diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index 6bdbfd44e96..5e275853b95 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -254,7 +254,11 @@ CREATE TABLE `player` ( `volume` smallint(4) DEFAULT '100', `nanoui_fancy` smallint(4) DEFAULT '1', `show_ghostitem_attack` smallint(4) DEFAULT '1', + `lastchangelog` varchar(32) NOT NULL DEFAULT '0', `lastchangelog` varchar(32) NOT NULL, + `space_parallax` smallint(4) DEFAULT '1', + `space_dust` smallint(4) DEFAULT '1', + `parallax_speed` float(24) DEFAULT '2', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) ) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1; diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index d28e9fe6f11..0eea48c2064 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -254,7 +254,11 @@ CREATE TABLE `SS13_player` ( `volume` smallint(4) DEFAULT '100', `nanoui_fancy` smallint(4) DEFAULT '1', `show_ghostitem_attack` smallint(4) DEFAULT '1', + `lastchangelog` varchar(32) NOT NULL DEFAULT '0', `lastchangelog` varchar(32) NOT NULL, + `space_parallax` smallint(4) DEFAULT '1', + `space_dust` smallint(4) DEFAULT '1', + `parallax_speed` float(24) DEFAULT '2', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) ) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1; diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 02ea1f45638..f435d880508 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -6306,6 +6306,7 @@ "crn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) "cro" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/sleeper,/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/medical/sleeper{name = "Sleepers"}) "crp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) +"crq" = (/obj/machinery/door_control{id = "telelab"; name = "Test Chamber Blast Doors"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 7; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/dropper,/obj/item/stack/medical/bruise_pack/advanced,/obj/item/stack/medical/ointment/advanced,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) "crs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/effect/spawner/window{useFull = 1; tag = "fullWin"},/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"}) "crt" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "cru" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) @@ -6402,7 +6403,6 @@ "cth" = (/obj/structure/table/reinforced,/obj/item/weapon/hand_labeler,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) "cti" = (/obj/machinery/computer/rdconsole/experiment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) "ctj" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/book/manual/experimentor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) -"ctk" = (/obj/machinery/door_control{id = "telelab"; name = "Test Chamber Blast Doors"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 7; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/dropper,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/stack/medical/advanced/ointment,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) "ctl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) "ctm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/effect/spawner/lootdrop{loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/weapon/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "ctn" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -8618,7 +8618,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqarBaaacjcaaaabqaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUbZUbZUcodcoecoecofcogcogcogcogcohcogcogcogcoicojcokcolcomconcoocopcoqcorcoscotcoucovcowcoxcoycozcoAcoBcoCcoDcoEcmgcoFckVcmmcmpcoGcoHcoIcoJcoKcoLcmocoMcoNcoOcoPcmzcdNcjncrFcrvcmzcoRcoScoTcoUcoVcmBcnKcoWcoXcoYcnKcoZcpacmBcpbbZUbZUbZUbZUbZUaoGaoGaoGcfKcfKcfKcpcclAcpdcpecpfcpgabqbGLcphcpicpjbGLcpkcplcpmbGLcpncpocppbGLabqaaaabqaaabCMcpqcprcpscptaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeaaackrabqabqabqabqabqaaabZUcpucpvcpwcpxcpycpzcpAbZUcodcoecpBcpCcpDcpEcpFcoecpGcpHcpIcoecpJcpKcpLcpMcpNcpOcpPcpQcpRcpScpTcpUcpTcpScpTcpVcpWcpXcpYcpZcqacqbcrVcmicnsckVcrWcmocqdcqecqfcqgcqhcqicqjcqkcqlcqmcqncmzcqocqpcqqcsncmzcqscqtcqucqvcqwcmBcnKcnKcqxcnKcnKcqycqzcmBcmCbZUcqAcqBbZUcqCcqDcqEcqFcqGcqHaoGcsoclAclAcsRclAclAabqbGLcqKcqLcqMbGLcqNcqOcqPbGLcqQcqRcqSbGLabqabqabqabqcptcqTcqUcqVcqWabqabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaackrabqaaaaaaaaaabqaaacqXcqYcqZcracrbcpycrccrdbZUcodcoecrecrfcrgcrhcricrjcrkcrlcrmcoeaovaotcrpcrncrocrscrtcructAcrwcrxcrycrycrycrzcrAcrBcrCcrDcpZcrEctBcrGcmgcrHckVcrIcmocrJcrKcrLcrMcrNcrOcmocrPcrQcrRcrScmzcrTcrUctSctEcmzcrXcrYcrZcsacsbcmBcmBcsccsdcsecsecmBcsfcmBcsgcshcsicsjbZUcskasJasJasJcdKcslbZUcsmcynclAcyqclAcspabqbGLcqKcsqcqKbGLcqNcsrcqNbGLcsscstcssbGLabqaaaabqaaacqWcqUcsucqUcjaaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabeabqckrabqaaaaaaaaaabqaaacqXcsvcrccqZcswcpycsxbZUbZUcsycoecszcsAcszcsBcszcoecszcsCcszcoeckEcsDcsEcsFckEckEcsGcsHcsIcsJcsJcsKcsLcsMcsJcsJcsNcmgcsOcsPcsQcyCcmgcmgcsSckVcsTcmocmocsUcsVcsWcsXcsYcmocsZcnBcfwcfwcmzctacmzctbcmzcmzcfwctcctdcfwcfwctectfctgcthctictjctkctlcmBctmbZUctnctobZUctpcdKchschyctqctrbZUctscttctuctvctuarAabqbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLabqabqabqabqcjacqUcqUcqUcqWabqbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabeabqckrabqaaaaaaaaaabqaaacqXcsvcrccqZcswcpycsxbZUbZUcsycoecszcsAcszcsBcszcoecszcsCcszcoeckEcsDcsEcsFckEckEcsGcsHcsIcsJcsJcsKcsLcsMcsJcsJcsNcmgcsOcsPcsQcyCcmgcmgcsSckVcsTcmocmocsUcsVcsWcsXcsYcmocsZcnBcfwcfwcmzctacmzctbcmzcmzcfwctcctdcfwcfwctectfctgcthctictjcrqctlcmBctmbZUctnctobZUctpcdKchschyctqctrbZUctscttctuctvctuarAabqbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLabqabqabqabqcjacqUcqUcqUcqWabqbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaabqaaaaaaarBaaaclIaaaaaaaaaaaaabqaaacqXctwcqZcswctxcpyctyctzcdOcodcoeczqczpctCctDczJcoectFctGctHcoectIctJctKctLctMctNctOcgrctPcsJctQctRcABctTctUcsJccvcmgctVctWctXctYcmictZcuacubcuccudcuecufcugcuhcuicujcukculcumcuncuocupciccuqcurcusciccutcuucuvciccuwctecuxcuycuzcuAcuBcuCcuDcmBcmCbZUbZUcuEbZUcuFcuGchychycuHcuIcqXabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaabqaaacjacqWcptbCMcptaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaabqaaaaaaabeaaacmRabqaaaaaaaaaabqaaacqXcqXcqZcpycpycqZcqZcuJcdOcodcoecuKcuLcuMcuNcuOcoecuPcuQcuRcuScuTcuUcuVcuWcuXcuYcuZcgrcgscsKcvacvbcvccvdcvecsJchscmgcvfcvgcvhcvicvjcvkcvlckVcvmcvncvocvpcvqcvrcvscvtcvucvvcvwcvxcvycvzcvAcvBcvCcvDcvEcvDcvFcvGcvHcvIcvJcvKcvLcvMcvNcvOcvPcvQcvRcvSbZUcvTcvUcvVcbvctqchychycvWcvXbZUcvYabqaaaaaaaaaabqaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaaaabqaaaabqaaaaaaabqaaaabqaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaabqabqaaaaaaarBaaacjcaaaaaaaaaaaaabqaaacqXcvZcqZcwacqZcqZcsxbZUbZUcwbcwccwdcuLcwecuNcwfcwgcwhcwicwjcwkcwlcwmcwncwocwpcwqcwrcwscjAcwtcwucwvcwwcwxcwwcwycwzcmgcwAcwBcwCcwDcmicvkcvlckVcvmcwEcmpcwFcwGcwHcwIcwJcukcwKcwLcwMcwNcwOcwPcwQcwRcihcihcwScwTcwUcwVcwWcwXcwYcwZcxacxbcxccxdcxecmBcmCbZUcxfcxgcxhcsicxicuHcmDchycxjcqXaaaabqaaaaaaaaaabqabqabebFbbFbbFbbFbbFbbFbabebFbbFcbFbbPGabqbFcabqabqabebRmbRmbRmabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index c4b556ae056..ed3fd57bf3a 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -92,7 +92,7 @@ "abN" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig) "abO" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig) "abP" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/security/permabrig) -"abQ" = (/turf/simulated/floor/holofloor,/area/security/permabrig) +"abQ" = (/obj/item/weapon/beach_ball/holoball,/turf/simulated/floor/holofloor,/area/security/permabrig) "abR" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/gameboard,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abS" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abT" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) @@ -356,10 +356,10 @@ "agR" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/solar/auxstarboard) "agS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/interrogation) "agT" = (/obj/item/weapon/restraints/handcuffs/pinkcuffs,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/security/prisonlockers) -"agU" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/interrogationhallway) +"agU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/clothing/mask/gas/clown_hat,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) "agV" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/armoury) "agW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) -"agX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) +"agX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) "agY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/security/seceqstorage) "agZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/seceqstorage) "aha" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prisonlockers) @@ -378,7 +378,7 @@ "ahn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/permabrig) "aho" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/main) "ahp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway) -"ahq" = (/obj/machinery/light{dir = 4},/obj/structure/rack,/obj/item/weapon/storage/box/teargas,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) +"ahq" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/security/permabrig) "ahr" = (/obj/structure/sink{pixel_y = 18},/obj/structure/mirror{pixel_y = 32},/obj/item/device/radio/intercom/department/security{pixel_x = 28; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage) "ahs" = (/obj/structure/disposalpipe/segment,/obj/structure/table,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main) "aht" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/security/main) @@ -401,13 +401,13 @@ "ahK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main) "ahL" = (/obj/machinery/vending/cigarette,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/main) "ahM" = (/obj/structure/table,/obj/item/ashtray/bronze{pixel_x = 2; pixel_y = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/weapon/storage/fancy/cigarettes/cigpack_robust,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main) -"ahN" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/permabrig) +"ahN" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) "ahO" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/security/armoury) "ahP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/seceqstorage) "ahQ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/landmark{name = "blobstart"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "ahR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "ahS" = (/turf/simulated/floor/plasteel,/area/security/armoury) -"ahT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/permabrig) +"ahT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) "ahU" = (/turf/simulated/wall,/area/security/main) "ahV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/seceqstorage) "ahW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/security/seceqstorage) @@ -462,8 +462,8 @@ "aiT" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/seceqstorage) "aiU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aiV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/armoury) -"aiW" = (/obj/structure/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) -"aiX" = (/obj/structure/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) +"aiW" = (/obj/structure/table,/obj/item/weapon/paper,/obj/machinery/light/small{dir = 1},/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/security/permabrig) +"aiX" = (/obj/machinery/light{dir = 4},/obj/effect/decal/warning_stripes/red/hollow,/obj/structure/closet/bombcloset,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aiY" = (/obj/structure/table,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/lock_buster,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aiZ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/interrogationhallway) "aja" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/security/seceqstorage) @@ -532,7 +532,7 @@ "akl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) "akm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/secure_closet/warden,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) "akn" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/apc{dir = 1; name = "Starboard Hall East APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/seceqstorage) -"ako" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Interrogation Hallway APC"; pixel_x = -24; pixel_y = 0},/obj/machinery/camera{c_tag = "Interrogation Hallway"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/interrogationhallway) +"ako" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) "akp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/sop_legal,/turf/simulated/floor/plasteel,/area/security/main) "akq" = (/obj/structure/reagent_dispensers/peppertank{pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage) "akr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway) @@ -671,7 +671,7 @@ "amU" = (/obj/machinery/computer/secure_data,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/prisonershuttle) "amV" = (/obj/machinery/computer/prisoner{req_access = null; req_access_txt = "2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle) "amW" = (/obj/machinery/computer/shuttle/labor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle) -"amX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/reinforced,/obj/item/stack/medical/advanced/bruise_pack,/obj/machinery/vending/wallmed1{dir = 2; name = "Emergency NanoMed"; pixel_x = -27; pixel_y = 0; req_access_txt = "0"},/obj/machinery/camera{c_tag = "Brig Security Equipment South"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/seceqstorage) +"amX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/reinforced,/obj/item/stack/medical/bruise_pack/advanced,/obj/machinery/vending/wallmed1{dir = 2; name = "Emergency NanoMed"; pixel_x = -27; pixel_y = 0; req_access_txt = "0"},/obj/machinery/camera{c_tag = "Brig Security Equipment South"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/seceqstorage) "amY" = (/obj/machinery/light,/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/obj/structure/rack,/obj/item/weapon/restraints/handcuffs{pixel_y = -4},/obj/item/weapon/restraints/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/seceqstorage) "amZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle) "ana" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle) @@ -731,7 +731,7 @@ "aoc" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/seceqstorage) "aod" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/lobby) "aoe" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/lobby) -"aof" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/courtroomdandp) +"aof" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/interrogationhallway) "aog" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/courtroomdandp) "aoh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/courtroomdandp) "aoi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig) @@ -760,11 +760,11 @@ "aoF" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/flasher{id = "gulagshuttleflasher"; pixel_x = 25},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/shuttle/siberia) "aoG" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/siberia) "aoH" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/lobby) -"aoI" = (/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/table,/turf/simulated/floor/plasteel,/area/security/processing) +"aoI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Interrogation Hallway APC"; pixel_x = -24; pixel_y = 0},/obj/machinery/camera{c_tag = "Interrogation Hallway"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway) "aoJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/security/processing) "aoK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/security/processing) "aoL" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle) -"aoM" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "Prisoner Processing APC"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing) +"aoM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig) "aoN" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{name = "Security Office APC"; pixel_y = -24},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main) "aoO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/security/courtroomdandp) "aoP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) @@ -779,10 +779,10 @@ "aoY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig) "aoZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable,/obj/machinery/power/apc{name = "Brig APC"; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "apa" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) -"apb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig) +"apb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "apc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig) "apd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) -"ape" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) +"ape" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig) "apf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "apg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "aph" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) @@ -860,7 +860,7 @@ "aqB" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/security/lobby) "aqC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B) "aqD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby) -"aqE" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/security/processing) +"aqE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig) "aqF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/security/processing) "aqG" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/lobby) "aqH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/office/dark,/obj/machinery/door_control{desc = "A remote control switch for the brig foyer."; id = "BrigFoyer"; name = "Brig Foyer Doors"; normaldoorcontrol = 1; pixel_x = -5; pixel_y = -35; range = 10; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby) @@ -933,8 +933,8 @@ "arW" = (/obj/machinery/sleeper/upgraded{dir = 4},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox) "arX" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/red,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom) "arY" = (/obj/structure/stool/bed/chair,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/processing) -"arZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Prisoner Cell Block B APC"; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) -"asa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/power/apc{dir = 4; name = "Prison Cell Block A APC"; pixel_x = 26; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) +"arZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) +"asa" = (/obj/structure/cable,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/processing) "asb" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "asc" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 6"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B) "asd" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/treadmill_monitor{id = "Cell 6"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B) @@ -982,7 +982,7 @@ "asT" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/security/processing) "asU" = (/turf/simulated/wall/r_wall,/area/security/prison/cell_block/B) "asV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/security/evidence) -"asW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) +"asW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/flag/nt,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/courtroomdandp) "asX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/evidence) "asY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/camera{c_tag = "Labor Shuttle Dock"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle) "asZ" = (/turf/simulated/wall/r_wall,/area/security/prison/cell_block/A) @@ -1071,7 +1071,7 @@ "auE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/prison/cell_block/A) "auF" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 4"; name = "Cell 4"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "auG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) -"auH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) +"auH" = (/obj/machinery/light_switch{pixel_x = -25},/obj/structure/table,/turf/simulated/floor/plasteel,/area/security/processing) "auI" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 2"; name = "Cell 2"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "auJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) "auK" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A) @@ -1090,7 +1090,7 @@ "auX" = (/obj/structure/window/basic,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "auY" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) "auZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) -"ava" = (/obj/structure/cable,/obj/item/device/radio/intercom{pixel_x = 28},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) +"ava" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Prisoner Processing APC"; pixel_x = 24; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing) "avb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "avc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "avd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fsmaint) @@ -1213,7 +1213,7 @@ "axq" = (/turf/simulated/floor/plasteel,/area/hallway/primary/fore) "axr" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) "axs" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) -"axt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig) +"axt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle) "axu" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) "axv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) "axw" = (/obj/structure/table/woodentable,/obj/item/weapon/stamp/clown,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/clownoffice) @@ -1256,7 +1256,7 @@ "ayh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore) "ayi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore) "ayj" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore) -"ayk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle) +"ayk" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/processing) "ayl" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore) "aym" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/primary/fore) "ayn" = (/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore) @@ -4110,7 +4110,7 @@ "bBb" = (/obj/structure/table,/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access_txt = "5"},/obj/item/device/radio/intercom/department/medbay,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/reception) "bBc" = (/obj/structure/table,/obj/machinery/media/receiver/boombox,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/reception) "bBd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception) -"bBe" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/structure/closet/secure_closet/medical_wall{name = "Pill Cabinet"; pixel_y = -32},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/syringe/insulin,/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/item/weapon/reagent_containers/syringe,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/stack/medical/advanced/ointment,/obj/item/weapon/reagent_containers/food/pill/patch/styptic,/obj/item/weapon/reagent_containers/food/pill/patch/styptic,/obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf,/obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf,/obj/item/weapon/storage/pill_bottle/painkillers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) +"bBe" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/structure/closet/secure_closet/medical_wall{name = "Pill Cabinet"; pixel_y = -32},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/syringe/insulin,/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/item/weapon/reagent_containers/syringe,/obj/item/stack/medical/bruise_pack/advanced,/obj/item/stack/medical/ointment/advanced,/obj/item/weapon/reagent_containers/food/pill/patch/styptic,/obj/item/weapon/reagent_containers/food/pill/patch/styptic,/obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf,/obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf,/obj/item/weapon/storage/pill_bottle/painkillers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "bBf" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/table,/obj/item/weapon/cane,/obj/item/weapon/cane{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cane{pixel_x = -6; pixel_y = 4},/obj/item/weapon/storage/box/rxglasses,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "bBg" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_y = -10},/obj/item/weapon/clipboard,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room) "bBh" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/morgue) @@ -4398,7 +4398,7 @@ "bGD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) "bGE" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay) "bGF" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/assembly/chargebay) -"bGG" = (/obj/structure/table,/obj/item/weapon/FixOVein,/obj/item/weapon/surgicaldrill,/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/item/weapon/cautery,/obj/item/stack/medical/advanced/bruise_pack{pixel_x = -4; pixel_y = 4},/turf/simulated/floor/plasteel,/area/assembly/robotics) +"bGG" = (/obj/structure/table,/obj/item/weapon/FixOVein,/obj/item/weapon/surgicaldrill,/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/item/weapon/cautery,/obj/item/stack/medical/bruise_pack/advanced{pixel_x = -4; pixel_y = 4},/turf/simulated/floor/plasteel,/area/assembly/robotics) "bGH" = (/obj/effect/decal/warning_stripes/east,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/table,/obj/item/device/mmi,/obj/item/device/mmi,/obj/item/device/mmi,/obj/item/device/mmi/posibrain,/obj/item/device/robotanalyzer,/turf/simulated/floor/plasteel,/area/assembly/robotics) "bGI" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bGJ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/machinery/newscaster{pixel_x = 26; pixel_y = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) @@ -8888,14 +8888,14 @@ "doV" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/hallway/primary/fore) "doW" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) "doX" = (/obj/item/toy/prize/honk,/turf/simulated/floor/plating,/area/space) -"doY" = (/obj/item/weapon/pen,/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable,/obj/machinery/power/apc{dir = 4; cell_type = 15000; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence) +"doY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) "doZ" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway Courtroom"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) "dpa" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore) "dpb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore) "dpc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore) "dpd" = (/turf/simulated/wall/r_wall,/area/clownoffice) "dpe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light,/turf/simulated/floor/wood,/area/clownoffice) -"dpf" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/obj/machinery/camera{c_tag = "Brig Evidence Storage"; dir = 1; network = list("SS13")},/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence) +"dpf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Prisoner Cell Block B APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) "dpg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary) "dph" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary) "dpi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary) @@ -8936,8 +8936,8 @@ "dpR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/security/permabrig) "dpS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/flasher{id = "permaflash2"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "dpT" = (/obj/machinery/flasher{id = "permaflash3"; pixel_x = 28; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"dpU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/clothing/mask/gas/clown_hat,/turf/simulated/floor/plating,/area/space) -"dpV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/space) +"dpU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/power/apc{dir = 4; name = "Prison Cell Block A APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) +"dpV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "dpW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig) "dpX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/holofloor{dir = 10; icon_state = "red"},/area/security/permabrig) "dpY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig) @@ -8982,9 +8982,9 @@ "dqL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) "dqM" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/security/permabrig) "dqN" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/camera{c_tag = "Prison Solitary Confinement"; dir = 6; network = list("Prison","SS13")},/turf/simulated/floor/plating,/area/security/permabrig) -"dqO" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/security/permabrig) +"dqO" = (/obj/effect/decal/warning_stripes/red/hollow,/obj/structure/closet/l3closet/security,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "dqP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/security/permabrig) -"dqQ" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/table,/obj/item/weapon/paper,/obj/machinery/light/small{dir = 1},/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/security/permabrig) +"dqQ" = (/obj/structure/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/box/teargas{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "dqR" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = -32},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) "dqS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/permabrig) "dqT" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) @@ -8994,11 +8994,14 @@ "dqX" = (/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "dqY" = (/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "dqZ" = (/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"dra" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/obj/machinery/camera{c_tag = "Medbay Surgery 1 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"dra" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/bruise_pack/advanced,/obj/machinery/camera{c_tag = "Medbay Surgery 1 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "drb" = (/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "drc" = (/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "drd" = (/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"dre" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/obj/machinery/camera{c_tag = "Medbay Surgery 2 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"dre" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/bruise_pack/advanced,/obj/machinery/camera{c_tag = "Medbay Surgery 2 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"drf" = (/obj/item/device/radio/intercom{pixel_x = 28},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) +"drg" = (/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable,/obj/machinery/power/apc{dir = 4; cell_type = 15000; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence) +"drh" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/obj/machinery/camera{c_tag = "Brig Evidence Storage"; dir = 1; network = list("SS13")},/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_x = 0; pixel_y = -22},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence) (1,1,1) = {" bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -9052,15 +9055,15 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhYcaVcaVdhZbFldiacaVcczdicdibdibdibbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikaalabRaaHabSaaHabTabVabUabYabXacaabZaccacbacfaceabZacjacjacFahdahcbnHahedhqbnIbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdidcaVcaVdiedigdifdifdihbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaavdiEdiDdkJdiIdpodkKdkJdkJdpqdppdpsdprdkJdptdpudkJdkJdpvdpxdpwdpydpwabPdpzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdijcaVcaVcaVaVUdikdikdimbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaaldpBdpAdpDdpCdpEaaldpFdpFaaldpGdpHaaldpJdpIaalaalaalaaldpKagtaaDagtabPdpLbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafaafaafdincaVcaVaafaafaafaafaafaafdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaaldpMaaydpNabndpOdpDdpPdpOdpQdpSdpRdpDdpTdpOdpUdpVdpOdpXdpWdpZdpYdqaaalbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldipdipdiqdisdirbFlditcaVcaVbFldiudiwdivdiydixbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabuaalabvdqbaaldqcaaqaaldqcaaqabxdqcaaqaalbikaEQaalaalaalaalaalaalaalaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVcaVayLcaVdizcaVcaVcaVdiAcaVayLcaVayLdiBbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaalaalaalaalabuaaldqddqeaaldqfdqfaaldqgdqgabxdqhdqhaalbikaEQabKabKabKdqiaEQaEQaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikabAcQScJadgjbikbikbikabAbikbikbikdgjbikbikbikabAdiCdgldgjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajbcaVcaVcaVcaVdiFcaVcaVcaVdiGcaVcaVcaVcaVdiHbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaaldqkdqjdqmdqldqnabkdqpdqodqqdqqdqsdqrdqrdqtdqrdquaalbikbikbikaEQabKabKaEQaabbikbikaabbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgodgndgmbikbikabAdgmdgpdgrdgqdgmdgjbikbikdgmdgsdgtdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajecaVcaVdiKdiJbFldiLdiMdiLbFlaWldiOcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaaldqwdqvdqydqxdqAdqzdqCdqBdqAdqDdqAdqEdqFdqAdqAdqGaalbikbikbikbikaEQabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgvdgudgmbikabAdgwdgydgxdgAdgzdgydgwdgjbikdgmdgBdgCdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVdiPbFlaafbFlcaVdiRdiQbFlaafbFlcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaalaalaalaalaaldqHdqIaalaalaalaalaalaalaalaalaalaalbikbikbikbikaEQabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgEdgDdgFbikdgHdgGdgydgydgIdgydgydgGdgJbikdgLdgKdgMdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiSdiUdiTbFlbikbFldiVdiVdiVbFlbikbFldiWdiYdiXbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaldqJdqLdqKdqNdqMdqOaalaabaabaabbikbikbikbikbikbikbikabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwbikbikdgOdgGdgydgPdgQdgydgydgGdgRbikbikdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiVdiVdiVbFlbikcVGdiZdjbdjadelbikbFldiVdiVdiVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgachacidqPackacldqQaalacmbikbikbikbikbikbikbikbikbikdqRabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwdgwdgwdgwdgwdgwdgwdgSdgwdgwdgwdgwdgwdgwdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacnacoacpacqacracsacdaalaalaalaalaalbikbikbikbikbikbikbikbikbikbikactactactacuacvactactactabKabKabKabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgHdgNdgTdgTdgTdgTdgTdgTdgmdgUdgmdgTdgTdgTdgTdgTdgTdgNdgJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafaafaafdincaVcaVaafaafaafaafaafaafdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaaldpMaaydpNabndpOdpDdpPdpOdpQdpSdpRdpDdpTdpOagUagXdpOdpXdpWdpZdpYdqaaalbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldipdipdiqdisdirbFlditcaVcaVbFldiudiwdivdiydixbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabuaalabvdqbaaldqcaaqaaldqcaaqabxdqcaaqaalaabaEQaalaalaalaalaalaalaalaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVcaVayLcaVdizcaVcaVcaVdiAcaVayLcaVayLdiBbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaalaalaalaalabuaaldqddqeaaldqfdqfaaldqgdqgabxdqhdqhaalaabaEQabLabLabLdqiaEQaEQaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikabAcQScJadgjbikbikbikabAbikbikbikdgjbikbikbikabAdiCdgldgjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajbcaVcaVcaVcaVdiFcaVcaVcaVdiGcaVcaVcaVcaVdiHbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaaldqkdqjdqmdqldqnabkdqpdqodqqdqqdqsdqrdqrdqtdqrdquaalaabaabaabaEQabLabLaEQaabbikbikaabbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgodgndgmbikbikabAdgmdgpdgrdgqdgmdgjbikbikdgmdgsdgtdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajecaVcaVdiKdiJbFldiLdiMdiLbFlaWldiOcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaaldqwdqvdqydqxdqAdqzdqCdqBdqAdqDdqAdqEdqFdqAdqAdqGaalbikaabaabaabaEQabLaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgvdgudgmbikabAdgwdgydgxdgAdgzdgydgwdgjbikdgmdgBdgCdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVdiPbFlaafbFlcaVdiRdiQbFlaafbFlcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaalaalaalaalaaldqHdqIaalaalaalaalaalaalaalaalaalaalbikbikbikaabaEQabLabLaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgEdgDdgFbikdgHdgGdgydgydgIdgydgydgGdgJbikdgLdgKdgMdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiSdiUdiTbFlbikbFldiVdiVdiVbFlbikbFldiWdiYdiXbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaldqJdqLdqKdqNdqMahqaalaabaabaabbikbikbikbikbikaabaabaEQabLaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwbikbikdgOdgGdgydgPdgQdgydgydgGdgRbikbikdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiVdiVdiVbFlbikcVGdiZdjbdjadelbikbFldiVdiVdiVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgachacidqPackaclaiWaalacmbikbikbikbikbikbikaabaabaabdqRabLabLbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwdgwdgwdgwdgwdgwdgwdgSdgwdgwdgwdgwdgwdgwdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacnacoacpacqacracsacdaalaalaalaalaalbikbikbikbikbikbikbikbikbikaabactactactacuacvactactactabKabKabKabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgHdgNdgTdgTdgTdgTdgTdgTdgmdgUdgmdgTdgTdgTdgTdgTdgTdgNdgJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacwacxacyaczacAacBacCaalacDacEacEacEacEacEbikbikbikbikbikbikbikbikactacHacIacJacKacLacMactabLabLabLabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgVdgXdgWdgZanqdhadgmdgSdgwdgSdgwdgSdgmdhcdhbdhedhddgXdhfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikacgacNacOacPacQacRacSacCaalacEacEacUacTacVacEacEacEbikbikbikbikbikbikactacWacXacYacXacXacZactadaadaadaadaadaadaabLadbbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgOdgXdgydgydgydhgdgmdgydgydgydgydgydgmdgydgydhhdgydgXdgRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgadcaddacEacEadeadgadfadiadhacEacEbikbikbikbikbikbikactadjadkadladmadnadoactadpadqadradsadtaduadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhjdhidhldhkdhmdgmdhndgydgydgydhodgmarWdgydhsdhrdhjdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -9072,28 +9075,28 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafzafAaeAafyafzafAaeAbikbikbikaabadwadxaekadUaemaelaenafKafLaeoacEacEafPafOafQacEacEafmafDafcafRagaafIafEafWafXafYaegagaagaagbafVagdagcagfaggaghadabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikafxbikaabbikagibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhHdhGdgydhIdhJdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAagjafAagkaeAaglafAagmaeAaabbikbikbikadwadyaeraeqaeBagqagragsagtaeCagvagwagzagyaeFaehafeafMahlafSageafSafSafTahpafbafGafCafSafSaikagoagLagxagMagNagOagPbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabagRaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdhKdhMdhLdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyafAaeAafAafyafAaeAbikbikaabaabadwadzaeraeGaeHahaahbdqSdqUdqTagvagnahiahhahmahjafJagvagpagYahgaguaguagAagDagCafUagEagHagGahUafZahvahwahxahyahzadaahAahAahAahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQafxbikahBbikafxagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdgwdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafAafyaeAafyafAafyaeAbikaabbikbikadwadxafBagBagFahJahfagWahnagIagKagJahRahQairahSahqagVagZahFahGahrahkahUahoahsahuahtahKahKahMahLahAadaadaadaadaadaaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabaabaabahBaabaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafyafAaeAafyafyafAaeAaabaabbikbikadwadwaiOafFailailadTaatahTahNagvaiqaisahhamuaitaiuahOahVahPahXahWahYaifaibaiaamyamzamzaicaiCaidahAaieaieaieaieaieaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQbikbikbikaiIbikbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyaiJaeAafAafyaiKaeAamcaabaabaabaabadwagTaiOaigaiwaeEaatagXaiSagvaimaiUaiVaiWaiXaiYaihaijaiiajgajfahYaioaiyaixaiEaiDaiHaiGaiCaiLahAaieaieaieaieaieaieaieaieahAagQagQajjaabagQagQagQagQagQagQagQagQagQagQagQagQagQagQaabaabajkajlajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVydmddmkdmjdmldmddmddmmdmddmddmnbikbikbikbikbikbikbikbikbikafxaabajnaabafxbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaeAajoajpajqajrajoajpajqajsajtajtajtajtajtajtajuajuafdaiAagSafHakoagUajGajGajNahIajEajFajGaiRaiPaiMaiNaipaiTajaajwaixaiEajhajiaiGajMajvajOaieaieaieaieaieaieaieaieahAaabaabaabaabaabaabbikaabbikaabaabaabaabaabaabaabaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafAafyaeAafyafAafyaeAbikaabbikbikadwadxafBagBagFahJahfagWahnagIagKagJahRahQairahSaiXagVagZahFahGahrahkahUahoahsahuahtahKahKahMahLahAadaadaadaadaadaaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabaabaabahBaabaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafyafAaeAafyafyafAaeAaabaabbikbikadwadwaiOafFailailadTaatahTahNagvaiqaisahhamuaitdqOahOahVahPahXahWahYaifaibaiaamyamzamzaicaiCaidahAaieaieaieaieaieaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQbikbikbikaiIbikbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyaiJaeAafAafyaiKaeAamcaabaabaabaabadwagTaiOaigaiwaeEaatakoaiSagvaimaiUaiVdqQaiuaiYaihaijaiiajgajfahYaioaiyaixaiEaiDaiHaiGaiCaiLahAaieaieaieaieaieaieaieaieahAagQagQajjaabagQagQagQagQagQagQagQagQagQagQagQagQagQagQaabaabajkajlajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVydmddmkdmjdmldmddmddmmdmddmddmnbikbikbikbikbikbikbikbikbikafxaabajnaabafxbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaeAajoajpajqajrajoajpajqajsajtajtajtajtajtajtajuajuafdaiAagSafHaoIaofajGajGajNahIajEajFajGaiRaiPaiMaiNaipaiTajaajwaixaiEajhajiaiGajMajvajOaieaieaieaieaieaieaieaieahAaabaabaabaabaabaabbikaabbikaabaabaabaabaabaabaabaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmpdmodmrdmqdmtdmsdmsdmsdmvdmudmwbikbikbikacGacGacGafxafxaabaabbikajQbikaabaabafxafxacGacGacGbikbikbikbikbikbikbikbikbikbikbikbikaeAajRajSajTafyajUajVajWakcajtbSoclqajcajAajyajDajuahDahCajJajxajLahHajBakjakkaklakmaiFajFaiRakiakaaiRajIaiRahUalhajKakbajYakpakdakzaiCakAaieaieaieaieaieaieaieaieahAaabakBakCakCakCakDakCakCakCakCakDakCakCakCakCakEaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmxdmodmzdmydmsdmAdmAdmAdmAdmAdmBbikbikbikacGbikbikaabbikaabbikbikajQbikbikaabbikaabbikbikacGbikbikbikbikbikbikbikbikbikbikbikbikaeAakFafyakGakHakIakJakKakLajtakMakNakOakOakPajZajuaivainaiBaizakrahHakWakXakYakZalaalbajdaknakwakuakqaksaktakTalBakSalcakUalealdaiCalfajOaieaieaieaieaieaieaieaieahAaabaloaabaabaabaloaabbikbikaabaloaabaabbikbikaloaabbikaabaabajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmCdmodmEdmDdmAdmAdmAdmAdmGdmFdmwbikbikbikacGaabalpalpalpalpalpbikalqbikalpalpalpalpalpaabacGbikbikbikbikbikbikbikbikbikbikbikbikaeAalralsakGafyaltakJalualvajtalwalxalyalzakQakxajuampaiQakRaiZalEajzajBalFalGaklalHalIajFaliahPaljaljallalCalgalJajXakfakealMakeakhakgahAahAahAahAahAahAahAahAahAahAaabaloaabbikajkajlajmbikbikajkajlajmbikbikajkajlajmaabaabbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaXhdmddmddmddmldmddmddmmdmddmddmIbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikamaalZaowanxambbikbikbikamcaeAaeAaeAamdamdamealKamgamdajuamfamiamjamkamhamlajualNajHammalQamnakvajGamsamtaXNamvaYjajGamXamDamqanlamYdoHaocaoNdoIasvaiCateauydoNalkahAamKamKamKamKamKbikbikbikbikaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikamOamNamQamPamOamRamSamSamTamUamVamWalnakVamZanaanbancajuajuandaneajuajualmajualAalAaufalAauLalDajGajBajCanjajEajFajGdoOatgdoPaiRaiRaiRahUahUannalLdoSalOahUahAalPahAanrantansansanubikbikbikbikbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikaabbikbikbikaEEanwanzanyanBanAanDanCanAanGanGanHanIanJanKanLanManNanOanPanQanRanSanTaoiaokalRaqjaxtaojaPcauwaswamoamxamwamBamAamEamCamGamFaokaojaokaolaomamHamJamIanfaoraovapmaotaovaEHaouaoyaoxbikbikbikbikbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOanEaoAanFamOamRamSamSamSauQasYamrankauSaoLaoLanoanmaoPaoQaoRaoSaoTaoUaoVaoWaoXaoYaoWaoZapaaoTavRapcawqanpaoTapdanUaoTapeaoTapcapbaoTaoVapfapgaphapianVapkaplapmapnaovaozansansapobikaacapqaacbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikaabaabajkajPajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsdmMdmLdmOdmNbikbikbikbikbikbikajjbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikamOaoCaoCaoDamObikbikbikapwanganianhanWawDanianiapBapBapBapBapCapDapEapEapEapFapGapHapFapEapEapEaoeaodaodanXanZanYaopaooahEahEaobaoaahEahEapRapSapTapUapVapWapXapmapnapYapYamKapZapZapZamKaqaamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmaabaabbikaabaiIaabbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmQdmQdmQdmPbikbikbikbikbikbikacGaqbamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikaEEaoEaoCaoFamOamRamSamSamSaxyaniaofaohaogaoqaonapBaqnaqoaqpapjaqraqsaqtaquaqvapxapvaqyaqzaqAaqsapzapyapyaosaoHaoBapMapLahEaoIaoKaoJaoMahEaqMaqNaqOaqhaqQaqiapXapmaqSaqTaqUaqVaqWaqWaqXamKaqYamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikaabaloaabbikbikaqZbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmRdmRdmRdmPbikbikbikbikbikbikacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikacGbikbikbikamOaoGaoCaoCaptanAapuanCanAaykaniayYapAaoOapJapIapBarkarlarmarnaqCarparqarrarsartaruarvarrarwarxaqDapyapyaosapNapKaqHaqGapPapOaqgapQawFahEaszasAarMarNarMarOapXapmaovaovaovaovarPaovarQarRarSamKakBarTakEbikbikaiIaabaabaabaabaiIaabaabaabaabaiIaabaabaabaabarUarVakEaabbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmTdmSdmUdmPbikbikbikbikbikbikacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOaqcaqcaqcamOamRamSazdazdazfaqlaqkaqqaqmaqxaqwapBascasdasearzasgashasiasjaskarAasmasnasoaspasharBapyapyaosaqBaooarFarEaqFaqEaqJaqIaqKahEatnatoatparNarMasBapXasCasDasEasFasEasGasHamKamKapnamKaloasIasJakCakCarTakCakCakCakCarTakCakCakCakCarTakCakCakCasKasLasIaloaabbikagQaabbikbikbikbikbikbikbikbikbikbikaabbikaabbikasMasMasNasNasNasNasNasNasMasMaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikbikbikbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikaqeaqdaqdaqdaqfbikbikaqLaqPaqPaqPaqRaqRaqRaqRarhapBapBatRapBarZasWapEapEatSapEasbasaapEatSapEasZaslasfapyariaroarjaAEasuahEaryarDarCarHarGauiaueaukatqarMatrapXatsattatuatvatwatxatyatzatAatBamKatCarTatDaabaabbikaabbikbikbikbikbikbikbikbikaabaabaabaabaabatEatFatDaabaabaabaabaabbikbikbikbikbikbikbikbikbikaabbikaabasMasMatGatHatIatJatKatLatMatIasMasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikaabbikbikbikaEEanwanzanyanBanAanDanCanAanGanGanHanIanJanKanLanManNanOanPanQanRanSanTaoiaokalRaqjaoMaojaPcauwaswamoamxamwamBamAamEamCamGamFaokaojaokaolaomamHamJamIanfaoraovapmaotaovaEHaouaoyaoxbikbikbikbikbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOanEaoAanFamOamRamSamSamSauQasYamrankauSaoLaoLanoanmaoPaoQaoRaoSaoTaoUaoVaoWaoXaoYaoWaoZapaaoTavRapcawqanpaoTapdanUaoTapdapbaqEapearZaoVapfapgaphapianVapkaplapmapnaovaozansansapobikaacapqaacbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikaabaabajkajPajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsdmMdmLdmOdmNbikbikbikbikbikbikajjbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikamOaoCaoCaoDamObikbikbikapwanganianhanWawDanianiapBapBapBapBapCapDapEapEapEapFapGapHapFapEapEapEaoeaodaodanXanZanYaopaooahEasaaobaoaasaahEapRapSapTapUapVapWapXapmapnapYapYamKapZapZapZamKaqaamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmaabaabbikaabaiIaabbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmQdmQdmQdmPbikbikbikbikbikbikacGaqbamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikaEEaoEaoCaoFamOamRamSamSamSaxyaniasWaohaogaoqaonapBaqnaqoaqpapjaqraqsaqtaquaqvapxapvaqyaqzaqAaqsapzapyapyaosaoHaoBapMapLahEauHaoKaoJavaahEaqMaqNaqOaqhaqQaqiapXapmaqSaqTaqUaqVaqWaqWaqXamKaqYamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikaabaloaabbikbikaqZbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmRdmRdmRdmPbikbikbikbikbikbikacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikacGbikbikbikamOaoGaoCaoCaptanAapuanCanAaxtaniayYapAaoOapJapIapBarkarlarmarnaqCarparqarrarsartaruarvarrarwarxaqDapyapyaosapNapKaqHaqGapPapOaqgapQawFahEaszasAarMarNarMarOapXapmaovaovaovaovarPaovarQarRarSamKakBarTakEbikbikaiIaabaabaabaabaiIaabaabaabaabaiIaabaabaabaabarUarVakEaabbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmTdmSdmUdmPbikbikbikbikbikbikacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOaqcaqcaqcamOamRamSazdazdazfaqlaqkaqqaqmaqxaqwapBascasdasearzasgashasiasjaskarAasmasnasoaspasharBapyapyaosaqBaooarFarEaqFaykaqJaqIaqKahEatnatoatparNarMasBapXasCasDasEasFasEasGasHamKamKapnamKaloasIasJakCakCarTakCakCakCakCarTakCakCakCakCarTakCakCakCasKasLasIaloaabbikagQaabbikbikbikbikbikbikbikbikbikbikaabbikaabbikasMasMasNasNasNasNasNasNasMasMaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikbikbikbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikaqeaqdaqdaqdaqfbikbikaqLaqPaqPaqPaqRaqRaqRaqRarhapBapBatRapBdpfdoYapEapEatSapEasbdpUapEatSapEasZaslasfapyariaroarjaAEasuahEaryarDarCarHarGauiaueaukatqarMatrapXatsattatuatvatwatxatyatzatAatBamKatCarTatDaabaabbikaabbikbikbikbikbikbikbikbikaabaabaabaabaabatEatFatDaabaabaabaabaabbikbikbikbikbikbikbikbikbikaabbikaabasMasMatGatHatIatJatKatLatMatIasMasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikbikbikbikbikbikaabatNamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikbikbikbikbikbikbikbikarIaqPaqPaqParJaqRarKarXarLapBatPatUatTatbatVaqsatQauJauEatdatcavEavBatWaqsatfaATapyapyapyathaSWatiahEarYaryasqasrahEatXatOarMarNarMaulapXatsarPattattattaumaovaunauoaupamKbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikaabaabaabaabauqaabaabbikbikaabaabaabbikbikbikbikbikbikbikbikasMasMasMasMauratJausatJausautatJatJatJauuasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmSdmSdmSdmWbikbikbikbikbikbikacGbikbikaabbikaabbikbikauvbikbikaabbikaabbikbikacGbikbikbikbikbikbikaahbikbikbikarIassaqPaqPastaqRaqRasxaxjapBarkavJauzaucauBaudauDdlLauFauGauHauIdlMauKaujaugauNauNauNauNauNcwXauhahEasyasqaryasTasSasXasVasSauMauXauPapXatsavbavcavcavcavdaveavfavgavhamKbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabbikbikbikaabaabaabaviaabaabbikbikaabbikaabaabbikbikbikbikbikbikbikasMavjavkavlavmavnavoavpatJatJavqavratJavsasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmXdmSdmSdmYbikbikbikbikbikbikacGacGacGaabaabaabaabavtavuavtaabaabaabaabacGacGacGbikbikbikbikbikbikbikbikbikbikaqLatadoKatkatjatmatlatZatYapBdlPdlQavyauZasgashdlRdlSashavvavaashdlTdlUashavxavwavAavzapyavHapyavCahEauaauxaubasqdoTauCauAaSqavMavOavOavQavPavTavUavUavUavVavWavXavYavYavYbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikaabaabavZawaavZaabaabbikaabbikbikaabaabbikbikbikbikbikbikasMawbawcawdaweawfawgatJatJatJawhawiatJawjasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmSdmSdmSdmWbikbikbikbikbikbikacGbikbikaabbikaabbikbikauvbikbikaabbikaabbikbikacGbikbikbikbikbikbikaahbikbikbikarIassaqPaqPastaqRaqRasxaxjapBarkavJauzaucauBaudauDdlLauFauGdpVauIdlMauKaujaugauNauNauNauNauNcwXauhahEasyasqaryasTasSasXasVasSauMauXauPapXatsavbavcavcavcavdaveavfavgavhamKbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabbikbikbikaabaabaabaviaabaabbikbikaabbikaabaabbikbikbikbikbikbikbikasMavjavkavlavmavnavoavpatJatJavqavratJavsasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmXdmSdmSdmYbikbikbikbikbikbikacGacGacGaabaabaabaabavtavuavtaabaabaabaabacGacGacGbikbikbikbikbikbikbikbikbikbikaqLatadoKatkatjatmatlatZatYapBdlPdlQavyauZasgashdlRdlSashavvdrfashdlTdlUashavxavwavAavzapyavHapyavCahEauaauxaubasqdoTauCauAaSqavMavOavOavQavPavTavUavUavUavVavWavXavYavYavYbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikaabaabavZawaavZaabaabbikaabbikbikaabaabbikbikbikbikbikbikasMawbawcawdaweawfawgatJatJatJawhawiatJawjasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmZdmSdnadmPbikaahbikbikbikbikaabbikaabbikbikaabbikavtawkawlbikbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikauOauOazIazIazIavSdoJdoGdoLauRasUasUasUawoawvawuawrawrawsawrawyawwawrawtasZasZaUcawzawAawBawCawBawCawAahEahEahEahEahEasSauUauTauVaxbaxeaxdawEaxfavUawGawHawIavVawJawKawLawMavWbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikaabbikavZawNavZbikaabbikaabbikbikbikaabaabbikbikbikbikbikasMawOawPavlawQawRawSawTatJawUawVawWawXasMawYaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnbdnddncdnddnebikbikbikbikbikbikaabbikaabbikbikaabavtavtawZaxaavtbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikauOauWavDauYavGavFavIaxvdoQaxxdoZaxhaxhaxzaxlaxlaxlaxlaxlaxmaxnaxoaxlaxlaxlaxlaxpdoUaxlaxlaxqdoVaxqaxraxraxAaxraxBaxuadQavLavKavNaxXaxCaxDaxEapmavUaxGaxHaxIavVaxKaxLaxJaAZavWbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikaabavZavZaxMavZavZaabbikaabbikbikbikbikaabaabbikbikbikbikasMaxNaxOavlasMavlavlaxPaxQasMasMasMasMasMasMaabaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnbdnfdnebikbikbikbikbikbikaabaabbikaabbikbikaabaxRaxSaxTaxUaxRaxVaxVbikbikaabbikbikbikbikbikbikbikbikbikbikdoFdoWaxqawnayjawpayjaygayiayhayoayjayjaypayjayjayjayjayjayqayjayjayjayjayjayjayPayuayjayjayjayQayjayRaxqaylaxqaymaynadQdpfdoYadQayraysaytaxEayUavUayvaywayxayyayzayAayBawMavWbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikaabayCayDayEayFayCaabbikaabbikbikaabbikbikaabaabbikbikayGasMavlasMavlayHayIayHayJayHayHayHayKayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnbdnfdnebikbikbikbikbikbikaabaabbikaabbikbikaabaxRaxSaxTaxUaxRaxVaxVbikbikaabbikbikbikbikbikbikbikbikbikbikdoFdoWaxqawnayjawpayjaygayiayhayoayjayjaypayjayjayjayjayjayqayjayjayjayjayjayjayPayuayjayjayjayQayjayRaxqaylaxqaymaynadQdrhdrgadQayraysaytaxEayUavUayvaywayxayyayzayAayBawMavWbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikaabayCayDayEayFayCaabbikaabbikbikaabbikbikaabaabbikbikayGasMavlasMavlayHayIayHayJayHayHayHayKayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaxVaxVaxVaxVaxVaabaabaxRazsayMayNaxRayOaxVbikbikaabbikbikbikbikbikbikbikbikbikbikdoFdplaxgaxcaxkaxiaxsazgdpabOIayXayXayZdlNazbazcayXayXayXdpbayXayXayXayXayXayXazedpcazgazgazgazhaziazjaziazkazlazmaznadQadQadQadQazoazoazoaxEapmavUazpaxHazqavVcscazraxJcvYavWbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikaabayCaFCaztazuayCaabbikaabbikbikaabbikbikayGazvayGazvayGayKayHayHayHayHayHayHayHayHayHazwazxayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikazyazzazybikbikbikaxVaxVaxVaxVazAazBazCaxVbikbikaxRazDazEazFazGazHaxVbikbikaabbikbikbikbikbikbikbikbikbikbikauOauOauOdpdawmdlVayaayaaVMazJazKazKazLazMazNazOazPazPazOazQazOazRazRazRazRazRazRazSazRazRazTazUazVazWazIazXazIazYazIazIaqVazZaovaovaovaovaAaapmavUaAbaxHaAcavVaAdayAayBawMavWbikbikbikbikbikbikbikbikaabaabbikbikbikbikazyaAeazybikaabayCaAfaAgaAhayCaAiaAiaAiaAiaAiazvazvazvayGaAjayHazwazxayJayHayJayJayJayGaAkayGayGayGayGayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaAlaAmaAlbikbikaabaxVaAnaAoaApazHaAqazHaxVaAlaAlaxRaxRaAraAsazGazHaxVaxVaAlaAlaAlaxVaxVbikaabbikbikbikbikbikbikbikbikdpdaxFaxwaxYaxWaxZazJaAtaAuaAvazMaAwazOaAxaAyaAzaAAaABaACaADbfTaAFaAGaAHaAIaAJaAKaALaxqaxraAMaANaAOaAPaAQaAPaAPaAPaARaAPaAPaAPaAPaASdoMaAUaAVaAWaAXaAYcNsaBaaUadcuavWaabaBbaBcaBcaBcaBcaBcaBdaabaabbikbikbikbikazvaBeazvbikaAiayCayCaBfaBgayCaBhayHayHayHayJaBiayHaBjayGayHayHayHaBkayJayHayGaBlaBmayGayHaBnayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index c644a9afd3d..dde720cecf7 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -689,6 +689,7 @@ "nm" = (/obj/machinery/light{dir = 4},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/trader_station/sol) "nn" = (/obj/docking_port/stationary/transit{dir = 8; dwidth = 2; height = 11; id = "trade_sol_transit"; name = "trade_sol in transit"; turf_type = /turf/space/transit/horizontal; width = 5},/turf/space/transit/horizontal,/area/space) "no" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/centcom/evac) +"np" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/bruise_pack/advanced,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) "oB" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/syndicate_mothership) "oC" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/syndicate_mothership) "oH" = (/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) @@ -1217,7 +1218,6 @@ "FQ" = (/obj/structure/table,/obj/random/tool,/obj/item/clothing/gloves/color/yellow,/obj/item/weapon/pinpointer/advpinpointer,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "FR" = (/obj/structure/table,/obj/item/weapon/grenade/syndieminibomb{pixel_x = 4; pixel_y = 2; pixel_z = 0},/obj/item/weapon/grenade/syndieminibomb{pixel_x = -1},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "FS" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/obj/item/toy/cards/deck/syndicate/black,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"FT" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) "FU" = (/obj/structure/table,/obj/item/weapon/hemostat,/obj/item/weapon/circular_saw,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) "FV" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ADMINCHEMLOCKDOWN"; name = "Security Doors"; opacity = 0},/obj/machinery/door/airlock/hatch{desc = "Uh oh."; name = "Operating Theater"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) "FW" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) @@ -1589,7 +1589,7 @@ aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbW aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEYDKDKDKDKkhFkDwDwDwDwDADKDKDAEwEwFlFmDADKDAFnFoFpDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAFqFrFsDKFtDAFuFvFwFxDADKDKDAFyEwEwFzDADKDAFAFBFCDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEYlfDKDKDKFDDAFEFvFvFvFFDKDKDAFGEwEwFHDADKDKDKDKDKEfaNaNaNaNDtDwFIFJFKDwDuaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAFMFNFODKFPDAFQFvFRFSDADKDKDAFTFUEwEwFVDKDKDKDKDKDAaNaNaNDtDwFWFXFXFXFYDwDuaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAFMFNFODKFPDAFQFvFRFSDADKDKDAnpFUEwEwFVDKDKDKDKDKDAaNaNaNDtDwFWFXFXFXFYDwDuaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDwDwDwDwDwDwDwDwDwDwGaDKDKGbDwDwDwDwDwDwDwDwGcDwDADuaNDtDwFWFXFXFXFXFXFYDADuaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAGaGdGeGfGgGhGiGjGbDAGaDKDKDKDKDKDKGbDwDwDwDwDwGaDKGbDwDwGkDwFWFXFXFXGlFXFXFXFYDAaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIGmlhDKDKlvDKDKDKDKDKGoDKDKGpGpGpGpDKDKDKDKDKDKDKDKDKDKGqFXFXFXFXFXFXGrGsGtFXFXFXGuaNaNaNaNaN diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index ae5425c4ad5..a6824b0cc17 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -874,7 +874,7 @@ "qP" = (/obj/structure/rack{dir = 1},/obj/item/clothing/glasses/meson,/obj/item/device/flashlight,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/shovel{attack_verb = list("ineffectively hit"); desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."; force = 1; name = "safety shovel"; pixel_x = -5; throwforce = 1},/obj/item/weapon/pickaxe{attack_verb = list("ineffectively hit"); desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."; force = 1; name = "safety pickaxe"; pixel_x = 5; throwforce = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "qQ" = (/obj/structure/rack{dir = 1},/obj/item/clothing/glasses/meson,/obj/item/device/flashlight,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/shovel{attack_verb = list("ineffectively hit"); desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."; force = 1; name = "safety shovel"; pixel_x = -5; throwforce = 1},/obj/item/weapon/pickaxe{attack_verb = list("ineffectively hit"); desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."; force = 1; name = "safety pickaxe"; pixel_x = 5; throwforce = 1},/obj/machinery/camera{c_tag = "Labor Camp Storage"; dir = 8; network = list("Labor")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "qR" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/laborcamp) -"qS" = (/obj/structure/table,/obj/item/device/healthanalyzer,/obj/item/stack/medical/advanced/bruise_pack,/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/laborcamp) +"qS" = (/obj/structure/table,/obj/item/device/healthanalyzer,/obj/item/stack/medical/bruise_pack/advanced,/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/laborcamp) "qT" = (/obj/structure/sign/redcross{pixel_y = 32},/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/laborcamp) "qU" = (/obj/machinery/camera{c_tag = "Labor Camp Medical"; dir = 8; network = list("Labor")},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/item/device/radio/intercom/locked/prison{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/laborcamp) "qV" = (/turf/simulated/wall,/area/mine/laborcamp) diff --git a/code/__DEFINES/clothing.dm b/code/__DEFINES/clothing.dm index bc067253ff1..ec9ad2f2128 100644 --- a/code/__DEFINES/clothing.dm +++ b/code/__DEFINES/clothing.dm @@ -30,8 +30,9 @@ #define slot_in_backpack 18 #define slot_legcuffed 19 #define slot_r_ear 20 -#define slot_tie 21 -#define slots_amt 21 +#define slot_wear_pda 21 +#define slot_tie 22 +#define slots_amt 22 //Cant seem to find a mob bitflags area other than the powers one diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index f6e10ca2e06..e7966690a8e 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -105,7 +105,8 @@ #define SLOT_POCKET 2048 //this is to allow items with a w_class of 3 or 4 to fit in pockets. #define SLOT_DENYPOCKET 4096 //this is to deny items with a w_class of 2 or 1 to fit in pockets. #define SLOT_TWOEARS 8192 -#define SLOT_TIE 16384 +#define SLOT_PDA 16384 +#define SLOT_TIE 32768 //ORGAN TYPE FLAGS #define AFFECT_ROBOTIC_ORGAN 1 diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 0852622f2c6..530f322c847 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -80,6 +80,14 @@ //turfs += centerturf return atoms +/proc/trange(rad = 0, turf/centre = null) //alternative to range (ONLY processes turfs and thus less intensive) + if(!centre) + return + + var/turf/x1y1 = locate(((centre.x-rad)<1 ? 1 : centre.x-rad),((centre.y-rad)<1 ? 1 : centre.y-rad),centre.z) + var/turf/x2y2 = locate(((centre.x+rad)>world.maxx ? world.maxx : centre.x+rad),((centre.y+rad)>world.maxy ? world.maxy : centre.y+rad),centre.z) + return block(x1y1,x2y2) + /proc/get_dist_euclidian(atom/Loc1 as turf|mob|obj,atom/Loc2 as turf|mob|obj) var/dx = Loc1.x - Loc2.x var/dy = Loc1.y - Loc2.y diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 4bc41808b96..e1965cf701e 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -171,7 +171,7 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul target.attack_log += text("\[[time_stamp()]\] Has been [what_done] by [key_name(user)][object ? " with [object]" : " "][addition]") if(admin) log_attack("[key_name(user)] [what_done] [key_name(target)][object ? " with [object]" : " "][addition]") - if(istype(target) && target.client) + if(istype(target) && (target.client || target.player_logged)) if(what_done in ignore) return if(target == user)return if(!admin) return diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 51e0dfa8ab2..a531f22ce86 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -72,4 +72,9 @@ var/timezoneOffset = 0 // The difference betwen midnight (of the host computer) // For FTP requests. (i.e. downloading runtime logs.) // However it'd be ok to use for accessing attack logs and such too, which are even laggier. -var/fileaccess_timer = 0 \ No newline at end of file +var/fileaccess_timer = 0 + +//SPACE PARALLAX +var/parallax_initialized = 0 +var/space_color = "#050505" +var/list/parallax_icon[27] \ No newline at end of file diff --git a/code/_onclick/_defines.dm b/code/_onclick/_defines.dm index a02a1f43590..84ef776b41b 100644 --- a/code/_onclick/_defines.dm +++ b/code/_onclick/_defines.dm @@ -1,3 +1,8 @@ #define CLICKCATCHER_PLANE -99 +#define PLANE_SPACE_BACKGROUND -10 +#define PLANE_SPACE_PARALLAX (PLANE_SPACE_BACKGROUND + 1) +#define PLANE_SPACE_DUST (PLANE_SPACE_PARALLAX + 1) +#define PLANE_BASE 0 + #define HUD_PLANE 90 \ No newline at end of file diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 3fb4ff12d38..d844292fbb1 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -35,7 +35,7 @@ #define ui_swaphand2 "CENTER: 16,SOUTH+1:5" #define ui_storage1 "CENTER+1:18,SOUTH:5" #define ui_storage2 "CENTER+2:20,SOUTH:5" -#define ui_crafting "12:-10,1:5" +#define ui_pda "CENTER+3:22,SOUTH:5" #define ui_alien_head "4:12,1:5" //aliens #define ui_alien_oclothing "5:14,1:5" //aliens @@ -65,6 +65,8 @@ #define ui_zonesel "EAST-1:28,SOUTH:5" #define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12) +#define ui_crafting "EAST:-5,SOUTH+2:7" + #define ui_borg_pull "EAST-2:26,SOUTH+1:7" #define ui_borg_radio "EAST-1:28,SOUTH+1:7" #define ui_borg_intents "EAST-2:26,SOUTH:5" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 29e7c676ac4..cce5cdb37fa 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -167,6 +167,7 @@ mymob.update_action_buttons(1) reorganize_alerts() reload_fullscreen() + update_parallax_and_dust() /datum/hud/human/show_hud(version = 0) ..() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 5227a25cde7..403d28ab774 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -157,6 +157,16 @@ inv_box.alpha = ui_alpha static_inventory += inv_box + inv_box = new /obj/screen/inventory() + inv_box.name = "pda" + inv_box.icon = ui_style + inv_box.icon_state = "pda" + inv_box.screen_loc = ui_pda + inv_box.slot_id = slot_wear_pda + inv_box.color = ui_color + inv_box.alpha = ui_alpha + static_inventory += inv_box + inv_box = new /obj/screen/inventory() inv_box.name = "mask" inv_box.icon = ui_style @@ -393,6 +403,9 @@ if(H.wear_id) H.wear_id.screen_loc = ui_id H.client.screen += H.wear_id + if(H.wear_pda) + H.wear_pda.screen_loc = ui_pda + H.client.screen += H.wear_pda if(H.belt) H.belt.screen_loc = ui_belt H.client.screen += H.belt @@ -410,6 +423,8 @@ H.s_store.screen_loc = null if(H.wear_id) H.wear_id.screen_loc = null + if(H.wear_pda) + H.wear_pda.screen_loc = null if(H.belt) H.belt.screen_loc = null if(H.back) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm new file mode 100644 index 00000000000..e5018468aad --- /dev/null +++ b/code/_onclick/hud/parallax.dm @@ -0,0 +1,281 @@ +/* + * This file handles all parallax-related business once the parallax itself is initialized with the rest of the HUD + */ + +var/list/parallax_on_clients = list() + +/obj/screen/parallax + var/base_offset_x = 0 + var/base_offset_y = 0 + mouse_opacity = 0 + icon = 'icons/turf/space.dmi' + icon_state = "blank" + name = "space parallax" + blend_mode = BLEND_ADD + layer = AREA_LAYER + plane = PLANE_SPACE_PARALLAX + var/parallax_speed = 0 + var/last_accumulated_offset_x = 0 + var/last_accumulated_offset_y = 0 + +/obj/screen/plane_master + appearance_flags = PLANE_MASTER + screen_loc = "1,1" + +/obj/screen/plane_master/parallax_master + plane = PLANE_SPACE_PARALLAX + blend_mode = BLEND_MULTIPLY + color = list( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 0, + 0, 0, 0, 1) + +/obj/screen/plane_master/parallax_spacemaster // Turns space-turfs into white. The parallax plane multiplies itself by the white, causing the parallax to only show in areas with opacity. + plane = PLANE_SPACE_BACKGROUND + color = list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 1, 1, 1, 1, + 0, 0, 0, 0) + +/obj/screen/plane_master/parallax_dustmaster + plane = PLANE_SPACE_DUST + +/datum/hud/proc/update_parallax() + var/client/C = mymob.client + if(!parallax_initialized || C.updating_parallax) return + + for(var/turf/space/T in trange(C.view,get_turf(C.eye))) + C.updating_parallax = 1 + break + + if(!C.updating_parallax) + return + + //multiple sub-procs for profiling purposes + if(update_parallax1()) + update_parallax2(0) + update_parallax3() + C.updating_parallax = 0 + else + C.updating_parallax = 0 + +/datum/hud/proc/update_parallax_and_dust() + var/client/C = mymob.client + if(!parallax_initialized || C.updating_parallax) return + C.updating_parallax = 1 + if(update_parallax1()) + update_parallax2(1) + update_parallax3() + C.updating_parallax = 0 + else + C.updating_parallax = 0 + +/datum/hud/proc/update_parallax1() + var/client/C = mymob.client + //DO WE UPDATE PARALLAX + if(C.prefs.space_parallax)//have to exclude Centcom so parallax doens't appear during hyperspace + parallax_on_clients |= C + else + for(var/obj/screen/parallax/bgobj in C.parallax) + C.screen -= bgobj + parallax_on_clients -= C + C.screen -= C.parallax_master + C.screen -= C.parallax_spacemaster + C.screen -= C.parallax_dustmaster + return 0 + + if(!C.parallax_master) + C.parallax_master = new /obj/screen/plane_master/parallax_master + if(!C.parallax_spacemaster) + C.parallax_spacemaster = new /obj/screen/plane_master/parallax_spacemaster + if(!C.parallax_dustmaster) + C.parallax_dustmaster = new /obj/screen/plane_master/parallax_dustmaster + return 1 + +/datum/hud/proc/update_parallax2(forcerecalibrate = 0) + var/client/C = mymob.client + //DO WE HAVE TO REPLACE ALL THE LAYERS + + if(!C.parallax.len) + for(var/obj/screen/parallax/bgobj in parallax_icon) + var/obj/screen/parallax/parallax_layer = new /obj/screen/parallax + parallax_layer.appearance = bgobj.appearance + parallax_layer.base_offset_x = bgobj.base_offset_x + parallax_layer.base_offset_y = bgobj.base_offset_y + parallax_layer.parallax_speed = bgobj.parallax_speed + C.parallax += parallax_layer + + var/parallax_loaded = 0 + for(var/obj/screen/parallax/S in C.screen) + parallax_loaded = 1 + break + + if(forcerecalibrate || !parallax_loaded) + for(var/obj/screen/parallax/bgobj in C.parallax) + C.screen |= bgobj + + C.screen |= C.parallax_master + C.screen |= C.parallax_spacemaster + C.screen |= C.parallax_dustmaster + C.parallax_dustmaster.color = list(0,0,0,0) + if(C.prefs.space_dust) + C.parallax_dustmaster.color = list( + 1,0,0,0, + 0,1,0,0, + 0,0,1,0, + 0,0,0,1) + + if(!C.parallax_offset.len) + C.parallax_offset["horizontal"] = 0 + C.parallax_offset["vertical"] = 0 + +/datum/hud/proc/update_parallax3() + var/client/C = mymob.client + //ACTUALLY MOVING THE PARALLAX + var/turf/posobj = get_turf(C.eye) + + if(!C.previous_turf || (C.previous_turf.z != posobj.z)) + C.previous_turf = posobj + + var/x_diff = posobj.x - C.previous_turf.x + var/y_diff = posobj.y - C.previous_turf.y + if(x_diff == 0 && y_diff == 0) + return // Nothing to do here. + var/world_time = world.time + var/last_delay = world_time - C.last_parallax_shift + last_delay = min(last_delay, 4) + + //Doing it this way prevents parallax layers from "jumping" when you change Z-Levels. + C.parallax_offset["horizontal"] += x_diff + C.parallax_offset["vertical"] += y_diff + + C.previous_turf = posobj + C.last_parallax_shift = world_time + + for(var/obj/screen/parallax/bgobj in C.parallax) + if(bgobj.parallax_speed)//only the middle and front layers actually move + var/accumulated_offset_x = bgobj.base_offset_x - round(C.parallax_offset["horizontal"] * bgobj.parallax_speed * (C.prefs.parallax_speed/2)) + var/accumulated_offset_y = bgobj.base_offset_y - round(C.parallax_offset["vertical"] * bgobj.parallax_speed * (C.prefs.parallax_speed/2)) + + bgobj.last_accumulated_offset_x = accumulated_offset_x + bgobj.last_accumulated_offset_y = accumulated_offset_y + + while(accumulated_offset_x > 720) + accumulated_offset_x -= 1440 + while(accumulated_offset_x < -720) + accumulated_offset_x += 1440 + + while(accumulated_offset_y > 720) + accumulated_offset_y -= 1440 + while(accumulated_offset_y < -720) + accumulated_offset_y += 1440 + + bgobj.screen_loc = "CENTER-7:[accumulated_offset_x],CENTER-7:[accumulated_offset_y]" + else + bgobj.screen_loc = "CENTER-7:[bgobj.base_offset_x],CENTER-7:[bgobj.base_offset_y]" + +//Parallax generation code below + +#define PARALLAX4_ICON_NUMBER 20 +#define PARALLAX3_ICON_NUMBER 14 +#define PARALLAX2_ICON_NUMBER 10 + +/datum/controller/game_controller/proc/cachespaceparallax() + var/list/plane1 = list() + var/list/plane2 = list() + var/list/plane3 = list() + var/list/pixel_x = list() + var/list/pixel_y = list() + var/index = 1 + for(var/i = 0 to 224) + for(var/j = 1 to 9) + plane1 += rand(1,26) + plane2 += rand(1,26) + plane3 += rand(1,26) + pixel_x += 32 * (i%15) + pixel_y += 32 * round(i/15) + + for(var/i in 0 to 8) + var/obj/screen/parallax/parallax_layer = new /obj/screen/parallax() + + var/list/L = list() + for(var/j in 1 to 225) + if(plane1[j+i*225] <= PARALLAX4_ICON_NUMBER) + var/image/I = image('icons/turf/space_parallax4.dmi',"[plane1[j+i*225]]") + I.pixel_x = pixel_x[j] + I.pixel_y = pixel_y[j] + I.plane = PLANE_SPACE_PARALLAX + L += I + + parallax_layer.overlays = L + parallax_layer.parallax_speed = 0 + parallax_layer.plane = PLANE_SPACE_PARALLAX + calibrate_parallax(parallax_layer,i+1) + parallax_icon[index] = parallax_layer + index++ + + for(var/i in 0 to 8) + var/obj/screen/parallax/parallax_layer = new /obj/screen/parallax() + + var/list/L = list() + for(var/j in 1 to 225) + if(plane2[j+i*225] <= PARALLAX3_ICON_NUMBER) + var/image/I = image('icons/turf/space_parallax3.dmi',"[plane2[j+i*225]]") + I.pixel_x = pixel_x[j] + I.pixel_y = pixel_y[j] + I.plane = PLANE_SPACE_PARALLAX + L += I + + parallax_layer.overlays = L + parallax_layer.parallax_speed = 1 + parallax_layer.plane = PLANE_SPACE_PARALLAX + calibrate_parallax(parallax_layer,i+1) + parallax_icon[index] = parallax_layer + index++ + + for(var/i in 0 to 8) + var/obj/screen/parallax/parallax_layer = new /obj/screen/parallax() + var/list/L = list() + for(var/j in 1 to 225) + if(plane3[j+i*225] <= PARALLAX2_ICON_NUMBER) + var/image/I = image('icons/turf/space_parallax2.dmi',"[plane3[j+i*225]]") + I.pixel_x = pixel_x[j] + I.pixel_y = pixel_y[j] + I.plane = PLANE_SPACE_PARALLAX + L += I + + parallax_layer.overlays = L + parallax_layer.parallax_speed = 2 + parallax_layer.plane = PLANE_SPACE_PARALLAX + calibrate_parallax(parallax_layer,i+1) + parallax_icon[index] = parallax_layer + index++ + + parallax_initialized = 1 + +/proc/calibrate_parallax(var/obj/screen/parallax/p_layer,var/i) + if(!p_layer || !i) return + + /* Placement of screen objects + 1 2 3 + 4 5 6 + 7 8 9 + */ + switch(i) + if(1,4,7) + p_layer.base_offset_x = -480 + if(3,6,9) + p_layer.base_offset_x = 480 + switch(i) + if(1,2,3) + p_layer.base_offset_y = 480 + if(7,8,9) + p_layer.base_offset_y = -480 + +#undef PARALLAX4_ICON_NUMBER +#undef PARALLAX3_ICON_NUMBER +#undef PARALLAX2_ICON_NUMBER \ No newline at end of file diff --git a/code/controllers/Processes/vote.dm b/code/controllers/Processes/vote.dm deleted file mode 100644 index 47cf079eeba..00000000000 --- a/code/controllers/Processes/vote.dm +++ /dev/null @@ -1,7 +0,0 @@ -/datum/controller/process/vote/setup() - name = "vote" - schedule_interval = 10 // every second - log_startup_progress("Voting ticker starting up.") - -/datum/controller/process/vote/doWork() - vote.process() diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index c3c0ea77ddb..7e2308a4026 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -53,6 +53,11 @@ var/global/pipe_processing_killed = 0 setupgenetics() setupfactions() setup_economy() + + var/watch = start_watch() + log_startup_progress("Caching space parallax simulation...") + cachespaceparallax() + log_startup_progress(" Finished caching space parallax simulation in [stop_watch(watch)]s.") for(var/i=0, i= 2) - to_chat(world, "Voting aborted due to game start.") - src.reset() - return +/datum/controller/vote/proc/process() + if(mode) + // No more change mode votes after the game has started. + if(mode == "gamemode" && ticker.current_state >= GAME_STATE_SETTING_UP) + to_chat(world, "Voting aborted due to game start.") + reset() + return - // Calculate how much time is remaining by comparing current time, to time of vote start, - // plus vote duration - time_remaining = round((started_time + config.vote_period - world.time)/10) + // Calculate how much time is remaining by comparing current time, to time of vote start, + // plus vote duration + time_remaining = round((started_time + config.vote_period - world.time)/10) - if(time_remaining < 0) - result() - for(var/client/C in voting) - if(C) - C << browse(null,"window=vote;can_close=0") - reset() - else - for(var/client/C in voting) - if(C) - C << browse(vote.interface(C),"window=vote;can_close=0") + if(time_remaining < 0) + result() + for(var/client/C in voting) + if(C) + C << browse(null,"window=vote") + reset() + else + for(var/client/C in voting) + update_panel(C) + CHECK_TICK - voting.Cut() +/datum/controller/vote/proc/autotransfer() + initiate_vote("crew_transfer","the server") - proc/autotransfer() - initiate_vote("crew_transfer","the server") +/datum/controller/vote/proc/reset() + initiator = null + time_remaining = 0 + mode = null + question = null + choices.Cut() + voted.Cut() + voting.Cut() + current_votes.Cut() - proc/reset() - initiator = null - time_remaining = 0 - mode = null - question = null - choices.Cut() - voted.Cut() - voting.Cut() - current_votes.Cut() - - if(auto_muted && !config.ooc_allowed) - auto_muted = 0 - config.ooc_allowed = !( config.ooc_allowed ) - to_chat(world, "The OOC channel has been automatically enabled due to vote end.") - log_admin("OOC was toggled automatically due to vote end.") - message_admins("OOC has been toggled on automatically.") + if(auto_muted && !config.ooc_allowed) + auto_muted = 0 + config.ooc_allowed = !( config.ooc_allowed ) + to_chat(world, "The OOC channel has been automatically enabled due to vote end.") + log_admin("OOC was toggled automatically due to vote end.") + message_admins("OOC has been toggled on automatically.") - proc/get_result() - //get the highest number of votes - var/greatest_votes = 0 - var/total_votes = 0 +/datum/controller/vote/proc/get_result() + var/greatest_votes = 0 + var/total_votes = 0 + var/list/sorted_choices = list() + var/sorted_highest + var/sorted_votes = -1 + //get the highest number of votes, while also sorting the list + while(choices.len) + // This is a very inefficient sorting method, but that's okay for(var/option in choices) var/votes = choices[option] - total_votes += votes + if(sorted_votes < votes) + sorted_highest = option + sorted_votes = votes if(votes > greatest_votes) greatest_votes = votes - //default-vote for everyone who didn't vote - if(!config.vote_no_default && choices.len) - var/non_voters = (clients.len - total_votes) - if(non_voters > 0) - if(mode == "restart") - choices["Continue Playing"] += non_voters - if(choices["Continue Playing"] >= greatest_votes) - greatest_votes = choices["Continue Playing"] - else if(mode == "gamemode") - if(master_mode in choices) - choices[master_mode] += non_voters - if(choices[master_mode] >= greatest_votes) - greatest_votes = choices[master_mode] - else if(mode == "crew_transfer") - var/factor = 0.5 - switch(world.time / (10 * 60)) // minutes - if(0 to 60) - factor = 0.5 - if(61 to 120) - factor = 0.8 - if(121 to 240) - factor = 1 - if(241 to 300) - factor = 1.2 - else - factor = 1.4 - choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor) - to_chat(world, "Crew Transfer Factor: [factor]") - greatest_votes = max(choices["Initiate Crew Transfer"], choices["Continue The Round"]) - - - //get all options with that many votes and return them in a list - . = list() - if(greatest_votes) - for(var/option in choices) - if(choices[option] == greatest_votes) - . += option - return . - - proc/announce_result() - var/list/winners = get_result() - var/text - if(winners.len > 0) - if(winners.len > 1) - if(mode != "gamemode" || ticker.hide_mode == 0) // Here we are making sure we don't announce potential game modes - text = "Vote Tied Between:\n" - for(var/option in winners) - text += "\t[option]\n" - . = pick(winners) - - for(var/key in current_votes) - if(choices[current_votes[key]] == .) - round_voters += key // Keep track of who voted for the winning round. - if((mode == "gamemode" && . == "extended") || ticker.hide_mode == 0) // Announce Extended gamemode, but not other gamemodes - text += "Vote Result: [.]" - else - if(mode != "gamemode") - text += "Vote Result: [.]" - else - text += "The vote has ended." // What will be shown if it is a gamemode vote that isn't extended - - else - text += "Vote Result: Inconclusive - No Votes!" - log_vote(text) - to_chat(world, "[text]") - return . - - proc/result() - . = announce_result() - var/restart = 0 - if(.) - switch(mode) - if("restart") - if(. == "Restart Round") - restart = 1 - if("gamemode") - if(master_mode != .) - world.save_mode(.) - if(ticker && ticker.mode) - restart = 1 - else - master_mode = . - if(!going) - going = 1 - to_chat(world, "The round will start soon.") - if("crew_transfer") - if(. == "Initiate Crew Transfer") - init_shift_change(null, 1) - - - if(restart) - world.Reboot("Restart vote successful.", "end_error", "restart vote") - - return . - - proc/submit_vote(var/ckey, var/vote) - if(mode) - if(config.vote_no_dead && usr.stat == DEAD && !usr.client.holder) - return 0 - if(current_votes[ckey]) - choices[choices[current_votes[ckey]]]-- - if(vote && 1<=vote && vote<=choices.len) - voted += usr.ckey - choices[choices[vote]]++ //check this - current_votes[ckey] = vote - return vote - return 0 - - proc/initiate_vote(var/vote_type, var/initiator_key) - if(!mode) - if(started_time != null && !check_rights(R_ADMIN)) - var/next_allowed_time = (started_time + config.vote_delay) - if(next_allowed_time > world.time) - return 0 - - reset() - switch(vote_type) - if("restart") - choices.Add("Restart Round","Continue Playing") - if("gamemode") - if(ticker.current_state >= 2) - return 0 - choices.Add(config.votable_modes) - if("crew_transfer") - if(check_rights(R_ADMIN|R_MOD)) - if(ticker.current_state <= 2) - return 0 - question = "End the shift?" - choices.Add("Initiate Crew Transfer", "Continue The Round") + sorted_votes = -1 + total_votes += choices[sorted_highest] + sorted_choices[sorted_highest] = choices[sorted_highest] || 0 + choices -= sorted_highest + choices = sorted_choices + //default-vote for everyone who didn't vote + if(!config.vote_no_default && choices.len) + var/non_voters = (clients.len - total_votes) + if(non_voters > 0) + if(mode == "restart") + choices["Continue Playing"] += non_voters + if(choices["Continue Playing"] >= greatest_votes) + greatest_votes = choices["Continue Playing"] + else if(mode == "gamemode") + if(master_mode in choices) + choices[master_mode] += non_voters + if(choices[master_mode] >= greatest_votes) + greatest_votes = choices[master_mode] + else if(mode == "crew_transfer") + var/factor = 0.5 + switch(world.time / (10 * 60)) // minutes + if(0 to 60) + factor = 0.5 + if(61 to 120) + factor = 0.8 + if(121 to 240) + factor = 1 + if(241 to 300) + factor = 1.2 else - if(ticker.current_state <= 2) - return 0 - question = "End the shift?" - choices.Add("Initiate Crew Transfer", "Continue The Round") - if("custom") - question = html_encode(input(usr,"What is the vote for?") as text|null) - if(!question) return 0 - for(var/i=1,i<=10,i++) - var/option = capitalize(html_encode(input(usr,"Please enter an option or hit cancel to finish") as text|null)) - if(!option || mode || !usr.client) break - choices.Add(option) - else return 0 - mode = vote_type - initiator = initiator_key - started_time = world.time - var/text = "[capitalize(mode)] vote started by [initiator]." - if(mode == "custom") - text += "\n[question]" - - log_vote(text) - to_chat(world, "[text]\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote.") - switch(vote_type) - if("crew_transfer") - world << sound('sound/ambience/alarm4.ogg') - if("gamemode") - world << sound('sound/ambience/alarm4.ogg') - if("custom") - world << sound('sound/ambience/alarm4.ogg') - if(mode == "gamemode" && going) - going = 0 - to_chat(world, "Round start has been delayed.") - if(mode == "crew_transfer" && config.ooc_allowed) - auto_muted = 1 - config.ooc_allowed = !( config.ooc_allowed ) - to_chat(world, "The OOC channel has been automatically disabled due to a crew transfer vote.") - log_admin("OOC was toggled automatically due to crew_transfer vote.") - message_admins("OOC has been toggled off automatically.") - if(mode == "gamemode" && config.ooc_allowed) - auto_muted = 1 - config.ooc_allowed = !( config.ooc_allowed ) - to_chat(world, "The OOC channel has been automatically disabled due to the gamemode vote.") - log_admin("OOC was toggled automatically due to gamemode vote.") - message_admins("OOC has been toggled off automatically.") - if(mode == "custom" && config.ooc_allowed) - auto_muted = 1 - config.ooc_allowed = !( config.ooc_allowed ) - to_chat(world, "The OOC channel has been automatically disabled due to a custom vote.") - log_admin("OOC was toggled automatically due to custom vote.") - message_admins("OOC has been toggled off automatically.") + factor = 1.4 + choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor) + to_chat(world, "Crew Transfer Factor: [factor]") + greatest_votes = max(choices["Initiate Crew Transfer"], choices["Continue The Round"]) + //get all options with that many votes and return them in a list + . = list() + if(greatest_votes) + for(var/option in choices) + if(choices[option] == greatest_votes) + . += option + return . +/datum/controller/vote/proc/announce_result() + var/list/winners = get_result() + var/text + if(winners.len > 0) + if(winners.len > 1) + if(mode != "gamemode" || ticker.hide_mode == 0) // Here we are making sure we don't announce potential game modes + text = "Vote Tied Between:\n" + for(var/option in winners) + text += "\t[option]\n" + . = pick(winners) - time_remaining = round(config.vote_period/10) - return 1 - return 0 - - proc/interface(var/client/C) - if(!C) return - var/admin = check_rights(R_ADMIN,0) - voting |= C - - . = "Voting Panel" - if(mode) - if(question) . += "

Vote: '[question]'

" - else . += "

Vote: [capitalize(mode)]

" - . += "Time Left: [time_remaining] s

" - if(admin) - . += "(Cancel Vote) " + for(var/key in current_votes) + if(choices[current_votes[key]] == .) + round_voters += key // Keep track of who voted for the winning round. + if(mode == "gamemode" && (. == "extended" || ticker.hide_mode == 0)) // Announce Extended gamemode, but not other gamemodes + text += "Vote Result: [.] ([choices[.]] vote\s)" else - . += "

Start a vote:



" - . += "Close" - return . + else + text += "Vote Result: Inconclusive - No Votes!" + log_vote(text) + to_chat(world, "[text]") + return . - - Topic(href,href_list[],hsrc) - if(!usr || !usr.client) return //not necessary but meh...just in-case somebody does something stupid - var/admin = check_rights(R_ADMIN,0) - switch(href_list["vote"]) - if("close") - voting -= usr.client - usr << browse(null, "window=vote") - return - if("cancel") - if(admin) - reset() - if("toggle_restart") - if(admin) - config.allow_vote_restart = !config.allow_vote_restart - if("toggle_gamemode") - if(admin) - config.allow_vote_mode = !config.allow_vote_mode +/datum/controller/vote/proc/result() + . = announce_result() + var/restart = 0 + if(.) + switch(mode) if("restart") - if(config.allow_vote_restart || admin) - initiate_vote("restart",usr.key) + if(. == "Restart Round") + restart = 1 if("gamemode") - if(config.allow_vote_mode || admin) - initiate_vote("gamemode",usr.key) + if(master_mode != .) + world.save_mode(.) + if(ticker && ticker.mode) + restart = 1 + else + master_mode = . + if(!going) + going = 1 + to_chat(world, "The round will start soon.") if("crew_transfer") - if(config.allow_vote_restart || admin) - initiate_vote("crew_transfer",usr.key) + if(. == "Initiate Crew Transfer") + init_shift_change(null, 1) + + + if(restart) + world.Reboot("Restart vote successful.", "end_error", "restart vote") + + return . + +/datum/controller/vote/proc/submit_vote(var/ckey, var/vote) + if(mode) + if(config.vote_no_dead && usr.stat == DEAD && !usr.client.holder) + return 0 + if(current_votes[ckey]) + choices[choices[current_votes[ckey]]]-- + if(vote && 1<=vote && vote<=choices.len) + voted += usr.ckey + choices[choices[vote]]++ //check this + current_votes[ckey] = vote + return vote + return 0 + +/datum/controller/vote/proc/initiate_vote(var/vote_type, var/initiator_key) + if(!mode) + if(started_time != null && !check_rights(R_ADMIN)) + var/next_allowed_time = (started_time + config.vote_delay) + if(next_allowed_time > world.time) + return 0 + + reset() + switch(vote_type) + if("restart") + choices.Add("Restart Round","Continue Playing") + if("gamemode") + if(ticker.current_state >= 2) + return 0 + choices.Add(config.votable_modes) + if("crew_transfer") + if(check_rights(R_ADMIN|R_MOD)) + if(ticker.current_state <= 2) + return 0 + question = "End the shift?" + choices.Add("Initiate Crew Transfer", "Continue The Round") + else + if(ticker.current_state <= 2) + return 0 + question = "End the shift?" + choices.Add("Initiate Crew Transfer", "Continue The Round") if("custom") - if(admin) - initiate_vote("custom",usr.key) + question = html_encode(input(usr,"What is the vote for?") as text|null) + if(!question) return 0 + for(var/i=1,i<=10,i++) + var/option = capitalize(html_encode(input(usr,"Please enter an option or hit cancel to finish") as text|null)) + if(!option || mode || !usr.client) break + choices.Add(option) else - submit_vote(usr.ckey, round(text2num(href_list["vote"]))) - usr.vote() + return 0 + mode = vote_type + initiator = initiator_key + started_time = world.time + var/text = "[capitalize(mode)] vote started by [initiator]." + if(mode == "custom") + text += "\n[question]" + if(usr) + log_admin("[capitalize(mode)] ([question]) vote started by [key_name(usr)].") + else if(usr) + log_admin("[capitalize(mode)] vote started by [key_name(usr)].") + + log_vote(text) + to_chat(world, {"[text] + Click here or type vote to place your vote. + You have [config.vote_period/10] seconds to vote."}) + switch(vote_type) + if("crew_transfer") + world << sound('sound/ambience/alarm4.ogg') + if("gamemode") + world << sound('sound/ambience/alarm4.ogg') + if("custom") + world << sound('sound/ambience/alarm4.ogg') + if(mode == "gamemode" && going) + going = 0 + to_chat(world, "Round start has been delayed.") + if(mode == "crew_transfer" && config.ooc_allowed) + auto_muted = 1 + config.ooc_allowed = !( config.ooc_allowed ) + to_chat(world, "The OOC channel has been automatically disabled due to a crew transfer vote.") + log_admin("OOC was toggled automatically due to crew_transfer vote.") + message_admins("OOC has been toggled off automatically.") + if(mode == "gamemode" && config.ooc_allowed) + auto_muted = 1 + config.ooc_allowed = !( config.ooc_allowed ) + to_chat(world, "The OOC channel has been automatically disabled due to the gamemode vote.") + log_admin("OOC was toggled automatically due to gamemode vote.") + message_admins("OOC has been toggled off automatically.") + if(mode == "custom" && config.ooc_allowed) + auto_muted = 1 + config.ooc_allowed = !( config.ooc_allowed ) + to_chat(world, "The OOC channel has been automatically disabled due to a custom vote.") + log_admin("OOC was toggled automatically due to custom vote.") + message_admins("OOC has been toggled off automatically.") + + time_remaining = round(config.vote_period/10) + return 1 + return 0 + +/datum/controller/vote/proc/browse_to(var/client/C) + if(!C) + return + var/admin = check_rights(R_ADMIN, 0, user = C.mob) + voting |= C + + var/dat = {""} + if(mode) + dat += "
[vote_html(C)]

" + if(admin) + dat += "(Cancel Vote) " + else + dat += "

Start a vote:



" + var/datum/browser/popup = new(C.mob, "vote", "Voting Panel", nref=src) + popup.set_content(dat) + popup.open() + +/datum/controller/vote/proc/update_panel(var/client/C) + C << output(url_encode(vote_html(C)), "vote.browser:update_vote_div") + +/datum/controller/vote/proc/vote_html(var/client/C) + . = "" + if(question) + . += "

Vote: '[question]'

" + else + . += "

Vote: [capitalize(mode)]

" + . += "Time Left: [time_remaining] s
" + + +/datum/controller/vote/Topic(href,href_list[],hsrc) + if(!usr || !usr.client) + return //not necessary but meh...just in-case somebody does something stupid + var/admin = check_rights(R_ADMIN,0) + if(href_list["close"]) + voting -= usr.client + return + switch(href_list["vote"]) + if("open") + // vote proc will automatically get called after this switch ends + if("cancel") + if(admin && mode) + var/votedesc = capitalize(mode) + if(mode == "custom") + votedesc += " ([question])" + admin_log_and_message_admins("cancelled the running [votedesc] vote.") + reset() + if("toggle_restart") + if(admin) + config.allow_vote_restart = !config.allow_vote_restart + if("toggle_gamemode") + if(admin) + config.allow_vote_mode = !config.allow_vote_mode + if("restart") + if(config.allow_vote_restart || admin) + initiate_vote("restart",usr.key) + if("gamemode") + if(config.allow_vote_mode || admin) + initiate_vote("gamemode",usr.key) + if("crew_transfer") + if(config.allow_vote_restart || admin) + initiate_vote("crew_transfer",usr.key) + if("custom") + if(admin) + initiate_vote("custom",usr.key) + else + submit_vote(usr.ckey, round(text2num(href_list["vote"]))) + update_panel(usr.client) + return + usr.vote() /mob/verb/vote() @@ -355,4 +410,4 @@ datum/controller/vote set name = "Vote" if(vote) - src << browse(vote.interface(client),"window=vote;can_close=0") + vote.browse_to(client) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index e6461865bed..586cf8af512 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -24,13 +24,12 @@ body += debug_variable("icon", new/icon(A.icon, A.icon_state, A.dir), 0) #endif - var/icon/sprite + var/sprite if(istype(D,/atom)) var/atom/AT = D if(AT.icon && AT.icon_state) - sprite = new /icon(AT.icon, AT.icon_state) - usr << browse_rsc(sprite, "view_vars_sprite.png") + sprite = 1 title = "[D] (\ref[D]) = [D.type]" @@ -162,7 +161,7 @@ body += "
" if(sprite) - body += "
" + body += "
[bicon(D)]" else body += "
" @@ -351,26 +350,18 @@ body else if(isicon(value)) #ifdef VARSICON - var/icon/I = new/icon(value) - var/rnd = rand(1,10000) - var/rname = "tmp\ref[I][rnd].png" - usr << browse_rsc(I, rname) - html += "[name] = ([value]) " + html += "[name] = /icon ([value]) [bicon(value)]" #else html += "[name] = /icon ([value])" #endif -/* else if(istype(value, /image)) + else if(istype(value, /image)) #ifdef VARSICON - var/rnd = rand(1, 10000) - var/image/I = value - - src << browse_rsc(I.icon, "tmp\ref[value][rnd].png") - html += "[name] = " + html += "[name] \ref[value] = /image ([value]) [bicon(value)]" #else - html += "[name] = /image ([value])" + html += "[name] \ref[value] = /image ([value])" #endif -*/ + else if(isfile(value)) html += "[name] = '[value]'" diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index 83b3a4a226a..172c4b63757 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -43,11 +43,11 @@ Bonus return /datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A) - var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth())*1) + var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()) M.adjustOxyLoss(get_damage) return 1 /datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A) - var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth()*5)) + var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()*5) M.adjustOxyLoss(get_damage) return 1 \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/advance/symptoms/damage_converter.dm index eb7afcaf6be..cba4d4a4cd0 100644 --- a/code/datums/diseases/advance/symptoms/damage_converter.dm +++ b/code/datums/diseases/advance/symptoms/damage_converter.dm @@ -45,9 +45,11 @@ Bonus if(!parts.len) return - M.heal_overall_damage(get_damage, get_damage) + for(var/obj/item/organ/external/E in parts) + E.heal_damage(get_damage, get_damage, 0, 0) M.adjustToxLoss(get_damage*parts.len) + else if(M.getFireLoss() > 0 || M.getBruteLoss() > 0) M.adjustFireLoss(-get_damage) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 3ec0f16358a..9234b54b088 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -21,7 +21,7 @@ Bonus resistance = -4 stage_speed = -4 transmittable = -3 - level = 6 + level = 5 severity = 0 /datum/symptom/sensory_restoration/Activate(var/datum/disease/advance/A) @@ -38,12 +38,12 @@ Bonus M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10)) to_chat(M, "You feel sober.") if(4) - if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10) - M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10, "synaptizine"=5)) + if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaphydramine") < 10) + M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10, "synaphydramine"=5)) to_chat(M, "You feel focused.") if(5) - if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10 && M.reagents.get_reagent_amount("mannitol") < 10) - M.reagents.add_reagent_list(list("mannitol"=10, "antihol"=10, "oculine"=10, "synaptizine"=10)) + if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaphydramine") < 10 && M.reagents.get_reagent_amount("mannitol") < 10) + M.reagents.add_reagent_list(list("mannitol"=10, "antihol"=10, "oculine"=10, "synaphydramine"=10)) to_chat(M, "Your mind feels relaxed.") return diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 2863e8a595c..21ff9dcd3fc 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -276,11 +276,10 @@ text += "
enthralled" text = "[text]: " if(src in ticker.mode.vampire_enthralled) - text += "YES|no" + text += "YES|no" else text += "yes|NO" - sections["vampire"] = text @@ -948,6 +947,13 @@ log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") + else if(href_list["vampthrall"]) + switch(href_list["vampthrall"]) + if("clear") + if(src in ticker.mode.vampire_enthralled) + ticker.mode.remove_vampire_mind(src) + log_admin("[key_name(usr)] has de-vampthralled [key_name(current)]") + message_admins("[key_name_admin(usr)] has de-vampthralled [key_name_admin(current)]") else if(href_list["nuclear"]) var/mob/living/carbon/human/H = current @@ -990,6 +996,7 @@ qdel(H.head) qdel(H.shoes) qdel(H.wear_id) + qdel(H.wear_pda) qdel(H.wear_suit) qdel(H.w_uniform) @@ -1316,6 +1323,7 @@ qdel(H.head) qdel(H.shoes) qdel(H.wear_id) + qdel(H.wear_pda) qdel(H.wear_suit) qdel(H.w_uniform) diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm index 1824abaf6ae..73224f67d94 100644 --- a/code/defines/procs/admin.dm +++ b/code/defines/procs/admin.dm @@ -45,7 +45,7 @@ return . /proc/key_name_admin(var/whom, var/include_name = 1) - var/message = "[key_name(whom, 1, include_name)](?)[isAntag(whom) ? "(A)" : ""] ([admin_jump_link(whom, "holder")])" + var/message = "[key_name(whom, 1, include_name)](?)[isAntag(whom) ? "(A)" : ""][isSSD(whom) ? "(SSD!)" : ""] ([admin_jump_link(whom, "holder")])" return message /proc/log_and_message_admins(var/message as text) @@ -55,4 +55,3 @@ /proc/admin_log_and_message_admins(var/message as text) log_admin("[key_name(usr)] " + message) message_admins("[key_name_admin(usr)] " + message, 1) - \ No newline at end of file diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c8ba2b49c40..7e5c26b52e5 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -84,14 +84,14 @@ if(istype(A, /datum/reagent)) if(!reagents) reagents = new() - reagents.reagent_list.Add(A) - reagents.conditional_update() + reagents.reagent_list.Add(A) + reagents.conditional_update() else if(istype(A, /atom/movable)) var/atom/movable/M = A if(istype(M.loc, /mob/living)) var/mob/living/L = M.loc L.unEquip(M) - M.loc = src + M.forceMove(src) /atom/proc/assume_air(datum/gas_mixture/giver) qdel(giver) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index cb612eec455..89860ba76bb 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -104,6 +104,8 @@ if(. && buckled_mob && !handle_buckled_mob_movement(loc, direct)) //movement failed due to buckled mob . = 0 + + update_client_hook(loc) // Previously known as Crossed() @@ -144,9 +146,25 @@ for(var/datum/light_source/L in light_sources) L.source_atom.update_light() + + update_client_hook(destination) return 1 +/atom/movable/proc/update_client_hook(atom/destination) + if(locate(/mob) in src) + for(var/client/C in parallax_on_clients) + if((get_turf(C.eye) == destination) && (C.mob.hud_used)) + C.mob.hud_used.update_parallax() + +/mob/update_client_hook(atom/destination) + if(locate(/mob) in src) + for(var/client/C in parallax_on_clients) + if((get_turf(C.eye) == destination) && (C.mob.hud_used)) + C.mob.hud_used.update_parallax() + else if(client && hud_used) + hud_used.update_parallax() + //called when src is thrown into hit_atom /atom/movable/proc/throw_impact(atom/hit_atom, var/speed) if(istype(hit_atom,/mob/living)) diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index e2f4fc50c12..5b0884788b9 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -36,7 +36,6 @@ melee_damage_upper = 4 attacktext = "hits" attack_sound = 'sound/weapons/genhit1.ogg' - del_on_death = 1 speak_emote = list("pulses") var/obj/effect/blob/factory/factory = null var/list/human_overlays = list() @@ -92,6 +91,7 @@ loc.visible_message("The corpse of [H.name] suddenly rises!") /mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) + ..() // On death, create a small smoke of harmful gas (s-Acid) var/datum/effect/system/chem_smoke_spread/S = new var/turf/location = get_turf(src) @@ -108,7 +108,7 @@ S.attach(location) S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud S.start() - ..() + qdel(src) /mob/living/simple_animal/hostile/blob/blobspore/Destroy() if(factory) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 35d17607709..7d6ea9b4e7d 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -48,9 +48,7 @@ var/round_start_time = 0 to_chat(world, "Welcome to the pre-game lobby!") to_chat(world, "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds") while(current_state == GAME_STATE_PREGAME) - for(var/i=0, i<10, i++) - sleep(1) - vote.process() + sleep(10) if(going) pregame_timeleft-- diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 8a8dea25cf5..8a3fbd8ff60 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -240,7 +240,7 @@ //There's no define for this / get all items ? var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\ slot_wear_mask,slot_head,slot_shoes,slot_gloves,slot_l_ear,slot_r_ear,\ - slot_glasses,slot_belt,slot_s_store,slot_l_store,slot_r_store,slot_wear_id) + slot_glasses,slot_belt,slot_s_store,slot_l_store,slot_r_store,slot_wear_id,slot_wear_pda) for(var/slot in slots) var/obj/item/I = H.get_item_by_slot(slot) diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index fb287135dc7..735efbddd0f 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/device.dmi' icon_state = "pinoff" flags = CONDUCT - slot_flags = SLOT_BELT + slot_flags = SLOT_PDA | SLOT_BELT w_class = 2 item_state = "electronic" throw_speed = 4 diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index ae687d70116..825e1183529 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -799,7 +799,17 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \ /datum/objective/heist/inviolate_death explanation_text = "Follow the Inviolate. Minimise death and loss of resources." - completed = 1 + + check_completion() + var/vox_allowed_kills = 3 // The number of people the vox can accidently kill. Mostly a counter to people killing themselves if a raider touches them to force fail. + var/vox_total_kills = 0 + + var/datum/game_mode/heist/H = ticker.mode + for(var/datum/mind/raider in H.raiders) + vox_total_kills += raider.kills.len // Kills are listed in the mind; uses this to calculate vox kills + + if(vox_total_kills > vox_allowed_kills) return 0 + return 1 // Traders diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 3f33d84b978..b7c1d7920e1 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -409,6 +409,10 @@ var/global/list/multiverse = list() if(belt) M.equip_to_slot_or_del(new belt.type(M), slot_belt) + var/obj/pda = H.get_item_by_slot(slot_wear_pda) + if(pda) + M.equip_to_slot_or_del(new pda.type(M), slot_wear_pda) + var/obj/back = H.get_item_by_slot(slot_back) if(back) M.equip_to_slot_or_del(new back.type(M), slot_back) diff --git a/code/game/jobs/job/central.dm b/code/game/jobs/job/central.dm index 5bdb217ddc1..d5cba5be3d0 100644 --- a/code/game/jobs/job/central.dm +++ b/code/game/jobs/job/central.dm @@ -20,7 +20,7 @@ H.equip_or_collect(new /obj/item/clothing/gloves/color/white(H), slot_gloves) H.equip_or_collect(new /obj/item/device/radio/headset/centcom(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(H), slot_head) - H.equip_or_collect(new /obj/item/device/pda/centcom(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/centcom(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack) @@ -61,13 +61,13 @@ H.equip_or_collect(new /obj/item/clothing/gloves/combat(H), slot_gloves) H.equip_or_collect(new /obj/item/device/radio/headset/centcom(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer/navy(H), slot_head) - H.equip_or_collect(new /obj/item/device/pda/centcom(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/centcom(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/suit/space/deathsquad/officer(H), slot_wear_suit) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack) H.equip_or_collect(new /obj/item/weapon/implanter/dust(H), slot_in_backpack) - H.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(H), slot_in_backpack) + H.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(H), slot_belt) H.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(H), slot_in_backpack) var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 4b924204aef..73e3e5717d3 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -27,16 +27,16 @@ if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back) if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform) - H.equip_or_collect(new /obj/item/device/pda/heads/ce(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/heads/ce(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/head/hardhat/white(H), slot_head) + H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/gloves/color/black/ce(H), slot_gloves) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) else H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H.back), slot_in_backpack) - H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_in_backpack) return 1 @@ -64,14 +64,14 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes) + H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/head/hardhat(H), slot_head) H.equip_or_collect(new /obj/item/device/t_scanner(H), slot_r_store) - H.equip_or_collect(new /obj/item/device/pda/engineering(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/engineering(H), slot_wear_pda) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) else H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) - H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_in_backpack) return 1 @@ -99,12 +99,12 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/atmos(H), slot_belt) + H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/atmos(H), slot_wear_pda) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) else H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) - H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_in_backpack) return 1 /datum/job/mechanic @@ -129,12 +129,12 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/mechanic(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes) + H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/head/hardhat(H), slot_head) H.equip_or_collect(new /obj/item/device/t_scanner(H), slot_r_store) - H.equip_or_collect(new /obj/item/device/pda/engineering(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/engineering(H), slot_wear_pda) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) else H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) - H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_in_backpack) return 1 diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 59682dc6336..a064f0247f5 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -25,7 +25,7 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/heads/cmo(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/heads/cmo(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat/cmo(H), slot_wear_suit) H.equip_or_collect(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand) H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store) @@ -89,7 +89,7 @@ H.equip_or_collect(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/shoes/white(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_wear_pda) H.equip_or_collect(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand) H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store) if(H.backbag == 1) @@ -127,7 +127,7 @@ H.equip_or_collect(new /obj/item/clothing/glasses/science(H), slot_glasses) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chemist(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_belt) + H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_wear_pda) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/chemist(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -157,7 +157,7 @@ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_medsci(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/geneticist(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_belt) + H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_wear_pda) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/genetics(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) @@ -185,7 +185,7 @@ if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_vir(H), slot_back) if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform) - H.equip_or_collect(new /obj/item/device/pda/viro(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/viro(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/mask/surgical(H), slot_wear_mask) H.equip_or_collect(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat/virologist(H), slot_wear_suit) @@ -228,7 +228,7 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt) + H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_wear_pda) H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) @@ -257,7 +257,7 @@ if(H.backbag == 3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/medical/paramedic(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/mask/cigarette(H), slot_wear_mask) H.equip_or_collect(new /obj/item/clothing/head/soft/blue(H), slot_head) H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store) diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index b4cea5d2b21..eb23d9a2427 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -33,7 +33,7 @@ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/rd(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/research_director(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_belt) + H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_wear_pda) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) @@ -71,7 +71,7 @@ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/toxins(H), slot_belt) + H.equip_to_slot_or_del(new /obj/item/device/pda/toxins(H), slot_wear_pda) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/science(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -106,11 +106,11 @@ H.equip_or_collect(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/roboticist(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/roboticist(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit) + H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_in_backpack) return 1 diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 4fb9201fe07..fdf754df57f 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -28,7 +28,7 @@ H.equip_or_collect(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/suit/armor/hos(H), slot_wear_suit) - H.equip_or_collect(new /obj/item/device/pda/heads/hos(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/heads/hos(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/gloves/color/black/hos(H), slot_gloves) H.equip_or_collect(new /obj/item/clothing/head/HoS(H), slot_head) H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses) @@ -72,7 +72,7 @@ H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/warden(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/head/warden(H), slot_head) - H.equip_or_collect(new /obj/item/device/pda/warden(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/warden(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves) H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses) // H.equip_or_collect(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk @@ -115,7 +115,7 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/det(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/detective(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/detective(H), slot_wear_pda) H.equip_or_collect(new /obj/item/toy/crayon/white(H), slot_l_store) /* var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H) CIG.light("") @@ -173,7 +173,7 @@ H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/security(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head) - H.equip_or_collect(new /obj/item/device/pda/security(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves) H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store) H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store) @@ -212,7 +212,7 @@ H.equip_or_collect(new /obj/item/clothing/suit/storage/fr_jacket(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/glasses/hud/health/health_advanced, slot_glasses) H.equip_or_collect(new /obj/item/clothing/shoes/white(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_wear_pda) H.equip_or_collect(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand) H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store) if(H.backbag == 1) @@ -247,7 +247,7 @@ H.equip_or_collect(new /obj/item/clothing/under/rank/security(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/suit/jacket/pilot(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/security(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves) H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store) H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store) diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index b2a91688daa..7768cf11870 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -25,7 +25,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) U.accessories += M M.on_attached(U) H.equip_or_collect(U, slot_w_uniform) - H.equip_or_collect(new /obj/item/device/pda/captain(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/captain(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/capcarapace(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/head/caphat(H), slot_head) @@ -84,7 +84,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_or_collect(new /obj/item/clothing/under/rank/head_of_personnel(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/head/hopcap(H), slot_head) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/heads/hop(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/heads/hop(H), slot_wear_pda) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/ids(H), slot_r_hand) else @@ -130,7 +130,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_or_collect(new /obj/item/clothing/under/rank/ntrep(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/suit/storage/ntrep(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/shoes/centcom(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/heads/ntrep(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/heads/ntrep(H), slot_wear_pda) var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) L.imp_in = H L.implanted = 1 @@ -170,7 +170,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_or_collect(new /obj/item/clothing/glasses/hud/health/health_advanced, slot_glasses) H.equip_or_collect(new /obj/item/clothing/under/rank/blueshield(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/blueshield(H), slot_wear_suit) - H.equip_or_collect(new /obj/item/device/pda/heads/blueshield(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/heads/blueshield(H), slot_wear_pda) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/deathimp(H), slot_r_hand) @@ -216,7 +216,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_or_collect(new /obj/item/clothing/shoes/centcom(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/head/powdered_wig(H), slot_head) H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses) - H.equip_or_collect(new /obj/item/device/pda/heads/magistrate(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/heads/magistrate(H), slot_wear_pda) H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H.back), slot_in_backpack) H.equip_or_collect(new /obj/item/device/flash(H), slot_r_store) var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) @@ -251,7 +251,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_or_collect(new /obj/item/clothing/suit/storage/internalaffairs(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses) - H.equip_or_collect(new /obj/item/device/pda/lawyer(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/lawyer(H), slot_wear_pda) H.equip_or_collect(new /obj/item/weapon/storage/briefcase(H), slot_l_hand) H.equip_or_collect(new /obj/item/device/laser_pointer(H), slot_l_store) H.equip_or_collect(new /obj/item/device/flash(H), slot_r_store) diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index cbd7e896fdd..982d2be445f 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -22,7 +22,8 @@ H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform) - H.equip_or_collect(new /obj/item/device/pda/bar(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/bar(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/weapon/storage/belt/bandolier/full(H), slot_in_backpack) if(H.backbag == 1) var/obj/item/weapon/storage/box/survival/Barpack = new /obj/item/weapon/storage/box/survival(H) @@ -30,7 +31,6 @@ else H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack) H.equip_or_collect(new /obj/item/toy/russian_revolver(H.back), slot_in_backpack) - H.equip_or_collect(new /obj/item/weapon/storage/belt/bandolier/full(H), slot_in_backpack) H.dna.SetSEState(SOBERBLOCK,1) H.mutations += SOBER @@ -64,7 +64,7 @@ H.equip_or_collect(new /obj/item/clothing/suit/chef(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/head/chefhat(H), slot_head) - H.equip_or_collect(new /obj/item/device/pda/chef(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/chef(H), slot_wear_pda) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else @@ -99,7 +99,7 @@ H.equip_or_collect(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves) H.equip_or_collect(new /obj/item/clothing/suit/apron(H), slot_wear_suit) H.equip_or_collect(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store) - H.equip_or_collect(new /obj/item/device/pda/botanist(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/botanist(H), slot_wear_pda) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -128,7 +128,7 @@ H.equip_or_collect(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/under/rank/cargo(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/quartermaster(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/quartermaster(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses) H.equip_or_collect(new /obj/item/weapon/clipboard(H), slot_l_hand) if(H.backbag == 1) @@ -161,7 +161,7 @@ H.equip_or_collect(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/under/rank/cargotech(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/cargo(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/cargo(H), slot_wear_pda) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else @@ -196,7 +196,7 @@ H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/gloves/fingerless(H), slot_gloves) - H.equip_or_collect(new /obj/item/device/pda/shaftminer(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/shaftminer(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes) H.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/patch/styptic(H), slot_l_store) H.equip_or_collect(new /obj/item/device/flashlight/seclite(H), slot_r_store) @@ -234,7 +234,7 @@ H.equip_or_collect(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask) H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/shoes/clown_shoes(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/clown(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/clown(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask) H.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(H), slot_in_backpack) H.equip_or_collect(new /obj/item/weapon/bikehorn(H), slot_in_backpack) @@ -277,7 +277,7 @@ H.equip_or_collect(new /obj/item/clothing/mask/gas/mime(H), slot_wear_mask) H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/mime(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/mime(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/gloves/color/white(H), slot_gloves) H.equip_or_collect(new /obj/item/clothing/head/beret(H), slot_head) H.equip_or_collect(new /obj/item/clothing/suit/suspenders(H), slot_wear_suit) @@ -315,7 +315,7 @@ H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/janitor(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/janitor(H), slot_wear_pda) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else @@ -339,21 +339,20 @@ equip(var/mob/living/carbon/human/H) - if(!H) return 0 + if(!H) + return 0 switch(H.backbag) if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back) if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform) - H.equip_or_collect(new /obj/item/device/pda/librarian(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/librarian(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) - H.equip_or_collect(new /obj/item/weapon/barcodescanner(H), slot_l_hand) + H.equip_or_collect(new /obj/item/weapon/storage/bag/books(H), slot_l_hand) + H.equip_or_collect(new /obj/item/weapon/barcodescanner(H), slot_r_store) H.equip_or_collect(new /obj/item/device/laser_pointer(H), slot_l_store) - if(H.backbag == 1) - H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 /datum/job/barber diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index 2a1f7d5dae2..cec48fd834b 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -21,7 +21,7 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform) - H.equip_or_collect(new /obj/item/device/pda/chaplain(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/chaplain(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index cf158648c9a..2409bda62ba 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -594,7 +594,7 @@ var/global/datum/controller/occupations/job_master H.equip_to_slot_or_del(C, slot_wear_id) - H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_belt) + H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_wear_pda) if(locate(/obj/item/device/pda,H)) var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H) pda.owner = H.real_name diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 343f421b4e8..097efa2c75c 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -12,11 +12,12 @@ /obj/machinery/computer/aifixer/attackby(I as obj, user as mob, params) if(occupant && istype(I, /obj/item/weapon/screwdriver)) - if(stat & (NOPOWER|BROKEN)) + if(stat & BROKEN) + ..() + if(stat & NOPOWER) to_chat(user, "The screws on [name]'s screen won't budge.") else - to_chat(user, "The screws on [name]'s screen won't budge and it emits a warning beep.") - return + to_chat(user, "The screws on [name]'s screen won't budge and it emits a warning beep!.") else ..() @@ -135,3 +136,18 @@ to_chat(user, "ERROR: Reconstruction in progress.") else if(!occupant) to_chat(user, "ERROR: Unable to locate artificial intelligence.") + +/obj/machinery/computer/aifixer/Destroy() + if(occupant) + occupant.ghostize() + qdel(occupant) + occupant = null + return ..() + +/obj/machinery/computer/aifixer/emp_act() + if(occupant) + occupant.ghostize() + qdel(occupant) + occupant = null + else + ..() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 257c583814b..0c68064d913 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -458,7 +458,7 @@ // Book keeping! log_admin("[key_name(M)] has entered a stasis pod.") - message_admins("[key_name_admin(user)] has entered a stasis pod. (JMP)") + message_admins("[key_name_admin(M)] has entered a stasis pod. (JMP)") //Despawning occurs when process() is called with an occupant without a client. src.add_fingerprint(M) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 9c6b0fc548d..fb55eee1200 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -1,101 +1,127 @@ /obj/machinery/iv_drip name = "\improper IV drip" icon = 'icons/obj/iv_drip.dmi' + icon_state = "iv_drip" anchored = 0 density = 1 + var/mob/living/carbon/human/attached = null + var/mode = 1 // 1 is injecting, 0 is taking blood. + var/obj/item/weapon/reagent_containers/beaker = null +/obj/machinery/iv_drip/New() + ..() + update_icon() -/obj/machinery/iv_drip/var/mob/living/carbon/human/attached = null -/obj/machinery/iv_drip/var/mode = 1 // 1 is injecting, 0 is taking blood. -/obj/machinery/iv_drip/var/obj/item/weapon/reagent_containers/beaker = null +/obj/machinery/iv_drip/Destroy() + attached = null + if(beaker) + qdel(beaker) + beaker = null + return ..() /obj/machinery/iv_drip/update_icon() - if(src.attached) - icon_state = "hooked" + if(attached) + if(mode) + icon_state = "injecting" + else + icon_state = "donating" else - icon_state = "" + if(mode) + icon_state = "injectidle" + else + icon_state = "donateidle" - overlays = null + overlays.Cut() if(beaker) - var/datum/reagents/reagents = beaker.reagents - if(reagents.total_volume) + if(attached) + overlays += "beakeractive" + else + overlays += "beakeridle" + if(beaker.reagents.total_volume) var/image/filling = image('icons/obj/iv_drip.dmi', src, "reagent") - var/percent = round((reagents.total_volume / beaker.volume) * 100) + var/percent = round((beaker.reagents.total_volume / beaker.volume) * 100) switch(percent) - if(0 to 9) filling.icon_state = "reagent0" - if(10 to 24) filling.icon_state = "reagent10" - if(25 to 49) filling.icon_state = "reagent25" - if(50 to 74) filling.icon_state = "reagent50" - if(75 to 79) filling.icon_state = "reagent75" - if(80 to 90) filling.icon_state = "reagent80" - if(91 to INFINITY) filling.icon_state = "reagent100" + if(0 to 9) + filling.icon_state = "reagent0" + if(10 to 24) + filling.icon_state = "reagent10" + if(25 to 49) + filling.icon_state = "reagent25" + if(50 to 74) + filling.icon_state = "reagent50" + if(75 to 79) + filling.icon_state = "reagent75" + if(80 to 90) + filling.icon_state = "reagent80" + if(91 to INFINITY) + filling.icon_state = "reagent100" - filling.icon += mix_color_from_reagents(reagents.reagent_list) + filling.icon += mix_color_from_reagents(beaker.reagents.reagent_list) overlays += filling -/obj/machinery/iv_drip/MouseDrop(over_object, src_location, over_location) - ..() - - if(!ishuman(usr) && !isrobot(usr)) - return - - var/turf/T = get_turf(src) - if(!usr in range(1, T)) +/obj/machinery/iv_drip/MouseDrop(mob/living/target) + if(!ishuman(usr)) return if(attached) - visible_message("[src.attached] is detached from \the [src]") - src.attached = null - src.update_icon() + visible_message("[attached] is detached from [src].") + attached = null + update_icon() return - if(in_range(src, usr) && ishuman(over_object) && get_dist(over_object, src) <= 1) - visible_message("[usr] attaches \the [src] to \the [over_object].") - src.attached = over_object - src.update_icon() + if(!target.dna) + to_chat(usr, "The drip beeps: Warning, incompatible creature!") + return - -/obj/machinery/iv_drip/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/reagent_containers)) - if(!isnull(src.beaker)) - to_chat(user, "There is already a reagent container loaded!") - return - - if(user.drop_item()) - W.forceMove(src) - src.beaker = W - to_chat(user, "You attach \the [W] to \the [src].") - src.update_icon() - return + if(Adjacent(target) && usr.Adjacent(target)) + if(beaker) + usr.visible_message("[usr] attaches [src] to [target].", "You attach [src] to [target].") + attached = target + addAtProcessing() + update_icon() else - to_chat(user, "\The [W] is stuck to you!") + to_chat(usr, "There's nothing attached to the IV drip!") + +/obj/machinery/iv_drip/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/weapon/reagent_containers)) + if(beaker) + to_chat(user, "There is already a reagent container loaded!") + return + if(!user.drop_item()) + return + + W.forceMove(src) + beaker = W + to_chat(user, "You attach [W] to [src].") + update_icon() else return ..() /obj/machinery/iv_drip/process() - //set background = 1 + if(!attached) + return PROCESS_KILL - if(src.attached) + if(get_dist(src, attached) > 1 && isturf(attached.loc)) + to_chat(attached, "The IV drip needle is ripped out of you!") + attached.apply_damage(3, BRUTE, pick("r_arm", "l_arm")) + attached = null + update_icon() + return PROCESS_KILL - if(!(get_dist(src, src.attached) <= 1 && isturf(src.attached.loc))) - visible_message("The needle is ripped out of [src.attached], doesn't that hurt?") - src.attached:apply_damage(3, BRUTE, pick("r_arm", "l_arm")) - src.attached = null - src.update_icon() - return - - if(src.attached && src.beaker) + if(beaker) // Give blood if(mode) - if(src.beaker.volume > 0) - var/transfer_amount = REAGENTS_METABOLISM - if(istype(src.beaker, /obj/item/weapon/reagent_containers/blood)) + if(beaker.volume > 0) + var/transfer_amount = 5 + if(istype(beaker, /obj/item/weapon/reagent_containers/blood)) // speed up transfer on blood packs - transfer_amount = 4 - src.beaker.reagents.trans_to(src.attached, transfer_amount) + transfer_amount = 10 + var/fraction = min(transfer_amount/beaker.volume, 1) //the fraction that is transfered of the total volume + beaker.reagents.reaction(attached, INGEST, fraction) //make reagents reacts, but don't spam messages + beaker.reagents.trans_to(attached, transfer_amount) update_icon() // Take blood @@ -104,71 +130,111 @@ amount = min(amount, 4) // If the beaker is full, ping if(amount == 0) - if(prob(5)) visible_message("\The [src] pings.") + if(prob(5)) + visible_message("[src] pings.") return var/mob/living/carbon/human/T = attached - if(!istype(T)) return + if(!ishuman(T)) + return + if(!T.dna) return + if(NOCLONE in T.mutations) return - if(T.species && T.species.flags & NO_BLOOD) + if(T.species.flags & NO_BLOOD) return - // If the human is losing too much blood, beep. - if(T.vessel.get_reagent_amount("blood") < BLOOD_VOLUME_SAFE) if(prob(5)) - visible_message("\The [src] beeps loudly.") - - var/datum/reagent/B = T.take_blood(beaker,amount) - - if(B) - beaker.reagents.reagent_list |= B - beaker.reagents.update_total() - beaker.on_reagent_change() - beaker.reagents.handle_reactions() + if(T.species.exotic_blood) + T.vessel.trans_to(beaker, amount) update_icon() + else + var/datum/reagent/B = T.take_blood(beaker, amount) -/obj/machinery/iv_drip/attack_hand(mob/living/carbon/user) - if(!istype(user)) + if(B) + beaker.reagents.reagent_list |= B + beaker.reagents.update_total() + beaker.on_reagent_change() + beaker.reagents.handle_reactions() + update_icon() + + // If attached is losing too much blood, beep. + var/blood_type = attached.get_blood_name() + if(T.vessel.get_reagent_amount(blood_type) < BLOOD_VOLUME_SAFE && prob(5)) + visible_message("[src] beeps loudly.") + playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) + +/obj/machinery/iv_drip/attack_hand(mob/user) + if(!ishuman(user)) return - if(src.beaker) - src.beaker.loc = get_turf(src) - src.beaker = null + if(attached) + visible_message("[attached] is detached from [src]") + attached = null update_icon() + return + else if(beaker) + eject_beaker(user) else - return ..() + toggle_mode() +/obj/machinery/iv_drip/AltClick(mob/user) + ..() + if(user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!Adjacent(user)) + return + toggle_mode() -/obj/machinery/iv_drip/verb/toggle_mode() - set name = "Toggle Mode" +/obj/machinery/iv_drip/verb/eject_beaker(mob/user) set category = "Object" + set name = "Remove IV Container" set src in view(1) - if(!istype(usr, /mob/living)) - to_chat(usr, "\red You can't do that.") + if(!iscarbon(usr)) + to_chat(usr, "You can't do that!") return - if(usr.stat) + if(usr.incapacitated()) + return + + if(beaker) + beaker.forceMove(get_turf(src)) + beaker = null + update_icon() + +/obj/machinery/iv_drip/verb/toggle_mode() + set category = "Object" + set name = "Toggle Mode" + set src in view(1) + + if(!iscarbon(usr)) + to_chat(usr, "You can't do that!") + return + + if(usr.incapacitated()) return mode = !mode to_chat(usr, "The IV drip is now [mode ? "injecting" : "taking blood"].") + update_icon() /obj/machinery/iv_drip/examine(mob/user) ..(user) - if(!(user in view(2)) && usr != src.loc) return + if(!(user in view(2)) && user != loc) + return - to_chat(usr, "The IV drip is [mode ? "injecting" : "taking blood"].") + to_chat(user, "The IV drip is [mode ? "injecting" : "taking blood"].") if(beaker) if(beaker.reagents && beaker.reagents.reagent_list.len) - to_chat(user, "\blue Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.") + to_chat(user, "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.") else - to_chat(user, "\blue Attached is an empty [beaker].") + to_chat(user, "Attached is an empty [beaker].") else - to_chat(user, "\blue No chemicals are attached.") + to_chat(user, "No chemicals are attached.") - to_chat(user, "\blue [attached ? attached : "No one"] is attached.") + to_chat(user, "[attached ? attached : "No one"] is attached.") diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index ae299d78a90..c0ecd475f5e 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -361,10 +361,9 @@ Class Procs: return ..() -/obj/machinery/CheckParts() +/obj/machinery/CheckParts(list/parts_list) ..() RefreshParts() - return /obj/machinery/proc/RefreshParts() //Placeholder proc for machines that are built using frames. return diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index b6fc160a6f6..11b8b5c3d42 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -893,7 +893,7 @@ products = list(/obj/item/weapon/reagent_containers/glass/bottle/charcoal = 4,/obj/item/weapon/reagent_containers/glass/bottle/morphine = 4,/obj/item/weapon/reagent_containers/glass/bottle/ether = 4,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/weapon/reagent_containers/glass/bottle/toxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 6,/obj/item/weapon/reagent_containers/syringe/insulin = 4, /obj/item/weapon/reagent_containers/syringe = 12,/obj/item/device/healthanalyzer = 5,/obj/item/device/healthupgrade = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, - /obj/item/weapon/reagent_containers/dropper = 2,/obj/item/stack/medical/advanced/bruise_pack = 3, /obj/item/stack/medical/advanced/ointment = 3, + /obj/item/weapon/reagent_containers/dropper = 2,/obj/item/stack/medical/bruise_pack/advanced = 3, /obj/item/stack/medical/ointment/advanced = 3, /obj/item/stack/medical/bruise_pack = 3,/obj/item/stack/medical/splint = 2, /obj/item/device/sensor_device = 2) contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/pancuronium = 1,/obj/item/weapon/reagent_containers/glass/bottle/sulfonal = 1) @@ -947,7 +947,7 @@ icon_deny = "sec-deny" req_access_txt = "1" products = list(/obj/item/weapon/restraints/handcuffs = 8,/obj/item/weapon/restraints/handcuffs/cable/zipties = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5, - /obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6,/obj/item/device/flashlight/seclite = 4) + /obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6,/obj/item/device/flashlight/seclite = 4,/obj/item/weapon/restraints/legcuffs/bola/energy = 7) contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/fancy/donut_box = 2,/obj/item/device/hailer = 5) /obj/machinery/vending/hydronutrients diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 6660692ce62..00d2fcef75b 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -413,10 +413,10 @@ do_after_cooldown() return -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas - name = "PCMK-6 Bolas Launcher" - icon_state = "mecha_bolas" - projectile = /obj/item/weapon/legcuffs/bolas +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bola + name = "PCMK-6 Bola Launcher" + icon_state = "mecha_bola" + projectile = /obj/item/weapon/restraints/legcuffs/bola fire_sound = 'sound/weapons/whip.ogg' projectiles = 10 missile_speed = 1 @@ -424,19 +424,18 @@ projectile_energy_cost = 50 equip_cooldown = 10 -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas/can_attach(obj/mecha/combat/gygax/M as obj) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bola/can_attach(obj/mecha/combat/gygax/M as obj) if(..()) if(istype(M)) return 1 return 0 -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas/action(target, params) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bola/action(target, params) if(!action_checks(target)) return set_ready_state(0) - var/obj/item/weapon/legcuffs/bolas/M = new projectile(chassis.loc) + var/obj/item/weapon/restraints/legcuffs/bola/M = new projectile(chassis.loc) playsound(chassis, fire_sound, 50, 1) - M.thrown_from = src M.throw_at(target, missile_range, missile_speed) projectiles-- log_message("Fired from [name], targeting [target].") diff --git a/code/game/objects/effects/datacore-effect.dm b/code/game/objects/effects/datacore-effect.dm index 5c2fe3f5167..65d873666d1 100644 --- a/code/game/objects/effects/datacore-effect.dm +++ b/code/game/objects/effects/datacore-effect.dm @@ -158,6 +158,7 @@ var/global/list/PDA_Manifest = list() var/name = sanitize(t.fields["name"]) var/rank = sanitize(t.fields["rank"]) var/real_rank = t.fields["real_rank"] + var/isactive = t.fields["p_stat"] var/department = 0 var/depthead = 0 // Department Heads will be placed at the top of their lists. @@ -165,44 +166,44 @@ var/global/list/PDA_Manifest = list() heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 depthead = 1 - if(rank=="Captain" && heads.len != 1) - heads.Swap(1,heads.len) + if(rank == "Captain" && heads.len != 1) + heads.Swap(1, heads.len) if(real_rank in security_positions) sec[++sec.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 if(depthead && sec.len != 1) - sec.Swap(1,sec.len) + sec.Swap(1, sec.len) if(real_rank in engineering_positions) eng[++eng.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 if(depthead && eng.len != 1) - eng.Swap(1,eng.len) + eng.Swap(1, eng.len) if(real_rank in medical_positions) med[++med.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 if(depthead && med.len != 1) - med.Swap(1,med.len) + med.Swap(1, med.len) if(real_rank in science_positions) sci[++sci.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 if(depthead && sci.len != 1) - sci.Swap(1,sci.len) + sci.Swap(1, sci.len) if(real_rank in service_positions) ser[++ser.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 if(depthead && ser.len != 1) - ser.Swap(1,ser.len) + ser.Swap(1, ser.len) if(real_rank in supply_positions) sup[++sup.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 if(depthead && sup.len != 1) - sup.Swap(1,sup.len) + sup.Swap(1, sup.len) if(real_rank in nonhuman_positions) bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 0bab46e25fc..0293231c60e 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -82,7 +82,7 @@ /obj/item/device/t_scanner = 60, /obj/item/stack/cable_coil = 40, /obj/item/stack/cable_coil{amount = 5} = 60, - /obj/item/stack/medical/advanced/bruise_pack = 10, + /obj/item/stack/medical/bruise_pack/advanced = 10, /obj/item/stack/rods{amount = 10} = 80, /obj/item/stack/rods{amount = 23} = 20, /obj/item/stack/rods{amount = 50} = 10, diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 017583b7336..111f7c4dc33 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1,3 +1,5 @@ +var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.dmi', "icon_state" = "fire") + /obj/item name = "item" icon = 'icons/obj/items.dmi' diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 23085ea3d78..c34710d01f0 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -5,14 +5,14 @@ amount = 5 max_amount = 5 w_class = 1 - throw_speed = 4 - throw_range = 20 + throw_speed = 3 + throw_range = 7 var/heal_brute = 0 var/heal_burn = 0 -/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob) +/obj/item/stack/medical/attack(mob/living/carbon/M, mob/user) if(!istype(M)) - to_chat(user, "\The [src] cannot be applied to [M]!") + to_chat(user, "[src] cannot be applied to [M]!") return 1 if(!user.IsAdvancedToolUser()) @@ -40,12 +40,15 @@ H.UpdateDamageIcon() else - M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2)) - user.visible_message("[M] has been applied with [src] by [user].","You apply \the [src] to [M].") + M.heal_organ_damage(heal_brute/2, heal_burn/2) + user.visible_message("[M] has been applied with [src] by [user].", \ + "You apply [src] to [M].") use(1) M.updatehealth() +//Bruise Packs// + /obj/item/stack/medical/bruise_pack name = "roll of gauze" singular_name = "gauze length" @@ -53,94 +56,7 @@ icon_state = "gauze" origin_tech = "biotech=1" -/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob) - if(..()) - return 1 - - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) - - if(affecting.open == 0) - if(!affecting.bandage()) - to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been bandaged.") - return 1 - else - for(var/datum/wound/W in affecting.wounds) - if(W.internal) - continue - if(W.current_stage <= W.max_bleeding_stage) - user.visible_message( "\blue [user] bandages \the [W.desc] on [M]'s [affecting.name].", \ - "\blue You bandage \the [W.desc] on [M]'s [affecting.name]." ) - else if(istype(W,/datum/wound/bruise)) - user.visible_message( "\blue [user] places a bruise patch over \the [W.desc] on [M]'s [affecting.name].", \ - "\blue You place a bruise patch over \the [W.desc] on [M]'s [affecting.name]." ) - else - user.visible_message( "\blue [user] places a bandaid over \the [W.desc] on [M]'s [affecting.name].", \ - "\blue You place a bandaid over \the [W.desc] on [M]'s [affecting.name]." ) - - affecting.heal_damage(src.heal_brute, src.heal_burn, 0) - use(1) - else - M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2)) - use(1) - -/obj/item/stack/medical/ointment - name = "ointment" - desc = "Used to treat those nasty burns." - gender = PLURAL - singular_name = "ointment" - icon_state = "ointment" - heal_burn = 1 - origin_tech = "biotech=1" - -/obj/item/stack/medical/ointment/attack(mob/living/carbon/M as mob, mob/user as mob) - if(..()) - return 1 - - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) - - if(affecting.open == 0) - if(!affecting.salve()) - to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been salved.") - return 1 - else - user.visible_message( "\blue [user] salves the wounds on [M]'s [affecting.name].", \ - "\blue You salve the wounds on [M]'s [affecting.name]." ) - affecting.heal_damage(src.heal_brute, src.heal_burn, 0) - use(1) - else - to_chat(user, "The [affecting.name] is cut open, you'll need more than some ointment!") - -/obj/item/stack/medical/bruise_pack/comfrey - name = "\improper Comfrey leaf" - singular_name = "Comfrey leaf" - desc = "A soft leaf that is rubbed on bruises." - icon = 'icons/obj/hydroponics_products.dmi' - icon_state = "alien3-product" - color = "#378C61" - heal_brute = 7 - -/obj/item/stack/medical/ointment/aloe - name = "\improper Aloe Vera leaf" - singular_name = "Aloe Vera leaf" - desc = "A cold leaf that is rubbed on burns." - icon = 'icons/obj/hydroponics_products.dmi' - icon_state = "ambrosia-product" - color = "#4CC5C7" - heal_burn = 7 - -/obj/item/stack/medical/advanced/bruise_pack - name = "advanced trauma kit" - singular_name = "advanced trauma kit" - desc = "An advanced trauma kit for severe injuries." - icon_state = "traumakit" - heal_brute = 12 - origin_tech = "biotech=1" - -/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob) +/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M, mob/user) if(..()) return 1 @@ -153,38 +69,49 @@ var/disinfected = affecting.disinfect() if(!(bandaged || disinfected)) - to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been treated.") + to_chat(user, "The wounds on [M]'s [affecting.name] have already been bandaged.") return 1 else for(var/datum/wound/W in affecting.wounds) if(W.internal) continue if(W.current_stage <= W.max_bleeding_stage) - user.visible_message( "\blue [user] cleans \the [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.", \ - "\blue You clean and seal \the [W.desc] on [M]'s [affecting.name]." ) - //H.add_side_effect("Itch") + user.visible_message("[user] bandages \the [W.desc] on [M]'s [affecting.name].", \ + "You bandage \the [W.desc] on [M]'s [affecting.name]." ) else if(istype(W,/datum/wound/bruise)) - user.visible_message( "\blue [user] places a medicine patch over \the [W.desc] on [M]'s [affecting.name].", \ - "\blue You place a medicine patch over \the [W.desc] on [M]'s [affecting.name]." ) + user.visible_message("[user] places a bruise patch over \the [W.desc] on [M]'s [affecting.name].", \ + "You place a bruise patch over \the [W.desc] on [M]'s [affecting.name]." ) else - user.visible_message( "\blue [user] smears some bioglue over [W.desc] on [M]'s [affecting.name].", \ - "\blue You smear some bioglue over [W.desc] on [M]'s [affecting.name]." ) + user.visible_message("[user] places a bandaid over \the [W.desc] on [M]'s [affecting.name].", \ + "You place a bandaid over \the [W.desc] on [M]'s [affecting.name]." ) if(bandaged) - affecting.heal_damage(heal_brute,0) + affecting.heal_damage(heal_brute, heal_burn) use(1) else - to_chat(user, "The [affecting.name] is cut open, you'll need more than a bandage!") + to_chat(user, "[affecting] is cut open, you'll need more than a bandage!") -/obj/item/stack/medical/advanced/ointment - name = "advanced burn kit" - singular_name = "advanced burn kit" - desc = "An advanced treatment kit for severe burns." - icon_state = "burnkit" - heal_burn = 12 + +/obj/item/stack/medical/bruise_pack/advanced + name = "advanced trauma kit" + singular_name = "advanced trauma kit" + desc = "An advanced trauma kit for severe injuries." + icon_state = "traumakit" + heal_brute = 12 + + + +//Ointment// + + +/obj/item/stack/medical/ointment + name = "ointment" + desc = "Used to treat those nasty burns." + gender = PLURAL + singular_name = "ointment" + icon_state = "ointment" origin_tech = "biotech=1" - -/obj/item/stack/medical/advanced/ointment/attack(mob/living/carbon/M as mob, mob/user as mob) +/obj/item/stack/medical/ointment/attack(mob/living/carbon/M, mob/user) if(..()) return 1 @@ -194,15 +121,52 @@ if(affecting.open == 0) if(!affecting.salve()) - to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been salved.") + to_chat(user, "The wounds on [M]'s [affecting.name] have already been salved.") return 1 else - user.visible_message( "\blue [user] covers the wounds on [M]'s [affecting.name] with regenerative membrane.", \ - "\blue You cover the wounds on [M]'s [affecting.name] with regenerative membrane." ) - affecting.heal_damage(0,heal_burn) + user.visible_message("[user] salves the wounds on [M]'s [affecting.name].", \ + "You salve the wounds on [M]'s [affecting.name]." ) + affecting.heal_damage(heal_brute, heal_burn) use(1) else - to_chat(user, "The [affecting.name] is cut open, you'll need more than a bandage!") + to_chat(user, "[affecting] is cut open, you'll need more than some ointment!") + + +/obj/item/stack/medical/ointment/advanced + name = "advanced burn kit" + singular_name = "advanced burn kit" + desc = "An advanced treatment kit for severe burns." + icon_state = "burnkit" + heal_burn = 12 + + + +//Medical Herbs// + + +/obj/item/stack/medical/bruise_pack/comfrey + name = "\improper Comfrey leaf" + singular_name = "Comfrey leaf" + desc = "A soft leaf that is rubbed on bruises." + icon = 'icons/obj/hydroponics_products.dmi' + icon_state = "alien3-product" + color = "#378C61" + heal_brute = 7 + + +/obj/item/stack/medical/ointment/aloe + name = "\improper Aloe Vera leaf" + singular_name = "Aloe Vera leaf" + desc = "A cold leaf that is rubbed on burns." + icon = 'icons/obj/hydroponics_products.dmi' + icon_state = "ambrosia-product" + color = "#4CC5C7" + heal_burn = 7 + + + +//Splits// + /obj/item/stack/medical/splint name = "medical splints" @@ -211,11 +175,7 @@ amount = 5 max_amount = 5 -/obj/item/stack/medical/splint/single - amount = 1 - - -/obj/item/stack/medical/splint/attack(mob/living/carbon/M as mob, mob/user as mob) +/obj/item/stack/medical/splint/attack(mob/living/carbon/M, mob/user) if(..()) return 1 @@ -224,30 +184,39 @@ var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) var/limb = affecting.name if(!(affecting.limb_name in list("l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot"))) - to_chat(user, "\red You can't apply a splint there!") + to_chat(user, "You can't apply a splint there!") return if(affecting.status & ORGAN_SPLINTED) - to_chat(user, "\red [M]'s [limb] is already splinted!") + to_chat(user, "[M]'s [limb] is already splinted!") if(alert(user, "Would you like to remove the splint from [M]'s [limb]?", "Removing.", "Yes", "No") == "Yes") affecting.status &= ~ORGAN_SPLINTED - to_chat(user, "You remove the splint from [M]'s [limb].") + to_chat(user, "You remove the splint from [M]'s [limb].") return if(M != user) - user.visible_message("\red [user] starts to apply \the [src] to [M]'s [limb].", "\red You start to apply \the [src] to [M]'s [limb].", "\red You hear something being wrapped.") + user.visible_message("[user] starts to apply [src] to [M]'s [limb].", \ + "You start to apply [src] to [M]'s [limb].", \ + "You hear something being wrapped.") else if((!user.hand && affecting.limb_name in list("r_arm", "r_hand")) || (user.hand && affecting.limb_name in list("l_arm", "l_hand"))) - to_chat(user, "\red You can't apply a splint to the arm you're using!") + to_chat(user, "You can't apply a splint to the arm you're using!") return - user.visible_message("\red [user] starts to apply \the [src] to their [limb].", "\red You start to apply \the [src] to your [limb].", "\red You hear something being wrapped.") + user.visible_message("[user] starts to apply [src] to their [limb].", \ + "You start to apply [src] to your [limb].", \ + "You hear something being wrapped.") if(do_after(user, 50, target = M)) if(M != user) - user.visible_message("\red [user] finishes applying \the [src] to [M]'s [limb].", "\red You finish applying \the [src] to [M]'s [limb].", "\red You hear something being wrapped.") + user.visible_message("[user] finishes applying [src] to [M]'s [limb].", \ + "You finish applying [src] to [M]'s [limb].", \ + "You hear something being wrapped.") else if(prob(25)) - user.visible_message("\red [user] successfully applies \the [src] to their [limb].", "\red You successfully apply \the [src] to your [limb].", "\red You hear something being wrapped.") + user.visible_message("[user] successfully applies [src] to their [limb].", \ + "You successfully apply [src] to your [limb].", \ + "You hear something being wrapped.") else - user.visible_message("\red [user] fumbles \the [src].", "\red You fumble \the [src].", "\red You hear something being wrapped.") + user.visible_message("[user] fumbles [src].", + "You fumble [src].", + "You hear something being wrapped.") return affecting.status |= ORGAN_SPLINTED use(1) - return \ No newline at end of file diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 50dc5c3b467..98fa7a955ab 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -184,7 +184,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \ new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \ new/datum/stack_recipe("folder", /obj/item/weapon/folder), \ new/datum/stack_recipe("cardboard tube", /obj/item/weapon/c_tube), \ - new/datum/stack_recipe("large box", /obj/structure/closet/cardboard, 4), \ + new/datum/stack_recipe("cardboard box", /obj/structure/closet/cardboard, 4), \ ) /obj/item/stack/sheet/cardboard //BubbleWrap diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index dd5102a25d7..ec524314b71 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1372,7 +1372,7 @@ obj/item/toy/cards/deck/syndicate/black is_empty = 1 playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1) user.visible_message("The [src] goes off!") - M.apply_damage(200, "brute", "head", used_weapon = "Self-inflicted gunshot would to the head.", sharp=1) + M.apply_damage(200, BRUTE, "head", sharp =1, used_weapon = "Self-inflicted gunshot would to the head.") M.death() else user.visible_message("[user] lowers the [src] from their head.") diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 416608b77f7..aea1ebd3e1b 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -105,4 +105,28 @@ desc = "Damn son, where'd you find this?" icon_state = "air_horn" honk_sound = 'sound/items/AirHorn2.ogg' - cooldowntime = 50 \ No newline at end of file + cooldowntime = 50 + +/obj/item/weapon/bikehorn/golden + name = "golden bike horn" + desc = "Golden? Clearly, its made with bananium! Honk!" + icon_state = "gold_horn" + item_state = "gold_horn" + +/obj/item/weapon/bikehorn/golden/attack() + flip_mobs() + return ..() + +/obj/item/weapon/bikehorn/golden/attack_self(mob/user) + flip_mobs() + ..() + +/obj/item/weapon/bikehorn/golden/proc/flip_mobs(mob/living/carbon/M, mob/user) + if(!spam_flag) + var/turf/T = get_turf(src) + for(M in ohearers(7, T)) + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs) || H.ear_deaf) + continue + M.emote("flip") \ No newline at end of file diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 9ccff568b87..d14c48a761e 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -69,7 +69,7 @@ ratio = Ceiling(ratio*4) * 25 overlays += "[icon_state]-charge[ratio]" -/obj/item/weapon/defibrillator/CheckParts() +/obj/item/weapon/defibrillator/CheckParts(list/parts_list) ..() bcell = locate(/obj/item/weapon/stock_parts/cell) in contents update_icon() diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index c3a23b2ba7d..e595ab33afc 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -164,10 +164,13 @@ update_icon() return -/obj/item/weapon/flamethrower/CheckParts() +/obj/item/weapon/flamethrower/CheckParts(list/parts_list) ..() weldtool = locate(/obj/item/weapon/weldingtool) in contents igniter = locate(/obj/item/device/assembly/igniter) in contents + weldtool.status = 0 + igniter.secured = 0 + status = 1 update_icon() //Called from turf.dm turf/dblclick diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index cad1b7630e3..745afd967ee 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -93,7 +93,7 @@ else range = pick(2,2,2,3,3,3,4) -/obj/item/weapon/grenade/iedcasing/CheckParts() +/obj/item/weapon/grenade/iedcasing/CheckParts(list/parts_list) ..() var/obj/item/weapon/reagent_containers/food/drinks/cans/can = locate() in contents if(can) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 51f892ac50b..2fb7b0de0b8 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -65,8 +65,8 @@ /obj/item/weapon/restraints/handcuffs/cable name = "cable restraints" desc = "Looks like some cables tied together. Could be used to tie something up." - icon_state = "cuff_white" - item_state = "coil_red" + icon_state = "cuff_red" + materials = list(MAT_METAL=150, MAT_GLASS=75) breakouttime = 300 //Deciseconds = 30s cuffsound = 'sound/weapons/cablecuff.ogg' @@ -114,14 +114,28 @@ to_chat(user, "You wrap the cable restraint around the top of the rod.") qdel(src) else - to_chat(user, "You need one rod to make a wired rod.") + to_chat(user, "You need one rod to make a wired rod!") + else if(istype(I, /obj/item/stack/sheet/metal)) + var/obj/item/stack/sheet/metal/M = I + if(M.amount < 6) + to_chat(user, "You need at least six metal sheets to make good enough weights!") return + to_chat(user, "You begin to apply [I] to [src]...") + if(do_after(user, 35, target = src)) + var/obj/item/weapon/restraints/legcuffs/bola/S = new /obj/item/weapon/restraints/legcuffs/bola + M.use(6) + user.put_in_hands(S) + to_chat(user, "You make some weights out of [I] and tie them to [src].") + if(!remove_item_from_storage(user)) + user.unEquip(src) + qdel(src) /obj/item/weapon/restraints/handcuffs/cable/zipties name = "zipties" desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use." icon_state = "cuff_white" breakouttime = 450 //Deciseconds = 45s + materials = list() trashtype = /obj/item/weapon/restraints/handcuffs/cable/zipties/used /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user) diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 3e6c4f835f5..4dc192e065b 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -15,12 +15,17 @@ name = "bear trap" throw_speed = 1 throw_range = 1 - icon_state = "beartrap0" + icon_state = "beartrap" desc = "A trap used to catch bears and other legged creatures." var/armed = 0 + var/trap_damage = 20 var/obj/item/weapon/grenade/iedcasing/IED = null var/obj/item/device/assembly/signaler/sig = null +/obj/item/weapon/restraints/legcuffs/beartrap/New() + ..() + icon_state = "[initial(icon_state)][armed]" + /obj/item/weapon/restraints/legcuffs/beartrap/Destroy() if(IED) qdel(IED) @@ -35,14 +40,14 @@ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) return (BRUTELOSS) -/obj/item/weapon/restraints/legcuffs/beartrap/attack_self(mob/user as mob) +/obj/item/weapon/restraints/legcuffs/beartrap/attack_self(mob/user) ..() if(ishuman(user) && !user.stat && !user.restrained()) armed = !armed - icon_state = "beartrap[armed]" + icon_state = "[initial(icon_state)][armed]" to_chat(user, "[src] is now [armed ? "armed" : "disarmed"]") -/obj/item/weapon/restraints/legcuffs/beartrap/attackby(var/obj/item/I, mob/user as mob) //Let's get explosive. +/obj/item/weapon/restraints/legcuffs/beartrap/attackby(obj/item/I, mob/user) //Let's get explosive. if(istype(I, /obj/item/weapon/grenade/iedcasing)) if(IED) to_chat(user, "This beartrap already has an IED hooked up to it!") @@ -101,7 +106,7 @@ if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator)) var/mob/living/L = AM armed = 0 - icon_state = "beartrap0" + icon_state = "[initial(icon_state)][armed]" playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) L.visible_message("[L] triggers \the [src].", \ "You trigger \the [src]!") @@ -122,105 +127,85 @@ if(ishuman(AM)) var/mob/living/carbon/H = AM if(H.lying) - H.apply_damage(20,BRUTE,"chest") + H.apply_damage(trap_damage, BRUTE,"chest") else - H.apply_damage(20,BRUTE,(pick("l_leg", "r_leg"))) + H.apply_damage(trap_damage, BRUTE,(pick("l_leg", "r_leg"))) if(!H.legcuffed) //beartrap can't cuff you leg if there's already a beartrap or legcuffs. H.legcuffed = src - src.loc = H - H.update_inv_legcuffed(0) + forceMove(H) + H.update_inv_legcuffed() feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart. else - L.apply_damage(20,BRUTE) + L.apply_damage(trap_damage, BRUTE) ..() +/obj/item/weapon/restraints/legcuffs/beartrap/energy + name = "energy snare" + armed = 1 + icon_state = "e_snare" + trap_damage = 0 -/obj/item/weapon/legcuffs/bolas - name = "bolas" - desc = "An entangling bolas. Throw at your foes to trip them and prevent them from running." +/obj/item/weapon/restraints/legcuffs/beartrap/energy/New() + ..() + spawn(100) + if(!istype(loc, /mob)) + var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread + sparks.set_up(1, 1, src) + sparks.start() + qdel(src) + +/obj/item/weapon/restraints/legcuffs/beartrap/energy/dropped() + ..() + qdel(src) + +/obj/item/weapon/restraints/legcuffs/beartrap/energy/attack_hand(mob/user) + Crossed(user) //honk + +/obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg + breakouttime = 20 // Cyborgs shouldn't have a strong restraint + +/obj/item/weapon/restraints/legcuffs/bola + name = "bola" + desc = "A restraining device designed to be thrown at the target. Upon connecting with said target, it will wrap around their legs, making it difficult for them to move quickly." + icon_state = "bola" + breakouttime = 35//easy to apply, easy to break out of gender = NEUTER - icon = 'icons/obj/weapons.dmi' - icon_state = "bolas" - slot_flags = SLOT_BELT - throwforce = 2 + origin_tech = "engineering=3;combat=1" + var/weaken = 0 + +/obj/item/weapon/restraints/legcuffs/bola/throw_impact(atom/hit_atom) + if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed, + return//abort + var/mob/living/carbon/C = hit_atom + if(!C.legcuffed) + visible_message("[src] ensnares [C]!") + C.legcuffed = src + forceMove(C) + C.update_inv_legcuffed() + feedback_add_details("handcuffs","B") + to_chat(C, "[src] ensnares you!") + C.Weaken(weaken) + +/obj/item/weapon/restraints/legcuffs/bola/tactical //traitor variant + name = "reinforced bola" + desc = "A strong bola, made with a long steel chain. It looks heavy, enough so that it could trip somebody." + icon_state = "bola_r" + breakouttime = 70 + origin_tech = "engineering=4;combat=3" + weaken = 1 + +/obj/item/weapon/restraints/legcuffs/bola/energy //For Security + name = "energy bola" + desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests." + icon_state = "ebola" + hitsound = 'sound/weapons/tase.ogg' w_class = 2 - origin_tech = "materials=1" - attack_verb = list("lashed", "bludgeoned", "whipped") - force = 4 - breakouttime = 50 //10 seconds - throw_speed = 1 - throw_range = 10 - var/dispenser = 0 - var/throw_sound = 'sound/weapons/whip.ogg' - var/trip_prob = 60 - var/thrown_from + breakouttime = 60 -/obj/item/weapon/legcuffs/bolas/suicide_act(mob/living/user) - to_chat(viewers(user), "[user] is wrapping the [src.name] around \his neck! It looks like \he's trying to commit suicide.") - return(OXYLOSS) - -/obj/item/weapon/legcuffs/bolas/throw_at(var/atom/A, throw_range, throw_speed) - if(usr && !istype(thrown_from, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas)) //if there is a user, but not a mech - if(istype(usr, /mob/living/carbon/human)) //if the user is human - var/mob/living/carbon/human/H = usr - if((CLUMSY in H.mutations) && prob(50)) - to_chat(H, "You smack yourself in the face while swinging the [src]!") - H.Stun(2) - H.drop_item(src) - return - if(!thrown_from && usr) //if something hasn't set it already (like a mech does when it launches) - thrown_from = usr //then the user must have thrown it - if(!istype(thrown_from, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas)) - playsound(src, throw_sound, 20, 1) //because mechs play the sound anyways - var/turf/target = get_turf(A) - var/atom/movable/adjtarget = new /atom/movable - var/xadjust = 0 - var/yadjust = 0 - var/scaler = 0 //used to changed the normalised vector to the proper size - scaler = throw_range / max(abs(target.x - src.x), abs(target.y - src.y)) //whichever is larger magnitude is what we normalise to - if(target.x - src.x != 0) //just to avoid fucking with math for no reason - xadjust = round((target.x - src.x) * scaler) //normalised vector is now scaled up to throw_range - adjtarget.x = src.x + xadjust //the new target at max range - else - adjtarget.x = src.x - if(target.y - src.y != 0) - yadjust = round((target.y - src.y) * scaler) - adjtarget.y = src.y + yadjust - else - adjtarget.y = src.y - // log_admin("Adjusted target of [adjtarget.x] and [adjtarget.y], adjusted with [xadjust] and [yadjust] from [scaler]") - ..(get_turf(adjtarget), throw_range, throw_speed) - thrown_from = null - -/obj/item/weapon/legcuffs/bolas/throw_impact(atom/hit_atom) //Pomf was right, I was wrong - Comic - if(isliving(hit_atom) && hit_atom != usr) //if the target is a live creature other than the thrower - var/mob/living/M = hit_atom - if(ishuman(M)) //if they're a human species - var/mob/living/carbon/human/H = M - if(H.legcuffed) //if the target is already legcuffed (has to be walking) - throw_failed() - return - if(prob(trip_prob)) //this probability is up for change and mostly a placeholder - Comic - step(H, H.dir) - H.visible_message("[H] was tripped by the bolas!","Your legs have been tangled!"); - H.Stun(2) //used instead of setting damage in vars to avoid non-human targets being affected - H.Weaken(4) - H.legcuffed = src //applies legcuff properties inherited through legcuffs - src.loc = H - H.update_inv_legcuffed() - if(!H.legcuffed) //in case it didn't happen, we need a safety net - throw_failed() - else - M.Stun(2) //minor stun damage to anything not human - throw_failed() - return - -/obj/item/weapon/legcuffs/bolas/proc/throw_failed() //called when the throw doesn't entangle - //log_admin("Logged as [thrown_from]") - if(!thrown_from || !istype(thrown_from, /mob/living)) //in essence, if we don't know whether a person threw it - qdel(src) //destroy it, to stop infinite bolases - -/obj/item/weapon/legcuffs/bolas/Bump() - ..() - throw_failed() //allows a mech bolas to be destroyed +/obj/item/weapon/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom) + if(iscarbon(hit_atom)) + var/obj/item/weapon/restraints/legcuffs/beartrap/B = new /obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom)) + B.Crossed(hit_atom) + qdel(src) + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 7e251532bd1..a7741267d09 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -1,7 +1,5 @@ //NEVER USE THIS IT SUX -PETETHEGOAT -var/global/list/cached_icons = list() - /obj/item/weapon/reagent_containers/glass/paint desc = "It's a paint bucket." name = "paint bucket" @@ -10,220 +8,57 @@ var/global/list/cached_icons = list() item_state = "paintcan" materials = list(MAT_METAL=200) w_class = 3 - amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(10,20,30,50,70) + amount_per_transfer_from_this = 5 + possible_transfer_amounts = list(5,10,20,30,50,70) volume = 70 flags = OPENCONTAINER - var/paint_type = "" - afterattack(turf/simulated/target, mob/user, proximity) - if(!proximity) return - if(istype(target) && reagents.total_volume > 5) - for(var/mob/O in viewers(user)) - O.show_message("\red \The [target] has been splashed with something by [user]!", 1) - spawn(5) - reagents.reaction(target, TOUCH) - reagents.remove_any(5) - else - return ..() - - New() - if(paint_type == "remover") - name = "paint remover bucket" - else if(paint_type && lentext(paint_type) > 0) - name = paint_type + " " + name - ..() - reagents.add_reagent("paint_[paint_type]", volume) - - red - icon_state = "paint_red" - paint_type = "red" - - green - icon_state = "paint_green" - paint_type = "green" - - blue - icon_state = "paint_blue" - paint_type = "blue" - - yellow - icon_state = "paint_yellow" - paint_type = "yellow" - - violet - icon_state = "paint_violet" - paint_type = "violet" - - black - icon_state = "paint_black" - paint_type = "black" - - white - icon_state = "paint_white" - paint_type = "white" - - remover - paint_type = "remover" -/* -/obj/item/weapon/paint - name = "Paint Can" - desc = "Used to recolor floors and walls. Can not be removed by the janitor." - icon = 'icons/obj/items.dmi' - icon_state = "paint_neutral" - color = "FFFFFF" - item_state = "paintcan" - w_class = 3 - -/obj/item/weapon/paint/red - name = "Red paint" - color = "FF0000" - icon_state = "paint_red" - -/obj/item/weapon/paint/green - name = "Green paint" - color = "00FF00" - icon_state = "paint_green" - -/obj/item/weapon/paint/blue - name = "Blue paint" - color = "0000FF" - icon_state = "paint_blue" - -/obj/item/weapon/paint/yellow - name = "Yellow paint" - color = "FFFF00" - icon_state = "paint_yellow" - -/obj/item/weapon/paint/violet - name = "Violet paint" - color = "FF00FF" - icon_state = "paint_violet" - -/obj/item/weapon/paint/black - name = "Black paint" - color = "333333" - icon_state = "paint_black" - -/obj/item/weapon/paint/white - name = "White paint" - color = "FFFFFF" - icon_state = "paint_white" - - -/obj/item/weapon/paint/anycolor - name = "Any color" - icon_state = "paint_neutral" - - attack_self(mob/user as mob) - var/t1 = input(user, "Please select a color:", "Locking Computer", null) in list( "red", "blue", "green", "yellow", "black", "white") - if((user.get_active_hand() != src || user.stat || user.restrained())) - return - switch(t1) - if("red") - color = "FF0000" - if("blue") - color = "0000FF" - if("green") - color = "00FF00" - if("yellow") - color = "FFFF00" - if("violet") - color = "FF00FF" - if("white") - color = "FFFFFF" - if("black") - color = "333333" - icon_state = "paint_[t1]" - add_fingerprint(user) +/obj/item/weapon/reagent_containers/glass/paint/afterattack(turf/simulated/target, mob/user, proximity) + if(!proximity) return - - -/obj/item/weapon/paint/afterattack(turf/target, mob/user as mob, proximity) - if(!proximity) return - if(!istype(target) || istype(target, /turf/space)) - return - var/ind = "[initial(target.icon)][color]" - if(!cached_icons[ind]) - var/icon/overlay = new/icon(initial(target.icon)) - overlay.Blend("#[color]",ICON_MULTIPLY) - overlay.SetIntensity(1.4) - target.icon = overlay - cached_icons[ind] = target.icon + if(istype(target) && reagents.total_volume >= 5) + user.visible_message("[target] has been splashed with something by [user]!") + spawn(5) + reagents.reaction(target, TOUCH) + reagents.remove_any(5) else - target.icon = cached_icons[ind] - return + return ..() -/obj/item/weapon/paint/paint_remover - name = "Paint remover" - icon_state = "paint_neutral" +/obj/item/weapon/reagent_containers/glass/paint/red + name = "red paint bucket" + icon_state = "paint_red" + list_reagents = list("paint_red" = 70) - afterattack(turf/target, mob/user as mob) - if(istype(target) && target.icon != initial(target.icon)) - target.icon = initial(target.icon) - return -*/ +/obj/item/weapon/reagent_containers/glass/paint/green + name = "green paint bucket" + icon_state = "paint_green" + list_reagents = list("paint_green" = 70) -datum/reagent/paint - name = "Paint" - id = "paint_" - description = "Floor paint is used to color floor tiles." - reagent_state = 2 - color = "#808080" +/obj/item/weapon/reagent_containers/glass/paint/blue + name = "blue paint bucket" + icon_state = "paint_blue" + list_reagents = list("paint_blue" = 70) - reaction_turf(var/turf/T, var/volume) - if(!istype(T) || istype(T, /turf/space)) - return - T.color = color +/obj/item/weapon/reagent_containers/glass/paint/yellow + name = "yellow paint bucket" + icon_state = "paint_yellow" + list_reagents = list("paint_yellow" = 70) - reaction_obj(var/obj/O, var/volume) - ..() - if(istype(O,/obj/item/weapon/light)) - O.color = color +/obj/item/weapon/reagent_containers/glass/paint/violet + name = "violet paint bucket" + icon_state = "paint_violet" + list_reagents = list("paint_violet" = 70) - red - name = "Red Paint" - id = "paint_red" - color = "#FF0000" +/obj/item/weapon/reagent_containers/glass/paint/black + name = "black paint bucket" + icon_state = "paint_black" + list_reagents = list("paint_black" = 70) - green - name = "Green Paint" - color = "#00FF00" - id = "paint_green" +/obj/item/weapon/reagent_containers/glass/paint/white + name = "white paint bucket" + icon_state = "paint_white" + list_reagents = list("paint_white" = 70) - blue - name = "Blue Paint" - color = "#0000FF" - id = "paint_blue" - - yellow - name = "Yellow Paint" - color = "#FFFF00" - id = "paint_yellow" - - violet - name = "Violet Paint" - color = "#FF00FF" - id = "paint_violet" - - black - name = "Black Paint" - color = "#333333" - id = "paint_black" - - white - name = "White Paint" - color = "#FFFFFF" - id = "paint_white" - -datum/reagent/paint_remover - name = "Paint Remover" - id = "paint_remover" - description = "Paint remover is used to remove floor paint from floor tiles." - reagent_state = 2 - color = "#808080" - - reaction_turf(var/turf/T, var/volume) - if(istype(T) && T.icon != initial(T.icon)) - T.icon = initial(T.icon) - return +/obj/item/weapon/reagent_containers/glass/paint/remover + name = "paint remover bucket" + list_reagents = list("paint_remover" = 70) \ No newline at end of file diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index 88d3f202ac6..d7c33164543 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -141,6 +141,7 @@ /obj/item/stack/packageWrap = 8, /obj/item/pipe = 2) time = 300 + category = CAT_WEAPON /obj/item/weapon/pneumatic_cannon/proc/updateTank(obj/item/weapon/tank/thetank, removing = 0, mob/living/carbon/human/user) if(removing) diff --git a/code/game/objects/items/weapons/signs.dm b/code/game/objects/items/weapons/signs.dm index 2155aeb69c6..00ac859528d 100644 --- a/code/game/objects/items/weapons/signs.dm +++ b/code/game/objects/items/weapons/signs.dm @@ -40,4 +40,5 @@ result = /obj/item/weapon/picket_sign reqs = list(/obj/item/stack/rods = 1, /obj/item/stack/sheet/cardboard = 2) - time = 80 \ No newline at end of file + time = 80 + category = CAT_MISC \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 66cb11a9dd6..af4d9aa6008 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -375,7 +375,7 @@ max_combined_w_class = 21 max_w_class = 3 w_class = 4 //Bigger than a book because physics - can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/spellbook") //No bibles, consistent with bookcase + can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/storage/bible", "/obj/item/weapon/tome", "/obj/item/weapon/spellbook") /* * Trays - Agouri diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 43d0897b2f9..a0e3d4dd69e 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -181,8 +181,8 @@ "/obj/item/weapon/melee/classic_baton", "/obj/item/device/flashlight/seclite", "/obj/item/taperoll/police", - "/obj/item/weapon/melee/classic_baton/telescopic" - ) + "/obj/item/weapon/melee/classic_baton/telescopic", + "/obj/item/weapon/restraints/legcuffs/bola") /obj/item/weapon/storage/belt/security/sec/New() ..() @@ -476,7 +476,7 @@ allow_quick_empty = 1 can_hold = list( "/obj/item/weapon/grenade/smokebomb", - "/obj/item/weapon/legcuffs/bolas" + "/obj/item/weapon/restraints/legcuffs/bola" ) flags = NODROP @@ -492,8 +492,8 @@ new /obj/item/weapon/grenade/smokebomb(src) new /obj/item/weapon/grenade/smokebomb(src) new /obj/item/weapon/grenade/smokebomb(src) - new /obj/item/weapon/legcuffs/bolas(src) - new /obj/item/weapon/legcuffs/bolas(src) + new /obj/item/weapon/restraints/legcuffs/bola(src) + new /obj/item/weapon/restraints/legcuffs/bola(src) processing_objects.Add(src) cooldown = world.time @@ -504,7 +504,7 @@ for(S in src) smokecount++ bolacount = 0 - var/obj/item/weapon/legcuffs/bolas/B + var/obj/item/weapon/restraints/legcuffs/bola/B for(B in src) bolacount++ if(smokecount < 4) @@ -513,7 +513,7 @@ smokecount++ if(bolacount < 2) while(bolacount < 2) - new /obj/item/weapon/legcuffs/bolas(src) + new /obj/item/weapon/restraints/legcuffs/bola(src) bolacount++ cooldown = world.time update_icon() diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 8348bef8bb1..76cbc9ab102 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -705,3 +705,73 @@ new /obj/item/weapon/lipstick/green(src) new /obj/item/weapon/lipstick/blue(src) new /obj/item/weapon/lipstick/white(src) + +#define NODESIGN "None" +#define NANOTRASEN "NanotrasenStandard" +#define SYNDI "SyndiSnacks" +#define HEART "Heart" +#define SMILE "SmileyFace" + +/obj/item/weapon/storage/box/papersack + name = "paper sack" + desc = "A sack neatly crafted out of paper." + icon_state = "paperbag_None" + item_state = "paperbag_None" + foldable = null + var/design = NODESIGN + +/obj/item/weapon/storage/box/papersack/update_icon() + if(!contents.len) + icon_state = "[item_state]" + else icon_state = "[item_state]_closed" + +/obj/item/weapon/storage/box/papersack/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/weapon/pen)) + //if a pen is used on the sack, dialogue to change its design appears + if(contents.len) + to_chat(user, "You can't modify [src] with items still inside!") + return + var/list/designs = list(NODESIGN, NANOTRASEN, SYNDI, HEART, SMILE) + var/switchDesign = input("Select a Design:", "Paper Sack Design", designs[1]) as null|anything in designs + if(!switchDesign) + return + if(get_dist(usr, src) > 1 && !usr.incapacitated()) + to_chat(usr, "You have moved too far away!") + return + if(design == switchDesign) + return + to_chat(usr, "You make some modifications to [src] using your pen.") + design = switchDesign + icon_state = "paperbag_[design]" + item_state = "paperbag_[design]" + switch(design) + if(NODESIGN) + desc = "A sack neatly crafted out of paper." + if(NANOTRASEN) + desc = "A standard Nanotrasen paper lunch sack for loyal employees on the go." + if(SYNDI) + desc = "The design on this paper sack is a remnant of the notorious 'SyndieSnacks' program." + if(HEART) + desc = "A paper sack with a heart etched onto the side." + if(SMILE) + desc = "A paper sack with a crude smile etched onto the side." + return + else if(is_sharp(W)) + if(!contents.len) + if(item_state == "paperbag_None") + to_chat(user, "You cut eyeholes into [src].") + new /obj/item/clothing/head/papersack(user.loc) + qdel(src) + return + else if(item_state == "paperbag_SmileyFace") + to_chat(user, "You cut eyeholes into [src] and modify the design.") + new /obj/item/clothing/head/papersack/smiley(user.loc) + qdel(src) + return + return ..() + +#undef NODESIGN +#undef NANOTRASEN +#undef SYNDI +#undef HEART +#undef SMILE \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 82ee049d51d..0c03e65beab 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -140,11 +140,11 @@ ..() if(empty) return new /obj/item/weapon/reagent_containers/hypospray/autoinjector( src ) - new /obj/item/stack/medical/advanced/bruise_pack(src) - new /obj/item/stack/medical/advanced/bruise_pack(src) - new /obj/item/stack/medical/advanced/bruise_pack(src) - new /obj/item/stack/medical/advanced/ointment(src) - new /obj/item/stack/medical/advanced/ointment(src) + new /obj/item/stack/medical/bruise_pack/advanced(src) + new /obj/item/stack/medical/bruise_pack/advanced(src) + new /obj/item/stack/medical/bruise_pack/advanced(src) + new /obj/item/stack/medical/ointment/advanced(src) + new /obj/item/stack/medical/ointment/advanced(src) new /obj/item/stack/medical/splint(src) return diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 305befe2ecb..c0935f5d316 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -23,7 +23,7 @@ update_icon() return -/obj/item/weapon/melee/baton/CheckParts() +/obj/item/weapon/melee/baton/CheckParts(list/parts_list) ..() bcell = locate(/obj/item/weapon/stock_parts/cell) in contents update_icon() @@ -47,11 +47,11 @@ /obj/item/weapon/melee/baton/update_icon() if(status) - icon_state = "[initial(icon_state)]_active" + icon_state = "[initial(name)]_active" else if(!bcell) - icon_state = "[initial(icon_state)]_nocell" + icon_state = "[initial(name)]_nocell" else - icon_state = "[initial(icon_state)]" + icon_state = "[initial(name)]" /obj/item/weapon/melee/baton/examine(mob/user) ..(user) @@ -198,12 +198,4 @@ throwforce = 5 stunforce = 5 hitcost = 3750 - slot_flags = null - -/obj/item/weapon/melee/baton/cattleprod/update_icon() - if(status) - icon_state = "stunprod_active" - else if(!bcell) - icon_state = "stunprod_nocell" - else - icon_state = "stunprod" + slot_flags = null \ No newline at end of file diff --git a/code/game/objects/items/weapons/teleprod.dm b/code/game/objects/items/weapons/teleprod.dm new file mode 100644 index 00000000000..0bc1b23f6d6 --- /dev/null +++ b/code/game/objects/items/weapons/teleprod.dm @@ -0,0 +1,18 @@ +/obj/item/weapon/melee/baton/cattleprod/teleprod + name = "teleprod" + desc = "A prod with a bluespace crystal on the end. The crystal doesn't look too fun to touch." + icon_state = "teleprod_nocell" + item_state = "teleprod" + origin_tech = "combat=2;bluespace=4;materials=3" + +/obj/item/weapon/melee/baton/cattleprod/teleprod/attack(mob/living/carbon/M, mob/living/carbon/user)//handles making things teleport when hit + ..() + if(status) + if((CLUMSY in user.mutations) && prob(50)) + user.visible_message("[user] accidentally hits themself with [src]!", \ + "You accidentally hit yourself with [src]!") + user.Weaken(stunforce*3) + deductcharge(hitcost) + do_teleport(user, get_turf(user), 50)//honk honk + else if(iscarbon(M) && !M.anchored) + do_teleport(M, get_turf(M), 15) \ No newline at end of file diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 7ecbef740cd..88138657270 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -283,20 +283,90 @@ w_class = 4 slot_flags = SLOT_BACK force_unwielded = 10 - force_wielded = 18 // Was 13, Buffed - RR + force_wielded = 18 throwforce = 20 - throw_speed = 3 + throw_speed = 4 armour_penetration = 10 - no_spin_thrown = 1 // Thrown spears that spin look dumb. -Fox + materials = list(MAT_METAL=1150, MAT_GLASS=2075) + hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") + sharp = 1 + edge = 1 + no_spin_thrown = 1 + var/obj/item/weapon/grenade/explosive = null + var/war_cry = "AAAAARGH!!!" /obj/item/weapon/twohanded/spear/update_icon() - icon_state = "spearglass[wielded]" - return + if(explosive) + icon_state = "spearbomb[wielded]" + else + icon_state = "spearglass[wielded]" -/obj/item/weapon/twohanded/spear/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - return ..() +/obj/item/weapon/twohanded/spear/afterattack(atom/movable/AM, mob/user, proximity) + if(!proximity) + return + if(isturf(AM)) //So you can actually melee with it + return + if(explosive && wielded) + user.say("[war_cry]") + explosive.forceMove(AM) + explosive.prime() + qdel(src) + +/obj/item/weapon/twohanded/spear/throw_impact(atom/target) + . = ..() + if(explosive) + explosive.prime() + qdel(src) + +/obj/item/weapon/twohanded/spear/AltClick(mob/user) + ..() + if(!explosive) + return + if(ismob(loc)) + var/mob/M = loc + var/input = stripped_input(M, "What do you want your war cry to be? You will shout it when you hit someone in melee.", ,"", 50) + if(input) + war_cry = input + +/obj/item/weapon/twohanded/spear/CheckParts(list/parts_list) + ..() + if(explosive) + explosive.forceMove(get_turf(loc)) + explosive = null + update_icon() + var/obj/item/weapon/grenade/G = locate() in contents + if(G) + explosive = G + name = "explosive lance" + desc = "A makeshift spear with [G] attached to it. Alt+click on the spear to set your war cry!" + update_icon() + +//GREY TIDE +/obj/item/weapon/twohanded/spear/grey_tide + icon_state = "spearglass0" + name = "\improper Grey Tide" + desc = "Recovered from the aftermath of a revolt aboard Defense Outpost Theta Aegis, in which a seemingly endless tide of Assistants caused heavy casualities among Nanotrasen military forces." + force_unwielded = 15 + force_wielded = 25 + throwforce = 20 + throw_speed = 4 + attack_verb = list("gored") + +/obj/item/weapon/twohanded/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity) + ..() + if(!proximity) + return + user.faction |= "greytide(\ref[user])" + if(isliving(AM)) + var/mob/living/L = AM + if(istype (L, /mob/living/simple_animal/hostile/illusion)) + return + if(!L.stat && prob(50)) + var/mob/living/simple_animal/hostile/illusion/M = new(user.loc) + M.faction = user.faction.Copy() + M.Copy_Parent(user, 100, user.health/2.5, 12, 30) + M.GiveTarget(L) //Putting heads on spears /obj/item/organ/external/head/attackby(var/obj/item/weapon/W, var/mob/living/user, params) @@ -348,6 +418,53 @@ name = "Kidan spear" desc = "A spear brought over from the Kidan homeworld." +// DIY CHAINSAW +/obj/item/weapon/twohanded/required/chainsaw + name = "chainsaw" + desc = "A versatile power tool. Useful for limbing trees and delimbing humans." + icon_state = "gchainsaw_off" + flags = CONDUCT + force = 13 + w_class = 5 + throwforce = 13 + throw_speed = 2 + throw_range = 4 + materials = list(MAT_METAL=13000) + origin_tech = "materials=3;engineering=4;combat=2" + attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered") + hitsound = "swing_hit" + sharp = 1 + edge = 1 + actions_types = list(/datum/action/item_action/startchainsaw) + var/on = 0 + +/obj/item/weapon/twohanded/required/chainsaw/attack_self(mob/user) + on = !on + to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]") + if(on) + playsound(loc, 'sound/weapons/chainsawstart.ogg', 50, 1) + force = on ? 21 : 13 + throwforce = on ? 21 : 13 + icon_state = "gchainsaw_[on ? "on" : "off"]" + + if(hitsound == "swing_hit") + hitsound = 'sound/weapons/chainsaw.ogg' + else + hitsound = "swing_hit" + + if(src == user.get_active_hand()) //update inhands + user.update_inv_l_hand() + user.update_inv_r_hand() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/weapon/twohanded/required/chainsaw/doomslayer + name = "OOOH BABY" + desc = "VRRRRRRR!!!" + armour_penetration = 100 + + ///CHAINSAW/// /obj/item/weapon/twohanded/chainsaw icon_state = "chainsaw0" diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index c62df2f6cca..a12f804d308 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -66,6 +66,14 @@ handle_rotation() return +/obj/structure/stool/bed/chair/AltClick(mob/user) + if(user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!Adjacent(user)) + return + rotate() + // Chair types /obj/structure/stool/bed/chair/wood // TODO: Special ash subtype that looks like charred chair legs diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index eabfcba148b..b93ec3979f4 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -78,7 +78,7 @@ last_delay = current_tube.enter_delay(src, next_dir) sleep(last_delay) dir = next_dir - loc = next_loc // When moving from one tube to another, skip collision and such. + forceMove(next_loc) // When moving from one tube to another, skip collision and such. density = current_tube.density if(current_tube && current_tube.should_stop_pod(src, next_dir)) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 47e0823f549..4e41daef289 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -322,6 +322,14 @@ obj/structure/windoor_assembly/Destroy() update_icon() return +/obj/structure/windoor_assembly/AltClick(mob/user) + if(user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!Adjacent(user)) + return + revrotate() + //Flips the windoor assembly, determines whather the door opens to the left or the right /obj/structure/windoor_assembly/verb/flip() set name = "Flip Windoor Assembly" diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 2293e04a746..7ae2ddcd27d 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -318,6 +318,14 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f return +/obj/structure/window/AltClick(mob/user) + if(user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!Adjacent(user)) + return + revrotate() + /* /obj/structure/window/proc/updateSilicate() if(silicateIcon && silicate) diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 93c0368f268..5f8543ca934 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -241,7 +241,7 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/engineer(M), slot_back) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/responseteam(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt) var/obj/item/weapon/card/id/W = new(src) W.assignment = "Emergency Response Team Member" @@ -256,7 +256,7 @@ var/ert_request_answered = 0 pda.ownjob = "Emergency Response Team Member" pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.icon_state = "pda-engineer" - M.equip_to_slot_or_del(pda, slot_belt) + M.equip_to_slot_or_del(pda, slot_wear_pda) if("Security") @@ -265,7 +265,7 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/security(M), slot_back) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/responseteam(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/response_team(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/response_team(M), slot_belt) var/obj/item/weapon/card/id/W = new(src) W.assignment = "Emergency Response Team Member" @@ -280,7 +280,7 @@ var/ert_request_answered = 0 pda.ownjob = "Emergency Response Team Member" pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.icon_state = "pda-security" - M.equip_to_slot_or_del(pda, slot_belt) + M.equip_to_slot_or_del(pda, slot_wear_pda) if("Medic") @@ -302,7 +302,7 @@ var/ert_request_answered = 0 pda.ownjob = "Emergency Response Team Member" pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.icon_state = "pda-medical" - M.equip_to_slot_or_del(pda, slot_belt) + M.equip_to_slot_or_del(pda, slot_wear_pda) if("Commander") @@ -329,7 +329,7 @@ var/ert_request_answered = 0 pda.owner = M.real_name pda.ownjob = "Emergency Response Team Leader" pda.name = "PDA-[M.real_name] ([pda.ownjob])" - M.equip_to_slot_or_del(pda, slot_belt) + M.equip_to_slot_or_del(pda, slot_wear_pda) /datum/response_team/proc/cannot_send_team() command_announcement.Announce("[station_name()], we are unfortunately unable to send you an Emergency Response Team at this time.", "ERT Unavailable") @@ -382,12 +382,13 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/ert/medical(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical/response_team(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/ert/medical(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/o2(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/brute(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical/response_team(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/CMO(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store) @@ -398,11 +399,12 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/ert/command(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/ert/command(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store) @@ -420,7 +422,7 @@ var/ert_request_answered = 0 switch(officer_type) if("Engineer") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/engi(M), slot_s_store) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(M), slot_glasses) @@ -440,7 +442,7 @@ var/ert_request_answered = 0 if("Security") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/security(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_s_store) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) @@ -458,10 +460,11 @@ var/ert_request_answered = 0 if("Medic") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex/nitrile(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/health_advanced(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_belt) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/medical(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_in_backpack) @@ -470,22 +473,22 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/surgery(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/CMO(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store) if("Commander") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/commander(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/commander(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store) @@ -504,7 +507,7 @@ var/ert_request_answered = 0 switch(officer_type) if("Engineer") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_s_store) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/night(M), slot_glasses) @@ -544,12 +547,12 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/night(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/medical(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/surgery(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store) @@ -562,13 +565,13 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/commander(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/night(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/commander(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 48f892caff0..3abf518c7f8 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -4,6 +4,8 @@ icon_state = "0" dynamic_lighting = 0 luminosity = 1 + + plane = PLANE_SPACE_BACKGROUND temperature = TCMB thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT @@ -18,6 +20,11 @@ if(!istype(src, /turf/space/transit)) icon_state = "[((x + y) ^ ~(x * y) + z) % 25]" + var/image/I = image('icons/turf/space_parallax1.dmi',"[icon_state]") + I.plane = PLANE_SPACE_DUST + I.alpha = 80 + I.blend_mode = BLEND_ADD + overlays += I update_starlight() /turf/space/Destroy() diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index 1b7c9343ca2..685e399ee12 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -1,4 +1,5 @@ /turf/space/transit + plane = 0 var/pushdirection // push things that get caught in the transit tile this direction //Overwrite because we dont want people building rods in space. diff --git a/code/modules/admin/buildmode.dm b/code/modules/admin/buildmode.dm index 34fcd5738c2..db97d7eb5ec 100644 --- a/code/modules/admin/buildmode.dm +++ b/code/modules/admin/buildmode.dm @@ -7,7 +7,8 @@ #define AREAEDIT_BUILDMODE 7 #define FILL_BUILDMODE 8 #define LINK_BUILDMODE 9 -#define NUM_BUILDMODES 9 +#define BOOM_BUILDMODE 10 +#define NUM_BUILDMODES 10 /obj/screen/buildmode icon = 'icons/misc/buildmode.dmi' @@ -167,6 +168,12 @@ var/list/link_lines = list() var/obj/link_obj var/valid_links = 0 + //Explosion mode + var/devastation = -1 + var/heavy = -1 + var/light = -1 + var/flash = -1 + var/flames = -1 /datum/click_intercept/buildmode/New(client/c) ..() @@ -250,6 +257,10 @@ to_chat(user, "Left Mouse Button on obj = Select button to link") to_chat(user, "Right Mouse Button on obj = Link/unlink to selected button") to_chat(user, "***********************************************************") + if(BOOM_BUILDMODE) + to_chat(user, "***********************************************************") + to_chat(user, "Mouse Button on obj = Kaboom") + to_chat(user, "***********************************************************") /datum/click_intercept/buildmode/proc/change_settings(mob/user) switch(mode) @@ -322,6 +333,17 @@ if(ispath(objholder,/mob) && !check_rights(R_DEBUG,0)) objholder = /obj/structure/closet deselect_region() + if(BOOM_BUILDMODE) + devastation = input("Range of total devastation. -1 to none", text("Input")) as num|null + if(devastation == null) devastation = -1 + var/heavy = input("Range of heavy impact. -1 to none", text("Input")) as num|null + if(heavy == null) heavy = -1 + var/light = input("Range of light impact. -1 to none", text("Input")) as num|null + if(light == null) light = -1 + var/flash = input("Range of flash. -1 to none", text("Input")) as num|null + if(flash == null) flash = -1 + var/flames = input("Range of flames. -1 to none", text("Input")) as num|null + if(flames == null) flames = -1 /datum/click_intercept/buildmode/proc/change_dir() switch(build_dir) @@ -601,3 +623,5 @@ var/obj/effect/buildmode_line/L2 = new(holder, P, M, "[M.name] to [P.name]") // Yes, reversed one so that you can see it from both sides. L2.color = L.color link_lines += L2 + if(BOOM_BUILDMODE) + explosion(object, devastation, heavy, light, flash, null, null,flames) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index c04940a3cfa..01f6736e5ca 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -593,17 +593,25 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that "tournament janitor", "pirate", "space pirate", + "soviet tourist", + "soviet soldier", "soviet admiral", "tunnel clown", + "mime assassin", "survivor", + "greytide", + "greytide leader", + "greytide xeno", "masked killer", "singuloth knight", "dark lord", "assassin", "spy", + "vox", "death commando", "syndicate agent", "syndicate operative", + "syndicate bomber", "syndicate strike team", "syndicate officer", "chrono legionnaire", @@ -746,30 +754,29 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if("pirate") M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand) - equip_special_id(M,get_all_accesses(), "Pirate", /obj/item/weapon/card/id) + equip_special_id(M,list(access_maint_tunnels), "Pirate", /obj/item/weapon/card/id) - if("space pirate") + if("space pirate") // not spaceworthy, just has fancier coat. M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/pirate(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/pirate(M), slot_head) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand) - equip_special_id(M,get_all_accesses(), "Space Pirate", /obj/item/weapon/card/id) - - if("soviet soldier") - M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head) - equip_special_id(M,get_all_accesses(), "Soviet Soldier", /obj/item/weapon/card/id) + equip_special_id(M,list(access_maint_tunnels), "Space Pirate", /obj/item/weapon/card/id) if("tunnel clown") M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask) @@ -780,25 +787,106 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/suit/chaplain_hoodie(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store) - equip_special_id(M,get_all_accesses(), "Tunnel Clown", /obj/item/weapon/card/id) + equip_special_id(M,list(access_clown, access_theatre, access_maint_tunnels), "Tunnel Clown", /obj/item/weapon/card/id) M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M) M.equip_to_slot_or_del(fire_axe, slot_r_hand) + + if("mime assassin") + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/mime(M), slot_back) + if(M.gender == FEMALE) + M.equip_or_collect(new /obj/item/clothing/under/sexymime(M), slot_w_uniform) + M.equip_or_collect(new /obj/item/clothing/mask/gas/sexymime(M), slot_wear_mask) + else + M.equip_or_collect(new /obj/item/clothing/under/mime(M), slot_w_uniform) + M.equip_or_collect(new /obj/item/clothing/mask/gas/mime(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/head/beret(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/syndie_kit/caneshotgun, slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/toy/crayon/mime, slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/suppressor(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack) + var/obj/item/device/pda/mime/pda = new(M) + pda.owner = M.real_name + pda.ownjob = "Mime" + pda.name = "PDA-[M.real_name] ([pda.ownjob])" + M.equip_to_slot_or_del(pda, slot_wear_pda) + equip_special_id(M,list(access_mime, access_theatre, access_maint_tunnels), "Mime", /obj/item/weapon/card/id/syndicate) + M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) + if("survivor") M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) - equip_special_id(M,get_all_accesses(), "Survivor", /obj/item/weapon/card/id) + equip_special_id(M,list(access_maint_tunnels), "Survivor", /obj/item/weapon/card/id) for(var/obj/item/carried_item in M.contents) if(!istype(carried_item, /obj/item/weapon/implant)) carried_item.add_blood(M) + if("greytide") + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) + equip_special_id(M,list(access_maint_tunnels), "Greytide", /obj/item/weapon/card/id) + + if("greytide leader") + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) + equip_special_id(M,list(access_maint_tunnels), "Greytide Leader", /obj/item/weapon/card/id) + + if("greytide xeno") + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/xenos(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/xenos(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_l_store) + M.equip_to_slot_or_del(new /obj/item/toy/toy_xeno(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) + equip_special_id(M,list(access_maint_tunnels), "Legit Xenomorph", /obj/item/weapon/card/id) + if("masked killer") M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask) @@ -809,7 +897,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store) M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) - equip_special_id(M,get_all_accesses(), "Masked Killer", /obj/item/weapon/card/id/syndicate, "syndie") + equip_special_id(M,list(access_maint_tunnels), "Masked Killer", /obj/item/weapon/card/id/syndicate, "syndie") var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M) M.equip_to_slot_or_del(fire_axe, slot_r_hand) for(var/obj/item/carried_item in M.contents) @@ -821,6 +909,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_hand) @@ -841,6 +930,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M) for(var/obj/item/briefcase_item in sec_briefcase) @@ -859,7 +949,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that pda.owner = M.real_name pda.ownjob = "Reaper" pda.name = "PDA-[M.real_name] ([pda.ownjob])" - M.equip_to_slot_or_del(pda, slot_belt) + M.equip_to_slot_or_del(pda, slot_wear_pda) equip_special_id(M,get_all_accesses(), "Reaper", /obj/item/weapon/card/id/syndicate, "syndie") if("spy") @@ -880,14 +970,39 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_r_store) var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M) DUST.implant(M) - var/obj/item/weapon/implant/dust/STOR = new /obj/item/weapon/implant/storage(M) - STOR.implant(M) + M.equip_to_slot_or_del(new /obj/item/weapon/implanter/storage(M), slot_in_backpack) var/obj/item/device/pda/heads/pda = new(M) pda.owner = M.real_name pda.ownjob = "Spy" pda.name = "PDA-[M.real_name] ([pda.ownjob])" M.equip_to_slot_or_del(pda, slot_belt) - equip_special_id(M,get_all_accesses(), "Spy", /obj/item/weapon/card/id/syndicate, "syndie") + equip_special_id(M,list(access_maint_tunnels), "Spy", /obj/item/weapon/card/id/syndicate, "syndie") + + + if("vox") + if(istype(M, /mob/living/carbon/human/voxarmalis)) // have to do this, they cannot wear normal vox gear! + M.equip_to_slot_or_del(new /obj/item/clothing/under/vox_grey(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/under/vox/vox_robes (M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate/vox(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate, slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow/vox, slot_gloves) + M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic, slot_l_store) + M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/vox, slot_r_store) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle, slot_glasses) + M.equip_to_slot_or_del(new /obj/item/device/flashlight, slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs/cable/zipties, slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/flash, slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/noisecannon, slot_in_backpack) + equip_special_id(M,get_all_accesses(), "Vox Armalis", /obj/item/weapon/card/id/syndicate/vox, "syndie") + else + M.equip_vox_raider() + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_l_hand) + M.regenerate_icons() if("death commando") M.equip_death_commando() @@ -909,15 +1024,31 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that U.hidden_uplink.uses = 20 M.equip_to_slot_or_del(U, slot_r_store) + if("syndicate bomber") + M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) + M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/syndicatedetonator(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt) + M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear) + equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Bomber", /obj/item/weapon/card/id/syndicate, "syndie") + if("syndicate operative") M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes) M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack) M.equip_or_collect(new /obj/item/ammo_box/magazine/m10mm(M), slot_in_backpack) - M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/crowbar/red(M), slot_in_backpack) M.equip_or_collect(new /obj/item/clothing/glasses/night(M), slot_glasses) M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt) @@ -948,8 +1079,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes) M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back) - M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack) M.equip_or_collect(new /obj/item/clothing/glasses/thermal(M), slot_glasses) M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt) M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store) @@ -974,9 +1105,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_or_collect(new /obj/item/clothing/shoes/black(M), slot_shoes) M.equip_or_collect(new /obj/item/clothing/gloves/color/black(M), slot_gloves) M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_or_collect(new /obj/item/clothing/head/that(M), slot_head) M.equip_or_collect(new /obj/item/device/radio/headset/ert(M), slot_l_ear) - M.equip_or_collect(new /obj/item/device/pda/(M), slot_belt) + M.equip_or_collect(new /obj/item/device/pda/(M), slot_wear_pda) equip_special_id(M,get_centcom_access("VIP Guest"), "VIP Guest", /obj/item/weapon/card/id/centcom) if("nt navy officer") @@ -985,10 +1117,11 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves) M.equip_or_collect(new /obj/item/device/radio/headset/centcom(M), slot_l_ear) M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head) - M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_belt) + M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_wear_pda) M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) + M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt) M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) - M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack) var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M) @@ -1003,10 +1136,11 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves) M.equip_or_collect(new /obj/item/device/radio/headset/centcom(M), slot_l_ear) M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head) - M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_belt) + M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_wear_pda) M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) + M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt) M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) - M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack) var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M) @@ -1047,10 +1181,11 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(src), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) // job has /obj/item/clothing/head/beret/centcom/officer/navy - M.equip_to_slot_or_del(new /obj/item/device/pda/centcom(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/device/pda/centcom(M), slot_wear_pda) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // job has /obj/item/clothing/glasses/hud/security/sunglasses M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad/officer(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/implanter/dust(M), slot_in_backpack) @@ -1075,9 +1210,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(src), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // special - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt) M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store) M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_in_backpack) @@ -1088,7 +1224,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition designed for military field work." - M.equip_or_collect(pda, slot_belt) + M.equip_or_collect(pda, slot_wear_pda) M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack) equip_special_id(M,get_centcom_access("Special Operations Officer"), "Special Operations Officer", /obj/item/weapon/card/id/centcom) @@ -1117,7 +1253,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id) if("red wizard") @@ -1130,7 +1266,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id) if("marisa wizard") @@ -1143,20 +1279,53 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id) + if("soviet tourist") + M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) + equip_special_id(M,list(access_maint_tunnels), "Soviet Tourist", /obj/item/weapon/card/id) + + if("soviet soldier") + M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) + equip_special_id(M,list(access_maint_tunnels), "Soviet Soldier", /obj/item/weapon/card/id) + if("soviet admiral") + M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) - equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Admiral", /obj/item/weapon/card/id, "commander") + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) + equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Soviet Admiral", /obj/item/weapon/card/id, "commander") //W.icon_state = "commander" if("chrono legionnaire") diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm index 0833ccdb669..1b49cb4c294 100644 --- a/code/modules/admin/verbs/honksquad.dm +++ b/code/modules/admin/verbs/honksquad.dm @@ -111,7 +111,7 @@ var/global/sent_honksquad = 0 equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(src), slot_w_uniform) equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask) equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(src), slot_shoes) - equip_to_slot_or_del(new /obj/item/device/pda/clown(src), slot_belt) + equip_to_slot_or_del(new /obj/item/device/pda/clown(src), slot_wear_pda) equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask) equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(src), slot_in_backpack) equip_to_slot_or_del(new /obj/item/weapon/bikehorn(src), slot_in_backpack) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index c44ff5c1af6..e0a2f35e05d 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -873,8 +873,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set name = "Reset Telecomms Scripts" set desc = "Blanks all telecomms scripts from all telecomms servers" - if(!holder || !holder.rights || !holder.rights & R_ADMIN) - to_chat(usr, "Admin only.") + if(!check_rights(R_ADMIN, 1, src)) return var/confirm = alert(src, "You sure you want to blank all NTSL scripts?", "Confirm", "Yes", "No") diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index c1cbd07daee..8ebb54fcc25 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -88,4 +88,16 @@ // Their chat window, sort of important. // See /goon/code/datums/browserOutput.dm - var/datum/chatOutput/chatOutput \ No newline at end of file + var/datum/chatOutput/chatOutput + + //////////// + //PARALLAX// + //////////// + var/updating_parallax = 0 + var/list/parallax = list() + var/list/parallax_offset = list() + var/turf/previous_turf = null + var/obj/screen/plane_master/parallax_master/parallax_master = null + var/obj/screen/plane_master/parallax_dustmaster/parallax_dustmaster = null + var/obj/screen/plane_master/parallax_spacemaster/parallax_spacemaster = null + var/last_parallax_shift diff --git a/code/modules/client/preference/loadout/loadout_general.dm b/code/modules/client/preference/loadout/loadout_general.dm index 40d581d030e..6447c2bed2a 100644 --- a/code/modules/client/preference/loadout/loadout_general.dm +++ b/code/modules/client/preference/loadout/loadout_general.dm @@ -29,7 +29,7 @@ /datum/gear/sechud display_name = "a classic security HUD" path = /obj/item/clothing/glasses/hud/security - allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot") + allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent") /datum/gear/matches display_name = "a box of matches" @@ -38,3 +38,35 @@ /datum/gear/cards display_name = "a deck of cards" path = /obj/item/toy/cards/deck + +/datum/gear/blackbandana + display_name = "bandana, black" + path = /obj/item/clothing/mask/bandana/black + +/datum/gear/purplebandana + display_name = "bandana, purple" + path = /obj/item/clothing/mask/bandana/purple + +/datum/gear/orangebandana + display_name = "bandana, orange" + path = /obj/item/clothing/mask/bandana/orange + +/datum/gear/greenbandana + display_name = "bandana, green" + path = /obj/item/clothing/mask/bandana/green + +/datum/gear/bluebandana + display_name = "bandana, blue" + path = /obj/item/clothing/mask/bandana/blue + +/datum/gear/redbandana + display_name = "bandana, red" + path = /obj/item/clothing/mask/bandana/red + +/datum/gear/goldbandana + display_name = "bandana, gold" + path = /obj/item/clothing/mask/bandana/gold + +/datum/gear/skullbandana + display_name = "bandana, skull" + path = /obj/item/clothing/mask/bandana/skull diff --git a/code/modules/client/preference/loadout/loadout_shoes.dm b/code/modules/client/preference/loadout/loadout_shoes.dm index 97e64e74f83..ec32e30d661 100644 --- a/code/modules/client/preference/loadout/loadout_shoes.dm +++ b/code/modules/client/preference/loadout/loadout_shoes.dm @@ -4,5 +4,15 @@ sort_category = "Shoes" /datum/gear/shoes/sandals - display_name = "sandals" - path = /obj/item/clothing/shoes/sandal \ No newline at end of file + display_name = "sandals, wooden" + path = /obj/item/clothing/shoes/sandal + +/datum/gear/shoes/fancysandals + display_name = "sandals, fancy" + cost = 5 + path = /obj/item/clothing/shoes/sandal/fancy + +/datum/gear/shoes/dressshoes + display_name = "dress shoes" + cost = 5 + path = /obj/item/clothing/shoes/centcom diff --git a/code/modules/client/preference/loadout/loadout_suit.dm b/code/modules/client/preference/loadout/loadout_suit.dm index 29f0c15c71c..2ac4b3bb7e9 100644 --- a/code/modules/client/preference/loadout/loadout_suit.dm +++ b/code/modules/client/preference/loadout/loadout_suit.dm @@ -59,7 +59,7 @@ /datum/gear/suit/coat/job/miner display_name = "winter coat, miner" path = /obj/item/clothing/suit/hooded/wintercoat/miner - allowed_roles = list("Miner") + allowed_roles = list("Shaft Miner") //LABCOATS /datum/gear/suit/labcoat_emt @@ -144,3 +144,17 @@ /datum/gear/suit/blackhoodie display_name = "hoodie, black" path = /obj/item/clothing/suit/hooded/hoodie + +//SUITS! + +/datum/gear/suit/blacksuit + display_name = "suit jacket, black" + path = /obj/item/clothing/suit/storage/lawyer/blackjacket + +/datum/gear/suit/bluesuit + display_name = "suit jacket, blue" + path = /obj/item/clothing/suit/storage/lawyer/bluejacket + +/datum/gear/suit/purplesuit + display_name = "suit jacket, purple" + path = /obj/item/clothing/suit/storage/lawyer/purpjacket diff --git a/code/modules/client/preference/loadout/loadout_uniform.dm b/code/modules/client/preference/loadout/loadout_uniform.dm index 5bef51bdc1d..aaec97829c8 100644 --- a/code/modules/client/preference/loadout/loadout_uniform.dm +++ b/code/modules/client/preference/loadout/loadout_uniform.dm @@ -66,7 +66,7 @@ /datum/gear/uniform/skirt/job/med display_name = "skirt, medical" path = /obj/item/clothing/under/rank/medical/skirt - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic","Brig Physician") /datum/gear/uniform/skirt/job/sci display_name = "skirt, scientist" @@ -106,8 +106,8 @@ path = /obj/item/clothing/under/rank/security/formal allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot") -datum/gear/uniform/secorporate - display_name = "security uniform, corporate " +/datum/gear/uniform/sec/secorporate + display_name = "security uniform, corporate" path = /obj/item/clothing/under/rank/security/corp allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot") diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 5f0d31f9c26..022f7c4ef67 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -93,6 +93,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/show_ghostitem_attack = TRUE var/UI_style_color = "#ffffff" var/UI_style_alpha = 255 + var/space_parallax = 1 + var/space_dust = 1 + var/parallax_speed = 1 //character preferences @@ -416,6 +419,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(TAB_GAME) // General Preferences dat += " @@ -255,7 +255,6 @@ screenstate = 4 if(href_list["del"]) if(!check_rights(R_ADMIN)) - to_chat(usr, "You aren't an admin, piss off.") return var/datum/cachedbook/target = getBookByID(href_list["del"]) // Sanitized in getBookByID var/ans = alert(usr, "Are you sure you wish to delete \"[target.title]\", by [target.author]? This cannot be undone.", "Library System", "Yes", "No") @@ -272,7 +271,6 @@ if(href_list["delbyckey"]) if(!check_rights(R_ADMIN)) - to_chat(usr, "You aren't an admin, piss off.") return var/tckey = ckey(href_list["delbyckey"]) var/ans = alert(usr,"Are you sure you wish to delete all books by [tckey]? This cannot be undone.", "Library System", "Yes", "No") diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 4d58fee8e11..aa7d9ea4607 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -20,26 +20,32 @@ opacity = 1 var/health = 50 var/tmp/busy = 0 - var/list/valid_types = list(/obj/item/weapon/book, \ - /obj/item/weapon/tome, \ - /obj/item/weapon/spellbook, \ - /obj/item/weapon/storage/bible) + var/list/allowed_books = list(/obj/item/weapon/book, /obj/item/weapon/spellbook, /obj/item/weapon/storage/bible, /obj/item/weapon/tome) //Things allowed in the bookcase /obj/structure/bookcase/initialize() ..() for(var/obj/item/I in loc) - if(is_type_in_list(I, valid_types)) + if(is_type_in_list(I, allowed_books)) I.forceMove(src) update_icon() /obj/structure/bookcase/attackby(obj/O as obj, mob/user as mob, params) if(busy) //So that you can't mess with it while deconstructing return 1 - if(is_type_in_list(O, valid_types)) - user.drop_item() + if(is_type_in_list(O, allowed_books)) + if(!user.drop_item()) + return O.forceMove(src) update_icon() return 1 + else if(istype(O, /obj/item/weapon/storage/bag/books)) + var/obj/item/weapon/storage/bag/books/B = O + for(var/obj/item/T in B.contents) + if(istype(T, /obj/item/weapon/book) || istype(T, /obj/item/weapon/spellbook) || istype(T, /obj/item/weapon/tome) || istype(T, /obj/item/weapon/storage/bible)) + B.remove_from_storage(T, src) + to_chat(user, "You empty [O] into [src].") + update_icon() + return 1 else if(istype(O, /obj/item/weapon/wrench)) user.visible_message("[user] starts disassembling \the [src].", \ "You start disassembling \the [src].") @@ -51,8 +57,6 @@ user.visible_message("[user] disassembles \the [src].", \ "You disassemble \the [src].") busy = 0 - for(var/i = 1 to 5) - new /obj/item/stack/sheet/wood(get_turf(src)) density = 0 qdel(src) else @@ -72,9 +76,6 @@ else if(health <= 0) visible_message("The bookcase is smashed apart!") - new /obj/item/stack/sheet/wood(get_turf(src)) - new /obj/item/stack/sheet/wood(get_turf(src)) - new /obj/item/stack/sheet/wood(get_turf(src)) qdel(src) return ..() @@ -110,10 +111,10 @@ return /obj/structure/bookcase/Destroy() - for(var/i = 1 to 3) + for(var/i in 1 to 5) new /obj/item/stack/sheet/wood(get_turf(src)) for(var/obj/item/I in contents) - if(is_type_in_list(I, valid_types)) + if(is_type_in_list(I, allowed_books)) I.forceMove(get_turf(src)) return ..() diff --git a/code/modules/mining/alloys.dm b/code/modules/mining/alloys.dm deleted file mode 100644 index ce29725d87a..00000000000 --- a/code/modules/mining/alloys.dm +++ /dev/null @@ -1,27 +0,0 @@ -//Alloys that contain subsets of each other's ingredients must be ordered in the desired sequence -//eg. steel comes after plasteel because plasteel's ingredients contain the ingredients for steel and -//it would be impossible to produce. - -/datum/alloy - var/list/requires - var/product_mod = 1 - var/product - var/metaltag - -/datum/alloy/plasteel - metaltag = "plasteel" - requires = list( - "platinum" = 1, - "coal" = 2, - "hematite" = 2 - ) - product_mod = 0.3 - product = /obj/item/stack/sheet/plasteel - -/datum/alloy/steel - metaltag = "steel" - requires = list( - "coal" = 1, - "hematite" = 1 - ) - product = /obj/item/stack/sheet/metal \ No newline at end of file diff --git a/code/modules/mining/manufacturing.dm b/code/modules/mining/manufacturing.dm deleted file mode 100644 index 36464c2d7c7..00000000000 --- a/code/modules/mining/manufacturing.dm +++ /dev/null @@ -1,1135 +0,0 @@ -// the entire manufacturing.dm - -/datum/manufacture - var/name = null - var/item = null - var/cost1 = null - var/cost2 = null - var/cost3 = null - var/cname1 = null - var/cname2 = null - var/cname3 = null - var/amount1 = 0 - var/amount2 = 0 - var/amount3 = 0 - var/create = 1 - var/time = 5 - -/obj/machinery/manufacturer - name = "Manufacturing Unit" - desc = "A standard fabricator unit capable of producing certain items from mined ore." - icon = 'icons/obj/surgery.dmi' - icon_state = "fab-idle" - density = 1 - anchored = 1 - //mats = 25 - var/working = 0 - var/panelopen = 0 - var/powconsumption = 0 - var/hacked = 0 - var/acceptdisk = 0 - var/dl_list = null - var/list/available = list() - var/list/diskload = list() - var/list/download = list() - var/list/hidden = list() - - New() - ..() - - process() - ..() - if(src.working) use_power(src.powconsumption) - - ex_act(severity) - switch(severity) - if(1.0) qdel(src) - if(2.0) - if(prob(60)) stat |= BROKEN - if(3.0) - if(prob(30)) stat |= BROKEN - return - - blob_act() - if(prob(25)) del src - return - - power_change() - if(stat & BROKEN) icon_state = "fab-broken" - else - if( powered() ) - if(src.working) src.icon_state = "fab-active" - else src.icon_state = "fab-idle" - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - src.icon_state = "fab-off" - stat |= NOPOWER - - attack_hand(var/mob/user as mob) - if(stat & BROKEN) return - if(stat & NOPOWER) return - - user.machine = src - var/dat = "[src.name]

" - - if(src.working) - dat += "This unit is currently busy." - user << browse(dat, "window=manufact;size=400x500") - onclose(user, "manufact") - return - - var/AMTmaux = 0 - var/AMTmoli = 0 - var/AMTphar = 0 - var/AMTclar = 0 - var/AMTbohr = 0 - var/AMTereb = 0 - var/AMTcere = 0 - var/AMTplas = 0 - var/AMTuqil = 0 - var/AMTtele = 0 - var/AMTfabr = 0 - - for(var/obj/item/weapon/ore/O in src.contents) - if(istype(O,/obj/item/weapon/ore/iron)) AMTmaux++ - if(istype(O,/obj/item/weapon/ore/glass)) AMTmoli++ - if(istype(O,/obj/item/weapon/ore/silver)) AMTphar++ - if(istype(O,/obj/item/weapon/ore/diamond)) AMTclar++ - if(istype(O,/obj/item/weapon/ore/gold)) AMTbohr++ - if(istype(O,/obj/item/weapon/ore/coal)) AMTereb++ - if(istype(O,/obj/item/weapon/ore/uranium)) AMTcere++ - if(istype(O,/obj/item/weapon/ore/plasma)) AMTplas++ - if(istype(O,/obj/item/weapon/ore/osmium)) AMTuqil++ - if(istype(O,/obj/item/weapon/ore/hydrogen)) AMTtele++ - if(istype(O,/obj/item/weapon/ore/fabric)) AMTfabr++ - - dat += "Available Minerals
" - if(AMTmaux) dat += "Iron: [AMTmaux]
" - if(AMTmoli) dat += "Glass: [AMTmoli]
" - if(AMTphar) dat += "Silver: [AMTphar]
" - if(AMTclar) dat += "Diamond: [AMTclar]
" - if(AMTbohr) dat += "Gold: [AMTbohr]
" - if(AMTereb) dat += "Coal: [AMTereb]
" - if(AMTcere) dat += "Uranium: [AMTcere]
" - if(AMTplas) dat += "Plasma: [AMTplas]
" - if(AMTuqil) dat += "Platinum: [AMTuqil]
" - if(AMTtele) dat += "Hydrogen: [AMTtele]
" - if(AMTfabr) dat += "Fabric: [AMTfabr]
" - if(!AMTmaux && !AMTmoli && !AMTphar && !AMTclar && !AMTbohr && !AMTereb && !AMTcere && !AMTplas && !AMTuqil && !AMTtele && !AMTfabr) - dat += "No minerals currently loaded.
" - - dat += {"
- Available Schematics"} - - for(var/datum/manufacture/A in src.available) - dat += {"
- [A.name]
- Cost: [A.amount1] [A.cname1]"} - if(A.cost2) dat += ", [A.amount2] [A.cname2]" - if(A.cost3) dat += ", [A.amount3] [A.cname3]" - dat += "
Time: [A.time] Seconds
" - - for(var/datum/manufacture/A in src.download) - dat += {"
- [A.name] (Downloaded)
- Cost: [A.amount1] [A.cname1]"} - if(A.cost2) dat += ", [A.amount2] [A.cname2]" - if(A.cost3) dat += ", [A.amount3] [A.cname3]" - dat += "
Time: [A.time] Seconds
" - - for(var/datum/manufacture/A in src.diskload) - dat += {"
- [A.name] (Disk)
- Cost: [A.amount1] [A.cname1]"} - if(A.cost2) dat += ", [A.amount2] [A.cname2]" - if(A.cost3) dat += ", [A.amount3] [A.cname3]" - dat += "
Time: [A.time] Seconds
" - - if(src.hacked) - for(var/datum/manufacture/A in src.hidden) - dat += {"
- [A.name] (Secret)
- Cost: [A.amount1] [A.cname1]"} - if(A.cost2) dat += ", [A.amount2] [A.cname2]" - if(A.cost3) dat += ", [A.amount3] [A.cname3]" - dat += "
Time: [A.time] Seconds
" - - dat += "
" - - if(src.dl_list) - dat += {"Download Available Schematics
- Clear Downloaded Schematics
"} - - if(src.acceptdisk) - dat += {"Clear Disk Schematics
"} - - user << browse(dat, "window=manufact;size=400x500") - onclose(user, "manufact") - - Topic(href, href_list) - if(stat & BROKEN) return - if(stat & NOPOWER) return - if(usr.stat || usr.restrained()) - return - - if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf)))) - usr.machine = src - - if(href_list["download"]) - to_chat(if(!src.dl_list) usr, "\red This unit is not capable of downloading any additional schematics.") - else - var/amtdl = 0 - //var/dontload = 0 - if(src.dl_list == "robotics") - /*for(var/i = robotics_research.starting_tier, i <= robotics_research.max_tiers, i++) - for(var/datum/roboresearch/X in robotics_research.researched_items[i]) - for(var/datum/manufacture/S in X.schematics) - for(var/datum/manufacture/A in src.download) - if(istype(S,A)) dontload = 1 - if(!dontload) - src.download += new S.type(src) - amtdl++ - else dontload = 0*/ - to_chat(if(amtdl) usr, "\blue [amtdl] new schematics downloaded from Robotics Research Database.") - to_chat(else usr, "\red No new schematics currently available in Robotics Research Database.") - - if(href_list["delete"]) - var/operation = text2num(href_list["delete"]) - if(operation == 1) // Clear Disk Schematics - var/amtgone = 0 - for(var/datum/manufacture/D in src.diskload) - src.diskload-= D - amtgone++ - to_chat(if(amtgone) usr, "\blue Cleared [amtgone] schematics from database.") - to_chat(else usr, "\red No disk-loaded schematics detected in database.") - if(operation == 2) // Clear Download Schematics - var/amtgone = 0 - for(var/datum/manufacture/D in src.download) - src.download-= D - amtgone++ - to_chat(if(amtgone) usr, "\blue Cleared [amtgone] schematics from database.") - to_chat(else usr, "\red No downloaded schematics detected in database.") - - if(href_list["eject"]) - var/operation = text2num(href_list["eject"]) - var/ejectamt = 0 - var/ejecting = null - switch(operation) - if(1) ejecting = /obj/item/weapon/ore/iron - if(2) ejecting = /obj/item/weapon/ore/glass - if(3) ejecting = /obj/item/weapon/ore/silver - if(4) ejecting = /obj/item/weapon/ore/diamond - if(5) ejecting = /obj/item/weapon/ore/gold - if(6) ejecting = /obj/item/weapon/ore/coal - if(7) ejecting = /obj/item/weapon/ore/uranium - if(8) ejecting = /obj/item/weapon/ore/plasma - if(9) ejecting = /obj/item/weapon/ore/osmium - if(10) ejecting = /obj/item/weapon/ore/hydrogen - if(11) ejecting = /obj/item/weapon/ore/fabric - else - to_chat(usr, "\red Error. Unknown ore type.") - return - sleep(3) - ejectamt = input(usr,"How many units do you want to eject?","Eject Materials") as num - for(var/obj/item/weapon/ore/O in src.contents) - if(ejectamt <= 0) break - if(istype(O, ejecting)) - O.loc = usr.loc - ejectamt-- - - if(href_list["disp"]) - var/datum/manufacture/I = locate(href_list["disp"]) - // Material Check - var/A1 = 0 - var/A2 = 0 - var/A3 = 0 - for(var/obj/item/weapon/ore/O in src.contents) - if(istype(O,I.cost1)) A1++ - if(istype(O,I.cost2)) A2++ - if(istype(O,I.cost3)) A3++ - if(A1 < I.amount1 || A2 < I.amount2 || A3 < I.amount3) - to_chat(usr, "\red Insufficient materials to manufacture that item.") - return - // Consume Mats - var/C1 = I.amount1 - var/C2 = I.amount2 - var/C3 = I.amount3 - for(var/obj/item/weapon/ore/O in src.contents) - if(istype(O,I.cost1) && C1) - del O - C1-- - if(istype(O,I.cost2) && C2) - del O - C2-- - if(istype(O,I.cost3) && C3) - del O - C3-- - // Manufacture Item - src.icon_state = "fab-active" - src.working = 1 - var/worktime = I.time * 10 - var/powconsume = round(1500*worktime/3) - /*for(var/i = robotics_research.starting_tier, i <= robotics_research.max_tiers, i++) - for(var/datum/roboresearch/a in robotics_research.researched_items[i]) - if(a.manubonus) - worktime -= a.timebonus - if(a.multiplier != 0) worktime /= a.multiplier - powconsume -= a.powbonus*/ - if(worktime < 1) worktime = 1 - src.powconsumption = powconsume - src.updateUsrDialog() - sleep(worktime) - var/make = I.create - while(make > 0) - new I.item(src.loc) - make-- - src.working = 0 - src.icon_state = "fab-idle" - src.updateUsrDialog() - - - attackby(obj/item/weapon/W as obj, mob/user as mob, params) - var/load = 0 - if(istype(W, /obj/item/weapon/ore/)) - for(var/mob/O in viewers(user, null)) O.show_message(text("\blue [] loads [] into the [].", user, W, src), 1) - load = 1 - else if(istype(W, /obj/item/stack/sheet)) - var/obj/item/stack/sheet/STACK = W - for(var/mob/O in viewers(user, null)) O.show_message(text("\blue [] loads [] into the [].", user, W, src), 1) - if(istype(STACK, /obj/item/stack/sheet/metal)) - for(var/amt = STACK.amount, amt > 0, amt--) new /obj/item/weapon/ore/iron(src) - if(istype(STACK, /obj/item/stack/sheet/plasteel)) - for(var/amt = STACK.amount, amt > 0, amt--) - new /obj/item/weapon/ore/iron(src) - new /obj/item/weapon/ore/plasma(src) - if(istype(STACK, /obj/item/stack/sheet/glass)) - for(var/amt = STACK.amount, amt > 0, amt--) new /obj/item/weapon/ore/glass(src) - if(istype(STACK, /obj/item/stack/sheet/rglass)) - for(var/amt = STACK.amount, amt > 0, amt--) - new /obj/item/weapon/ore/iron(src) - new /obj/item/weapon/ore/glass(src) - load = 2 - //else if(istype(W, /obj/item/weapon/plant/wheat/metal)) - // new /obj/item/weapon/ore/iron(src) - // load = 2 - /*else if(istype(W, /obj/item/stack/cable_coil/)) - for(var/mob/O in viewers(user, null)) O.show_message(text("\blue [] loads [] into the [].", user, W, src), 1) - for(var/amt = W:amount, amt > 0, amt--) - new /obj/item/weapon/ore/silver(src) - amt-- - load = 2*/ - else if(istype(W, /obj/item/weapon/shard)) - new /obj/item/weapon/ore/glass(src) - load = 2 - else if(istype(W, /obj/item/stack/rods)) - var/obj/item/stack/RODS = W - for(var/amt = RODS.amount, amt > 0, amt--) new /obj/item/weapon/ore/iron(src) - load = 2 - else if(istype(W, /obj/item/clothing/)) - if(istype(W, /obj/item/clothing/under/)) - new /obj/item/weapon/ore/fabric(src) - load = 2 - if(istype(W, /obj/item/clothing/suit/)) - if(!istype(W,/obj/item/clothing/suit/armor)) - new /obj/item/weapon/ore/fabric(src) - new /obj/item/weapon/ore/fabric(src) - if(istype(W,/obj/item/clothing/suit/space/)) new /obj/item/weapon/ore/fabric(src) - load = 2 - else if(istype(W, /obj/item/weapon/disk/data/schematic)) - to_chat(if(!src.acceptdisk) user, "\red This unit is unable to accept disks.") - else - var/amtload = 0 - var/dontload = 0 - for(var/datum/manufacture/WS in W:schematics) - for(var/datum/manufacture/A in src.available) - if(istype(WS,A)) dontload = 1 - for(var/datum/manufacture/B in src.download) - if(istype(WS,B)) dontload = 1 - for(var/datum/manufacture/C in src.diskload) - if(istype(WS,C)) dontload = 1 - for(var/datum/manufacture/D in src.hidden) - if(istype(WS,D) && src.hacked) dontload = 1 - if(!dontload) - src.diskload += new WS.type(src) - amtload++ - else dontload = 0 - to_chat(if(amtload) user, "\blue [amtload] new schematics downloaded from disk.") - to_chat(else user, "\red No new schematics available on disk.") - else if(istype(W, /obj/item/weapon/storage/bag/ore)) - for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] uses the []'s automatic ore loader on []!", user, src, W), 1) - var/amtload = 0 - for(var/obj/item/weapon/ore/M in W.contents) - M.loc = src - amtload++ - to_chat(if(amtload) user, "\blue [amtload] pieces of ore loaded from [W]!") - to_chat(else user, "\red No ore loaded!") - else if(istype(W, /obj/item/weapon/card/emag)) - src.hacked = 1 - to_chat(user, "\blue You remove the [src]'s product locks!") - else ..() - - if(load == 1) - user.unEquip(W) - W.loc = src - if((user.client && user.s_active != src)) - user.client.screen -= W - W.dropped() - else if(load == 2) - user.unEquip(W) - W.dropped() - if((user.client && user.s_active != src)) - user.client.screen -= W - del W - - src.updateUsrDialog() - - MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) - if(istype(O, /obj/structure/closet/crate/)) - for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] uses the []'s automatic ore loader on []!", user, src, O), 1) - var/amtload = 0 - for(var/obj/item/weapon/ore/M in O.contents) - M.loc = src - amtload++ - to_chat(if(amtload) user, "\blue [amtload] pieces of ore loaded from [O]!") - to_chat(else user, "\red No ore loaded!") - else if(istype(O, /obj/item/weapon/ore/)) - for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] begins quickly stuffing ore into []!", user, src), 1) - var/staystill = user.loc - for(var/obj/item/weapon/ore/M in view(1,user)) - M.loc = src - sleep(3) - if(user.loc != staystill) break - to_chat(user, "\blue You finish stuffing ore into [src]!") - /*else if(istype(O, /obj/item/weapon/plant/wheat/metal)) - for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] begins quickly stuffing [O] into []!", user, src), 1) - var/staystill = user.loc - for(var/obj/item/weapon/plant/wheat/metal/M in view(1,user)) - new /obj/item/weapon/ore/iron(src) - del M - sleep(3) - if(user.loc != staystill) break - to_chat(user, "\blue You finish stuffing [O] into [src]!"*/) - else ..() - src.updateUsrDialog() - -/obj/item/weapon/disk/data/schematic - name = "Manufacturer Schematic Disk" - desc = "Contains schematics for use in a Manufacturing Unit." - var/list/schematics = list() - -// Fabricator Defines - -/obj/machinery/manufacturer/general - name = "General Manufacturer" - desc = "A manufacturing unit calibrated to produce tools and general purpose items." - - New() - ..() - src.available += new /datum/manufacture/screwdriver(src) - src.available += new /datum/manufacture/wirecutters(src) - src.available += new /datum/manufacture/wrench(src) - src.available += new /datum/manufacture/crowbar(src) - src.available += new /datum/manufacture/extinguisher(src) - src.available += new /datum/manufacture/welder(src) - src.available += new /datum/manufacture/weldingmask(src) - src.available += new /datum/manufacture/multitool(src) - src.available += new /datum/manufacture/metal5(src) - src.available += new /datum/manufacture/metalR(src) - src.available += new /datum/manufacture/glass5(src) - src.available += new /datum/manufacture/glassR(src) - src.available += new /datum/manufacture/atmos_can(src) - //src.available += new /datum/manufacture/cable(src) - src.available += new /datum/manufacture/light_bulb(src) - src.available += new /datum/manufacture/light_tube(src) - src.available += new /datum/manufacture/breathmask(src) - src.available += new /datum/manufacture/RCDammo(src) - //src.available += new /datum/manufacture/cola_bottle(src) - //src.hidden += new /datum/manufacture/vuvuzela(src) - //src.hidden += new /datum/manufacture/harmonica(src) - //src.hidden += new /datum/manufacture/bikehorn(src) - //src.hidden += new /datum/manufacture/stunrounds - -/obj/machinery/manufacturer/robotics - name = "Robotics Fabricator" - desc = "A manufacturing unit calibrated to produce robot-related equipment." - acceptdisk = 1 - dl_list = "robotics" - - New() - ..() - src.available += new /datum/manufacture/robo_frame(src) - src.available += new /datum/manufacture/robo_head(src) - src.available += new /datum/manufacture/robo_chest(src) - src.available += new /datum/manufacture/robo_arm_r(src) - src.available += new /datum/manufacture/robo_arm_l(src) - src.available += new /datum/manufacture/robo_leg_r(src) - src.available += new /datum/manufacture/robo_leg_l(src) - src.available += new /datum/manufacture/robo_stmodule(src) - //src.available += new /datum/manufacture/cable(src) - src.available += new /datum/manufacture/powercell(src) - src.available += new /datum/manufacture/crowbar(src) - src.available += new /datum/manufacture/scalpel(src) - src.available += new /datum/manufacture/circular_saw(src) - src.available += new /datum/manufacture/implanter - src.hidden += new /datum/manufacture/flash(src) - -// Schematic Defines -// General/Miscellaneous - -/datum/manufacture/crowbar - name = "Crowbar" - item = /obj/item/weapon/crowbar - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 1 - time = 5 - create = 1 - -/datum/manufacture/screwdriver - name = "Screwdriver" - item = /obj/item/weapon/screwdriver - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 1 - time = 5 - create = 1 - -/datum/manufacture/wirecutters - name = "Wirecutters" - item = /obj/item/weapon/wirecutters - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 1 - time = 5 - create = 1 - -/datum/manufacture/wrench - name = "Wrench" - item = /obj/item/weapon/wrench - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 1 - time = 5 - create = 1 -/* -/datum/manufacture/vuvuzela - name = "Vuvuzela" - item = /obj/item/weapon/vuvuzela - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 1 - time = 5 - create = 1 - -/datum/manufacture/harmonica - name = "Harmonica" - item = /obj/item/weapon/harmonica - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 1 - time = 5 - create = 1 - -/datum/manufacture/cola_bottle - name = "Glass Bottle" - item = /obj/item/weapon/reagent_containers/food/drinks/cola_bottle - cost1 = /obj/item/weapon/ore/glass - cname1 = "Glass" - amount1 = 1 - time = 4 - create = 1 - -/datum/manufacture/bikehorn - name = "Bicycle Horn" - item = /obj/item/weapon/bikehorn - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 1 - time = 5 - create = 1 - -/datum/manufacture/stunrounds - name = ".38 Stunner Rounds" - item = /obj/item/weapon/ammo/bullets/a38/stun - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 7 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 3 - time = 25 - create = 1 -*/ -/datum/manufacture/extinguisher - name = "Fire Extinguisher" - item = /obj/item/weapon/extinguisher - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 1 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 1 - time = 8 - create = 1 - -/datum/manufacture/welder - name = "Welding Tool" - item = /obj/item/weapon/weldingtool - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 1 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 1 - time = 8 - create = 1 - -/datum/manufacture/multitool - name = "Multi Tool" - item = /obj/item/device/multitool - cost1 = /obj/item/weapon/ore/glass - cname1 = "Glass" - amount1 = 1 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 1 - time = 8 - create = 1 - -/datum/manufacture/weldingmask - name = "Welding Mask" - item = /obj/item/clothing/head/welding - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 2 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 2 - time = 10 - create = 1 - -/datum/manufacture/light_bulb - name = "Light Bulb" - item = /obj/item/weapon/light/bulb - cost1 = /obj/item/weapon/ore/glass - cname1 = "Glass" - amount1 = 1 - time = 4 - create = 1 - -/datum/manufacture/light_tube - name = "Light Tube" - item = /obj/item/weapon/light/tube - cost1 = /obj/item/weapon/ore/glass - cname1 = "Glass" - amount1 = 1 - time = 4 - create = 1 - -/datum/manufacture/metal5 - name = "Sheet Metal (x5)" - item = /obj/item/stack/sheet/metal - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 5 - time = 8 - create = 5 - -/datum/manufacture/metalR - name = "Reinforced Metal" - item = /obj/item/stack/sheet/plasteel - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 1 - cost2 = /obj/item/weapon/ore/plasma - cname2 = "Plasma" - amount2 = 1 - time = 6 - create = 1 - -/datum/manufacture/glass5 - name = "Glass Panel (x5)" - item = /obj/item/stack/sheet/glass - cost1 = /obj/item/weapon/ore/glass - cname1 = "Glass" - amount1 = 5 - time = 8 - create = 5 - -/datum/manufacture/glassR - name = "Reinforced Glass Panel" - item = /obj/item/stack/sheet/rglass - cost1 = /obj/item/weapon/ore/glass - cname1 = "Glass" - amount1 = 1 - cost2 = /obj/item/weapon/ore/iron - cname2 = "Iron" - amount2 = 1 - time = 12 - create = 1 - -/datum/manufacture/atmos_can - name = "Portable Gas Canister" - item = /obj/machinery/portable_atmospherics/canister - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 5 - time = 10 - create = 1 - -/* -/datum/manufacture/cable - name = "Electrical Cable Piece" - item = /obj/item/stack/cable_coil/cut - cost1 = /obj/item/weapon/ore/silver - cname1 = "Silver" - amount1 = 1 - time = 3 - create = 1 -*/ -/datum/manufacture/RCD - name = "Rapid Construction Device" - item = /obj/item/weapon/rcd - cost1 = /obj/item/weapon/ore/gold - cname1 = "Gold" - amount1 = 5 - cost2 = /obj/item/weapon/ore/osmium - cname2 = "Platinum" - amount2 = 1 - cost3 = /obj/item/weapon/ore/silver - cname3 = "Silver" - amount3 = 10 - time = 90 - create = 1 - -/datum/manufacture/RCDammo - name = "Compressed Matter Cartridge" - item = /obj/item/weapon/rcd_ammo - cost1 = /obj/item/weapon/ore/osmium - cname1 = "Platinum" - amount1 = 1 - time = 15 - create = 1 - - -/******************** Robotics **************************/ - -/datum/manufacture/robo_frame - name = "Cyborg Frame" - item = /obj/item/robot_parts/robot_suit - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 18 - time = 45 - create = 1 - -/datum/manufacture/robo_chest - name = "Cyborg Chest" - item = /obj/item/robot_parts/chest - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 12 - time = 30 - create = 1 - -/datum/manufacture/robo_head - name = "Cyborg Head" - item = /obj/item/robot_parts/head - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 12 - time = 30 - create = 1 - -/datum/manufacture/robo_arm_r - name = "Cyborg Arm (Right)" - item = /obj/item/robot_parts/r_arm - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 6 - time = 15 - create = 1 - -/datum/manufacture/robo_arm_l - name = "Cyborg Arm (Left)" - item = /obj/item/robot_parts/l_arm - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 6 - time = 15 - create = 1 - -/datum/manufacture/robo_leg_r - name = "Cyborg Leg (Right)" - item = /obj/item/robot_parts/r_leg - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 6 - time = 15 - create = 1 - -/datum/manufacture/robo_leg_l - name = "Cyborg Leg (Left)" - item = /obj/item/robot_parts/l_leg - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 6 - time = 15 - create = 1 - -/datum/manufacture/robo_stmodule - name = "Standard Cyborg Module" - item = /obj/item/weapon/robot_module/standard - cost1 = /obj/item/weapon/ore/silver - cname1 = "Silver" - amount1 = 2 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 3 - time = 40 - create = 1 - -/datum/manufacture/scalpel - name = "Scalpel" - item = /obj/item/weapon/scalpel - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 1 - time = 5 - create = 1 - -/datum/manufacture/circular_saw - name = "Circular Saw" - item = /obj/item/weapon/circular_saw - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 1 - time = 5 - create = 1 - -/datum/manufacture/powercell - name = "Power Cell" - item = /obj/item/weapon/stock_parts/cell - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 4 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 4 - cost3 = /obj/item/weapon/ore/silver - cname3 = "Silver" - amount3 = 4 - time = 30 - create = 1 - -/datum/manufacture/flash - name = "Flash" - item = /obj/item/device/flash - cost1 = /obj/item/weapon/ore/glass - cname1 = "Glass" - amount1 = 2 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 2 - time = 15 - create = 1 - - - -// Robotics Research - -/datum/manufacture/implanter - name = "Implanter" - item = /obj/item/weapon/implanter - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 1 - time = 3 - create = 1 - -/datum/manufacture/secbot - name = "Security Drone" - item = /obj/machinery/bot/secbot - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 10 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 5 - cost3 = /obj/item/weapon/ore/glass - cname3 = "Glass" - amount3 = 5 - time = 60 - create = 1 - -/datum/manufacture/floorbot - name = "Construction Drone" - item = /obj/machinery/bot/floorbot - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 10 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 5 - cost3 = /obj/item/weapon/ore/glass - cname3 = "Glass" - amount3 = 5 - time = 60 - create = 1 - -/datum/manufacture/medbot - name = "Medical Drone" - item = /obj/machinery/bot/medbot - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 10 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 5 - cost3 = /obj/item/weapon/ore/glass - cname3 = "Glass" - amount3 = 5 - time = 60 - create = 1 -/* -/datum/manufacture/firebot - name = "Firefighting Drone" - item = /obj/machinery/bot/firebot - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 10 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 5 - cost3 = /obj/item/weapon/ore/glass - cname3 = "Glass" - amount3 = 5 - time = 60 - create = 1 -*/ -/datum/manufacture/cleanbot - name = "Sanitation Drone" - item = /obj/machinery/bot/cleanbot - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 10 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 5 - cost3 = /obj/item/weapon/ore/glass - cname3 = "Glass" - amount3 = 5 - time = 60 - create = 1 -/* -/datum/manufacture/robup_jetpack - name = "Propulsion Upgrade" - item = /obj/item/weapon/roboupgrade/jetpack - cost1 = /obj/item/weapon/ore/silver - cname1 = "Silver" - amount1 = 3 - cost2 = /obj/item/weapon/ore/iron - cname2 = "Iron" - amount2 = 5 - time = 60 - create = 1 - -/datum/manufacture/robup_speed - name = "Speed Upgrade" - item = /obj/item/weapon/roboupgrade/speed - cost1 = /obj/item/weapon/ore/silver - cname1 = "Silver" - amount1 = 3 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 5 - time = 60 - create = 1 - -/datum/manufacture/robup_recharge - name = "Recharge Pack" - item = /obj/item/weapon/roboupgrade/rechargepack - cost1 = /obj/item/weapon/ore/silver - cname1 = "Silver" - amount1 = 5 - time = 60 - create = 1 - -/datum/manufacture/robup_repairpack - name = "Repair Pack" - item = /obj/item/weapon/roboupgrade/repairpack - cost1 = /obj/item/weapon/ore/silver - cname1 = "Silver" - amount1 = 5 - time = 60 - create = 1 - -/datum/manufacture/robup_physshield - name = "Force Shield Upgrade" - item = /obj/item/weapon/roboupgrade/physshield - cost1 = /obj/item/weapon/ore/diamond - cname1 = "Claretine" - amount1 = 2 - cost2 = /obj/item/weapon/ore/iron - cname2 = "Iron" - amount2 = 10 - time = 90 - create = 1 - -/datum/manufacture/robup_fireshield - name = "Heat Shield Upgrade" - item = /obj/item/weapon/roboupgrade/fireshield - cost1 = /obj/item/weapon/ore/diamond - cname1 = "Claretine" - amount1 = 2 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 10 - time = 90 - create = 1 - -/datum/manufacture/robup_aware - name = "Operational Upgrade" - item = /obj/item/weapon/roboupgrade/aware - cost1 = /obj/item/weapon/ore/diamond - cname1 = "Claretine" - amount1 = 2 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 5 - cost3 = /obj/item/weapon/ore/silver - cname3 = "Silver" - amount3 = 5 - time = 90 - create = 1 - -/datum/manufacture/robup_efficiency - name = "Efficiency Upgrade" - item = /obj/item/weapon/roboupgrade/efficiency - cost1 = /obj/item/weapon/ore/osmium - cname1 = "Platinum" - amount1 = 3 - cost2 = /obj/item/weapon/ore/diamond - cname2 = "Claretine" - amount2 = 10 - time = 120 - create = 1 - -/datum/manufacture/robup_repair - name = "Self-Repair Upgrade" - item = /obj/item/weapon/roboupgrade/repair - cost1 = /obj/item/weapon/ore/osmium - cname1 = "Platinum" - amount1 = 3 - cost2 = /obj/item/weapon/ore/gold - cname2 = "Gold" - amount2 = 10 - time = 120 - create = 1 - -/datum/manufacture/robup_teleport - name = "Teleport Upgrade" - item = /obj/item/weapon/roboupgrade/teleport - cost1 = /obj/item/weapon/ore/osmium - cname1 = "Platinum" - amount1 = 3 - cost2 = /obj/item/weapon/ore/hydrogen - cname2 = "Telecrystal" - amount2 = 2 - time = 120 - create = 1 - -/datum/manufacture/robup_expand - name = "Expansion Upgrade" - item = /obj/item/weapon/roboupgrade/expand - cost1 = /obj/item/weapon/ore/osmium - cname1 = "Platinum" - amount1 = 3 - cost2 = /obj/item/weapon/ore/uranium - cname2 = "Cerenkite" - amount2 = 1 - time = 120 - create = 1 - -/datum/manufacture/robup_chargexpand - name = "Charge Expander Upgrade" - item = /obj/item/weapon/roboupgrade/chargeexpand - cost1 = /obj/item/weapon/ore/diamond - cname1 = "Claretine" - amount1 = 5 - time = 70 - create = 1 - -/datum/manufacture/robup_meson - name = "Optical Meson Upgrade" - item = /obj/item/weapon/roboupgrade/opticmeson - cost1 = /obj/item/weapon/ore/glass - cname1 = "Glass" - amount1 = 2 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 4 - time = 90 - create = 1 - -/datum/manufacture/robup_thermal - name = "Optical Thermal Upgrade" - item = /obj/item/weapon/roboupgrade/opticthermal - cost1 = /obj/item/weapon/ore/glass - cname1 = "Glass" - amount1 = 4 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 8 - time = 90 - create = 1 - -/datum/manufacture/deafhs - name = "Auditory Headset" - item = /obj/item/device/radio/headset/deaf - cost1 = /obj/item/weapon/ore/silver - cname1 = "Silver" - amount1 = 3 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 3 - time = 40 - create = 1 - -/datum/manufacture/visor - name = "VISOR Prosthesis" - item = /obj/item/clothing/glasses/visor - cost1 = /obj/item/weapon/ore/silver - cname1 = "Silver" - amount1 = 3 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 3 - time = 40 - create = 1 - -/datum/manufacture/implant_robotalk - name = "Machine Translator Implant" - item = /obj/item/weapon/implantcase/robotalk - cost1 = /obj/item/weapon/ore/silver - cname1 = "Silver" - amount1 = 3 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 3 - time = 40 - create = 1 - -/datum/manufacture/implant_bloodmonitor - name = "Blood Monitor Implant" - item = /obj/item/weapon/implantcase/bloodmonitor - cost1 = /obj/item/weapon/ore/silver - cname1 = "Silver" - amount1 = 3 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 3 - time = 40 - create = 1 -*/ \ No newline at end of file diff --git a/code/modules/mining/materials.dm b/code/modules/mining/materials.dm deleted file mode 100644 index 5c743bb4521..00000000000 --- a/code/modules/mining/materials.dm +++ /dev/null @@ -1,147 +0,0 @@ -/** -* Materials system -* -* Replaces all of the horrible variables that tracked each individual thing. -*/ - -/** -* MATERIALS DATUM -* -* Tracks and manages material storage for an object. -*/ -/datum/materials - var/list/datum/material/storage[0] - -/datum/materials/New() - for(var/matdata in subtypesof(/datum/material)) - var/datum/material/mat = new matdata - storage[mat.id]=mat - -/datum/materials/proc/addAmount(var/mat_id,var/amount) - if(!(mat_id in storage)) - warning("addAmount(): Unknown material [mat_id]!") - return - // I HATE BYOND - // storage[mat_id].stored++ - var/datum/material/mat=storage[mat_id] - mat.stored += amount - storage[mat_id]=mat - -/datum/materials/proc/removeAmount(var/mat_id,var/amount) - if(!(mat_id in storage)) - warning("removeAmount(): Unknown material [mat_id]!") - return - addAmount(mat_id,-amount) - -/datum/materials/proc/getAmount(var/mat_id) - if(!(mat_id in storage)) - warning("getAmount(): Unknown material [mat_id]!") - return 0 - - var/datum/material/mat=getMaterial(mat_id) - return mat.stored - -/datum/materials/proc/getMaterial(var/mat_id) - if(!(mat_id in storage)) - warning("getMaterial(): Unknown material [mat_id]!") - return 0 - - return storage[mat_id] - - -/datum/material - var/name="" - var/processed_name="" - var/id="" - var/stored=0 - var/cc_per_sheet=CC_PER_SHEET_MISC - var/oretype=null - var/sheettype=null - var/cointype=null - var/value=0 - -/datum/material/New() - if(processed_name=="") - processed_name=name - -/datum/material/iron - name="Iron" - id="iron" - value=1 - cc_per_sheet=CC_PER_SHEET_METAL - oretype=/obj/item/weapon/ore/iron - sheettype=/obj/item/stack/sheet/metal - cointype=/obj/item/weapon/coin/iron - -/datum/material/glass - name="Sand" - processed_name="Glass" - id="glass" - value=1 - cc_per_sheet=CC_PER_SHEET_GLASS - oretype=/obj/item/weapon/ore/glass - sheettype=/obj/item/stack/sheet/glass - -/datum/material/diamond - name="Diamond" - id="diamond" - value=40 - oretype=/obj/item/weapon/ore/diamond - sheettype=/obj/item/stack/sheet/mineral/diamond - cointype=/obj/item/weapon/coin/diamond - -/datum/material/plasma - name="Plasma" - id="plasma" - value=40 - oretype=/obj/item/weapon/ore/plasma - sheettype=/obj/item/stack/sheet/mineral/plasma - cointype=/obj/item/weapon/coin/plasma - -/datum/material/gold - name="Gold" - id="gold" - value=20 - oretype=/obj/item/weapon/ore/gold - sheettype=/obj/item/stack/sheet/mineral/gold - cointype=/obj/item/weapon/coin/gold - -/datum/material/silver - name="Silver" - id="silver" - value=20 - oretype=/obj/item/weapon/ore/silver - sheettype=/obj/item/stack/sheet/mineral/silver - cointype=/obj/item/weapon/coin/silver - -/datum/material/uranium - name="Uranium" - id="uranium" - value=20 - oretype=/obj/item/weapon/ore/uranium - sheettype=/obj/item/stack/sheet/mineral/uranium - cointype=/obj/item/weapon/coin/uranium - -/datum/material/clown - name="Bananium" - id="clown" - value=100 - oretype=/obj/item/weapon/ore/clown - sheettype=/obj/item/stack/sheet/mineral/clown - cointype=/obj/item/weapon/coin/clown - -/datum/material/plastic - name="Plastic" - id="plastic" - value=1 - oretype=null - sheettype=/obj/item/stack/sheet/mineral/plastic - cointype=null - -/datum/material/fabric - name="Fabric" - id="fabric" - value=20 - oretype=/obj/item/weapon/ore/fabric - sheettype=null - cointype=null \ No newline at end of file diff --git a/code/modules/mining/minerals.dm b/code/modules/mining/minerals.dm deleted file mode 100644 index 0cd46917858..00000000000 --- a/code/modules/mining/minerals.dm +++ /dev/null @@ -1,107 +0,0 @@ -var/list/name_to_mineral - -proc/SetupMinerals() - name_to_mineral = list() - for(var/type in subtypesof(/mineral)) - var/mineral/new_mineral = new type - if(!new_mineral.name) - continue - name_to_mineral[new_mineral.name] = new_mineral - return 1 - -mineral - ///What am I called? - var/name - var/display_name - ///How much ore? - var/result_amount - ///Does this type of deposit spread? - var/spread = 1 - ///Chance of spreading in any direction - var/spread_chance - - ///Path to the resultant ore. - var/ore - - New() - . = ..() - if(!display_name) - display_name = name - - proc/UpdateTurf(var/turf/simulated/mineral/T) - T.UpdateMineral() - -mineral/uranium - name = "Uranium" - result_amount = 5 - spread_chance = 10 - ore = /obj/item/weapon/ore/uranium - -mineral/iron - name = "Iron" - result_amount = 5 - spread_chance = 25 - ore = /obj/item/weapon/ore/iron - -mineral/diamond - name = "Diamond" - result_amount = 5 - spread_chance = 10 - ore = /obj/item/weapon/ore/diamond - -mineral/gold - name = "Gold" - result_amount = 5 - spread_chance = 10 - ore = /obj/item/weapon/ore/gold - -mineral/silver - name = "Silver" - result_amount = 5 - spread_chance = 10 - ore = /obj/item/weapon/ore/silver - -mineral/platinum - name = "Platinum" - result_amount = 5 - spread_chance = 10 - ore = /obj/item/weapon/ore/osmium - -mineral/plasma - name = "Plasma" - result_amount = 5 - spread_chance = 25 - ore = /obj/item/weapon/ore/plasma - -mineral/clown - display_name = "Bananium" - name = "Clown" - result_amount = 3 - spread = 0 - ore = /obj/item/weapon/ore/clown - -mineral/coal - name = "Coal" - result_amount = 5 - spread_chance = 25 - ore = /obj/item/weapon/ore/coal - -mineral/hydrogen - name = "Hydrogen" - result_amount = 5 - spread_chance = 10 - ore = /obj/item/weapon/ore/coal - - -mineral/cave - display_name = "Cave" - name = "Cave" - result_amount = 1 - spread_chance = 10 - ore = null - UpdateTurf(var/turf/T) - if(!istype(T,/turf/simulated/floor/plating/airless/asteroid/cave)) - T.ChangeTurf(/turf/simulated/floor/plating/airless/asteroid/cave) - else - ..() - diff --git a/code/modules/mining/mining_recipes.dm b/code/modules/mining/mining_recipes.dm deleted file mode 100644 index ebe28c4e083..00000000000 --- a/code/modules/mining/mining_recipes.dm +++ /dev/null @@ -1,252 +0,0 @@ -/obj/machinery/manufacturer/mining - name = "Mining Fabricator" - desc = "A manufacturing unit calibrated to produce mining related equipment." - acceptdisk = 1 - - New() - ..() - src.available += new /datum/manufacture/pick(src) - src.available += new /datum/manufacture/shovel(src) - src.available += new /datum/manufacture/oresatchel(src) - src.available += new /datum/manufacture/breathmask(src) - src.available += new /datum/manufacture/spacesuit(src) - src.available += new /datum/manufacture/spacehelm(src) - src.available += new /datum/manufacture/eyes_meson(src) - src.hidden += new /datum/manufacture/RCD(src) - src.hidden += new /datum/manufacture/RCDammo(src) - - -// Mining Gear -/datum/manufacture/pick - name = "Pickaxe" - item = /obj/item/weapon/pickaxe - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 5 - time = 5 - create = 1 - -/datum/manufacture/shovel - name = "Shovel" - item = /obj/item/weapon/shovel - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 3 - time = 2 - create = 1 - -/datum/manufacture/spick - name = "Silver Pickaxe" - item = /obj/item/weapon/pickaxe/silver - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 5 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 5 - time = 10 - create = 1 - -/datum/manufacture/gpick - name = "Gold Pickaxe" - item = /obj/item/weapon/pickaxe/gold - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 5 - cost2 = /obj/item/weapon/ore/gold - cname2 = "Gold" - amount2 = 5 - time = 15 - create = 1 - -/datum/manufacture/dpick - name = "Diamond Pickaxe" - item = /obj/item/weapon/pickaxe/diamond - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 5 - cost2 = /obj/item/weapon/ore/diamond - cname2 = "Uranium" - amount2 = 5 - time = 30 - create = 1 - -/datum/manufacture/jackhammer - name = "Sonic Jackhammer" - item = /obj/item/weapon/pickaxe/jackhammer - cost1 = /obj/item/weapon/ore/gold - cname1 = "Gold" - amount1 = 8 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 12 - time = 30 - create = 1 - -/datum/manufacture/drill - name = "Hand Drill" - item = /obj/item/weapon/pickaxe/drill - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 15 - time = 20 - create = 1 - -/datum/manufacture/diamonddrill - name = "Diamond Drill" - item = /obj/item/weapon/pickaxe/diamonddrill - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 15 - cost2 = /obj/item/weapon/ore/diamond - cname2 = "Diamond" - amount2 = 15 - cost3 = /obj/item/weapon/ore/silver - cname3 = "Silver" - amount3 = 15 - time = 40 - create = 1 - -/datum/manufacture/cutter - name = "Plasma Cutter" - item = /obj/item/weapon/pickaxe/plasmacutter - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 10 - cost2 = /obj/item/weapon/ore/gold - cname2 = "Gold" - amount2 = 10 - cost3 = /obj/item/weapon/ore/plasma - cname3 = "Plasma" - amount3 = 15 - time = 30 - create = 1 - -/datum/manufacture/eyes_meson - name = "Optical Meson Scanner" - item = /obj/item/clothing/glasses/meson - cost1 = /obj/item/weapon/ore/glass - cname1 = "Glass" - amount1 = 5 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 3 - time = 10 - create = 1 - -/datum/manufacture/miningsuit - name = "Mining Hardsuit" - item = /obj/item/clothing/suit/space/rig/mining - cost1 = /obj/item/weapon/ore/osmium - cname1 = "Platinum" - amount1 = 30 - cost2 = /obj/item/weapon/ore/iron - cname2 = "Iron" - amount2 = 30 - time = 30 - create = 1 - -/datum/manufacture/mininghelm - name = "Mining Hardsuit Helmet" - item = /obj/item/clothing/head/helmet/space/rig/mining - cost1 = /obj/item/weapon/ore/osmium - cname1 = "Platinum" - amount1 = 30 - cost2 = /obj/item/weapon/ore/iron - cname2 = "Iron" - amount2 = 30 - time = 20 - create = 1 - -/datum/manufacture/breathmask - name = "Breath Mask" - item = /obj/item/clothing/mask/breath - cost1 = /obj/item/weapon/ore/fabric - cname1 = "Fabric" - amount1 = 1 - time = 5 - create = 1 - -/datum/manufacture/spacesuit - name = "Space Suit" - item = /obj/item/clothing/suit/space - cost1 = /obj/item/weapon/ore/fabric - cname1 = "Fabric" - amount1 = 5 - cost2 = /obj/item/weapon/ore/iron - cname2 = "Iron" - amount2 = 5 - time = 15 - create = 1 - -/datum/manufacture/spacehelm - name = "Space Helmet" - item = /obj/item/clothing/head/helmet/space - cost1 = /obj/item/weapon/ore/fabric - cname1 = "Fabric" - amount1 = 5 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 5 - time = 10 - create = 1 - -/datum/manufacture/oresatchel - name = "Ore Satchel" - item = /obj/item/weapon/storage/bag/ore - cost1 = /obj/item/weapon/ore/fabric - cname1 = "Fabric" - amount1 = 5 - time = 5 - create = 1 - -/datum/manufacture/jetpack - name = "Jetpack" - item = /obj/item/weapon/tank/jetpack - cost1 = /obj/item/weapon/ore/gold - cname1 = "Gold" - amount1 = 15 - cost2 = /obj/item/weapon/ore/silver - cname2 = "Silver" - amount2 = 20 - time = 30 - create = 1 - -//Diskettes! -/obj/item/weapon/disk/data/schematic/mining1 - name = "Mining Schematics Level 1" - desc = "Contains the schematics for a new range of Pickaxes." - - New() - src.schematics += new /datum/manufacture/spick(src) - src.schematics += new /datum/manufacture/gpick(src) - src.schematics += new /datum/manufacture/dpick(src) - -/obj/item/weapon/disk/data/schematic/mining2 - name = "Mining Schematics Level 2" - desc = "Contains the schematics for a new line of drills. And a Plasma Cutter. Has the previous level as well." - - New() - src.schematics += new /datum/manufacture/spick(src) - src.schematics += new /datum/manufacture/gpick(src) - src.schematics += new /datum/manufacture/dpick(src) - src.schematics += new /datum/manufacture/drill(src) - src.schematics += new /datum/manufacture/jackhammer(src) - src.schematics += new /datum/manufacture/diamonddrill(src) - src.schematics += new /datum/manufacture/cutter(src) - -/obj/item/weapon/disk/data/schematic/mining3 - name = "Mining Schematics Level 3" - desc = "Contains the schematics for a new type of Spacesuit, and schematics for a Jetpack. Has the previous levels as well." - - New() - src.schematics += new /datum/manufacture/spick(src) - src.schematics += new /datum/manufacture/gpick(src) - src.schematics += new /datum/manufacture/dpick(src) - src.schematics += new /datum/manufacture/drill(src) - src.schematics += new /datum/manufacture/jackhammer(src) - src.schematics += new /datum/manufacture/diamonddrill(src) - src.schematics += new /datum/manufacture/cutter(src) - src.schematics += new /datum/manufacture/miningsuit(src) - src.schematics += new /datum/manufacture/mininghelm(src) - src.schematics += new /datum/manufacture/jetpack(src) \ No newline at end of file diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm deleted file mode 100644 index 9927b6e5b85..00000000000 --- a/code/modules/mining/ore_datum.dm +++ /dev/null @@ -1,55 +0,0 @@ -/datum/ore - var/oretag - var/alloy - var/smelts_to - var/compresses_to - -/datum/ore/uranium - smelts_to = /obj/item/stack/sheet/mineral/uranium - oretag = "uranium" - -/datum/ore/iron - smelts_to = /obj/item/stack/sheet/mineral/iron - alloy = 1 - oretag = "hematite" - -/datum/ore/coal - smelts_to = /obj/item/stack/sheet/mineral/plastic - alloy = 1 - oretag = "coal" - -/datum/ore/glass - smelts_to = /obj/item/stack/sheet/glass - compresses_to = /obj/item/stack/sheet/mineral/sandstone - oretag = "sand" - -/datum/ore/plasma - smelts_to = /obj/item/stack/sheet/mineral/plasma - oretag = "plasma" - -/datum/ore/silver - smelts_to = /obj/item/stack/sheet/mineral/silver - oretag = "silver" - -/datum/ore/gold - smelts_to = /obj/item/stack/sheet/mineral/gold - oretag = "gold" - -/datum/ore/diamond - compresses_to = /obj/item/stack/sheet/mineral/diamond - oretag = "diamond" - -/datum/ore/osmium - smelts_to = /obj/item/stack/sheet/mineral/platinum - compresses_to = /obj/item/stack/sheet/mineral/osmium - alloy = 1 - oretag = "platinum" - -/datum/ore/hydrogen - smelts_to = /obj/item/stack/sheet/mineral/tritium - compresses_to = /obj/item/stack/sheet/mineral/mhydrogen - oretag = "hydrogen" - -/datum/ore/clown - smelts_to = /obj/item/stack/sheet/mineral/clown - oretag = "clown" \ No newline at end of file diff --git a/code/modules/mining/security_recipes.dm b/code/modules/mining/security_recipes.dm deleted file mode 100644 index 9cbdeadc154..00000000000 --- a/code/modules/mining/security_recipes.dm +++ /dev/null @@ -1,128 +0,0 @@ -/obj/machinery/manufacturer/security - name = "Security Fabricator" - desc = "A manufacturing unit calibrated to produce security and military related equipment." - acceptdisk = 1 - - New() - ..() - src.available += new /datum/manufacture/beret(src) - src.available += new /datum/manufacture/helmet1(src) - src.available += new /datum/manufacture/sunglasses(src) - src.available += new /datum/manufacture/sechud(src) - src.available += new /datum/manufacture/secpants(src) - src.available += new /datum/manufacture/secbelt(src) - src.available += new /datum/manufacture/armor1(src) - src.available += new /datum/manufacture/taser(src) - src.available += new /datum/manufacture/baton(src) - -// Security Gear Tier-0. AKA Clothing and basic as shit gear. -/datum/manufacture/beret - name = "Beret" - item = /obj/item/clothing/head/beret/sec - cost1 = /obj/item/weapon/ore/fabric - cname1 = "Fabric" - amount1 = 2 - time = 3 - create = 1 - -/datum/manufacture/helmet1 - name = "Helmet" - item = /obj/item/clothing/head/helmet - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 10 - cost2 = /obj/item/weapon/ore/fabric - cname2 = "Fabric" - amount2 = 10 - time = 10 - create = 1 - -/datum/manufacture/sunglasses - name = "Sunglasses" - item = /obj/item/clothing/glasses/sunglasses - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 5 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 10 - time = 8 - create = 1 - -/datum/manufacture/sechud - name = "Security HUD" - item = /obj/item/clothing/glasses/hud/security - cost1 = /obj/item/weapon/ore/osmium - cname1 = "Platinum" - amount1 = 10 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 15 - time = 12 - create = 1 - -/datum/manufacture/secpants - name = "Security Uniform" - item = /obj/item/clothing/under/rank/security - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 2 - cost2 = /obj/item/weapon/ore/fabric - cname2 = "Fabric" - amount2 = 1 - time = 10 - create = 1 - -/datum/manufacture/secbelt - name = "Security Belt" - item = /obj/item/weapon/storage/belt/security - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 2 - cost2 = /obj/item/weapon/ore/fabric - cname2 = "Fabric" - amount2 = 5 - time = 15 - create = 1 - -/datum/manufacture/armor1 - name = "Armored Vest" - item = /obj/item/clothing/suit/armor/vest - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 15 - cost2 = /obj/item/weapon/ore/fabric - cname2 = "Fabric" - amount2 = 15 - time = 20 - create = 1 - -/datum/manufacture/taser - name = "Advanced Taser" - item = /obj/item/weapon/gun/energy/gun/advtaser - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 15 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 10 - cost3 = /obj/item/weapon/ore/osmium - cname3 = "Platinum" - amount3 = 20 - time = 25 - create = 1 - -/datum/manufacture/baton - name = "Stun Baton" - item = /obj/item/weapon/melee/baton - cost1 = /obj/item/weapon/ore/iron - cname1 = "Iron" - amount1 = 10 - cost2 = /obj/item/weapon/ore/glass - cname2 = "Glass" - amount2 = 10 - cost3 = /obj/item/weapon/ore/osmium - cname3 = "Platinum" - amount3 = 15 - time = 20 - create = 1 \ No newline at end of file diff --git a/code/modules/mining/surprise.dm b/code/modules/mining/surprise.dm deleted file mode 100644 index 48ecbdd5356..00000000000 --- a/code/modules/mining/surprise.dm +++ /dev/null @@ -1,342 +0,0 @@ -#define CONTIGUOUS_WALLS 1 -#define CONTIGUOUS_FLOORS 2 - -#define TURF_FLOOR 0 -#define TURF_WALL 1 -var/global/list/mining_surprises = subtypesof(/mining_surprise) - -/surprise_turf_info - var/list/types[0] - var/list/adjacents - var/turf_type=TURF_FLOOR - - New() - adjacents=list( - "[NORTH]"=list(), - "[SOUTH]"=list(), - "[EAST]"=list(), - "[WEST]"=list() - ) - - proc/GetAdjacentTypes(var/dir) - return adjacents["[dir]"] - -/surprise_room - var/list/turfs[0] - - // Used for layout system. - var/list/turf_info[0] - - var/size_x=0 - var/size_y=0 - - proc/UpdateTurfs() - for(var/turf/T in turfs) - UpdateTurf(T) - - proc/GetTurfs(var/ttype) - var/list/selected[0] - for(var/turf/T in turfs) - var/surprise_turf_info/Ti = GetTurfInfo(T) - if(Ti.turf_type==ttype) - selected |= T - return selected - - proc/GetTurfInfo(var/turf/T) - var/surprise_turf_info/sti - if(!(T in turf_info)) - sti = new - turf_info[T]=sti - else - sti = turf_info[T] - return sti - - proc/UpdateTurf(var/turf/T, var/no_adjacent=0) - // List types in this turf. - var/surprise_turf_info/sti = GetTurfInfo(T) - - sti.types=0 - for(var/atom/A in T.contents) - sti.types |= A.type - - if(no_adjacent) return - UpdateAdjacentsOfTurf(T) - - proc/AddTypeToTurf(var/turf/T, var/newtype) - var/surprise_turf_info/sti = GetTurfInfo(T) - sti.types |= newtype - - //UpdateAdjacentsOfTurf(T) - - proc/UpdateAdjacentsOfTurf(var/turf/T) - var/surprise_turf_info/Ti = turf_info[T] - for(var/dir in cardinal) - var/turf/AT = get_step(T,dir) - if(!(AT in turfs)) - return - if(!(AT in turf_info)) - UpdateTurf(AT, no_adjacent=1) - var/surprise_turf_info/ATi = turf_info[AT] - // By-Ref so shit gets updated. - ATi.adjacents["[reverse_direction(dir)]"]=Ti.types - - -// For room layouts. -/layout_rule - var/mining_surprise/root - var/surprise_room/room - - // What to place if true - var/placetype=null - - var/min_to_place=5 // Force placement at ALL candidates. - var/max_to_place=10 // 0 = max amount of ALL candidates. - - var/placed_times=0 - - var/list/decorations=list() // types, empty for no decorations - - var/flags = 0 - - New(var/mining_surprise/_root,var/surprise_room/_room) - root=_root - room=_room - - // Called in Evaluate - proc/Plop(var/turf/T) - new placetype(T) - placed_times++ - room.AddTypeToTurf(T,placetype) - if(decorations.len) - var/decoration = pickweight(decorations) - new decoration(T) - room.AddTypeToTurf(T,decoration) - - // Return 1 if we Plop()'d something. - // Return 0 if we didn't or something went wrong. - proc/Evaluate() - var/list/candidates=GetCandidates() - if(candidates.len==0) - return 0 - if(max_to_place<=0) - max_to_place=candidates.len - var/n=candidates.len - if(min_to_place>0) - n = min(candidates.len,rand(min_to_place,max_to_place)) - if(n==0) - return 0 - for(var/i=0;i0) - var/turf/weed_turf = pick(w_cand) - w_cand -= weed_turf - if(weed_turf.density) - continue - if(locate(/obj/structure/alien) in weed_turf) - continue - if(weed_turf && !egged) - new /obj/structure/alien/weeds/node(weed_turf) - weeds += weed_turf - break - - for(var/e=0;eLeft (Empty)"]" dat += " [(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "Right (Empty)"]" dat += "" + dat += "" if(istype(w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm index 5e77278be6f..d3f8a66e7a0 100644 --- a/code/modules/mob/living/carbon/human/interactive/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm @@ -262,7 +262,7 @@ MYPDA = wear_pda else MYPDA = new(src) - equip_to_slot_or_del(MYPDA, slot_belt) + equip_to_slot_or_del(MYPDA, slot_wear_pda) MYPDA.owner = real_name MYPDA.ownjob = alt_title MYPDA.ownrank = job diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 5e0a4335b83..0264e874d17 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -78,6 +78,8 @@ if(slot_wear_id) // the only relevant check for this is the uniform check return 1 + if(slot_wear_pda) + return 1 if(slot_l_ear) return has_organ("head") if(slot_r_ear) @@ -105,15 +107,19 @@ if(slot_tie) return 1 +// The actual dropping happens at the mob level - checks to prevent drops should +// come here +/mob/living/carbon/human/canUnEquip(obj/item/I, force) + . = ..() + var/obj/item/organ/O = I + if(istype(O) && O.owner == src) + . = 0 // keep a good grip on your heart + /mob/living/carbon/human/unEquip(obj/item/I) . = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should. if(!. || !I) return - var/obj/item/organ/internal/O = I //Organs shouldn't be removed unless you call droplimb. - if(istype(O) && O.owner == src) - return - if(I == wear_suit) if(s_store) unEquip(s_store, 1) //It makes no sense for your suit storage to stay on you if you drop your suit. @@ -248,6 +254,9 @@ wear_id = W sec_hud_set_ID() update_inv_wear_id(redraw_mob) + if(slot_wear_pda) + wear_pda = W + update_inv_wear_pda(redraw_mob) if(slot_l_ear) l_ear = W if(l_ear.slot_flags & SLOT_TWOEARS) @@ -334,6 +343,8 @@ return belt if(slot_wear_id) return wear_id + if(slot_wear_pda) + return wear_pda if(slot_l_ear) return l_ear if(slot_r_ear) @@ -513,6 +524,16 @@ if(!(I.slot_flags & SLOT_ID)) return 0 return 1 + if(slot_wear_pda) + if(wear_pda) + return 0 + if(!w_uniform) + if(!disable_warning) + to_chat(src, "You need a jumpsuit before you can attach this [name].") + return 0 + if(!(I.slot_flags & SLOT_PDA)) + return 0 + return 1 if(slot_l_store) if(I.flags & NODROP) //Pockets aren't visible, so you can't move NODROP items into them. return 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 63cf00f2a96..2d588063f09 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -990,6 +990,16 @@ var/global/list/damage_icon_parts = list() client.screen += r_store r_store.screen_loc = ui_storage2 +/mob/living/carbon/human/update_inv_wear_pda() + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[slot_wear_pda] + if(inv) + inv.update_icon() + + if(wear_pda) + client.screen += wear_pda + wear_pda.screen_loc = ui_pda + /mob/living/carbon/human/update_inv_wear_mask(var/update_icons = 1) ..() if(client && hud_used) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 866c01c9702..921080c989a 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -8,7 +8,7 @@ Returns standard 0 if fail */ -/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0) +/mob/living/proc/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/used_weapon = null) blocked = (100-blocked)/100 if(!damage || (blocked <= 0)) return 0 switch(damagetype) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 762efbcf02d..bd2712cdcdb 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -119,8 +119,8 @@ module_type = "Medical" subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) stacktypes = list( - /obj/item/stack/medical/advanced/bruise_pack = 5, - /obj/item/stack/medical/advanced/ointment = 5, + /obj/item/stack/medical/bruise_pack/advanced = 5, + /obj/item/stack/medical/ointment/advanced = 5, /obj/item/stack/medical/splint = 5, /obj/item/stack/nanopaste = 5 ) @@ -136,8 +136,8 @@ src.modules += new /obj/item/weapon/reagent_containers/dropper(src) src.modules += new /obj/item/weapon/reagent_containers/syringe(src) src.modules += new /obj/item/weapon/extinguisher/mini(src) - src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src) - src.modules += new /obj/item/stack/medical/advanced/ointment(src) + src.modules += new /obj/item/stack/medical/bruise_pack/advanced(src) + src.modules += new /obj/item/stack/medical/ointment/advanced(src) src.modules += new /obj/item/stack/medical/splint(src) src.modules += new /obj/item/stack/nanopaste(src) src.modules += new /obj/item/weapon/scalpel(src) @@ -362,8 +362,8 @@ name = "syndicate medical robot module" module_type = "Malf" stacktypes = list( - /obj/item/stack/medical/advanced/bruise_pack = 25, - /obj/item/stack/medical/advanced/ointment = 25, + /obj/item/stack/medical/bruise_pack/advanced = 25, + /obj/item/stack/medical/ointment/advanced = 25, /obj/item/stack/medical/splint = 25, /obj/item/stack/nanopaste = 25 ) @@ -376,8 +376,8 @@ src.modules += new /obj/item/roller_holder(src) src.modules += new /obj/item/weapon/reagent_containers/borghypo/syndicate(src) src.modules += new /obj/item/weapon/extinguisher/mini(src) - src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src) - src.modules += new /obj/item/stack/medical/advanced/ointment(src) + src.modules += new /obj/item/stack/medical/bruise_pack/advanced(src) + src.modules += new /obj/item/stack/medical/ointment/advanced(src) src.modules += new /obj/item/stack/medical/splint(src) src.modules += new /obj/item/stack/nanopaste(src) src.modules += new /obj/item/weapon/scalpel(src) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d470e19c401..93b94e74f9e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -256,6 +256,7 @@ var/list/slot_equipment_priority = list( \ slot_back,\ slot_wear_id,\ + slot_wear_pda,\ slot_w_uniform,\ slot_wear_suit,\ slot_wear_mask,\ diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index f78f6ba314f..1e9f3d8add5 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -34,6 +34,9 @@ return 1 return 0 +proc/isSSD(mob/M) + return istype(M) && M.player_logged + proc/isAntag(A) if(istype(A, /mob/living/carbon)) var/mob/living/carbon/C = A diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 0dfa4ef64fe..383f75b757f 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -245,7 +245,7 @@ if(jobban_isbanned(src,rank)) return 0 if(!is_job_whitelisted(src, rank)) return 0 if(!job.player_old_enough(src.client)) return 0 - if(job.admin_only && !(check_rights(R_ADMIN, 0))) return 0 + if(job.admin_only && !(check_rights(R_EVENT, 0))) return 0 if(config.assistantlimit) if(job.title == "Civilian") diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 689799680ec..a09589f22ee 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -153,7 +153,7 @@ var/see_ghosts = 0 //for the spoop of it -/obj/item/device/camera/spooky/CheckParts() +/obj/item/device/camera/spooky/CheckParts(list/parts_list) ..() var/obj/item/device/camera/C = locate(/obj/item/device/camera) in contents if(C) diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm index 4dfd8575a22..fafa27a24f7 100755 --- a/code/modules/pda/PDA.dm +++ b/code/modules/pda/PDA.dm @@ -11,7 +11,7 @@ var/global/list/obj/item/device/pda/PDAs = list() icon_state = "pda" item_state = "electronic" w_class = 1 - slot_flags = SLOT_ID | SLOT_BELT + slot_flags = SLOT_ID | SLOT_BELT | SLOT_PDA //Main variables var/owner = null @@ -300,15 +300,16 @@ var/global/list/obj/item/device/pda/PDAs = list() else to_chat(usr, "You cannot do this while restrained.") -/obj/item/device/pda/AltClick() +/obj/item/device/pda/AltClick(mob/user) + ..() if(issilicon(usr)) return - if(can_use(usr)) + if(can_use(user)) if(id) remove_id() else - usr << "This PDA does not have an ID in it!" + to_chat(user, "This PDA does not have an ID in it!") /obj/item/device/pda/proc/remove_id() if(id) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 6a6933db72d..3bbfbb2248c 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -457,10 +457,15 @@ obj/structure/cable/proc/cableColor(var/colorC) #define MAXCOIL 30 +var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \ + new/datum/stack_recipe("cable restraints", /obj/item/weapon/restraints/handcuffs/cable, 15), \ + ) + /obj/item/stack/cable_coil name = "cable coil" icon = 'icons/obj/power.dmi' icon_state = "coil" + item_state = "coil_red" amount = MAXCOIL max_amount = MAXCOIL color = COLOR_RED @@ -492,6 +497,7 @@ obj/structure/cable/proc/cableColor(var/colorC) pixel_x = rand(-2,2) pixel_y = rand(-2,2) update_icon() + recipes = cable_coil_recipes update_wclass() /////////////////////////////////// @@ -556,37 +562,12 @@ obj/structure/cable/proc/cableColor(var/colorC) else to_chat(user, "A coil of power cable. There are [get_amount()] lengths of cable in the coil.") - -/obj/item/stack/cable_coil/verb/make_restraint() - set name = "Make Cable Restraints" - set category = "Object" - var/mob/M = usr - - if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned) - if(!istype(usr.loc,/turf)) return - if(src.amount <= 14) - to_chat(usr, "You need at least 15 lengths to make restraints!") - return - var/obj/item/weapon/restraints/handcuffs/cable/B = new /obj/item/weapon/restraints/handcuffs/cable(usr.loc) - B.color = color - to_chat(usr, "You wind some cable together to make some restraints.") - src.use(15) - else - to_chat(usr, "You cannot do that.") - ..() - // Items usable on a cable coil : // - Wirecutters : cut them duh ! // - Cable coil : merge cables /obj/item/stack/cable_coil/attackby(obj/item/weapon/W, mob/user) ..() - if( istype(W, /obj/item/weapon/wirecutters) && src.amount > 1) - src.amount-- - new/obj/item/stack/cable_coil(user.loc, 1,color) - to_chat(user, "You cut a piece off the cable coil.") - src.update_icon() - return - else if(istype(W, /obj/item/stack/cable_coil)) + if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = W if(C.amount >= MAXCOIL) to_chat(user, "The coil is too long, you cannot add any more cable to it.") diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 89119df21a8..2493e492d48 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -70,6 +70,14 @@ src.dir = turn(src.dir, 90) return 1 +/obj/machinery/power/emitter/AltClick(mob/user) + if(user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!Adjacent(user)) + return + rotate() + /obj/machinery/power/emitter/initialize() ..() if(state == 2 && anchored) diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 051440525f3..a75bdd3ec80 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -101,6 +101,14 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin src.dir = turn(src.dir, 270) return 1 +/obj/structure/particle_accelerator/AltClick(mob/user) + if(user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!Adjacent(user)) + return + rotate() + /obj/structure/particle_accelerator/verb/rotateccw() set name = "Rotate Counter Clockwise" set category = "Object" diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index a661c0e3701..2a893755589 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -99,6 +99,7 @@ projectile_type = /obj/item/projectile/bullet materials = list(MAT_METAL=4000) + /obj/item/ammo_casing/shotgun/buckshot name = "buckshot shell" desc = "A 12 gauge buckshot shell." @@ -116,6 +117,7 @@ variance = 25 materials = list(MAT_METAL=4000) + /obj/item/ammo_casing/shotgun/beanbag name = "beanbag slug" desc = "A weak beanbag slug for riot control." @@ -123,15 +125,17 @@ projectile_type = /obj/item/projectile/bullet/weakbullet/rubber materials = list(MAT_METAL=250) + /obj/item/ammo_casing/shotgun/improvised name = "improvised shell" desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards." - icon_state = "gshell" + icon_state = "improvshell" projectile_type = /obj/item/projectile/bullet/pellet/weak materials = list(MAT_METAL=250) - pellets = 5 + pellets = 10 variance = 25 + /obj/item/ammo_casing/shotgun/improvised/overload name = "overloaded improvised shell" desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards. This one has been packed with even more \ @@ -139,12 +143,9 @@ icon_state = "improvshell" projectile_type = /obj/item/projectile/bullet/pellet/overload materials = list(MAT_METAL=250) - pellets = 5 + pellets = 4 variance = 40 -/obj/item/ammo_casing/shotgun/improvised/overload/New() - ..() - pellets = rand(3, 8) /obj/item/ammo_casing/shotgun/stunslug name = "taser slug" @@ -153,6 +154,7 @@ projectile_type = /obj/item/projectile/bullet/stunshot materials = list(MAT_METAL=250) + /obj/item/ammo_casing/shotgun/meteorshot name = "meteorshot shell" desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired." @@ -206,7 +208,7 @@ name = "laser slug" desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a laser weapon in a ballistic package." icon_state = "lshell" - projectile_type = /obj/item/projectile/beam + projectile_type = /obj/item/projectile/beam/laser /obj/item/ammo_casing/shotgun/techshell name = "unloaded technological shell" diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index a5dc8c62da3..93e5d5f2bb4 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -104,16 +104,15 @@ /obj/item/ammo_casing/energy/temp projectile_type = /obj/item/projectile/temp - e_cost = 100 fire_sound = 'sound/weapons/pulse3.ogg' + var/temp = 300 /obj/item/ammo_casing/energy/temp/New() ..() BB = null -/obj/item/ammo_casing/energy/temp/newshot(shot_temp, shot_cost) - e_cost = shot_cost - ..(shot_temp) +/obj/item/ammo_casing/energy/temp/newshot() + ..(temp) /obj/item/ammo_casing/energy/meteor projectile_type = /obj/item/projectile/meteor @@ -231,17 +230,18 @@ ..() BB = null -/obj/item/ammo_casing/energy/teleport/newshot(teleport_target) - ..() +/obj/item/ammo_casing/energy/teleport/newshot() + ..(teleport_target) /obj/item/ammo_casing/energy/mimic projectile_type = /obj/item/projectile/mimic fire_sound = 'sound/weapons/bite.ogg' select_name = "gun mimic" + var/mimic_type /obj/item/ammo_casing/energy/mimic/New() ..() BB = null -/obj/item/ammo_casing/energy/mimic/newshot(mimic_type) - ..() +/obj/item/ammo_casing/energy/mimic/newshot() + ..(mimic_type) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 5d0e190ee04..6ede088c4ce 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -161,7 +161,7 @@ return 0 return 1 -obj/item/weapon/gun/proc/newshot(params) +obj/item/weapon/gun/proc/newshot() return /obj/item/weapon/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index ca6bfd495a6..2d87a32be2b 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -80,13 +80,13 @@ var/obj/item/ammo_casing/energy/shot = ammo_type[select] return power_supply.charge >= shot.e_cost -/obj/item/weapon/gun/energy/newshot(params) +/obj/item/weapon/gun/energy/newshot() if(!ammo_type || !power_supply) return var/obj/item/ammo_casing/energy/shot = ammo_type[select] if(power_supply.charge >= shot.e_cost) //if there's enough power in the power_supply cell... chambered = shot //...prepare a new shot based on the current ammo type selected - chambered.newshot(params) + chambered.newshot() return /obj/item/weapon/gun/energy/process_chamber() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 6affad6284f..4339cd504e9 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -442,6 +442,7 @@ origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2" ammo_type = list(/obj/item/ammo_casing/energy/temp) + selfcharge = 1 cell_type = /obj/item/weapon/stock_parts/cell var/powercost = "" @@ -461,7 +462,7 @@ return ..() /obj/item/weapon/gun/energy/temperature/newshot() - ..(temperature, e_cost) + ..() /obj/item/weapon/gun/energy/temperature/attack_self(mob/living/user as mob) user.set_machine(src) @@ -493,26 +494,32 @@ return /obj/item/weapon/gun/energy/temperature/process() + ..() + var/obj/item/ammo_casing/energy/temp/T = ammo_type[select] + T.temp = temperature switch(temperature) if(0 to 100) - e_cost = 3000 + T.e_cost = 3000 powercost = "High" if(100 to 250) - e_cost = 2000 + T.e_cost = 2000 powercost = "Medium" if(251 to 300) - e_cost = 1000 + T.e_cost = 1000 powercost = "Low" if(301 to 400) - e_cost = 2000 + T.e_cost = 2000 powercost = "Medium" if(401 to 1000) - e_cost = 3000 + T.e_cost = 3000 powercost = "High" switch(powercost) - if("High") powercostcolor = "orange" - if("Medium") powercostcolor = "green" - else powercostcolor = "blue" + if("High") + powercostcolor = "orange" + if("Medium") + powercostcolor = "green" + else + powercostcolor = "blue" if(target_temperature != temperature) var/difference = abs(target_temperature - temperature) if(difference >= (10 + 40*emagged)) //so emagged temp guns adjust their temperature much more quickly @@ -616,4 +623,6 @@ var/mimic_type = /obj/item/weapon/gun/projectile/automatic/pistol //Setting this to the mimicgun type does exactly what you think it will. /obj/item/weapon/gun/energy/mimicgun/newshot() - ..(mimic_type) + var/obj/item/ammo_casing/energy/mimic/M = ammo_type[select] + M.mimic_type = mimic_type + ..() diff --git a/code/modules/projectiles/guns/energy/telegun.dm b/code/modules/projectiles/guns/energy/telegun.dm index a52a40c7ef2..2155a1cf0a1 100644 --- a/code/modules/projectiles/guns/energy/telegun.dm +++ b/code/modules/projectiles/guns/energy/telegun.dm @@ -38,4 +38,6 @@ teleport_target = L[desc] /obj/item/weapon/gun/energy/telegun/newshot() - ..(teleport_target) + var/obj/item/ammo_casing/energy/teleport/T = ammo_type[select] + T.teleport_target = teleport_target + ..() diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 8f8809c504f..ecb54b9c1f0 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -59,7 +59,7 @@ ..() if(istype(target, /mob/living/carbon)) var/mob/living/carbon/M = target - M.adjust_fire_stacks(1) + M.adjust_fire_stacks(4) M.IgniteMob() /obj/item/projectile/bullet/incendiary/firebullet diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 6fc934cd87e..cd562e00a48 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -55,7 +55,7 @@ /obj/item/projectile/temp/New(loc, shot_temp) ..(loc) - if(shot_temp) + if(!isnull(shot_temp)) temperature = shot_temp switch(temperature) if(501 to INFINITY) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index bce80d857b1..ecc9c9ddc18 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -10,6 +10,8 @@ var/const/INGEST = 2 var/total_volume = 0 var/maximum_volume = 100 var/atom/my_atom = null + var/chem_temp = 300 + var/list/datum/reagent/addiction_list = new/list() /datum/reagents/New(maximum=100) maximum_volume = maximum @@ -56,17 +58,19 @@ var/const/INGEST = 2 current_list_element = rand(1,reagent_list.len) while(total_transfered != amount) - if(total_transfered >= amount) break - if(total_volume <= 0 || !reagent_list.len) break + if(total_transfered >= amount) + break + if(total_volume <= 0 || !reagent_list.len) + break if(current_list_element > reagent_list.len) current_list_element = 1 var/datum/reagent/current_reagent = reagent_list[current_list_element] - src.remove_reagent(current_reagent.id, min(1, amount - total_transfered)) + remove_reagent(current_reagent.id, min(1, amount - total_transfered)) current_list_element++ total_transfered++ - src.update_total() + update_total() handle_reactions() return total_transfered @@ -94,7 +98,7 @@ var/const/INGEST = 2 /datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. if(!target) return - if(src.total_volume <= 0) + if(total_volume <= 0) return var/datum/reagents/R if(istype(target, /obj)) @@ -102,7 +106,7 @@ var/const/INGEST = 2 if(!O.reagents ) return R = O.reagents - else if(istype(target, /mob/living)) + else if(isliving(target)) var/mob/living/M = target if(!M.reagents) return @@ -112,10 +116,10 @@ var/const/INGEST = 2 else return - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - var/part = amount / src.total_volume + amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) + var/part = amount / total_volume var/trans_data = null - for(var/datum/reagent/current_reagent in src.reagent_list) + for(var/datum/reagent/current_reagent in reagent_list) if(!current_reagent) continue if(current_reagent.id == "blood" && ishuman(target)) @@ -126,59 +130,59 @@ var/const/INGEST = 2 if(preserve_data) trans_data = copy_data(current_reagent) - R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, src.chem_temp) - src.remove_reagent(current_reagent.id, current_reagent_transfer) + R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp) + remove_reagent(current_reagent.id, current_reagent_transfer) - src.update_total() + update_total() R.update_total() R.handle_reactions() - src.handle_reactions() + handle_reactions() return amount /datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1, safety = 0) if(!target) return - if(!target.reagents || src.total_volume<=0) + if(!target.reagents || total_volume<=0) return var/datum/reagents/R = target.reagents - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - var/part = amount / src.total_volume + amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume) + var/part = amount / total_volume var/trans_data = null - for(var/datum/reagent/current_reagent in src.reagent_list) + for(var/datum/reagent/current_reagent in reagent_list) var/current_reagent_transfer = current_reagent.volume * part if(preserve_data) trans_data = copy_data(current_reagent) R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data) - src.update_total() + update_total() R.update_total() R.handle_reactions() - src.handle_reactions() + handle_reactions() return amount /datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N if(!target) return - if(!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) + if(!target.reagents || total_volume<=0 || !get_reagent_amount(reagent)) return var/datum/reagents/R = target.reagents - if(src.get_reagent_amount(reagent) 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1*/ - if(istype(my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/M = my_atom - - if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1 + if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this + matching_other = 1 if(min_temp == 0) min_temp = chem_temp @@ -302,14 +301,14 @@ var/const/INGEST = 2 var/list/seen = viewers(4, get_turf(my_atom)) for(var/mob/M in seen) if(!C.no_message) - to_chat(M, "\blue [bicon(my_atom)] [C.mix_message]") + to_chat(M, "[bicon(my_atom)] [C.mix_message]") if(istype(my_atom, /obj/item/slime_extract)) var/obj/item/slime_extract/ME2 = my_atom ME2.Uses-- if(ME2.Uses <= 0) // give the notification that the slime core is dead for(var/mob/M in seen) - to_chat(M, "\blue [bicon(my_atom)] The [my_atom]'s power is consumed in the reaction.") + to_chat(M, "[bicon(my_atom)] The [my_atom]'s power is consumed in the reaction.") ME2.name = "used slime extract" ME2.desc = "This extract has been used up." @@ -334,7 +333,7 @@ var/const/INGEST = 2 for(var/A in reagent_list) var/datum/reagent/R = A if(R.id == reagent) - if(istype(my_atom, /mob/living)) + if(isliving(my_atom)) var/mob/living/M = my_atom R.reagent_deleted(M) reagent_list -= A @@ -361,10 +360,8 @@ var/const/INGEST = 2 del_reagent(R.id) return 0 -/datum/reagents/proc/reaction_check(mob/M, datum/reagent/R) +/datum/reagents/proc/reaction_check(mob/living/M, datum/reagent/R) var/can_process = 0 - if(!istype(M, /mob/living)) //Non-living mobs can't metabolize reagents, so don't bother trying (runtime safety check) - return can_process if(ishuman(M)) var/mob/living/carbon/human/H = M //Check if this mob's species is set and can process this type of reagent @@ -389,45 +386,28 @@ var/const/INGEST = 2 switch(method) if(TOUCH) for(var/datum/reagent/R in reagent_list) - if(ismob(A)) - if(!R) - return + if(isliving(A)) var/check = reaction_check(A, R) if(!check) continue else R.reaction_mob(A, TOUCH, R.volume*volume_modifier) if(isturf(A)) - if(!R) - return - else - R.reaction_turf(A, R.volume*volume_modifier) + R.reaction_turf(A, R.volume*volume_modifier) if(isobj(A)) - if(!R) - return - else - R.reaction_obj(A, R.volume*volume_modifier) + R.reaction_obj(A, R.volume*volume_modifier) if(INGEST) for(var/datum/reagent/R in reagent_list) - if(ismob(A) && R) - if(!R) - return + if(isliving(A)) var/check = reaction_check(A, R) if(!check) continue else R.reaction_mob(A, INGEST, R.volume*volume_modifier) - if(isturf(A) && R) - if(!R) - return - else - R.reaction_turf(A, R.volume*volume_modifier) - if(isobj(A) && R) - if(!R) - return - else - R.reaction_obj(A, R.volume*volume_modifier) - return + if(isturf(A)) + R.reaction_turf(A, R.volume*volume_modifier) + if(isobj(A)) + R.reaction_obj(A, R.volume*volume_modifier) /datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) for(var/r_id in list_reagents) @@ -435,10 +415,12 @@ var/const/INGEST = 2 add_reagent(r_id, amt, data) /datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300) - if(!isnum(amount)) return 1 + if(!isnum(amount)) + return 1 update_total() if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. - if(amount <= 0) return 0 + if(amount <= 0) + return 0 chem_temp = round(((amount * reagtemp) + (total_volume * chem_temp)) / (total_volume + amount)) //equalize with new chems for(var/A in reagent_list) @@ -476,7 +458,8 @@ var/const/INGEST = 2 /datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to - if(!isnum(amount)) return 1 + if(!isnum(amount)) + return 1 for(var/A in reagent_list) var/datum/reagent/R = A @@ -495,10 +478,13 @@ var/const/INGEST = 2 for(var/A in reagent_list) var/datum/reagent/R = A if(R.id == reagent) - if(!amount) return R + if(!amount) + return R else - if(R.volume >= amount) return R - else return 0 + if(R.volume >= amount) + return R + else + return 0 return 0 @@ -522,7 +508,8 @@ var/const/INGEST = 2 . = locate(type) in reagent_list /datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. - if(!isnum(amount)) return 1 + if(!isnum(amount)) + return 1 var/has_removed_reagent = 0 @@ -566,8 +553,10 @@ var/const/INGEST = 2 D.data = new_data /datum/reagents/proc/copy_data(datum/reagent/current_reagent) - if(!current_reagent || !current_reagent.data) return null - if(!istype(current_reagent.data, /list)) return current_reagent.data + if(!current_reagent || !current_reagent.data) + return null + if(!istype(current_reagent.data, /list)) + return current_reagent.data var/list/trans_data = current_reagent.data.Copy() diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 197df4425ec..fd5faf4d7bd 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -167,7 +167,7 @@ if(href_list["dispense"]) if(dispensable_reagents.Find(href_list["dispense"]) && beaker != null) - var/obj/item/weapon/reagent_containers/glass/B = src.beaker + var/obj/item/weapon/reagent_containers/glass/B = beaker var/datum/reagents/R = B.reagents var/space = R.maximum_volume - R.total_volume @@ -207,21 +207,21 @@ S.use(1) else if(!user.drop_item()) - to_chat(user, "\The [B] is stuck to you!") + to_chat(user, "[B] is stuck to you!") return qdel(B) broken_requirements -= broken_requirements[1] to_chat(user, "You fix [src].") return - if(src.beaker) + if(beaker) to_chat(user, "Something is already loaded into the machine.") return if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks)) - src.beaker = B + beaker = B if(!user.drop_item()) - to_chat(user, "\The [B] is stuck to you!") + to_chat(user, "[B] is stuck to you!") return B.forceMove(src) to_chat(user, "You set [B] on the machine.") @@ -248,10 +248,10 @@ return /obj/machinery/chem_dispenser/attack_ai(mob/user) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/chem_dispenser/attack_ghost(mob/user) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/chem_dispenser/attack_hand(mob/user) if(stat & BROKEN) @@ -362,10 +362,10 @@ playsound(src, 'sound/items/Ratchet.ogg', 50, 1) if(anchored) anchored = 0 - to_chat(user, "\The [src] can now be moved.") + to_chat(user, "[src] can now be moved.") else if(!anchored) anchored = 1 - to_chat(user, "\The [src] is now secured.") + to_chat(user, "[src] is now secured.") if(panel_open) if(istype(I, /obj/item/weapon/crowbar)) @@ -430,13 +430,13 @@ if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass)) - if(src.beaker) + if(beaker) to_chat(user, "A beaker is already loaded into the machine.") return if(!user.drop_item()) - to_chat(user, "\The [B] is stuck to you!") + to_chat(user, "[B] is stuck to you!") return - src.beaker = B + beaker = B B.forceMove(src) to_chat(user, "You add the beaker to the machine!") nanomanager.update_uis(src) @@ -444,14 +444,14 @@ else if(istype(B, /obj/item/weapon/storage/pill_bottle)) - if(src.loaded_pill_bottle) + if(loaded_pill_bottle) to_chat(user, "A pill bottle is already loaded into the machine.") return if(!user.drop_item()) - to_chat(user, "\The [B] is stuck to you!") + to_chat(user, "[B] is stuck to you!") return - src.loaded_pill_bottle = B + loaded_pill_bottle = B B.forceMove(src) to_chat(user, "You add the pill bottle into the dispenser slot!") nanomanager.update_uis(src) @@ -461,13 +461,13 @@ if(..()) return 1 - src.add_fingerprint(usr) + add_fingerprint(usr) usr.set_machine(src) if(href_list["ejectp"]) if(loaded_pill_bottle) - loaded_pill_bottle.forceMove(src.loc) + loaded_pill_bottle.forceMove(loc) loaded_pill_bottle = null else if(href_list["close"]) usr << browse(null, "window=chem_master") @@ -476,12 +476,11 @@ return if(href_list["print_p"]) - if(!(src.printing)) - src.printing = 1 - for(var/mob/O in viewers(usr)) - O.show_message("\blue \the [src] rattles and prints out a sheet of paper.", 1) + if(!(printing)) + printing = 1 + visible_message("[src] rattles and prints out a sheet of paper.") playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc ) + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc) P.info = "
Chemical Analysis

" P.info += "Time of analysis: [worldtime2text(world.time)]

" P.info += "Chemical name: [href_list["name"]]
" @@ -499,7 +498,7 @@ P.info += "Description: [href_list["desc"]]" P.info += "

Notes:
" P.name = "Chemical Analysis - [href_list["name"]]" - src.printing = null + printing = null if(beaker) var/datum/reagents/R = beaker.reagents @@ -537,7 +536,7 @@ var/id = href_list["addcustom"] useramount = input("Select the amount to transfer.", 30, useramount) as num useramount = isgoodnumber(useramount) - src.Topic(null, list("amount" = "[useramount]", "add" = "[id]")) + Topic(null, list("amount" = "[useramount]", "add" = "[id]")) else if(href_list["remove"]) @@ -555,7 +554,7 @@ var/id = href_list["removecustom"] useramount = input("Select the amount to transfer.", 30, useramount) as num useramount = isgoodnumber(useramount) - src.Topic(null, list("amount" = "[useramount]", "remove" = "[id]")) + Topic(null, list("amount" = "[useramount]", "remove" = "[id]")) else if(href_list["toggle"]) mode = !mode @@ -586,23 +585,23 @@ return name = reject_bad_text(name) while(count--) - var/obj/item/weapon/reagent_containers/food/pill/P = new/obj/item/weapon/reagent_containers/food/pill(src.loc) + var/obj/item/weapon/reagent_containers/food/pill/P = new/obj/item/weapon/reagent_containers/food/pill(loc) if(!name) name = reagents.get_master_reagent_name() P.name = "[name] pill" P.pixel_x = rand(-7, 7) //random position P.pixel_y = rand(-7, 7) P.icon_state = "pill"+pillsprite reagents.trans_to(P,amount_per_pill) - if(src.loaded_pill_bottle) + if(loaded_pill_bottle) if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots) P.forceMove(loaded_pill_bottle) - src.updateUsrDialog() + updateUsrDialog() else var/name = input(usr,"Name:","Name your bag!",reagents.get_master_reagent_name()) as text|null if(!name) return name = reject_bad_text(name) - var/obj/item/weapon/reagent_containers/food/condiment/pack/P = new/obj/item/weapon/reagent_containers/food/condiment/pack(src.loc) + var/obj/item/weapon/reagent_containers/food/condiment/pack/P = new/obj/item/weapon/reagent_containers/food/condiment/pack(loc) if(!name) name = reagents.get_master_reagent_name() P.originalname = name P.name = "[name] pack" @@ -627,7 +626,7 @@ name = reject_bad_text(name) var/is_medical_patch = chemical_safety_check(reagents) while(count--) - var/obj/item/weapon/reagent_containers/food/pill/patch/P = new/obj/item/weapon/reagent_containers/food/pill/patch(src.loc) + var/obj/item/weapon/reagent_containers/food/pill/patch/P = new/obj/item/weapon/reagent_containers/food/pill/patch(loc) if(!name) name = reagents.get_master_reagent_name() P.name = "[name] patch" P.pixel_x = rand(-7, 7) //random position @@ -642,7 +641,7 @@ if(!name) return name = reject_bad_text(name) - var/obj/item/weapon/reagent_containers/glass/bottle/P = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) + var/obj/item/weapon/reagent_containers/glass/bottle/P = new/obj/item/weapon/reagent_containers/glass/bottle(loc) if(!name) name = reagents.get_master_reagent_name() P.name = "[name] bottle" P.pixel_x = rand(-7, 7) //random position @@ -650,7 +649,7 @@ P.icon_state = "bottle"+bottlesprite reagents.trans_to(P,30) else - var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc) + var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(loc) reagents.trans_to(P,50) else if(href_list["change_pill"]) #define MAX_PILL_SPRITE 20 //max icon state of the pill sprites @@ -693,10 +692,10 @@ return /obj/machinery/chem_master/attack_ai(mob/user) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/chem_master/attack_ghost(mob/user) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/chem_master/attack_hand(mob/user) if(..()) @@ -733,7 +732,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) - ui = new(user, src, ui_key, "chem_master.tmpl", src.name, 575, 400) + ui = new(user, src, ui_key, "chem_master.tmpl", name, 575, 400) ui.set_initial_data(data) ui.open() @@ -793,7 +792,7 @@ default_deconstruction_crowbar(B) return 1 else - to_chat(user, "You can't use the [src.name] while it's panel is opened!") + to_chat(user, "You can't use the [name] while it's panel is opened!") return 1 else ..() @@ -884,12 +883,12 @@ return 1 else if(!user.drop_item()) - to_chat(user, "\The [O] is stuck to you!") + to_chat(user, "[O] is stuck to you!") return - src.beaker = O + beaker = O O.forceMove(src) update_icon() - src.updateUsrDialog() + updateUsrDialog() return 0 if(holdingitems && holdingitems.len >= limit) @@ -910,7 +909,7 @@ if(!O.contents.len) to_chat(user, "You empty the plant bag into the All-In-One grinder.") - src.updateUsrDialog() + updateUsrDialog() return 0 @@ -921,7 +920,7 @@ user.unEquip(O) O.forceMove(src) holdingitems += O - src.updateUsrDialog() + updateUsrDialog() return 0 /obj/machinery/reagentgrinder/attack_ai(mob/user) @@ -989,7 +988,7 @@ eject() if("detach") detach() - src.updateUsrDialog() + updateUsrDialog() return /obj/machinery/reagentgrinder/proc/detach() @@ -998,7 +997,7 @@ return if(!beaker) return - beaker.forceMove(src.loc) + beaker.forceMove(loc) beaker = null update_icon() @@ -1010,7 +1009,7 @@ return for(var/obj/item/O in holdingitems) - O.forceMove(src.loc) + O.forceMove(loc) holdingitems -= O holdingitems = list() @@ -1071,7 +1070,7 @@ return if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume)) return - playsound(src.loc, 'sound/machines/juicer.ogg', 20, 1) + playsound(loc, 'sound/machines/juicer.ogg', 20, 1) var/offset = prob(50) ? -2 : 2 animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking inuse = 1 @@ -1111,7 +1110,7 @@ return if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume)) return - playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) + playsound(loc, 'sound/machines/blender.ogg', 50, 1) var/offset = prob(50) ? -2 : 2 animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking inuse = 1 diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/Chemistry-Readme.dm index fee6e61e2b9..cae0c31162c 100644 --- a/code/modules/reagents/Chemistry-Readme.dm +++ b/code/modules/reagents/Chemistry-Readme.dm @@ -24,22 +24,22 @@ About the Holder: The holder (reagents datum) is the datum that holds a list of all reagents currently in the object.It also has all the procs needed to manipulate reagents - remove_any(var/amount) + remove_any(amount) This proc removes reagents from the holder until the passed amount is matched. It'll try to remove some of ALL reagents contained. - trans_to(var/obj/target, var/amount) + trans_to(obj/target, amount) This proc equally transfers the contents of the holder to another objects holder. You need to pass it the object (not the holder) you want to transfer to and the amount you want to transfer. Its return value is the actual amount transfered (if one of the objects is full/empty) - trans_id_to(var/obj/target, var/reagent, var/amount) + trans_id_to(obj/target, reagent, amount) Same as above but only for a specific reagent in the reagent list. If the specified amount is greater than what is available, it will use the amount of the reagent that is available. If no reagent exists, returns null. - metabolize(var/mob/M) + metabolize(mob/living/M) This proc is called by the mobs life proc. It simply calls on_mob_life for all contained reagents. You shouldnt have to use this one directly. @@ -49,16 +49,13 @@ About the Holder: Currently, this proc is automatically called by trans_to. - Modified from the original to preserve reagent data across reactions (originally for xenoarchaeology) - isolate_reagent(var/reagent) + isolate_reagent(reagent) Pass it a reagent id and it will remove all reagents but that one. It's that simple. - del_reagent(var/reagent) + del_reagent(reagent) Completely remove the reagent with the matching id. - reaction_fire(exposed_temp) - Simply calls the reaction_fire procs of all contained reagents. - update_total() This one simply updates the total volume of the holder. (the volume of all reagents added together) @@ -66,7 +63,7 @@ About the Holder: clear_reagents() This proc removes ALL reagents from the holder. - reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=0) + reaction(atom/A, method=TOUCH, volume_modifier=0) This proc calls the appropriate reaction procs of the reagents. I.e. if A is an object, it will call the reagents reaction_obj proc. The method var is used for reaction on mobs. It simply tells @@ -79,22 +76,22 @@ About the Holder: contact with the reagents of a holder. (in the 'splash' part of a beaker i.e.) More on the reaction in the reagent part of this readme. - add_reagent(var/reagent, var/amount, var/data) + add_reagent(reagent, amount, data) Attempts to add X of the matching reagent to the holder. You wont use this much. Mostly in new procs for pre-filled objects. - remove_reagent(var/reagent, var/amount) + remove_reagent(reagent, amount) The exact opposite of the add_reagent proc. - Modified from original to return the reagent's data, in order to preserve reagent data across reactions (originally for xenoarchaeology) - has_reagent(var/reagent, var/amount) + has_reagent(reagent, amount) Returns 1 if the holder contains this reagent. Or 0 if not. If you pass it an amount it will additionally check if the amount is matched. This is optional. - get_reagent_amount(var/reagent) + get_reagent_amount(reagent) Returns the amount of the matching reagent inside the holder. Returns 0 if the reagent is missing. @@ -123,26 +120,27 @@ About Reagents: Reagents are all the things you can mix and fille in bottles etc. This can be anything from rejuvs over water to ... iron. Each reagent also has a few procs - i'll explain those below. - reaction_mob(var/mob/M, var/method=TOUCH) + reaction_mob(mob/living/M, method=TOUCH) This is called by the holder's reation proc. This version is only called when the reagent reacts with a mob. The method var can be either TOUCH or INGEST. You'll want to put stuff like - acid-facemelting in here. + acid-facemelting in here. Should only ever be + called, directly, on living mobs. - reaction_obj(var/obj/O) + reaction_obj(obj/O) This is called by the holder's reation proc. This version is called when the reagents reacts with an object. You'll want to put stuff like object melting in here ... or something. i dunno. - reaction_turf(var/turf/T) + reaction_turf(turf/T) This is called by the holder's reation proc. This version is called when the reagents reacts with a turf. You'll want to put stuff like extra slippery floors for lube or something in here. - on_mob_life(var/mob/M) + on_mob_life(mob/living/M) This proc is called everytime the mobs life proc executes. This is the place where you put damage for toxins , drowsyness for sleep toxins etc etc. @@ -166,8 +164,7 @@ About Reagents: The name of the reagent. data - This var can be used for whatever the fuck you want. I used it for the sleep - toxins to make them work slowly instead of instantly. You could also use this + This var can be used for whatever the fuck you want.You could use this for DNA in a blood reagent or ... well whatever you want. color @@ -185,7 +182,7 @@ About Recipes: Recipes are simple datums that contain a list of required reagents and a result. They also have a proc that is called when the recipe is matched. - on_reaction(var/datum/reagents/holder, var/created_volume) + on_reaction(datum/reagents/holder, created_volume) This proc is called when the recipe is matched. You'll want to add explosions etc here. To find the location you'll have to do something @@ -232,7 +229,7 @@ About the Tools: R.my_atom = src, <<< set the holders my_atom to src so that we know where we are. This can also be done by calling a convenience proc: - atom/proc/create_reagents(var/max_volume) + atom/proc/create_reagents(max_volume) Other important stuff: diff --git a/code/modules/reagents/newchem/Blob-Reagents.dm b/code/modules/reagents/newchem/Blob-Reagents.dm index e451b561469..d3ebcc447b5 100644 --- a/code/modules/reagents/newchem/Blob-Reagents.dm +++ b/code/modules/reagents/newchem/Blob-Reagents.dm @@ -35,8 +35,7 @@ volume = ..() M.apply_damage(0.6*volume, BURN) M.IgniteMob() - if(isliving(M)) - M.emote("scream") + M.emote("scream") /datum/reagent/blob/envenomed_filaments //toxin, hallucination, and some bonus spore toxin name = "Envenomed Filaments" diff --git a/code/modules/reagents/newchem/chem_heater.dm b/code/modules/reagents/newchem/chem_heater.dm index daea5802d64..28d1f4c2afa 100644 --- a/code/modules/reagents/newchem/chem_heater.dm +++ b/code/modules/reagents/newchem/chem_heater.dm @@ -100,8 +100,8 @@ ui_interact(user) /obj/machinery/chem_heater/attack_ai(mob/user) - src.add_hiddenprint(user) - return src.attack_hand(user) + add_hiddenprint(user) + return attack_hand(user) /obj/machinery/chem_heater/Topic(href, href_list) if(..()) diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm index 6f8e7fd6308..def94ba9a2c 100644 --- a/code/modules/reagents/newchem/disease.dm +++ b/code/modules/reagents/newchem/disease.dm @@ -122,6 +122,25 @@ qdel(ate_heart) ..() +//virus-specific symptom reagents + +/datum/reagent/synaphydramine + name = "Diphen-Synaptizine" + id = "synaphydramine" + description = "Reduces drowsiness and hallucinations while also purging histamine from the body." + color = "#EC536D" // rgb: 236, 83, 109 + +/datum/reagent/synaphydramine/on_mob_life(mob/living/M) + M.drowsyness = max(M.drowsyness-5, 0) + if(holder.has_reagent("lsd")) + holder.remove_reagent("lsd", 5) + if(holder.has_reagent("histamine")) + holder.remove_reagent("histamine", 5) + M.hallucination = max(0, M.hallucination - 10) + if(prob(30)) + M.adjustToxLoss(1) + ..() + //virus food /datum/reagent/virus_food name = "Virus Food" diff --git a/code/modules/reagents/newchem/drinks.dm b/code/modules/reagents/newchem/drinks.dm index 4790b4d01ec..5f4dc5b0018 100644 --- a/code/modules/reagents/newchem/drinks.dm +++ b/code/modules/reagents/newchem/drinks.dm @@ -133,9 +133,7 @@ M.fakevomit() ..() -/datum/reagent/ethanol/synthanol/reaction_mob(mob/M, method=TOUCH, volume) - if(!istype(M, /mob/living)) - return +/datum/reagent/ethanol/synthanol/reaction_mob(mob/living/M, method=TOUCH, volume) if(M.isSynthetic()) return if(method == INGEST) diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index ac9f2bdcc39..99a637e4fca 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/newchem/drugs.dm @@ -522,9 +522,7 @@ result_amount = 4 mix_message = "The mixture swirls around excitedly!" -/datum/reagent/fliptonium/reaction_mob(mob/M, method=TOUCH, volume) - if(!istype(M, /mob/living)) - return +/datum/reagent/fliptonium/reaction_mob(mob/living/M, method=TOUCH, volume) if(method == INGEST || method == TOUCH) M.SpinAnimation(speed = 12, loops = -1) ..() diff --git a/code/modules/reagents/newchem/food.dm b/code/modules/reagents/newchem/food.dm index c1b78581534..6909a60e2e5 100644 --- a/code/modules/reagents/newchem/food.dm +++ b/code/modules/reagents/newchem/food.dm @@ -6,9 +6,7 @@ color = "#63DE63" metabolization_rate = 0.4 -/datum/reagent/questionmark/reaction_mob(mob/M, method=TOUCH, volume) - if(!istype(M, /mob/living)) - return +/datum/reagent/questionmark/reaction_mob(mob/living/M, method=TOUCH, volume) if(method == INGEST) M.Stun(2) M.Weaken(2) @@ -45,9 +43,7 @@ mix_message = "The citrus juices begin to blend together." mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' -/datum/reagent/triple_citrus/reaction_mob(mob/living/carbon/M, method=TOUCH, volume) - if(!istype(M, /mob/living/carbon)) - return +/datum/reagent/triple_citrus/reaction_mob(mob/living/M, method=TOUCH, volume) if(method == INGEST) M.adjustToxLoss(-rand(1,2)) @@ -134,8 +130,7 @@ ..() /datum/reagent/chocolate/reaction_turf(turf/T, volume) - src = null - if(volume >= 5) + if(volume >= 5 && !istype(T, /turf/space)) new /obj/item/weapon/reagent_containers/food/snacks/choc_pile(T) /datum/reagent/mugwort @@ -146,7 +141,7 @@ color = "#21170E" /datum/reagent/mugwort/on_mob_life(mob/living/M) - if(istype(M, /mob/living/carbon/human) && M.mind) + if(ishuman(M) && M.mind) if(M.mind.special_role == "Wizard") M.adjustToxLoss(-1*REM) M.adjustOxyLoss(-1*REM) @@ -177,9 +172,7 @@ reagent_state = LIQUID color = "#C87D28" -/datum/reagent/fungus/reaction_mob(mob/M, method=TOUCH, volume) - if(!istype(M, /mob/living)) - return +/datum/reagent/fungus/reaction_mob(mob/living/M, method=TOUCH, volume) if(method == INGEST) var/ranchance = rand(1,10) if(ranchance == 1) @@ -211,9 +204,7 @@ color = "#F5F5F5" metabolization_rate = 0.2 -/datum/reagent/msg/reaction_mob(mob/M, method=TOUCH, volume) - if(!istype(M, /mob/living)) - return +/datum/reagent/msg/reaction_mob(mob/living/M, method=TOUCH, volume) if(method == INGEST) to_chat(M, "That tasted amazing!") @@ -242,8 +233,7 @@ ..() /datum/reagent/cheese/reaction_turf(turf/T, volume) - src = null - if(volume >= 5) + if(volume >= 5 && !istype(T, /turf/space)) new /obj/item/weapon/reagent_containers/food/snacks/cheesewedge(T) /datum/chemical_reaction/cheese @@ -286,8 +276,7 @@ ..() /datum/reagent/weird_cheese/reaction_turf(turf/T, volume) - src = null - if(volume >= 5) + if(volume >= 5 && !istype(T, /turf/space)) new /obj/item/weapon/reagent_containers/food/snacks/weirdcheesewedge(T) /datum/chemical_reaction/weird_cheese @@ -323,8 +312,7 @@ color = "#9C5013" /datum/reagent/bread/reaction_turf(turf/T, volume) - src = null - if(volume >= 5) + if(volume >= 5 && !istype(T, /turf/space)) new /obj/item/weapon/reagent_containers/food/snacks/breadslice(T) /datum/reagent/vomit @@ -335,8 +323,7 @@ color = "#FFFF00" /datum/reagent/vomit/reaction_turf(turf/T, volume) - src = null - if(volume >= 5) + if(volume >= 5 && !istype(T, /turf/space)) new /obj/effect/decal/cleanable/vomit(T) playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) @@ -348,8 +335,7 @@ color = "#78FF74" /datum/reagent/greenvomit/reaction_turf(turf/T, volume) - src = null - if(volume >= 5) + if(volume >= 5 && !istype(T, /turf/space)) new /obj/effect/decal/cleanable/vomit/green(T) playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) @@ -362,9 +348,7 @@ color = "#8EAE7B" process_flags = ORGANIC | SYNTHETIC //Because apparently ghosts in the shell -/datum/reagent/ectoplasm/reaction_mob(mob/M, method=TOUCH, volume) - if(!istype(M, /mob/living)) - return +/datum/reagent/ectoplasm/reaction_mob(mob/living/M, method=TOUCH, volume) if(method == INGEST) var/spooky_eat = pick("Ugh, why did you eat that? Your mouth feels haunted. Haunted with bad flavors.", "Ugh, why did you eat that? It has the texture of ham aspic. From the 1950s. Left out in the sun.", "Ugh, why did you eat that? It tastes like a ghost fart.", "Ugh, why did you eat that? It tastes like flavor died.") to_chat(M, "[spooky_eat]") @@ -376,8 +360,7 @@ ..() /datum/reagent/ectoplasm/reaction_turf(turf/T, volume) - src = null - if(volume >= 10) + if(volume >= 10 && !istype(T, /turf/space)) new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm(T) /datum/reagent/soybeanoil @@ -448,8 +431,7 @@ ..() /datum/reagent/meatslurry/reaction_turf(turf/T, volume) - src = null - if(volume >= 5 && prob(10)) + if(volume >= 5 && prob(10) && !istype(T, /turf/space)) new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T) playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index 5b5e5722c46..e5e7af93b66 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -89,8 +89,7 @@ ..() /datum/reagent/synthflesh/reaction_turf(turf/T, volume) //let's make a mess! - src = null - if(volume >= 5) + if(volume >= 5 && !istype(T, /turf/space)) new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T) playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) @@ -620,7 +619,7 @@ SM.loot.Cut() //no abusing strange reagent for unlimited farming of resources SM.visible_message("[M] seems to rise from the dead!") - if(istype(M, /mob/living/carbon)) + if(iscarbon(M)) if(method == INGEST) if(M.stat == DEAD) if(M.getBruteLoss()+M.getFireLoss() >= 150) @@ -952,11 +951,8 @@ result_amount = 2 /datum/reagent/degreaser/reaction_turf(turf/simulated/T, volume) - if(!istype(T)) - return - src = null - if(volume >= 1) - if(istype(T) && T.wet) + if(volume >= 1 && istype(T)) + if(T.wet) T.MakeDry(TURF_WET_LUBE) /datum/reagent/degreaser/on_mob_life(mob/living/M) diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index 4508125387e..68e618a9ac7 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -8,17 +8,13 @@ var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick. var/current_cycle = 1 -/datum/reagents - var/chem_temp = 300 - var/list/datum/reagent/addiction_list = new/list() - /datum/reagents/proc/metabolize(mob/living/M) if(M) chem_temp = M.bodytemperature handle_reactions() for(var/A in reagent_list) var/datum/reagent/R = A - if(!istype(R)) + if(!istype(R)) // How are non-reagents ending up in the reagents_list? continue if(!R.holder) continue diff --git a/code/modules/reagents/newchem/other.dm b/code/modules/reagents/newchem/other.dm index 44d506a026a..2ff4a18c3d0 100644 --- a/code/modules/reagents/newchem/other.dm +++ b/code/modules/reagents/newchem/other.dm @@ -124,7 +124,7 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 mix_message = "The substance flashes multiple colors and emits the smell of a pocket protector." /datum/reagent/colorful_reagent/reaction_mob(mob/living/simple_animal/M, method=TOUCH, volume) - if(M && istype(M)) + if(isanimal(M)) M.color = pick(random_color_list) ..() @@ -187,7 +187,7 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 result_amount = 2 /datum/reagent/hair_dye/reaction_mob(mob/living/M, volume) - if(M && ishuman(M)) + if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/head/head_organ = H.get_organ("head") head_organ.r_facial = rand(0,255) @@ -217,7 +217,7 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 mix_message = "The liquid becomes slightly hairy." /datum/reagent/hairgrownium/reaction_mob(mob/living/M, volume) - if(M && ishuman(M)) + if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/head/head_organ = H.get_organ("head") head_organ.h_style = random_hair_style(H.gender, head_organ.species.name) @@ -244,7 +244,7 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 mix_message = "The liquid becomes amazingly furry and smells peculiar." /datum/reagent/super_hairgrownium/reaction_mob(mob/living/M, volume) - if(M && ishuman(M)) + if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/head/head_organ = H.get_organ("head") var/datum/sprite_accessory/tmp_hair_style = hair_styles_list["Very Long Hair"] diff --git a/code/modules/reagents/newchem/pyro.dm b/code/modules/reagents/newchem/pyro.dm index 96cbecf3680..7afdc564647 100644 --- a/code/modules/reagents/newchem/pyro.dm +++ b/code/modules/reagents/newchem/pyro.dm @@ -65,7 +65,7 @@ new /obj/effect/hotspot(T) /datum/reagent/clf3/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == TOUCH && isliving(M)) + if(method == TOUCH) M.adjust_fire_stacks(5) M.IgniteMob() M.bodytemperature += 30 @@ -177,9 +177,8 @@ mix_sound = null /datum/reagent/blackpowder/reaction_turf(turf/T, volume) //oh shit - src = null - if(volume >= 5) - if(!locate(/obj/effect/decal/cleanable/dirt/blackpowder) in get_turf(T)) //let's not have hundreds of decals of black powder on the same turf + if(volume >= 5 && !istype(T, /turf/space)) + if(!locate(/obj/effect/decal/cleanable/dirt/blackpowder) in T) //let's not have hundreds of decals of black powder on the same turf new /obj/effect/decal/cleanable/dirt/blackpowder(T) /datum/chemical_reaction/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume) @@ -436,7 +435,7 @@ ..() /datum/reagent/napalm/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == TOUCH && isliving(M)) + if(method == TOUCH) M.adjust_fire_stacks(7) /datum/chemical_reaction/napalm @@ -474,7 +473,7 @@ holder.handle_reactions() ..() -/datum/reagent/cryostylane/reaction_turf(turf/simulated/T, volume) +/datum/reagent/cryostylane/reaction_turf(turf/T, volume) if(volume >= 5) for(var/mob/living/carbon/slime/M in T) M.adjustToxLoss(rand(15,30)) @@ -537,9 +536,6 @@ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' /datum/reagent/firefighting_foam/reaction_mob(mob/living/M, method=TOUCH, volume) - if(!istype(M, /mob/living)) - return - // Put out fire if(method == TOUCH) M.adjust_fire_stacks(-(volume / 5)) // more effective than water @@ -550,24 +546,23 @@ if(!istype(T)) return var/CT = cooling_temperature - src = null - if(!istype(T, /turf/space)) - new /obj/effect/decal/cleanable/flour/foam(T) //foam mess; clears up quickly. + new /obj/effect/decal/cleanable/flour/foam(T) //foam mess; clears up quickly. var/hotspot = (locate(/obj/effect/hotspot) in T) - if(hotspot && !istype(T, /turf/space)) - var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() ) - lowertemp.temperature = max( min(lowertemp.temperature-(CT*1000),lowertemp.temperature / CT) ,0) + if(hotspot) + var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles()) + lowertemp.temperature = max(min(lowertemp.temperature-(CT*1000), lowertemp.temperature / CT), 0) lowertemp.react() T.assume_air(lowertemp) qdel(hotspot) /datum/reagent/firefighting_foam/reaction_obj(obj/O, volume) - src = null - var/turf/T = get_turf(O) + var/turf/simulated/T = get_turf(O) + if(!istype(T)) + return var/hotspot = (locate(/obj/effect/hotspot) in T) - if(hotspot && !istype(T, /turf/space)) - var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() ) - lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) + if(hotspot) + var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles()) + lowertemp.temperature = max(min(lowertemp.temperature-2000,lowertemp.temperature / 2), 0) lowertemp.react() T.assume_air(lowertemp) qdel(hotspot) @@ -625,8 +620,6 @@ T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume) /datum/reagent/plasma_dust/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma dust is stronger than fuel! - if(!istype(M, /mob/living)) - return if(method == TOUCH) M.adjust_fire_stacks(volume / 5) return diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index e9729b47f10..56d64d9a62e 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -289,8 +289,6 @@ process_flags = ORGANIC | SYNTHETIC /datum/reagent/facid/reaction_mob(mob/living/M, method=TOUCH, volume) - if(!istype(M, /mob/living)) - return //wooo more runtime fixin if(method == TOUCH || method == INGEST) if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -311,18 +309,18 @@ if(!H.wear_mask.unacidable) qdel(H.wear_mask) H.update_inv_wear_mask() - to_chat(H, "\red Your mask melts away but protects you from the acid!") + to_chat(H, "Your mask melts away but protects you from the acid!") else - to_chat(H, "\red Your mask protects you from the acid!") + to_chat(H, "Your mask protects you from the acid!") return if(H.head) if(!H.head.unacidable) qdel(H.head) H.update_inv_head() - to_chat(H, "\red Your helmet melts away but protects you from the acid") + to_chat(H, "Your helmet melts away but protects you from the acid") else - to_chat(H, "\red Your helmet protects you from the acid!") + to_chat(H, "Your helmet protects you from the acid!") return if(!H.unacidable) @@ -333,12 +331,11 @@ H.status_flags |= DISFIGURED /datum/reagent/facid/reaction_obj(obj/O, volume) - if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom))) + if((istype(O, /obj/item) || istype(O, /obj/effect/glowshroom))) if(!O.unacidable) var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc) I.desc = "Looks like this was \an [O] some time ago." - for(var/mob/M in viewers(5, O)) - to_chat(M, "\red \the [O] melts.") + O.visible_message("[O] melts.") qdel(O) /datum/chemical_reaction/facid @@ -694,45 +691,41 @@ ..() // Clear off wallrot fungi -/datum/reagent/atrazine/reaction_turf(turf/T, volume) - if(istype(T, /turf/simulated/wall)) - var/turf/simulated/wall/W = T - if(W.rotting) - W.rotting = 0 - for(var/obj/effect/E in W) - if(E.name == "Wallrot") - qdel(E) +/datum/reagent/atrazine/reaction_turf(turf/simulated/wall/W, volume) + if(istype(W) && W.rotting) + W.rotting = 0 + for(var/obj/effect/overlay/O in W) + if(O.name == "Wallrot") // This is so awful + qdel(O) - for(var/mob/O in viewers(W, null)) - O.show_message(text("\blue The fungi are completely dissolved by the solution!"), 1) + W.visible_message("The fungi are completely dissolved by the solution!") /datum/reagent/atrazine/reaction_obj(obj/O, volume) if(istype(O,/obj/structure/alien/weeds/)) var/obj/structure/alien/weeds/alien_weeds = O alien_weeds.health -= rand(15,35) // Kills alien weeds pretty fast alien_weeds.healthcheck() - else if(istype(O,/obj/effect/glowshroom)) //even a small amount is enough to kill it + else if(istype(O, /obj/effect/glowshroom)) //even a small amount is enough to kill it qdel(O) else if(istype(O,/obj/effect/plant)) - if(prob(50)) qdel(O) //Kills kudzu too. + if(prob(50)) + qdel(O) //Kills kudzu too. // Damage that is done to growing plants is separately at code/game/machinery/hydroponics at obj/item/hydroponics /datum/reagent/atrazine/reaction_mob(mob/living/M, method=TOUCH, volume) - src = null if(iscarbon(M)) var/mob/living/carbon/C = M if(!C.wear_mask) // If not wearing a mask - C.adjustToxLoss(2) // 4 toxic damage per application, doubled for some reason + C.adjustToxLoss(2) // 2 toxic damage per application if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.dna) - if(H.species.flags & IS_PLANT) //plantmen take a LOT of damage - H.adjustToxLoss(50) - ..() - else if(istype(M,/mob/living/simple_animal/diona)) //plantmen monkeys (diona) take EVEN MORE damage - var/mob/living/simple_animal/diona/D = M - D.adjustHealth(100) - ..() + if(H.species.flags & IS_PLANT) //plantmen take a LOT of damage + H.adjustToxLoss(50) + ..() + else if(istype(M, /mob/living/simple_animal/diona)) //plantmen monkeys (diona) take EVEN MORE damage + var/mob/living/simple_animal/diona/D = M + D.adjustHealth(100) + ..() /datum/chemical_reaction/atrazine name = "atrazine" @@ -817,10 +810,11 @@ reagent_state = LIQUID color = "#00FD00" -/datum/reagent/glowing_slurry/reaction_mob(mob/M, method=TOUCH, volume) //same as mutagen - if(!..()) return - if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. - src = null +/datum/reagent/glowing_slurry/reaction_mob(mob/living/M, method=TOUCH, volume) //same as mutagen + if(!..()) + return + if(!M.dna) + return //No robots, AIs, aliens, Ians or other mobs should be affected by this. if((method==TOUCH && prob(50)) || method==INGEST) randmutb(M) domutcheck(M, null) @@ -828,6 +822,8 @@ /datum/reagent/glowing_slurry/on_mob_life(mob/living/M) M.apply_effect(2, IRRADIATE, 0, negate_armor = 1) + if(!M.dna) + return if(prob(15)) randmutb(M) if(prob(3)) diff --git a/code/modules/reagents/oldchem/reagents/_reagent_base.dm b/code/modules/reagents/oldchem/reagents/_reagent_base.dm index 3adfab86292..fbf1398decb 100644 --- a/code/modules/reagents/oldchem/reagents/_reagent_base.dm +++ b/code/modules/reagents/oldchem/reagents/_reagent_base.dm @@ -21,57 +21,42 @@ var/process_flags = ORGANIC var/admin_only = 0 -/datum/reagent/proc/reaction_mob(mob/M, method=TOUCH, volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not. - if(!istype(M, /mob/living)) - return 0 - var/datum/reagent/self = src - src = null - - if(self.holder) //for catching rare runtimes - if(method == TOUCH && self.penetrates_skin) - if(isliving(M)) - var/mob/living/L = M - var/block = L.get_permeability_protection() - var/amount = round(self.volume * (1.0 - block), 0.1) - if(L.reagents) - if(amount >= 1) - L.reagents.add_reagent(self.id,amount) - +/datum/reagent/proc/reaction_mob(mob/living/M, method=TOUCH, volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not. + if(holder) //for catching rare runtimes + if(method == TOUCH && penetrates_skin) + var/block = M.get_permeability_protection() + var/amount = round(volume * (1.0 - block), 0.1) + if(M.reagents) + if(amount >= 1) + M.reagents.add_reagent(id, amount) if(method == INGEST) //Yes, even Xenos can get addicted to drugs. - var/can_become_addicted = M.reagents.reaction_check(M, self) + var/can_become_addicted = M.reagents.reaction_check(M, src) if(can_become_addicted) - if(prob(self.addiction_chance) && !is_type_in_list(self, M.reagents.addiction_list)) + if(prob(addiction_chance) && !is_type_in_list(src, M.reagents.addiction_list)) to_chat(M, "You suddenly feel invigorated and guilty...") - var/datum/reagent/new_reagent = new self.type() + var/datum/reagent/new_reagent = new type() new_reagent.last_addiction_dose = world.timeofday M.reagents.addiction_list.Add(new_reagent) - else if(is_type_in_list(self, M.reagents.addiction_list)) + else if(is_type_in_list(src, M.reagents.addiction_list)) to_chat(M, "You feel slightly better, but for how long?") for(var/A in M.reagents.addiction_list) var/datum/reagent/AD = A - if(AD && istype(AD, self)) + if(AD && istype(AD, src)) AD.last_addiction_dose = world.timeofday AD.addiction_stage = 1 return 1 -/datum/reagent/proc/reaction_obj(obj/O, volume) //By default we transfer a small part of the reagent to the object - src = null //if it can hold reagents. nope! - //if(O.reagents) - // O.reagents.add_reagent(id,volume/3) +/datum/reagent/proc/reaction_obj(obj/O, volume) return /datum/reagent/proc/reaction_turf(turf/T, volume) - src = null return /datum/reagent/proc/on_mob_life(mob/living/M) - if(!istype(M)) - return - if(holder) - holder.remove_reagent(id, metabolization_rate) //By default it slowly disappears. - current_cycle++ + current_cycle++ + holder.remove_reagent(id, metabolization_rate) //By default it slowly disappears. /datum/reagent/proc/on_mob_death(mob/living/M) //use this to have chems have a "death-triggered" effect return diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm index bc3fc46c1af..da92ffee0f2 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -29,14 +29,10 @@ to_chat(usr, "The solution melts away the ink on the book.") else to_chat(usr, "It wasn't enough...") - return /datum/reagent/ethanol/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with ethanol isn't quite as good as fuel. - if(!istype(M, /mob/living)) - return if(method == TOUCH) M.adjust_fire_stacks(volume / 15) - return /datum/reagent/ethanol/beer diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm index 418fc80daf4..26bad6c1665 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm @@ -102,7 +102,7 @@ /datum/reagent/drink/banana/on_mob_life(mob/living/M) M.nutrition += nutriment_factor - if((istype(M, /mob/living/carbon/human) && M.job in list("Clown") ) || issmall(M)) + if((ishuman(M) && M.job in list("Clown") ) || issmall(M)) M.adjustBruteLoss(-1) M.adjustFireLoss(-1) ..() @@ -114,7 +114,7 @@ /datum/reagent/drink/nothing/on_mob_life(mob/living/M) M.nutrition += nutriment_factor - if(istype(M, /mob/living/carbon/human) && M.job in list("Mime")) + if(ishuman(M) && M.job in list("Mime")) M.adjustBruteLoss(-1) M.adjustFireLoss(-1) ..() @@ -265,7 +265,7 @@ /datum/reagent/drink/bananahonk/on_mob_life(mob/living/M) M.nutrition += nutriment_factor - if((istype(M, /mob/living/carbon/human) && M.job in list("Clown") ) || issmall(M)) + if((ishuman(M) && M.job in list("Clown") ) || issmall(M)) M.adjustBruteLoss(-1) M.adjustFireLoss(-1) ..() @@ -279,7 +279,7 @@ /datum/reagent/drink/silencer/on_mob_life(mob/living/M) M.nutrition += nutriment_factor - if(istype(M, /mob/living/carbon/human) && M.job in list("Mime")) + if(ishuman(M) && M.job in list("Mime")) M.adjustBruteLoss(-1) M.adjustFireLoss(-1) ..() \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm index 45059ed84dd..52d33e21e07 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm @@ -6,8 +6,6 @@ color = "#060606" /datum/reagent/fuel/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with welding fuel to make them easy to ignite! - if(!istype(M, /mob/living)) - return if(method == TOUCH) M.adjust_fire_stacks(volume / 10) return @@ -56,8 +54,6 @@ ..() /datum/reagent/plasma/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma is stronger than fuel! - if(!istype(M, /mob/living)) - return if(method == TOUCH) M.adjust_fire_stacks(volume / 5) ..() @@ -71,13 +67,11 @@ color = "#673910" // rgb: 103, 57, 16 process_flags = ORGANIC | SYNTHETIC -/datum/reagent/thermite/reaction_turf(turf/T, volume) - src = null - if(volume >= 5) - if(istype(T, /turf/simulated/wall)) - T:thermite = 1 - T.overlays.Cut() - T.overlays = image('icons/effects/effects.dmi',icon_state = "thermite") +/datum/reagent/thermite/reaction_turf(turf/simulated/wall/W, volume) + if(volume >= 5 && istype(W)) + W.thermite = 1 + W.overlays.Cut() + W.overlays = image('icons/effects/effects.dmi',icon_state = "thermite") /datum/reagent/glycerol name = "Glycerol" diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm index 57dfd93c19d..1dbe1f05a20 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_food.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_food.dm @@ -92,19 +92,19 @@ M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT if(holder.has_reagent("frostoil")) holder.remove_reagent("frostoil", 5) - if(istype(M, /mob/living/carbon/slime)) + if(isslime(M)) M.bodytemperature += rand(5,20) if(15 to 25) M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT - if(istype(M, /mob/living/carbon/slime)) + if(isslime(M)) M.bodytemperature += rand(10,20) if(25 to 35) M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT - if(istype(M, /mob/living/carbon/slime)) + if(isslime(M)) M.bodytemperature += rand(15,20) if(35 to INFINITY) M.bodytemperature += 20 * TEMPERATURE_DAMAGE_COEFFICIENT - if(istype(M, /mob/living/carbon/slime)) + if(isslime(M)) M.bodytemperature += rand(20,25) ..() @@ -122,27 +122,27 @@ M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT if(holder.has_reagent("capsaicin")) holder.remove_reagent("capsaicin", 5) - if(istype(M, /mob/living/carbon/slime)) + if(isslime(M)) M.bodytemperature -= rand(5,20) if(15 to 25) M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT - if(istype(M, /mob/living/carbon/slime)) + if(isslime(M)) M.bodytemperature -= rand(10,20) if(25 to 35) M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT if(prob(1)) M.emote("shiver") - if(istype(M, /mob/living/carbon/slime)) + if(isslime(M)) M.bodytemperature -= rand(15,20) if(35 to INFINITY) M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT if(prob(1)) M.emote("shiver") - if(istype(M, /mob/living/carbon/slime)) + if(isslime(M)) M.bodytemperature -= rand(20,25) ..() -/datum/reagent/frostoil/reaction_turf(turf/simulated/T, volume) +/datum/reagent/frostoil/reaction_turf(turf/T, volume) if(volume >= 5) for(var/mob/living/carbon/slime/M in T) M.adjustToxLoss(rand(15,30)) @@ -202,7 +202,7 @@ /datum/reagent/sprinkles/on_mob_life(mob/living/M) M.nutrition += nutriment_factor - if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Security Pod Pilot", "Detective", "Warden", "Head of Security", "Brig Physician", "Internal Affairs Agent", "Magistrate")) + if(ishuman(M) && M.job in list("Security Officer", "Security Pod Pilot", "Detective", "Warden", "Head of Security", "Brig Physician", "Internal Affairs Agent", "Magistrate")) M.adjustBruteLoss(-1) M.adjustFireLoss(-1) ..() @@ -221,14 +221,14 @@ ..() /datum/reagent/cornoil/reaction_turf(turf/simulated/T, volume) - if(!istype(T)) return - src = null + if(!istype(T)) + return if(volume >= 3) T.MakeSlippery() var/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot) - var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() ) - lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) + var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles()) + lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0) lowertemp.react() T.assume_air(lowertemp) qdel(hotspot) @@ -297,7 +297,6 @@ ..() /datum/reagent/flour/reaction_turf(turf/T, volume) - src = null if(!istype(T, /turf/space)) new /obj/effect/decal/cleanable/flour(T) diff --git a/code/modules/reagents/oldchem/reagents/reagents_misc.dm b/code/modules/reagents/oldchem/reagents/reagents_misc.dm index c4fec24d054..ff729dcdf3f 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_misc.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_misc.dm @@ -5,9 +5,8 @@ reagent_state = LIQUID color = "#C7FFFF" // rgb: 199, 255, 255 -/datum/reagent/silicate/reaction_obj(var/obj/O, var/volume) - src = null - if(istype(O,/obj/structure/window)) +/datum/reagent/silicate/reaction_obj(obj/O, volume) + if(istype(O, /obj/structure/window)) if(O:silicate <= 200) O:silicate += volume @@ -30,9 +29,7 @@ var/b = (volume / 50) + 1 I.SetIntensity(r,g,b) O.icon = I - O:silicateIcon = I - - return*/ + O:silicateIcon = I */ /datum/reagent/oxygen @@ -99,12 +96,9 @@ color = "#1C1300" // rgb: 30, 20, 0 /datum/reagent/carbon/reaction_turf(turf/T, volume) - src = null - // Only add one dirt per turf. Was causing people to crash. - if(!istype(T, /turf/space) && !(locate(/obj/effect/decal/cleanable/dirt) in T)) + if(!istype(T, /turf/space) && !(locate(/obj/effect/decal/cleanable/dirt) in T)) // Only add one dirt per turf. Was causing people to crash. new /obj/effect/decal/cleanable/dirt(T) - /datum/reagent/gold name = "Gold" id = "gold" diff --git a/code/modules/reagents/oldchem/reagents/reagents_paint.dm b/code/modules/reagents/oldchem/reagents/reagents_paint.dm new file mode 100644 index 00000000000..0ca67259126 --- /dev/null +++ b/code/modules/reagents/oldchem/reagents/reagents_paint.dm @@ -0,0 +1,60 @@ +/datum/reagent/paint + name = "Paint" + id = "paint_" + description = "Floor paint is used to color floor tiles." + reagent_state = LIQUID + color = "#808080" + +/datum/reagent/paint/reaction_turf(turf/T, volume) + if(!istype(T, /turf/space)) + T.color = color + +/datum/reagent/paint/reaction_obj(obj/O, volume) + if(istype(O, /obj/item/weapon/light)) + O.color = color + +/datum/reagent/paint/red + name = "Red Paint" + id = "paint_red" + color = "#FF0000" + +/datum/reagent/paint/green + name = "Green Paint" + id = "paint_green" + color = "#00FF00" + +/datum/reagent/paint/blue + name = "Blue Paint" + id = "paint_blue" + color = "#0000FF" + +/datum/reagent/paint/yellow + name = "Yellow Paint" + id = "paint_yellow" + color = "#FFFF00" + +/datum/reagent/paint/violet + name = "Violet Paint" + id = "paint_violet" + color = "#FF00FF" + +/datum/reagent/paint/black + name = "Black Paint" + id = "paint_black" + color = "#333333" + +/datum/reagent/paint/white + name = "White Paint" + id = "paint_white" + color = "#FFFFFF" + +/datum/reagent/paint_remover + name = "Paint Remover" + id = "paint_remover" + description = "Paint remover is used to remove floor paint from floor tiles." + reagent_state = LIQUID + color = "#808080" + +/datum/reagent/paint_remover/reaction_turf(turf/T, volume) + if(!istype(T, /turf/space)) + T.color = initial(T.color) \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm index 20ccb420e85..bbdf92b8693 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm @@ -53,7 +53,7 @@ /datum/reagent/slimejelly/on_mob_life(mob/living/M) if(prob(10)) - to_chat(M, "\red Your insides are burning!") + to_chat(M, "Your insides are burning!") M.adjustToxLoss(rand(20,60)*REM) else if(prob(40)) M.adjustBruteLoss(-5*REM) @@ -70,10 +70,10 @@ if(ishuman(M)) var/mob/living/carbon/human/human = M if(human.species.name != "Shadow") - to_chat(M, "\red Your flesh rapidly mutates!") - to_chat(M, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") - to_chat(M, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.") - to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") + to_chat(M, "Your flesh rapidly mutates!") + to_chat(M, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") + to_chat(M, "Your body reacts violently to light. \green However, it naturally heals in darkness.") + to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") human.set_species("Shadow") ..() @@ -84,7 +84,7 @@ reagent_state = LIQUID color = "#13BC5E" // rgb: 19, 188, 94 -/datum/reagent/aslimetoxin/reaction_mob(mob/M, method=TOUCH, volume) +/datum/reagent/aslimetoxin/reaction_mob(mob/living/M, method=TOUCH, volume) if(method != TOUCH) M.ForceContractDisease(new /datum/disease/transformation/slime(0)) @@ -145,12 +145,8 @@ ..() /datum/reagent/radium/reaction_turf(turf/T, volume) - src = null - if(volume >= 3) - if(!istype(T, /turf/space)) - new /obj/effect/decal/cleanable/greenglow(T) - return - + if(volume >= 3 && !istype(T, /turf/space)) + new /obj/effect/decal/cleanable/greenglow(T) /datum/reagent/mutagen name = "Unstable mutagen" @@ -160,17 +156,19 @@ color = "#04DF27" metabolization_rate = 0.3 -/datum/reagent/mutagen/reaction_mob(mob/M, method=TOUCH, volume) - if(!..()) return - if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. - src = null +/datum/reagent/mutagen/reaction_mob(mob/living/M, method=TOUCH, volume) + if(!..()) + return + if(!M.dna) + return //No robots, AIs, aliens, Ians or other mobs should be affected by this. if((method==TOUCH && prob(33)) || method==INGEST) randmutb(M) domutcheck(M, null) M.UpdateAppearance() /datum/reagent/mutagen/on_mob_life(mob/living/M) - if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. + if(!M.dna) + return //No robots, AIs, aliens, Ians or other mobs should be affected by this. M.apply_effect(2*REM, IRRADIATE, negate_armor = 1) if(prob(4)) randmutb(M) @@ -189,10 +187,8 @@ ..() /datum/reagent/uranium/reaction_turf(turf/T, volume) - src = null - if(volume >= 3) - if(!istype(T, /turf/space)) - new /obj/effect/decal/cleanable/greenglow(T) + if(volume >= 3 && !istype(T, /turf/space)) + new /obj/effect/decal/cleanable/greenglow(T) /datum/reagent/lexorin @@ -221,8 +217,6 @@ ..() /datum/reagent/sacid/reaction_mob(mob/living/M, method=TOUCH, volume) - if(!istype(M, /mob/living)) - return if(method == TOUCH) if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -230,11 +224,11 @@ if(volume > 25) if(H.wear_mask) - to_chat(H, "\red Your mask protects you from the acid!") + to_chat(H, "Your mask protects you from the acid!") return if(H.head) - to_chat(H, "\red Your helmet protects you from the acid!") + to_chat(H, "Your helmet protects you from the acid!") return if(!M.unacidable) @@ -278,8 +272,7 @@ if(!O.unacidable) var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc) I.desc = "Looks like this was \an [O] some time ago." - for(var/mob/M in viewers(5, O)) - to_chat(M, "\red \the [O] melts.") + O.visible_message("[O] melts.") qdel(O) @@ -361,10 +354,8 @@ color = "#B31008" // rgb: 179, 16, 8 /datum/reagent/condensedcapsaicin/reaction_mob(mob/living/M, method=TOUCH, volume) - if(!istype(M, /mob/living)) - return if(method == TOUCH) - if(istype(M, /mob/living/carbon/human)) + if(ishuman(M)) var/mob/living/carbon/human/victim = M var/mouth_covered = 0 var/eyes_covered = 0 @@ -388,10 +379,10 @@ if( !safe_thing ) safe_thing = victim.glasses if( eyes_covered && mouth_covered ) - to_chat(victim, "\red Your [safe_thing] protects you from the pepperspray!") + to_chat(victim, "Your [safe_thing] protects you from the pepperspray!") return else if( mouth_covered ) // Reduced effects if partially protected - to_chat(victim, "\red Your [safe_thing] protect you from most of the pepperspray!") + to_chat(victim, "Your [safe_thing] protect you from most of the pepperspray!") if(prob(5)) victim.emote("scream") victim.eye_blurry = max(M.eye_blurry, 3) @@ -402,14 +393,14 @@ victim.drop_item() return else if( eyes_covered ) // Eye cover is better than mouth cover - to_chat(victim, "\red Your [safe_thing] protects your eyes from the pepperspray!") + to_chat(victim, "Your [safe_thing] protects your eyes from the pepperspray!") victim.eye_blurry = max(M.eye_blurry, 3) victim.damageoverlaytemp = 30 return else // Oh dear :D if(prob(5)) victim.emote("scream") - to_chat(victim, "\red You're sprayed directly in the eyes with pepperspray!") + to_chat(victim, "You're sprayed directly in the eyes with pepperspray!") victim.eye_blurry = max(M.eye_blurry, 5) victim.eye_blind = max(M.eye_blind, 2) victim.confused = max(M.confused, 6) diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index 7df0fd3fdba..a2ec51f1811 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -17,9 +17,6 @@ process_flags = ORGANIC | SYNTHETIC /datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume) - if(!istype(M, /mob/living)) - return - // Put out fire if(method == TOUCH) M.adjust_fire_stacks(-(volume / 10)) @@ -30,7 +27,6 @@ /datum/reagent/water/reaction_turf(turf/simulated/T, volume) if(!istype(T)) return - src = null if(volume >= 3) T.MakeSlippery() @@ -38,32 +34,31 @@ M.apply_water() var/hotspot = (locate(/obj/effect/hotspot) in T) - if(hotspot && !istype(T, /turf/space)) - var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() ) - lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) + if(hotspot) + var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles()) + lowertemp.temperature = max(min(lowertemp.temperature-2000,lowertemp.temperature / 2), 0) lowertemp.react() T.assume_air(lowertemp) qdel(hotspot) /datum/reagent/water/reaction_obj(obj/O, volume) - src = null - var/turf/T = get_turf(O) - var/hotspot = (locate(/obj/effect/hotspot) in T) - if(hotspot && !istype(T, /turf/space)) - var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() ) - lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) - lowertemp.react() - T.assume_air(lowertemp) - qdel(hotspot) - if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) + var/turf/simulated/T = get_turf(O) + if(istype(T)) + var/hotspot = (locate(/obj/effect/hotspot) in T) + if(hotspot) + var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles() ) + lowertemp.temperature = max(min(lowertemp.temperature-2000,lowertemp.temperature / 2), 0) + lowertemp.react() + T.assume_air(lowertemp) + qdel(hotspot) + if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube)) var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O if(!cube.wrapped) cube.Expand() // Dehydrated carp - if(istype(O,/obj/item/toy/carpplushie/dehy_carp)) + if(istype(O, /obj/item/toy/carpplushie/dehy_carp)) var/obj/item/toy/carpplushie/dehy_carp/dehy = O dehy.Swell() // Makes a carp - return /datum/reagent/lube @@ -74,9 +69,7 @@ color = "#1BB1AB" /datum/reagent/lube/reaction_turf(turf/simulated/T, volume) - if(!istype(T)) return - src = null - if(volume >= 1) + if(volume >= 1 && istype(T)) T.MakeSlippery(TURF_WET_LUBE) @@ -90,11 +83,10 @@ /datum/reagent/space_cleaner/reaction_obj(obj/O, volume) if(O && !istype(O, /atom/movable/lighting_overlay)) O.color = initial(O.color) - if(istype(O,/obj/effect/decal/cleanable)) + if(istype(O, /obj/effect/decal/cleanable)) qdel(O) - else - if(O) - O.clean_blood() + else if(O) + O.clean_blood() /datum/reagent/space_cleaner/reaction_turf(turf/T, volume) if(volume >= 1) @@ -106,14 +98,14 @@ for(var/mob/living/carbon/slime/M in T) M.adjustToxLoss(rand(5,10)) - if(istype(T,/turf/simulated)) + if(istype(T, /turf/simulated)) var/turf/simulated/S = T S.dirt = 0 -/datum/reagent/space_cleaner/reaction_mob(mob/M, method=TOUCH, volume) +/datum/reagent/space_cleaner/reaction_mob(mob/living/M, method=TOUCH, volume) if(iscarbon(M)) var/mob/living/carbon/C = M - if(istype(M,/mob/living/carbon/human)) + if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.lip_style) H.lip_style = null @@ -141,7 +133,6 @@ H.update_inv_shoes(0,0) M.clean_blood() ..() - return /datum/reagent/blood @@ -151,7 +142,7 @@ reagent_state = LIQUID color = "#C80000" // rgb: 200, 0, 0 -/datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, volume) +/datum/reagent/blood/reaction_mob(mob/living/M, method=TOUCH, volume) if(data && data["viruses"]) for(var/datum/disease/D in data["viruses"]) @@ -232,7 +223,7 @@ id = "vaccine" color = "#C81040" // rgb: 200, 16, 64 -/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, volume) +/datum/reagent/vaccine/reaction_mob(mob/living/M, method=TOUCH, volume) if(islist(data) && (method == INGEST)) for(var/datum/disease/D in M.viruses) if(D.GetDiseaseID() in data) @@ -241,7 +232,7 @@ /datum/reagent/vaccine/on_merge(list/data) if(istype(data)) - src.data |= data.Copy() + data |= data.Copy() /datum/reagent/fishwater name = "Fish Water" @@ -250,9 +241,7 @@ reagent_state = LIQUID color = "#757547" -/datum/reagent/fishwater/reaction_mob(mob/M, method=TOUCH, volume) - if(!istype(M, /mob/living)) - return +/datum/reagent/fishwater/reaction_mob(mob/living/M, method=TOUCH, volume) if(method == INGEST) to_chat(M, "Oh god, why did you drink that?") @@ -271,7 +260,7 @@ reagent_state = LIQUID color = "#757547" -/datum/reagent/fishwater/toiletwater/reaction_mob(mob/M, method=TOUCH, volume) //For shennanigans +/datum/reagent/fishwater/toiletwater/reaction_mob(mob/living/M, method=TOUCH, volume) //For shennanigans return /datum/reagent/holywater @@ -293,14 +282,14 @@ M.confused += 3 if(isvampirethrall(M)) ticker.mode.remove_vampire_mind(M.mind) - holder.remove_reagent(src.id, src.volume) + holder.remove_reagent(id, volume) M.jitteriness = 0 M.stuttering = 0 M.confused = 0 return if(iscultist(M)) ticker.mode.remove_cultist(M.mind) - holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? + holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? M.jitteriness = 0 M.stuttering = 0 M.confused = 0 @@ -331,10 +320,10 @@ var/mob/living/carbon/human/H=M if(method == TOUCH) if(H.wear_mask) - to_chat(H, "\red Your mask protects you from the holy water!") + to_chat(H, "Your mask protects you from the holy water!") return else if(H.head) - to_chat(H, "\red Your helmet protects you from the holy water!") + to_chat(H, "Your helmet protects you from the holy water!") return else to_chat(M, "Something holy interferes with your powers!") @@ -342,8 +331,8 @@ /datum/reagent/holywater/reaction_turf(turf/simulated/T, volume) - ..() - if(!istype(T)) return + if(!istype(T)) + return if(volume>=10) for(var/obj/effect/rune/R in T) qdel(R) @@ -358,13 +347,9 @@ reagent_state = LIQUID /datum/reagent/liquidgibs/reaction_turf(turf/T, volume) //yes i took it from synthflesh... - src = null - if(volume >= 5) + if(volume >= 5 && !istype(T, /turf/space)) new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T) playsound(T, 'sound/effects/splat.ogg', 50, 1, -3) - return - - /datum/reagent/lye name = "Lye" diff --git a/code/modules/reagents/pandemic.dm b/code/modules/reagents/pandemic.dm index d39b274db8c..059da261c5a 100644 --- a/code/modules/reagents/pandemic.dm +++ b/code/modules/reagents/pandemic.dm @@ -51,9 +51,9 @@ wait = 1 update_icon() spawn(waittime) - src.wait = null + wait = null update_icon() - playsound(src.loc, 'sound/machines/ping.ogg', 30, 1) + playsound(loc, 'sound/machines/ping.ogg', 30, 1) /obj/machinery/computer/pandemic/update_icon() if(stat & BROKEN) @@ -75,8 +75,8 @@ if(!beaker) return if(href_list["create_vaccine"]) - if(!src.wait) - var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) + if(!wait) + var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(loc) if(B) B.pixel_x = rand(-3, 3) B.pixel_y = rand(-3, 3) @@ -101,8 +101,8 @@ B.reagents.add_reagent("vaccine", 15, list(vaccine_type)) replicator_cooldown(200) else - src.temp_html = "The replicator is not ready yet." - src.updateUsrDialog() + temp_html = "The replicator is not ready yet." + updateUsrDialog() return else if(href_list["create_virus_culture"]) if(!wait) @@ -121,7 +121,7 @@ var/name = stripped_input(usr,"Name:","Name the culture",D.name,MAX_NAME_LEN) if(name == null || wait) return - var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) + var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(loc) B.icon_state = "bottle3" B.pixel_x = rand(-3, 3) B.pixel_y = rand(-3, 3) @@ -130,24 +130,24 @@ B.name = "[name] culture bottle" B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium." B.reagents.add_reagent("blood",20,data) - src.updateUsrDialog() + updateUsrDialog() else - src.temp_html = "The replicator is not ready yet." - src.updateUsrDialog() + temp_html = "The replicator is not ready yet." + updateUsrDialog() return else if(href_list["empty_beaker"]) beaker.reagents.clear_reagents() - src.updateUsrDialog() + updateUsrDialog() return else if(href_list["eject"]) - beaker:loc = src.loc + beaker:loc = loc beaker = null icon_state = "mixer0" - src.updateUsrDialog() + updateUsrDialog() return else if(href_list["clear"]) - src.temp_html = "" - src.updateUsrDialog() + temp_html = "" + updateUsrDialog() return else if(href_list["name_disease"]) var/new_name = stripped_input(usr, "Name the Disease", "New Name", "", MAX_NAME_LEN) @@ -161,15 +161,15 @@ A.AssignName(new_name) for(var/datum/disease/advance/AD in disease_master.processing) AD.Refresh() - src.updateUsrDialog() + updateUsrDialog() else usr << browse(null, "window=pandemic") - src.updateUsrDialog() + updateUsrDialog() return - src.add_fingerprint(usr) + add_fingerprint(usr) return /obj/machinery/computer/pandemic/attack_hand(mob/user) @@ -177,8 +177,8 @@ return user.set_machine(src) var/dat = "" - if(src.temp_html) - dat = "[src.temp_html]

Main Menu" + if(temp_html) + dat = "[temp_html]

Main Menu" else if(!beaker) dat += "Please insert beaker.
" dat += "Close" @@ -284,11 +284,11 @@ beaker = I beaker.loc = src to_chat(user, "You add the beaker to the machine.") - src.updateUsrDialog() + updateUsrDialog() icon_state = "mixer1" else if(istype(I, /obj/item/weapon/screwdriver)) - if(src.beaker) + if(beaker) beaker.loc = get_turf(src) ..() return diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index f977047d700..f8e6f626bb1 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -28,7 +28,7 @@ /obj/item/weapon/reagent_containers/New() ..() if(!possible_transfer_amounts) - src.verbs -= /obj/item/weapon/reagent_containers/verb/set_APTFT + verbs -= /obj/item/weapon/reagent_containers/verb/set_APTFT var/datum/reagents/R = new/datum/reagents(volume) reagents = R R.my_atom = src @@ -80,7 +80,7 @@ /obj/item/weapon/reagent_containers/wash(mob/user, atom/source) if(is_open_container()) if(reagents.total_volume >= volume) - to_chat(user, "\The [src] is full.") + to_chat(user, "[src] is full.") return else reagents.add_reagent("water", min(volume - reagents.total_volume, amount_per_transfer_from_this)) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 6f53f4c423b..634e0875aaf 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -49,8 +49,8 @@ if(charge_tick < recharge_time) return 0 charge_tick = 0 - if(isrobot(src.loc)) - var/mob/living/silicon/robot/R = src.loc + if(isrobot(loc)) + var/mob/living/silicon/robot/R = loc if(R && R.cell) var/datum/reagents/RG = reagent_list[mode] if(RG.total_volume < RG.maximum_volume) //Don't recharge reagents and drain power if the storage is full. @@ -84,10 +84,10 @@ if(M.reagents) var/datum/reagent/injected = chemical_reagents_list[reagent_ids[mode]] var/contained = injected.name - M.attack_log += text("\[[time_stamp()]\] Has been injected with [src.name] by [key_name(user)]. Reagents: [contained]") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to inject [key_name(M)]. Reagents: [contained]") + M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [key_name(user)]. Reagents: [contained]") + user.attack_log += text("\[[time_stamp()]\] Used the [name] to inject [key_name(M)]. Reagents: [contained]") if(M.ckey) - msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") M.LAssailant = user var/trans = R.trans_to(M, amount_per_transfer_from_this) @@ -95,7 +95,7 @@ return /obj/item/weapon/reagent_containers/borghypo/attack_self(mob/user) - playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) //Change the mode + playsound(loc, 'sound/effects/pop.ogg', 50, 0) //Change the mode mode++ if(mode > reagent_list.len) mode = 1 diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 419325445f0..deeeb76b58d 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -18,11 +18,11 @@ if(filled) if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, "\red [target] is full.") + to_chat(user, "[target] is full.") return if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/clothing/mask/cigarette)) //You can inject humans and food but you cant remove the shit. - to_chat(user, "\red You cannot directly fill this object.") + to_chat(user, "You cannot directly fill this object.") return var/trans = 0 @@ -45,60 +45,58 @@ if(safe_thing) if(!safe_thing.reagents) safe_thing.create_reagents(100) - trans = src.reagents.trans_to(safe_thing, amount_per_transfer_from_this) + trans = reagents.trans_to(safe_thing, amount_per_transfer_from_this) - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("\red [] tries to squirt something into []'s eyes, but fails!", user, target), 1) + visible_message("[user] tries to squirt something into [victim]'s eyes, but fails!") spawn(5) - src.reagents.reaction(safe_thing, TOUCH) + reagents.reaction(safe_thing, TOUCH) - to_chat(user, "\blue You transfer [trans] units of the solution.") - if(src.reagents.total_volume<=0) + to_chat(user, "You transfer [trans] units of the solution.") + if(reagents.total_volume<=0) filled = 0 icon_state = "[initial(icon_state)]" return - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("\red [] squirts something into []'s eyes!", user, target), 1) - src.reagents.reaction(target, TOUCH) + visible_message("[user] squirts something into [target]'s eyes!") + reagents.reaction(target, TOUCH) var/mob/living/M = target var/list/injected = list() - for(var/datum/reagent/R in src.reagents.reagent_list) + for(var/datum/reagent/R in reagents.reagent_list) injected += R.name var/contained = english_list(injected) - M.attack_log += text("\[[time_stamp()]\] Has been squirted with [src.name] by [key_name(user)]. Reagents: [contained]") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to squirt [key_name(M)]. Reagents: [contained]") + M.attack_log += text("\[[time_stamp()]\] Has been squirted with [name] by [key_name(user)]. Reagents: [contained]") + user.attack_log += text("\[[time_stamp()]\] Used the [name] to squirt [key_name(M)]. Reagents: [contained]") if(M.ckey) - msg_admin_attack("[key_name_admin(user)] squirted [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("[key_name_admin(user)] squirted [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") if(!iscarbon(user)) M.LAssailant = null else M.LAssailant = user - trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - to_chat(user, "\blue You transfer [trans] units of the solution.") - if(src.reagents.total_volume<=0) + trans = reagents.trans_to(target, amount_per_transfer_from_this) + to_chat(user, "You transfer [trans] units of the solution.") + if(reagents.total_volume<=0) filled = 0 icon_state = "[initial(icon_state)]" else if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers)) - to_chat(user, "\red You cannot directly remove reagents from [target].") + to_chat(user, "You cannot directly remove reagents from [target].") return if(!target.reagents.total_volume) - to_chat(user, "\red [target] is empty.") + to_chat(user, "[target] is empty.") return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) - to_chat(user, "\blue You fill the [src] with [trans] units of the solution.") + to_chat(user, "You fill [src] with [trans] units of the solution.") filled = 1 icon_state = "[initial(icon_state)][filled]" diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 2dbc77e0ba7..10187280265 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -54,10 +54,10 @@ /obj/item/weapon/reagent_containers/glass/attack_self() ..() if(is_open_container()) - to_chat(usr, "You put the lid on \the [src].") + to_chat(usr, "You put the lid on [src].") flags ^= OPENCONTAINER else - to_chat(usr, "You take the lid off \the [src].") + to_chat(usr, "You take the lid off [src].") flags |= OPENCONTAINER update_icon() @@ -208,7 +208,7 @@ if(usr.incapacitated()) return if(assembly) - to_chat(usr, "You detach [assembly] from \the [src]") + to_chat(usr, "You detach [assembly] from [src]") usr.put_in_hands(assembly) assembly = null update_icon() @@ -223,7 +223,7 @@ /obj/item/weapon/reagent_containers/glass/beaker/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/device/assembly_holder) && can_assembly) if(assembly) - to_chat(usr, "The [src] already has an assembly.") + to_chat(usr, "[src] already has an assembly.") return ..() assembly = W user.drop_item() diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 205d025383f..3972f0a4a13 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -27,24 +27,24 @@ if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution if(!A.reagents.total_volume && A.reagents) - to_chat(user, "\The [A] is empty.") + to_chat(user, "[A] is empty.") return if(reagents.total_volume >= reagents.maximum_volume) - to_chat(user, "\The [src] is full.") + to_chat(user, "[src] is full.") return var/trans = A.reagents.trans_to(src, A:amount_per_transfer_from_this) - to_chat(user, "You fill \the [src] with [trans] units of the contents of \the [A].") + to_chat(user, "You fill [src] with [trans] units of the contents of [A].") return if(reagents.total_volume < amount_per_transfer_from_this) - to_chat(user, "\The [src] is empty!") + to_chat(user, "[src] is empty!") return spray(A) - playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6) + playsound(loc, 'sound/effects/spray2.ogg', 50, 1, -6) user.changeNext_move(CLICK_CD_RANGE*2) user.newtonian_move(get_dir(A, user)) @@ -82,8 +82,8 @@ to_chat(user, "You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.") /obj/item/weapon/reagent_containers/spray/examine(mob/user) - if(..(user, 0) && user==src.loc) - to_chat(user, "[round(src.reagents.total_volume)] units left.") + if(..(user, 0) && user == loc) + to_chat(user, "[round(reagents.total_volume)] units left.") /obj/item/weapon/reagent_containers/spray/verb/empty() @@ -94,10 +94,10 @@ return if(alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes") return - if(isturf(usr.loc) && src.loc == usr) - to_chat(usr, "You empty \the [src] onto the floor.") + if(isturf(usr.loc) && loc == usr) + to_chat(usr, "You empty [src] onto the floor.") reagents.reaction(usr.loc) - src.reagents.clear_reagents() + reagents.clear_reagents() //space cleaner /obj/item/weapon/reagent_containers/spray/cleaner @@ -156,10 +156,10 @@ /obj/item/weapon/reagent_containers/spray/chemsprayer/spray(var/atom/A) var/Sprays[3] for(var/i=1, i<=3, i++) // intialize sprays - if(src.reagents.total_volume < 1) break + if(reagents.total_volume < 1) break var/obj/effect/decal/chempuff/D = new/obj/effect/decal/chempuff(get_turf(src)) D.create_reagents(amount_per_transfer_from_this) - src.reagents.trans_to(D, amount_per_transfer_from_this) + reagents.trans_to(D, amount_per_transfer_from_this) D.icon += mix_color_from_reagents(D.reagents.reagent_list) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 71232fa1dad..772eef4d0f9 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -82,7 +82,7 @@ if(istype(target, /mob/living/carbon/slime)) to_chat(user, "\red You are unable to locate any blood.") return - if(src.reagents.has_reagent("blood")) + if(reagents.has_reagent("blood")) to_chat(user, "\red There is already a blood sample in this syringe") return if(istype(target, /mob/living/carbon))//maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea. @@ -109,7 +109,7 @@ if(!do_mob(user, target, time)) return - var/amount = src.reagents.maximum_volume - src.reagents.total_volume + var/amount = reagents.maximum_volume - reagents.total_volume if(amount == 0) to_chat(usr, "The syringe is full!") return @@ -125,10 +125,10 @@ B = T.take_blood(src,amount) if(B) - src.reagents.reagent_list |= B - src.reagents.update_total() - src.on_reagent_change() - src.reagents.handle_reactions() + reagents.reagent_list |= B + reagents.update_total() + on_reagent_change() + reagents.handle_reactions() to_chat(user, "\blue You take a blood sample from [target]") for(var/mob/O in viewers(4, user)) @@ -193,25 +193,25 @@ if(istype(target,/mob/living)) var/mob/living/M = target var/list/injected = list() - for(var/datum/reagent/R in src.reagents.reagent_list) + for(var/datum/reagent/R in reagents.reagent_list) injected += R.name var/contained = english_list(injected) - M.attack_log += text("\[[time_stamp()]\] Has been injected with [src.name] by [key_name(user)]. Reagents: [contained]") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to inject [key_name(M)]. Reagents: [contained]") + M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [key_name(user)]. Reagents: [contained]") + user.attack_log += text("\[[time_stamp()]\] Used the [name] to inject [key_name(M)]. Reagents: [contained]") if(M.ckey) - msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") if(!iscarbon(user)) M.LAssailant = null else M.LAssailant = user - src.reagents.reaction(target, INGEST) + reagents.reaction(target, INGEST) if(ismob(target) && target == user) - src.reagents.reaction(target, INGEST) + reagents.reaction(target, INGEST) spawn(5) var/datum/reagent/blood/B - for(var/datum/reagent/blood/d in src.reagents.reagent_list) + for(var/datum/reagent/blood/d in reagents.reagent_list) B = d break var/trans @@ -219,8 +219,8 @@ var/mob/living/carbon/C = target C.inject_blood(src, 5) else - trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.") + trans = reagents.trans_to(target, amount_per_transfer_from_this) + to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [reagents.total_volume] units.") if(istype(target, /obj/item/weapon/reagent_containers/food/pill/patch)) var/obj/item/weapon/reagent_containers/food/pill/patch/P = target if(P.instant_application) @@ -342,12 +342,12 @@ if(!do_mob(user, target, 300)) return for(var/mob/O in viewers(world.view, user)) O.show_message(text("\red [] injects [] with a giant syringe!", user, target), 1) - src.reagents.reaction(target, INGEST) + reagents.reaction(target, INGEST) if(ismob(target) && target == user) - src.reagents.reaction(target, INGEST) + reagents.reaction(target, INGEST) spawn(5) - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.") + var/trans = reagents.trans_to(target, amount_per_transfer_from_this) + to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [reagents.total_volume] units.") if(reagents.total_volume >= reagents.maximum_volume && mode==SYRINGE_INJECT) mode = SYRINGE_DRAW update_icon() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 5d2323b9b6e..f5225daeae1 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -20,18 +20,18 @@ reagents = R R.my_atom = src if(!possible_transfer_amounts) - src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT + verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT ..() /obj/structure/reagent_dispensers/examine(mob/user) if(!..(user, 2)) return - to_chat(user, "\blue It contains:") + to_chat(user, "It contains:") if(reagents && reagents.reagent_list.len) for(var/datum/reagent/R in reagents.reagent_list) - to_chat(user, "\blue [R.volume] units of [R.name]") + to_chat(user, "[R.volume] units of [R.name]") else - to_chat(user, "\blue Nothing.") + to_chat(user, "Nothing.") /obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this set name = "Set transfer amount" @@ -50,12 +50,12 @@ return if(2.0) if(prob(50)) - new /obj/effect/effect/water(src.loc) + new /obj/effect/effect/water(loc) qdel(src) return if(3.0) if(prob(5)) - new /obj/effect/effect/water(src.loc) + new /obj/effect/effect/water(loc) qdel(src) return else @@ -63,7 +63,7 @@ /obj/structure/reagent_dispensers/blob_act() if(prob(50)) - new /obj/effect/effect/water(src.loc) + new /obj/effect/effect/water(loc) qdel(src) @@ -106,7 +106,7 @@ boom() /obj/structure/reagent_dispensers/fueltank/proc/boom() - explosion(src.loc,0,1,5,7,10, flame_range = 5) + explosion(loc,0,1,5,7,10, flame_range = 5) if(src) qdel(src) @@ -128,13 +128,13 @@ if(!..(user, 2)) return if(rig) - to_chat(usr, "There is some kind of device rigged to the tank.") + to_chat(usr, "There is some kind of device rigged to the tank.") /obj/structure/reagent_dispensers/fueltank/attack_hand() if(rig) - usr.visible_message("[usr] begins to detach [rig] from \the [src].", "You begin to detach [rig] from \the [src]") + usr.visible_message("[usr] begins to detach [rig] from [src].", "You begin to detach [rig] from [src].") if(do_after(usr, 20, target = src)) - usr.visible_message("\blue [usr] detaches [rig] from \the [src].", "\blue You detach [rig] from \the [src]") + usr.visible_message("[usr] detaches [rig] from [src].", "You detach [rig] from [src].") rig.loc = get_turf(usr) rig = null overlays = new/list() @@ -142,11 +142,11 @@ /obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W, mob/user, params) if(istype(W,/obj/item/device/assembly_holder) && accepts_rig) if(rig) - to_chat(user, "\red There is another device in the way.") + to_chat(user, "There is another device in the way.") return ..() - user.visible_message("[user] begins rigging [W] to \the [src].", "You begin rigging [W] to \the [src]") + user.visible_message("[user] begins rigging [W] to [src].", "You begin rigging [W] to [src]") if(do_after(user, 20, target = src)) - user.visible_message("\blue [user] rigs [W] to \the [src].", "\blue You rig [W] to \the [src]") + user.visible_message("[user] rigs [W] to [src].", "You rig [W] to [src].") var/obj/item/device/assembly_holder/H = W if(istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter)) @@ -231,7 +231,7 @@ reagents.add_reagent("beer",1000) /obj/structure/reagent_dispensers/beerkeg/blob_act() - explosion(src.loc,0,3,5,7,10) + explosion(loc,0,3,5,7,10) qdel(src) /obj/structure/reagent_dispensers/virusfood diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 948973bc3bc..4e720f39c00 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -96,6 +96,14 @@ dir = turn(dir, -90) update() +/obj/structure/disposalconstruct/AltClick(mob/user) + if(user.incapacitated()) + to_chat(user << "You can't do that right now!") + return + if(!Adjacent(user)) + return + rotate() + /obj/structure/disposalconstruct/verb/flip() set name = "Flip Pipe" set src in view(1) diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 8f2b16626d3..f292209ac3e 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -837,13 +837,13 @@ construction_time = 100 category = list("Exosuit Equipment") -/datum/design/mech_bolas - name = "Exosuit Weapon Design (PCMK-6 Bolas Launcher)" - desc = "Allows for the construction of PCMK-6 Bolas Launcher." - id = "mech_bolas" +/datum/design/mech_bola + name = "Exosuit Weapon Design (PCMK-6 Bola Launcher)" + desc = "Allows for the construction of PCMK-6 Bola Launcher." + id = "mech_bola" build_type = MECHFAB req_tech = list("combat" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bola materials = list(MAT_METAL=10000) construction_time = 100 category = list("Exosuit Equipment") diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 30c58cce776..262820990c2 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -260,7 +260,7 @@ if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) visible_message("[src] malfunctions and destroys [exp_on], lashing its arms out at nearby people!") for(var/mob/living/m in oview(1, src)) - m.apply_damage(15,"brute",pick("head","chest","groin")) + m.apply_damage(15,BRUTE,pick("head","chest","groin")) investigate_log("Experimentor dealt minor brute to [m].", "experimentor") ejectItem(TRUE) if(prob(EFFECT_PROB_LOW-badThingCoeff)) @@ -398,7 +398,7 @@ visible_message("[src] malfunctions, activating its emergency coolant systems!") throwSmoke(src.loc) for(var/mob/living/m in oview(1, src)) - m.apply_damage(5,"burn",pick("head","chest","groin")) + m.apply_damage(5,BURN,pick("head","chest","groin")) investigate_log("Experimentor has dealt minor burn damage to [m]", "experimentor") ejectItem() //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm index a7cd09b63ac..0a89272f1bb 100644 --- a/code/modules/spacepods/spacepod.dm +++ b/code/modules/spacepods/spacepod.dm @@ -130,7 +130,7 @@ light_color = icon_light_color[src.icon_state] /obj/spacepod/bullet_act(var/obj/item/projectile/P) - if(P.damage && !P.nodamage) + if(P.damage_type == BRUTE || P.damage_type == BURN) deal_damage(P.damage) else if(P.flag == "energy" && istype(P,/obj/item/projectile/ion)) //needed to make sure ions work properly empulse(src, 1, 1) @@ -250,95 +250,99 @@ processing_objects.Add(src) /obj/spacepod/attackby(obj/item/W as obj, mob/user as mob, params) - if(iscrowbar(W)) - if(!equipment_system.lock_system || unlocked || hatch_open) - hatch_open = !hatch_open - playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - to_chat(user, "You [hatch_open ? "open" : "close"] the maintenance hatch.") - else - to_chat(user, "The hatch is locked shut!") - return - if(istype(W, /obj/item/weapon/stock_parts/cell)) - if(!hatch_open) - to_chat(user, "\red The maintenance hatch is closed!") - return - if(battery) - to_chat(user, "The pod already has a battery.") - return - user.drop_item(W) - battery = W - W.forceMove(src) - return - if(istype(W, /obj/item/device/spacepod_equipment)) - if(!hatch_open) - to_chat(user, "\red The maintenance hatch is closed!") - return - if(!equipment_system) - to_chat(user, "The pod has no equipment datum, yell at the coders") - return - if(istype(W, /obj/item/device/spacepod_equipment/weaponry)) - add_equipment(user, W, "weapon_system") - return - if(istype(W, /obj/item/device/spacepod_equipment/misc)) - add_equipment(user, W, "misc_system") - return - if(istype(W, /obj/item/device/spacepod_equipment/cargo)) - add_equipment(user, W, "cargo_system") - return - if(istype(W, /obj/item/device/spacepod_equipment/sec_cargo)) - add_equipment(user, W, "sec_cargo_system") - return - if(istype(W, /obj/item/device/spacepod_equipment/lock)) - add_equipment(user, W, "lock_system") - return - - if(istype(W, /obj/item/device/spacepod_key) && istype(equipment_system.lock_system, /obj/item/device/spacepod_equipment/lock/keyed)) - var/obj/item/device/spacepod_key/key = W - if(key.id == equipment_system.lock_system.id) - lock_pod() - return - else - to_chat(user, "This is the wrong key!") - return - - if(istype(W, /obj/item/weapon/weldingtool)) - if(!hatch_open) - to_chat(user, "\red You must open the maintenance hatch before attempting repairs.") - return - var/obj/item/weapon/weldingtool/WT = W - if(!WT.isOn()) - to_chat(user, "\red The welder must be on for this task.") - return - if(health < initial(health)) - to_chat(user, "\blue You start welding the spacepod...") - playsound(loc, 'sound/items/Welder.ogg', 50, 1) - if(do_after(user, 20, target = src)) - if(!src || !WT.remove_fuel(3, user)) return - repair_damage(10) - to_chat(user, "\blue You mend some [pick("dents","bumps","damage")] with \the [WT]") - return - to_chat(user, "\blue \The [src] is fully repaired!") - return - - if(istype(W, /obj/item/device/lock_buster)) - var/obj/item/device/lock_buster/L = W - if(L.on && equipment_system.lock_system) - user.visible_message(user, "[user] is drilling through the [src]'s lock!", - "You start drilling through the [src]'s lock!") - if(do_after(user, 100, target = src)) - qdel(equipment_system.lock_system) - equipment_system.lock_system = null - user.visible_message(user, "[user] has destroyed the [src]'s lock!", - "You destroy the [src]'s lock!") + if(user.a_intent == I_HARM) + ..() + deal_damage(W.force) + else + if(iscrowbar(W)) + if(!equipment_system.lock_system || unlocked || hatch_open) + hatch_open = !hatch_open + playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + to_chat(user, "You [hatch_open ? "open" : "close"] the maintenance hatch.") else - user.visible_message(user, "[user] fails to break through the [src]'s lock!", - "You were unable to break through the [src]'s lock!") + to_chat(user, "The hatch is locked shut!") return - to_chat(user, "Turn the [L] on first.") - return + if(istype(W, /obj/item/weapon/stock_parts/cell)) + if(!hatch_open) + to_chat(user, "\red The maintenance hatch is closed!") + return + if(battery) + to_chat(user, "The pod already has a battery.") + return + user.drop_item(W) + battery = W + W.forceMove(src) + return + if(istype(W, /obj/item/device/spacepod_equipment)) + if(!hatch_open) + to_chat(user, "\red The maintenance hatch is closed!") + return + if(!equipment_system) + to_chat(user, "The pod has no equipment datum, yell at the coders") + return + if(istype(W, /obj/item/device/spacepod_equipment/weaponry)) + add_equipment(user, W, "weapon_system") + return + if(istype(W, /obj/item/device/spacepod_equipment/misc)) + add_equipment(user, W, "misc_system") + return + if(istype(W, /obj/item/device/spacepod_equipment/cargo)) + add_equipment(user, W, "cargo_system") + return + if(istype(W, /obj/item/device/spacepod_equipment/sec_cargo)) + add_equipment(user, W, "sec_cargo_system") + return + if(istype(W, /obj/item/device/spacepod_equipment/lock)) + add_equipment(user, W, "lock_system") + return - if(cargo_hold.storage_slots > 0 && !hatch_open && unlocked) // must be the last option as all items not listed prior will be stored - cargo_hold.attackby(W, user, params) + if(istype(W, /obj/item/device/spacepod_key) && istype(equipment_system.lock_system, /obj/item/device/spacepod_equipment/lock/keyed)) + var/obj/item/device/spacepod_key/key = W + if(key.id == equipment_system.lock_system.id) + lock_pod() + return + else + to_chat(user, "This is the wrong key!") + return + + if(istype(W, /obj/item/weapon/weldingtool)) + if(!hatch_open) + to_chat(user, "\red You must open the maintenance hatch before attempting repairs.") + return + var/obj/item/weapon/weldingtool/WT = W + if(!WT.isOn()) + to_chat(user, "\red The welder must be on for this task.") + return + if(health < initial(health)) + to_chat(user, "\blue You start welding the spacepod...") + playsound(loc, 'sound/items/Welder.ogg', 50, 1) + if(do_after(user, 20, target = src)) + if(!src || !WT.remove_fuel(3, user)) return + repair_damage(10) + to_chat(user, "\blue You mend some [pick("dents","bumps","damage")] with \the [WT]") + return + to_chat(user, "\blue \The [src] is fully repaired!") + return + + if(istype(W, /obj/item/device/lock_buster)) + var/obj/item/device/lock_buster/L = W + if(L.on && equipment_system.lock_system) + user.visible_message(user, "[user] is drilling through the [src]'s lock!", + "You start drilling through the [src]'s lock!") + if(do_after(user, 100, target = src)) + qdel(equipment_system.lock_system) + equipment_system.lock_system = null + user.visible_message(user, "[user] has destroyed the [src]'s lock!", + "You destroy the [src]'s lock!") + else + user.visible_message(user, "[user] fails to break through the [src]'s lock!", + "You were unable to break through the [src]'s lock!") + return + to_chat(user, "Turn the [L] on first.") + return + + if(cargo_hold.storage_slots > 0 && !hatch_open && unlocked) // must be the last option as all items not listed prior will be stored + cargo_hold.attackby(W, user, params) obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment/SPE, var/slot) if(equipment_system.vars[slot]) @@ -370,7 +374,10 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment if(do_after(user, 50, target = src)) target.forceMove(get_turf(src)) target.Stun(1) - passengers -= target + if(pilot) + pilot = null + else + passengers -= target target.visible_message("[user] flings the door open and tears [target] out of the [src]", "The door flies open and you are thrown out of the [src] and to the ground!") return diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index 1c1ad5dfa1d..6e947511dd6 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -128,7 +128,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message(" [user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \ " Your hand slips, tearing skin on [target]'s face with \the [tool]!") - target.apply_damage(10, BRUTE, affected, sharp=1, sharp=1) + target.apply_damage(10, BRUTE, affected, sharp=1, edge=1) return 0 /datum/surgery_step/face/cauterize diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index e16a07c454c..625f886455a 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -72,7 +72,7 @@ name = "manipulate organs" allowed_tools = list(/obj/item/organ/internal = 100, /obj/item/weapon/reagent_containers/food/snacks/organ = 0) var/implements_extract = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/kitchen/utensil/fork = 55) - var/implements_mend = list(/obj/item/stack/medical/advanced/bruise_pack = 100,/obj/item/stack/nanopaste = 100,/obj/item/stack/medical/bruise_pack = 20) + var/implements_mend = list(/obj/item/stack/medical/bruise_pack = 20,/obj/item/stack/medical/bruise_pack/advanced = 100,/obj/item/stack/nanopaste = 100) //Finish is just so you can close up after you do other things. var/implements_finsh = list(/obj/item/weapon/scalpel/manager = 120,/obj/item/weapon/retractor = 100 ,/obj/item/weapon/crowbar = 75) var/current_type @@ -156,10 +156,10 @@ else if(implement_type in implements_mend) current_type = "mend" var/tool_name = "\the [tool]" - if(istype(tool, /obj/item/stack/medical/advanced/bruise_pack)) - tool_name = "regenerative membrane" - else if(istype(tool, /obj/item/stack/medical/bruise_pack)) + if(istype(tool, /obj/item/stack/medical/bruise_pack)) tool_name = "the bandaid" + if(istype(tool, /obj/item/stack/medical/bruise_pack/advanced)) + tool_name = "regenerative membrane" else if(istype(tool, /obj/item/stack/nanopaste)) tool_name = "\the [tool]" //what else do you call nanopaste medically? @@ -177,7 +177,8 @@ user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \ "You start treating damage to [target]'s [I.name] with [tool_name]." ) - to_chat(user, "[I] does not appear to be damaged.") + else + to_chat(user, "[I] does not appear to be damaged.") H.custom_pain("The pain in your [affected.name] is living hell!",1) else if(istype(tool, /obj/item/weapon/reagent_containers/food/snacks/organ)) @@ -188,7 +189,7 @@ /datum/surgery_step/internal/manipulate_organs/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) if(current_type == "mend") var/tool_name = "\the [tool]" - if(istype(tool, /obj/item/stack/medical/advanced/bruise_pack)) + if(istype(tool, /obj/item/stack/medical/bruise_pack/advanced)) tool_name = "regenerative membrane" if(istype(tool, /obj/item/stack/medical/bruise_pack)) tool_name = "the bandaid" @@ -266,7 +267,7 @@ " Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!") var/dam_amt = 2 - if(istype(tool, /obj/item/stack/medical/advanced/bruise_pack)) + if(istype(tool, /obj/item/stack/medical/bruise_pack/advanced)) target.adjustToxLoss(5) else if(istype(tool, /obj/item/stack/medical/bruise_pack) || istype(tool, /obj/item/stack/nanopaste)) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 44c0e30d9f2..21328599a19 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -256,11 +256,11 @@ if(iscarbon(user)) var/mob/living/carbon/C = user C.Weaken(6) - C.apply_damage(20, "brute", "chest") + C.apply_damage(20, BRUTE, "chest") else if(issilicon(user)) var/mob/living/silicon/S = user S.Weaken(8) - S.apply_damage(20, "brute") + S.apply_damage(20, BRUTE) playsound(S, 'sound/effects/bang.ogg', 50, 1) return 0 user.visible_message("[user] shines light onto the tumor in [target]'s head!", "You cleanse the contamination from [target]'s brain!") diff --git a/code/world.dm b/code/world.dm index 6fa54acfbe7..c82b00b8e9a 100644 --- a/code/world.dm +++ b/code/world.dm @@ -154,6 +154,39 @@ var/world_topic_spam_protect_time = world.timeofday return list2params(s) + else if("manifest" in input) + var/list/positions = list() + var/list/set_names = list( + "heads" = command_positions, + "sec" = security_positions, + "eng" = engineering_positions, + "med" = medical_positions, + "sci" = science_positions, + "car" = supply_positions, + "srv" = service_positions, + "civ" = civilian_positions, + "bot" = nonhuman_positions + ) + + for(var/datum/data/record/t in data_core.general) + var/name = t.fields["name"] + var/rank = t.fields["rank"] + var/real_rank = t.fields["real_rank"] + + var/department = 0 + for(var/k in set_names) + if(real_rank in set_names[k]) + if(!positions[k]) + positions[k] = list() + positions[k][name] = rank + department = 1 + if(!department) + if(!positions["misc"]) + positions["misc"] = list() + positions["misc"][name] = rank + + return json_encode(positions) + else if("adminmsg" in input) /* We got an adminmsg from IRC bot lets split the input then validate the input. diff --git a/html/changelog.html b/html/changelog.html index df0593625b4..27fe9b5f57f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,54 @@ -->
+

21 July 2016

+

Alffd updated:

+
    +
  • Added a 6th Vulpkanin tail option.
  • +
  • Fixes animations, side view, and pixel fill for Vulpkanin tail 6
  • +
+

FalseIncarnate updated:

+
    +
  • Engineers can properly show up for work with their hats and coats to keep warm.
  • +
+

Fox McCloud updated:

+
    +
  • Tajarans and Unathi can now wear all shoe and glove types
  • +
  • Glove clipping removed except for black gloves, which makes them fingerless gloves
  • +
  • Adds sandals as a loadout option
  • +
  • Adds in simple animal mob spawners
  • +
  • Adds shielded hardsuit to the nuke ops uplink for 30 TC
  • +
  • Implements the powerfist and adds it to the uplink for 8 TC
  • +
  • Removed drinking glass shattering (regular bottle shattering is still a thing)
  • +
  • Captain's flask is now gold instead of silver
  • +
  • Bottles have a throwforce of 15
  • +
  • can crack eggs into drinking glasses
  • +
  • Detective's flask starts out with 30 units of whiskey
  • +
  • removes redundant object verbs that have an action button
  • +
  • Fixes up mindswap spell so it behaves more properly
  • +
  • Fixes genetic abilities action buttons not properly clearing
  • +
  • Fixes simple animals, silicons, and brains becoming perma deaf from flashbangs and other sources
  • +
  • ACTUALLY FIXES MINING APC
  • +
  • Fixes brig cell timers not having the option to flash people
  • +
+

FreeStylaLT updated:

+
    +
  • Added new syndicate item Chameleon SecHUD to uplink store, available for all antags. It can morph into various eyewear while being a flashproof sechud.
  • +
+

Kyep updated:

+
    +
  • Added new syndicate costumes to "select equipment" admin verb.
  • +
+

TullyBBurnalot updated:

+
    +
  • More beds outside the Operating Theaters, Pajama Wardrobes outside and inside the Operating Theaters, an extra NanoMed Vendor, one Disposal Chute per OR, table with cards
  • +
  • Sinks moved closer to Surgical Tables, moved light fixtures in the Operating Theaters, tables with surgical tools now made of glass for maximum style points and Xenomorph Larva Whack-A-Mole
  • +
+

monster860 updated:

+
    +
  • Brig timer UI reopening after being closed fixed.
  • +
+

20 July 2016

Allfd updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index ce569c985b3..1309d5211dd 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2391,3 +2391,45 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. to reset them to their initial position. - tweak: Implants with limited uses, such as freedom implants, now delete themselves when they run out of uses. +2016-07-21: + Alffd: + - rscadd: Added a 6th Vulpkanin tail option. + - tweak: Fixes animations, side view, and pixel fill for Vulpkanin tail 6 + FalseIncarnate: + - bugfix: Engineers can properly show up for work with their hats and coats to keep + warm. + Fox McCloud: + - tweak: Tajarans and Unathi can now wear all shoe and glove types + - tweak: Glove clipping removed except for black gloves, which makes them fingerless + gloves + - rscadd: Adds sandals as a loadout option + - rscadd: Adds in simple animal mob spawners + - rscadd: Adds shielded hardsuit to the nuke ops uplink for 30 TC + - rscadd: Implements the powerfist and adds it to the uplink for 8 TC + - rscdel: Removed drinking glass shattering (regular bottle shattering is still + a thing) + - rscadd: Captain's flask is now gold instead of silver + - tweak: Bottles have a throwforce of 15 + - rscadd: can crack eggs into drinking glasses + - tweak: Detective's flask starts out with 30 units of whiskey + - rscdel: removes redundant object verbs that have an action button + - bugfix: Fixes up mindswap spell so it behaves more properly + - bugfix: Fixes genetic abilities action buttons not properly clearing + - bugfix: Fixes simple animals, silicons, and brains becoming perma deaf from flashbangs + and other sources + - bugfix: ACTUALLY FIXES MINING APC + - bugfix: Fixes brig cell timers not having the option to flash people + FreeStylaLT: + - rscadd: Added new syndicate item Chameleon SecHUD to uplink store, available for + all antags. It can morph into various eyewear while being a flashproof sechud. + Kyep: + - rscadd: Added new syndicate costumes to "select equipment" admin verb. + TullyBBurnalot: + - rscadd: More beds outside the Operating Theaters, Pajama Wardrobes outside and + inside the Operating Theaters, an extra NanoMed Vendor, one Disposal Chute per + OR, table with cards + - tweak: Sinks moved closer to Surgical Tables, moved light fixtures in the Operating + Theaters, tables with surgical tools now made of glass for maximum style points + and Xenomorph Larva Whack-A-Mole + monster860: + - bugfix: Brig timer UI reopening after being closed fixed. diff --git a/html/changelogs/AutoChangeLog-pr-4739.yml b/html/changelogs/AutoChangeLog-pr-4739.yml new file mode 100644 index 00000000000..1938b2c45d4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4739.yml @@ -0,0 +1,4 @@ +author: monster860, clusterfack, and DeityLink +delete-after: True +changes: + - rscadd: "Adds space parallax" diff --git a/html/changelogs/AutoChangeLog-pr-4881.yml b/html/changelogs/AutoChangeLog-pr-4881.yml deleted file mode 100644 index 2d7a5ed3321..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4881.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: TullyBBurnalot -delete-after: True -changes: - - rscadd: "More beds outside the Operating Theaters, Pajama Wardrobes outside and inside the Operating Theaters, an extra NanoMed Vendor, one Disposal Chute per OR, table with cards" - - tweak: "Sinks moved closer to Surgical Tables, moved light fixtures in the Operating Theaters, tables with surgical tools now made of glass for maximum style points and Xenomorph Larva Whack-A-Mole" diff --git a/html/changelogs/AutoChangeLog-pr-4996.yml b/html/changelogs/AutoChangeLog-pr-4996.yml new file mode 100644 index 00000000000..c6079f72ff3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4996.yml @@ -0,0 +1,5 @@ +author: TullyBurnalot +delete-after: True +changes: + - tweak: "AI Integrity Restorers now destroy any AIs inside if they get EMP'd" + - tweak: "AI Integrity Restorers can be deconstructed if broken via explosions. This kills the AI inside" diff --git a/html/changelogs/AutoChangeLog-pr-5089.yml b/html/changelogs/AutoChangeLog-pr-5089.yml deleted file mode 100644 index a43df58ee05..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5089.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - tweak: "Tajarans and Unathi can now wear all shoe and glove types" - - tweak: "Glove clipping removed except for black gloves, which makes them fingerless gloves" - - rscadd: "Adds sandals as a loadout option" diff --git a/html/changelogs/AutoChangeLog-pr-5090.yml b/html/changelogs/AutoChangeLog-pr-5090.yml deleted file mode 100644 index 3252d032abc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5090.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Adds in simple animal mob spawners" diff --git a/html/changelogs/AutoChangeLog-pr-5091.yml b/html/changelogs/AutoChangeLog-pr-5091.yml deleted file mode 100644 index cae8cf4032f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5091.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Adds shielded hardsuit to the nuke ops uplink for 30 TC" diff --git a/html/changelogs/AutoChangeLog-pr-5092.yml b/html/changelogs/AutoChangeLog-pr-5092.yml deleted file mode 100644 index 25004699c9e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5092.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Implements the powerfist and adds it to the uplink for 8 TC" diff --git a/html/changelogs/AutoChangeLog-pr-5100.yml b/html/changelogs/AutoChangeLog-pr-5100.yml new file mode 100644 index 00000000000..4da76e20694 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5100.yml @@ -0,0 +1,4 @@ +author: A Giant-Ass Mountain of Salt +delete-after: True +changes: + - rscadd: "Re-adds PDA slot." diff --git a/html/changelogs/AutoChangeLog-pr-5102.yml b/html/changelogs/AutoChangeLog-pr-5102.yml deleted file mode 100644 index f99b59db6a0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5102.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscdel: "Removed drinking glass shattering (regular bottle shattering is still a thing)" - - rscadd: "Captain's flask is now gold instead of silver" - - tweak: "Bottles have a throwforce of 15" - - rscadd: "can crack eggs into drinking glasses" - - tweak: "Detective's flask starts out with 30 units of whiskey" diff --git a/html/changelogs/AutoChangeLog-pr-5107.yml b/html/changelogs/AutoChangeLog-pr-5107.yml deleted file mode 100644 index d7a906a976f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5107.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscdel: "removes redundant object verbs that have an action button" diff --git a/html/changelogs/AutoChangeLog-pr-5108.yml b/html/changelogs/AutoChangeLog-pr-5108.yml new file mode 100644 index 00000000000..91ad159673c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5108.yml @@ -0,0 +1,6 @@ +author: Twinmold +delete-after: True +changes: + - bugfix: "Can no longer destroy pods with anything other than brute and burn weapons." + - bugfix: "Can no longer pull someone out of a pod when no one is actually in the pod." + - tweak: "Can now melee attack pods with weapons when harm intent is on." diff --git a/html/changelogs/AutoChangeLog-pr-5111.yml b/html/changelogs/AutoChangeLog-pr-5111.yml deleted file mode 100644 index 7ac1169830d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5111.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Kyep -delete-after: True -changes: - - rscadd: "Added new syndicate costumes to \"select equipment\" admin verb." diff --git a/html/changelogs/AutoChangeLog-pr-5112.yml b/html/changelogs/AutoChangeLog-pr-5112.yml deleted file mode 100644 index ceab85d927f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5112.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: FreeStylaLT -delete-after: True -changes: - - rscadd: "Added new syndicate item Chameleon SecHUD to uplink store, available for all antags. It can morph into various eyewear while being a flashproof sechud." diff --git a/html/changelogs/AutoChangeLog-pr-5113.yml b/html/changelogs/AutoChangeLog-pr-5113.yml deleted file mode 100644 index f6e80fee660..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5113.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Alffd -delete-after: True -changes: - - rscadd: "Added a 6th Vulpkanin tail option." diff --git a/html/changelogs/AutoChangeLog-pr-5131.yml b/html/changelogs/AutoChangeLog-pr-5131.yml deleted file mode 100644 index fe4d3b2ba46..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5131.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes up mindswap spell so it behaves more properly" - - bugfix: "Fixes genetic abilities action buttons not properly clearing" - - bugfix: "Fixes simple animals, silicons, and brains becoming perma deaf from flashbangs and other sources" diff --git a/html/changelogs/AutoChangeLog-pr-5133.yml b/html/changelogs/AutoChangeLog-pr-5133.yml deleted file mode 100644 index b6791c98619..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5133.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "ACTUALLY FIXES MINING APC" diff --git a/html/changelogs/AutoChangeLog-pr-5134.yml b/html/changelogs/AutoChangeLog-pr-5134.yml deleted file mode 100644 index 7b1826aa212..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5134.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: FalseIncarnate -delete-after: True -changes: - - bugfix: "Engineers can properly show up for work with their hats and coats to keep warm." diff --git a/html/changelogs/AutoChangeLog-pr-5137.yml b/html/changelogs/AutoChangeLog-pr-5137.yml new file mode 100644 index 00000000000..ec2f850e681 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5137.yml @@ -0,0 +1,5 @@ +author: Kyep +delete-after: True +changes: + - rscadd: "Admins can now see attacks against SSD players more easily." + - tweak: "Clarified the text you get when examining a SSD player." diff --git a/html/changelogs/AutoChangeLog-pr-5138.yml b/html/changelogs/AutoChangeLog-pr-5138.yml new file mode 100644 index 00000000000..c6c227bb522 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5138.yml @@ -0,0 +1,11 @@ +author: FreeStylaLT +delete-after: True +changes: + - bugfix: "Fixed brig cell block APCs not getting power" + - bugfix: "Fixed space buggery Kyet made :angry:" + - bugfix: "Fixed missing light near labor shuttle dock" + - bugfix: "Fixed wrongly placed cobweb in solitary" + - bugfix: "Fixed basketball court not having a basketball" + - rscadd: "Added windows to brig processing entrance" + - rscadd: "Re-added the missing EOD and biohazard lockers in Armory" + - rscdel: "6 gas masks from Armory" diff --git a/html/changelogs/AutoChangeLog-pr-5141.yml b/html/changelogs/AutoChangeLog-pr-5141.yml deleted file mode 100644 index e7fc1672f8e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5141.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: monster860 -delete-after: True -changes: - - bugfix: "Brig timer UI reopening after being closed fixed." diff --git a/html/changelogs/AutoChangeLog-pr-5142.yml b/html/changelogs/AutoChangeLog-pr-5142.yml deleted file mode 100644 index 3b02e3a3158..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5142.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Alffd -delete-after: True -changes: - - tweak: "Fixes animations, side view, and pixel fill for Vulpkanin tail 6" diff --git a/html/changelogs/AutoChangeLog-pr-5143.yml b/html/changelogs/AutoChangeLog-pr-5143.yml deleted file mode 100644 index 348453e89b8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5143.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes brig cell timers not having the option to flash people" diff --git a/html/changelogs/AutoChangeLog-pr-5144.yml b/html/changelogs/AutoChangeLog-pr-5144.yml new file mode 100644 index 00000000000..e0805cd23d4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5144.yml @@ -0,0 +1,6 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes organ repair surgery saying an organ wasn't damaged when it actually was" + - tweak: "Removes the 1 burn heal from regular ointment" + - tweak: "Regular bandages will now disinfect (in addition to stopping bleeding as they previously did)" diff --git a/html/changelogs/AutoChangeLog-pr-5150.yml b/html/changelogs/AutoChangeLog-pr-5150.yml new file mode 100644 index 00000000000..d3f7a6a55fa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5150.yml @@ -0,0 +1,4 @@ +author: FreeStylaLT +delete-after: True +changes: + - rscadd: "Added grid check into random events." diff --git a/html/changelogs/AutoChangeLog-pr-5155.yml b/html/changelogs/AutoChangeLog-pr-5155.yml new file mode 100644 index 00000000000..2d79019ec97 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5155.yml @@ -0,0 +1,4 @@ +author: Twinmold +delete-after: True +changes: + - tweak: "Vox Objective 4 now calculates the kills vox raiders actually have, instead of always complete." diff --git a/html/changelogs/AutoChangeLog-pr-5159.yml b/html/changelogs/AutoChangeLog-pr-5159.yml new file mode 100644 index 00000000000..f61ea6e1943 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5159.yml @@ -0,0 +1,9 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes a few crafting recipes not having the proper category" + - bugfix: "Fixes laser slugs not firing lasers" + - tweak: "Adjusts the damage/consistency of improvised slugs" + - rscadd: "Adds in craftable bolas; throw them at someone to slow them down" + - rscadd: "Secvend starts off with e-bolas" + - rscadd: "Can make spears with personal crafting now" diff --git a/html/changelogs/AutoChangeLog-pr-5161.yml b/html/changelogs/AutoChangeLog-pr-5161.yml new file mode 100644 index 00000000000..a40bea35861 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5161.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes teacups and some other drinks having no sprite, in-hand, or object" diff --git a/html/changelogs/AutoChangeLog-pr-5162.yml b/html/changelogs/AutoChangeLog-pr-5162.yml new file mode 100644 index 00000000000..ea046aab6ce --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5162.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - rscadd: "Adds an explosion buildmode" diff --git a/html/changelogs/AutoChangeLog-pr-5164.yml b/html/changelogs/AutoChangeLog-pr-5164.yml new file mode 100644 index 00000000000..a8255aa162d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5164.yml @@ -0,0 +1,5 @@ +author: TheDZD +delete-after: True +changes: + - bugfix: "Fixes tempgun not recharging." + - bugfix: "Fixes tempgun beams costing one tenth of what they are supposed to." diff --git a/html/changelogs/AutoChangeLog-pr-5165.yml b/html/changelogs/AutoChangeLog-pr-5165.yml new file mode 100644 index 00000000000..1ed519978b6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5165.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "adds alt-click rotating of chairs, disposal pipes, windows, the PA, emitters, and windoor assemblies" diff --git a/html/changelogs/AutoChangeLog-pr-5170.yml b/html/changelogs/AutoChangeLog-pr-5170.yml new file mode 100644 index 00000000000..bf144623d0a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5170.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - bugfix: "\"Drop Everything\" in VV no longer causes limbs to fall to the ground." diff --git a/html/changelogs/AutoChangeLog-pr-5172.yml b/html/changelogs/AutoChangeLog-pr-5172.yml new file mode 100644 index 00000000000..d147308871a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5172.yml @@ -0,0 +1,8 @@ +author: Fox McCloud +delete-after: True +changes: + - tweak: "Cablecuffs are now made by opening the cable stack's crafting menu by using it in your hand" + - bugfix: "Fixes cablecuffs not having a unique in-hand icon" + - bugfix: "Fixes cable coils not having a unique in-hand icon" + - tweak: "All cablecuffs will be red, regardless of what they're produced from" + - bugfix: "Fixes an unlimited metal exploit" diff --git a/html/changelogs/AutoChangeLog-pr-5173.yml b/html/changelogs/AutoChangeLog-pr-5173.yml new file mode 100644 index 00000000000..2fd77d57ab3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5173.yml @@ -0,0 +1,8 @@ +author: Krausus +delete-after: True +changes: + - tweak: "The voting panel now uses the browser datum, which means it looks nicer." + - tweak: "The voting panel now updates while a vote is in progress." + - tweak: "When a vote is started, it will now include a link to open the vote panel, as an alternative to typing in \"vote\"." + - tweak: "Custom votes will now show full voting results upon completion." + - bugfix: "Admins should no longer lose the \"cancel vote\" link in the voting panel." diff --git a/html/changelogs/AutoChangeLog-pr-5178.yml b/html/changelogs/AutoChangeLog-pr-5178.yml new file mode 100644 index 00000000000..78b2f4f927e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5178.yml @@ -0,0 +1,4 @@ +author: Krausus +delete-after: True +changes: + - bugfix: "View Variables should probably stop crashing admins." diff --git a/html/changelogs/AutoChangeLog-pr-5182.yml b/html/changelogs/AutoChangeLog-pr-5182.yml new file mode 100644 index 00000000000..35fee785997 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5182.yml @@ -0,0 +1,7 @@ +author: FlattestGuitar +delete-after: True +changes: + - tweak: "IAAs can now select the classic secHUD in loadouts" + - rscadd: "adds bananas and suit jackets to the loadout system" + - rscadd: "adds dress shoes and fancy sandals to the loadout system" + - bugfix: "Miners can now get the mining coat from loadouts" diff --git a/html/changelogs/AutoChangeLog-pr-5184.yml b/html/changelogs/AutoChangeLog-pr-5184.yml new file mode 100644 index 00000000000..53372963d89 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5184.yml @@ -0,0 +1,8 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "IV Drip sprites updated; has visual feedback for if it's injecting or taking blood" + - tweak: "IV Drip injection rate dramatically increased" + - rscadd: "Warning ping for when someone is low on blood" + - rscadd: "Support for species with exotic blood type" + - rscadd: "Alt-Click to toggle between modes" diff --git a/html/changelogs/AutoChangeLog-pr-5190.yml b/html/changelogs/AutoChangeLog-pr-5190.yml new file mode 100644 index 00000000000..232f6bb3f51 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5190.yml @@ -0,0 +1,4 @@ +author: Kyep +delete-after: True +changes: + - bugfix: "It is now possible for admins to remove a person's vamp thrall status." diff --git a/html/changelogs/AutoChangeLog-pr-5191.yml b/html/changelogs/AutoChangeLog-pr-5191.yml new file mode 100644 index 00000000000..ffa6d33de26 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5191.yml @@ -0,0 +1,4 @@ +author: Krausus +delete-after: True +changes: + - tweak: "The RnD console now shows an overlay while you're waiting for it to do work, rather than using a separate wait screen." diff --git a/html/changelogs/AutoChangeLog-pr-5192.yml b/html/changelogs/AutoChangeLog-pr-5192.yml new file mode 100644 index 00000000000..9798dd041f0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5192.yml @@ -0,0 +1,5 @@ +author: Fox-McCloud +delete-after: True +changes: + - rscadd: "Adds in a few makeshift items/weapons: molotovs, grenade lances, golden bikehorn, paper bags, and DIY chainsaws" + - bugfix: "Fixes some personal crafting behaving as other than intended" diff --git a/html/changelogs/AutoChangeLog-pr-5198.yml b/html/changelogs/AutoChangeLog-pr-5198.yml new file mode 100644 index 00000000000..ab88cd6b449 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5198.yml @@ -0,0 +1,4 @@ +author: Spacemanspark +delete-after: True +changes: + - bugfix: "Cardboard boxes now have their own specific name in the cardboard sheets menu." diff --git a/html/changelogs/AutoChangeLog-pr-5200.yml b/html/changelogs/AutoChangeLog-pr-5200.yml new file mode 100644 index 00000000000..dad0ed52822 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5200.yml @@ -0,0 +1,6 @@ +author: TheDZD +delete-after: True +changes: + - bugfix: "Admin-only jobs check for R_EVENT now, instead of R_ADMIN, as event-related tools should." + - bugfix: "Mentors should no longer get spammed by the library checkout computer on occasion." + - bugfix: "Mentors should no longer get spammed by mirrors due to body accessories." diff --git a/html/changelogs/AutoChangeLog-pr-5204.yml b/html/changelogs/AutoChangeLog-pr-5204.yml new file mode 100644 index 00000000000..2fd2cb0b641 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5204.yml @@ -0,0 +1,5 @@ +author: Fox McCloud +delete-after: True +changes: + - tweak: "Sensory restoration virology symptom no longer has anti-stun properties nor heals brain damage, but has a lower acquisition level" + - tweak: "Damage convert heals individual limbs instead of healing overall damage (actual impact is low)" diff --git a/html/changelogs/AutoChangeLog-pr-5205.yml b/html/changelogs/AutoChangeLog-pr-5205.yml new file mode 100644 index 00000000000..83fc924a44b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5205.yml @@ -0,0 +1,7 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Librarian now starts off with a bookbag" + - tweak: "Bookbag can now hold Bibles, cult tomes, books, and spellbooks" + - rscadd: "Can empty a bookbag into a bookshelf" + - bugfix: "Fixes an exploit where you could generate wood out of thin air" diff --git a/html/changelogs/AutoChangeLog-pr-5206.yml b/html/changelogs/AutoChangeLog-pr-5206.yml new file mode 100644 index 00000000000..f9125be098a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5206.yml @@ -0,0 +1,5 @@ +author: Kyep +delete-after: True +changes: + - rscadd: "Adds Vox, Greytide & Soviet loadouts to admin Select Equipment verb." + - bugfix: "Fixes an issue with spy loadouts, and excessive access on loadouts in general" diff --git a/html/changelogs/AutoChangeLog-pr-5211.yml b/html/changelogs/AutoChangeLog-pr-5211.yml new file mode 100644 index 00000000000..a6e6819b10d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5211.yml @@ -0,0 +1,5 @@ +author: Ty-Omaha +delete-after: True +changes: + - tweak: "Gives Combat Gloves to Code Red ERT agents." + - tweak: "Gives Code Gamma Engineering ERT agents Combat Gloves." diff --git a/html/changelogs/AutoChangeLog-pr-5231.yml b/html/changelogs/AutoChangeLog-pr-5231.yml new file mode 100644 index 00000000000..b7ef8ff67bc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5231.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes blobspores doing more damage than intended" diff --git a/icons/goonstation/effects/fire.dmi b/icons/goonstation/effects/fire.dmi new file mode 100644 index 00000000000..48a1f9b90e6 Binary files /dev/null and b/icons/goonstation/effects/fire.dmi differ diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi index f330c5a9b25..9c0d20bd898 100644 Binary files a/icons/mecha/mecha_equipment.dmi and b/icons/mecha/mecha_equipment.dmi differ diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi index 1d206b45e75..062d5b404c8 100644 Binary files a/icons/misc/buildmode.dmi and b/icons/misc/buildmode.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 7553227171c..fec4fdce7a1 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 2a5ac2889c2..bdc47e32599 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index f950b2bdf74..20ff8795432 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 21205081639..25ec0162866 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index a22bb625198..f81f4ab555a 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/iv_drip.dmi b/icons/obj/iv_drip.dmi index 40068f216e7..016513245e1 100644 Binary files a/icons/obj/iv_drip.dmi and b/icons/obj/iv_drip.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 9c90b468860..d21263adf0f 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 2c9a230d1df..745f976c1ca 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/icons/turf/screen1_parallax.dmi b/icons/turf/screen1_parallax.dmi new file mode 100644 index 00000000000..cd0f232bbc4 Binary files /dev/null and b/icons/turf/screen1_parallax.dmi differ diff --git a/icons/turf/space.dmi b/icons/turf/space.dmi index 60fdfce3861..4e27e4086be 100644 Binary files a/icons/turf/space.dmi and b/icons/turf/space.dmi differ diff --git a/icons/turf/space_parallax1.dmi b/icons/turf/space_parallax1.dmi new file mode 100644 index 00000000000..a538bf0f0d1 Binary files /dev/null and b/icons/turf/space_parallax1.dmi differ diff --git a/icons/turf/space_parallax2.dmi b/icons/turf/space_parallax2.dmi new file mode 100644 index 00000000000..e93cc831d49 Binary files /dev/null and b/icons/turf/space_parallax2.dmi differ diff --git a/icons/turf/space_parallax3.dmi b/icons/turf/space_parallax3.dmi new file mode 100644 index 00000000000..2261ab17f71 Binary files /dev/null and b/icons/turf/space_parallax3.dmi differ diff --git a/icons/turf/space_parallax4.dmi b/icons/turf/space_parallax4.dmi new file mode 100644 index 00000000000..560bacd0090 Binary files /dev/null and b/icons/turf/space_parallax4.dmi differ diff --git a/nano/templates/r_n_d.tmpl b/nano/templates/r_n_d.tmpl index cabd0c46992..e007fc93f31 100644 --- a/nano/templates/r_n_d.tmpl +++ b/nano/templates/r_n_d.tmpl @@ -1,4 +1,4 @@ -{{if data.menu > 0 && !data.wait_message}} +{{if data.menu > 0}}
    {{:helper.link('Main Menu', 'reply', {'menu': 0, 'submenu': 0})}} {{if data.submenu > 0}} @@ -18,9 +18,7 @@
    {{/if}}
    - {{if data.wait_message}} - {{:data.wait_message}} - {{else data.menu == 0}} + {{if data.menu == 0}}

    Main Menu:

    {{:helper.link('Disk Operations', 'save', {'menu': 2, 'submenu': 0}, data.disk_type ? null : 'disabled')}}
    {{:helper.link('Destructive Analyzer Menu', 'chain-broken', {'menu': 3, 'submenu': 0}, data.linked_destroy ? null : 'disabled')}}
    @@ -262,4 +260,12 @@
    {{/if}} {{/if}} -
\ No newline at end of file + + +{{if data.wait_message}} +
+
+

{{:data.wait_message}}

+
+
+{{/if}} diff --git a/paradise.dme b/paradise.dme index 4e095cdde39..96f47272de4 100644 --- a/paradise.dme +++ b/paradise.dme @@ -111,6 +111,7 @@ #include "code\_onclick\hud\monkey.dm" #include "code\_onclick\hud\movable_screen_objects.dm" #include "code\_onclick\hud\other_mobs.dm" +#include "code\_onclick\hud\parallax.dm" #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\swarmer.dm" @@ -180,7 +181,6 @@ #include "code\controllers\Processes\sun.dm" #include "code\controllers\Processes\ticker.dm" #include "code\controllers\Processes\timer.dm" -#include "code\controllers\Processes\vote.dm" #include "code\controllers\Processes\weather.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" @@ -625,14 +625,6 @@ #include "code\game\machinery\embedded_controller\embedded_controller_base.dm" #include "code\game\machinery\embedded_controller\embedded_program_base.dm" #include "code\game\machinery\embedded_controller\simple_docking_controller.dm" -#include "code\game\machinery\kitchen\gibber.dm" -#include "code\game\machinery\kitchen\icecream_vat.dm" -#include "code\game\machinery\kitchen\juicer.dm" -#include "code\game\machinery\kitchen\kitchen_machine.dm" -#include "code\game\machinery\kitchen\microwave.dm" -#include "code\game\machinery\kitchen\monkeyrecycler.dm" -#include "code\game\machinery\kitchen\processor.dm" -#include "code\game\machinery\kitchen\smartfridge.dm" #include "code\game\machinery\pipe\construction.dm" #include "code\game\machinery\pipe\pipe_dispenser.dm" #include "code\game\machinery\telecomms\broadcaster.dm" @@ -834,6 +826,7 @@ #include "code\game\objects\items\weapons\table_rack_parts.dm" #include "code\game\objects\items\weapons\tape.dm" #include "code\game\objects\items\weapons\teleportation.dm" +#include "code\game\objects\items\weapons\teleprod.dm" #include "code\game\objects\items\weapons\tools.dm" #include "code\game\objects\items\weapons\twohanded.dm" #include "code\game\objects\items\weapons\vending_items.dm" @@ -1321,23 +1314,42 @@ #include "code\modules\flufftext\Dreaming.dm" #include "code\modules\flufftext\Hallucination.dm" #include "code\modules\flufftext\TextFilters.dm" -#include "code\modules\food\candy_maker.dm" -#include "code\modules\food\cereal_maker.dm" -#include "code\modules\food\cooker.dm" -#include "code\modules\food\customizables.dm" -#include "code\modules\food\deep_fryer.dm" -#include "code\modules\food\food_grill.dm" -#include "code\modules\food\grill_new.dm" -#include "code\modules\food\icecream_vat.dm" -#include "code\modules\food\oven.dm" -#include "code\modules\food\oven_new.dm" -#include "code\modules\food\recipes_candy.dm" -#include "code\modules\food\recipes_grill.dm" -#include "code\modules\food\recipes_microwave.dm" -#include "code\modules\food\recipes_oven.dm" -#include "code\modules\food\recipes_table.dm" -#include "code\modules\food\beverages\bottler.dm" -#include "code\modules\food\beverages\bottler_recipes.dm" +#include "code\modules\food_and_drinks\food.dm" +#include "code\modules\food_and_drinks\drinks\drinks.dm" +#include "code\modules\food_and_drinks\drinks\bottler\bottler.dm" +#include "code\modules\food_and_drinks\drinks\bottler\bottler_recipes.dm" +#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm" +#include "code\modules\food_and_drinks\drinks\drinks\cans.dm" +#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm" +#include "code\modules\food_and_drinks\drinks\drinks\shotglass.dm" +#include "code\modules\food_and_drinks\food\candy.dm" +#include "code\modules\food_and_drinks\food\condiment.dm" +#include "code\modules\food_and_drinks\food\customizables.dm" +#include "code\modules\food_and_drinks\food\meat.dm" +#include "code\modules\food_and_drinks\food\seafood.dm" +#include "code\modules\food_and_drinks\food\snacks.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\candy_maker.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\cereal_maker.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\cooker.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\food_grill.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\grill_new.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat_2.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\juicer.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\kitchen_machine.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\oven.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\oven_new.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\processor.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm" +#include "code\modules\food_and_drinks\recipes\recipes_candy.dm" +#include "code\modules\food_and_drinks\recipes\recipes_grill.dm" +#include "code\modules\food_and_drinks\recipes\recipes_microwave.dm" +#include "code\modules\food_and_drinks\recipes\recipes_oven.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_table.dm" #include "code\modules\garbage_collection\garbage_collector.dm" #include "code\modules\garbage_collection\gc_testing.dm" #include "code\modules\holiday\christmas.dm" @@ -1855,6 +1867,7 @@ #include "code\modules\reagents\oldchem\reagents\reagents_food.dm" #include "code\modules\reagents\oldchem\reagents\reagents_med.dm" #include "code\modules\reagents\oldchem\reagents\reagents_misc.dm" +#include "code\modules\reagents\oldchem\reagents\reagents_paint.dm" #include "code\modules\reagents\oldchem\reagents\reagents_toxin.dm" #include "code\modules\reagents\oldchem\reagents\reagents_water.dm" #include "code\modules\reagents\oldchem\reagents\drink\reagents_alcohol.dm" @@ -1865,22 +1878,11 @@ #include "code\modules\reagents\reagent_containers\borghydro.dm" #include "code\modules\reagents\reagent_containers\bottle.dm" #include "code\modules\reagents\reagent_containers\dropper.dm" -#include "code\modules\reagents\reagent_containers\food.dm" #include "code\modules\reagents\reagent_containers\glass_containers.dm" #include "code\modules\reagents\reagent_containers\hypospray.dm" #include "code\modules\reagents\reagent_containers\pill.dm" #include "code\modules\reagents\reagent_containers\spray.dm" #include "code\modules\reagents\reagent_containers\syringes.dm" -#include "code\modules\reagents\reagent_containers\food\cans.dm" -#include "code\modules\reagents\reagent_containers\food\condiment.dm" -#include "code\modules\reagents\reagent_containers\food\drinks.dm" -#include "code\modules\reagents\reagent_containers\food\snacks.dm" -#include "code\modules\reagents\reagent_containers\food\drinks\bottle.dm" -#include "code\modules\reagents\reagent_containers\food\drinks\drinkingglass.dm" -#include "code\modules\reagents\reagent_containers\food\drinks\shotglass.dm" -#include "code\modules\reagents\reagent_containers\food\snacks\candy.dm" -#include "code\modules\reagents\reagent_containers\food\snacks\meat.dm" -#include "code\modules\reagents\reagent_containers\food\snacks\seafood.dm" #include "code\modules\recycling\conveyor2.dm" #include "code\modules\recycling\disposal-construction.dm" #include "code\modules\recycling\disposal.dm"
" dat += "

General Settings

" + dat += "Space Parallax: [space_parallax ? "Enabled" : "Disabled"]
" + dat += "Parallax Speed: [parallax_speed]
" + dat += "Space Dust: [space_dust ? "Yes" : "No"]
" dat += "Fancy NanoUI: [(nanoui_fancy) ? "Yes" : "No"]
" dat += "Ghost-Item Attack Animation: [(show_ghostitem_attack) ? "Yes" : "No"]
" dat += "Custom UI settings:
" @@ -1934,6 +1940,21 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/mob/living/carbon/human/H = usr H.remake_hud() + if("parallax") + space_parallax = !space_parallax + + if(usr && usr.hud_used) + usr.hud_used.update_parallax_and_dust() + + if("dust") + space_dust = !space_dust + + if(usr && usr.hud_used) + usr.hud_used.update_parallax_and_dust() + + if("p_speed") + parallax_speed = min(max(input(user, "Enter a number between 0 and 5 included (default=2)","Parallax Speed Preferences",parallax_speed),0),5) + if("be_special") var/r = href_list["role"] if(!(r in special_roles)) @@ -2204,4 +2225,4 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts popup.open(0) /datum/preferences/proc/close_load_dialog(mob/user) - user << browse(null, "window=saves") \ No newline at end of file + user << browse(null, "window=saves") diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index cd6177a08f1..c070581137a 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -13,7 +13,10 @@ volume, nanoui_fancy, show_ghostitem_attack, - lastchangelog + lastchangelog, + space_parallax, + space_dust, + parallax_speed FROM [format_table_name("player")] WHERE ckey='[C.ckey]'"} ) @@ -40,6 +43,9 @@ nanoui_fancy = text2num(query.item[11]) show_ghostitem_attack = text2num(query.item[12]) lastchangelog = query.item[13] + space_parallax = text2num(query.item[14]) + space_dust = text2num(query.item[15]) + parallax_speed = text2num(query.item[16]) //Sanitize ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) @@ -54,6 +60,9 @@ nanoui_fancy = sanitize_integer(nanoui_fancy, 0, 1, initial(nanoui_fancy)) show_ghostitem_attack = sanitize_integer(show_ghostitem_attack, 0, 1, initial(show_ghostitem_attack)) lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) + space_parallax = sanitize_integer(space_parallax, 0, 1, initial(space_parallax)) + space_dust = sanitize_integer(space_dust, 0, 1, initial(space_dust)) + parallax_speed = sanitize_integer(parallax_speed, 0, 5, initial(parallax_speed)) return 1 /datum/preferences/proc/save_preferences(client/C) @@ -78,7 +87,10 @@ volume='[volume]', nanoui_fancy='[nanoui_fancy]', show_ghostitem_attack='[show_ghostitem_attack]', - lastchangelog='[lastchangelog]' + lastchangelog='[lastchangelog]', + space_parallax='[space_parallax]', + space_dust='[space_dust]', + parallax_speed='[parallax_speed]' WHERE ckey='[C.ckey]'"} ) diff --git a/code/modules/client/preference/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm index 541dee07242..a1ba6d907d6 100644 --- a/code/modules/client/preference/preferences_toggles.dm +++ b/code/modules/client/preference/preferences_toggles.dm @@ -213,4 +213,45 @@ set category = "Preferences" set desc = "Allows you to access the Setup Character screen. Changes to your character won't take effect until next round, but other changes will." prefs.current_tab = 1 - prefs.ShowChoices(usr) \ No newline at end of file + prefs.ShowChoices(usr) + +/client/verb/toggle_space_parallax() + set name = "Toggle Space Parallax" + set category = "Preferences" + set desc = "Toggle the parallax effect of space turfs." + prefs.space_parallax = !prefs.space_parallax + + prefs.save_preferences(src) + + if(!prefs.space_parallax) + to_chat(usr, "Space parallax is now deactivated.") + else + to_chat(usr, "Space parallax is now activated.") + + if(mob && mob.hud_used) + mob.hud_used.update_parallax_and_dust() + +/client/verb/toggle_space_dust() + set name = "Toggle Space Dust" + set category = "Preferences" + set desc = "Toggle the presence of dust on space turfs." + prefs.space_dust = !prefs.space_dust + + prefs.save_preferences(src) + + if(!prefs.space_dust) + to_chat(usr, "Space dust is now deactivated.") + else + to_chat(usr, "Space dust is now activated.") + + if(mob && mob.hud_used) + mob.hud_used.update_parallax_and_dust() + +/client/verb/toggle_parallax_speed() + set name = "Change Parallax Speed" + set category = "Preferences" + set desc = "Change the speed at which parallax moves." + + prefs.parallax_speed = min(max(input(usr, "Enter a number between 0 and 5 included (default=2)","Parallax Speed Preferences",prefs.parallax_speed),0),5) + + prefs.save_preferences(src) \ No newline at end of file diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index f7253a82cdf..6e53e8a9b04 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -372,3 +372,17 @@ desc = "A horribly bloated and mismatched human head." icon_state = "lingspacehelmet" item_state = "lingspacehelmet" + +/obj/item/clothing/head/papersack + name = "paper sack hat" + desc = "A paper sack with crude holes cut out for eyes. Useful for hiding one's identity or ugliness." + icon_state = "papersack" + flags = BLOCKHAIR + flags_inv = HIDEFACE|HIDEEARS + +/obj/item/clothing/head/papersack/smiley + name = "paper sack hat" + desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all." + icon_state = "papersack_smile" + flags = BLOCKHAIR + flags_inv = HIDEFACE|HIDEEARS diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 184d4c14c40..dd66740f966 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -222,37 +222,37 @@ /obj/item/clothing/mask/bandana/attack_self(var/mob/user) adjustmask(user) -obj/item/clothing/mask/bandana/red +/obj/item/clothing/mask/bandana/red name = "red bandana" icon_state = "bandred" item_color = "red" desc = "It's a red bandana." -obj/item/clothing/mask/bandana/blue +/obj/item/clothing/mask/bandana/blue name = "blue bandana" icon_state = "bandblue" item_color = "blue" desc = "It's a blue bandana." -obj/item/clothing/mask/bandana/gold +/obj/item/clothing/mask/bandana/gold name = "gold bandana" icon_state = "bandgold" item_color = "yellow" desc = "It's a gold bandana." -obj/item/clothing/mask/bandana/green +/obj/item/clothing/mask/bandana/green name = "green bandana" icon_state = "bandgreen" item_color = "green" desc = "It's a green bandana." -obj/item/clothing/mask/bandana/orange +/obj/item/clothing/mask/bandana/orange name = "orange bandana" icon_state = "bandorange" item_color = "orange" desc = "It's an orange bandana." -obj/item/clothing/mask/bandana/purple +/obj/item/clothing/mask/bandana/purple name = "purple bandana" icon_state = "bandpurple" item_color = "purple" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 229daee5c93..2330f439547 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -177,12 +177,11 @@ /datum/crafting_recipe/shoe_rags name = "Shoe Rags" - result = /obj/item/shoe_silencer reqs = list(/obj/item/stack/tape_roll = 10) tools = list(/obj/item/weapon/wirecutters) - time = 40 + category = CAT_MISC /obj/item/clothing/shoes/sandal/white name = "White Sandals" diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 901de314edc..d2b0da70ebe 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -43,7 +43,7 @@ . = list() . += user.r_hand . += user.l_hand - if(!istype(user.loc, /turf)) + if(!isturf(user.loc)) return var/list/L = block(get_step(user, SOUTHWEST), get_step(user, NORTHEAST)) for(var/A in L) @@ -231,8 +231,7 @@ var/list/surroundings = get_surroundings(user) var/dat = "

Crafting menu

" if(busy) - dat += "
" - dat += "Crafting in progress...
" + dat += "
Crafting in progress...
" else dat += "<--" dat += " [categories[prev_cat()]] |" diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 60d830a1c89..6f946146aa4 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -23,7 +23,25 @@ /obj/item/device/assembly/igniter = 1, /obj/item/weapon/reagent_containers/food/drinks/cans = 1) parts = list(/obj/item/weapon/reagent_containers/food/drinks/cans = 1) - time = 80 + time = 15 + category = CAT_WEAPON + +/datum/crafting_recipe/lance + name = "explosive lance (grenade)" + result = /obj/item/weapon/twohanded/spear + reqs = list(/obj/item/weapon/twohanded/spear = 1, + /obj/item/weapon/grenade = 1) + parts = list(/obj/item/weapon/grenade = 1) + time = 15 + category = CAT_WEAPON + +/datum/crafting_recipe/molotov + name = "Molotov" + result = /obj/item/weapon/reagent_containers/food/drinks/bottle/molotov + reqs = list(/obj/item/weapon/reagent_containers/glass/rag = 1, + /obj/item/weapon/reagent_containers/food/drinks/bottle = 1) + parts = list(/obj/item/weapon/reagent_containers/food/drinks/bottle = 1) + time = 40 category = CAT_WEAPON /datum/crafting_recipe/stunprod @@ -33,10 +51,18 @@ /obj/item/stack/rods = 1, /obj/item/weapon/wirecutters = 1, /obj/item/weapon/stock_parts/cell = 1) - time = 80 + time = 40 parts = list(/obj/item/weapon/stock_parts/cell = 1) category = CAT_WEAPON +/datum/crafting_recipe/bola + name = "Bola" + result = /obj/item/weapon/restraints/legcuffs/bola + reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1, + /obj/item/stack/sheet/metal = 6) + time = 20//15 faster than crafting them by hand! + category= CAT_WEAPON + /datum/crafting_recipe/ed209 name = "ED209" result = /mob/living/simple_animal/bot/ed209 @@ -52,7 +78,7 @@ /obj/item/device/assembly/prox_sensor = 1, /obj/item/robot_parts/r_arm = 1) tools = list(/obj/item/weapon/weldingtool, /obj/item/weapon/screwdriver) - time = 120 + time = 60 category = CAT_ROBOT /datum/crafting_recipe/secbot @@ -64,7 +90,7 @@ /obj/item/device/assembly/prox_sensor = 1, /obj/item/robot_parts/r_arm = 1) tools = list(/obj/item/weapon/weldingtool) - time = 120 + time = 60 category = CAT_ROBOT /datum/crafting_recipe/cleanbot @@ -73,7 +99,7 @@ reqs = list(/obj/item/weapon/reagent_containers/glass/bucket = 1, /obj/item/device/assembly/prox_sensor = 1, /obj/item/robot_parts/r_arm = 1) - time = 80 + time = 40 category = CAT_ROBOT /datum/crafting_recipe/floorbot @@ -83,7 +109,7 @@ /obj/item/stack/tile/plasteel = 1, /obj/item/device/assembly/prox_sensor = 1, /obj/item/robot_parts/r_arm = 1) - time = 80 + time = 40 category = CAT_ROBOT /datum/crafting_recipe/medbot @@ -93,7 +119,7 @@ /obj/item/weapon/storage/firstaid = 1, /obj/item/device/assembly/prox_sensor = 1, /obj/item/robot_parts/r_arm = 1) - time = 80 + time = 40 category = CAT_ROBOT /datum/crafting_recipe/flamethrower @@ -101,9 +127,11 @@ result = /obj/item/weapon/flamethrower reqs = list(/obj/item/weapon/weldingtool = 1, /obj/item/device/assembly/igniter = 1, - /obj/item/stack/rods = 2) + /obj/item/stack/rods = 1) + parts = list(/obj/item/device/assembly/igniter = 1, + /obj/item/weapon/weldingtool = 1) tools = list(/obj/item/weapon/screwdriver) - time = 20 + time = 10 category = CAT_WEAPON /datum/crafting_recipe/meteorshot @@ -171,7 +199,8 @@ name = "Overload Improvised Shell" result = /obj/item/ammo_casing/shotgun/improvised/overload reqs = list(/obj/item/ammo_casing/shotgun/improvised = 1, - /datum/reagent/blackpowder = 5) + /datum/reagent/blackpowder = 10, + /datum/reagent/plasma_dust = 20) tools = list(/obj/item/weapon/screwdriver) time = 5 category = CAT_AMMO @@ -194,7 +223,26 @@ /obj/item/weaponcrafting/stock = 1, /obj/item/stack/packageWrap = 5,) tools = list(/obj/item/weapon/screwdriver) - time = 200 + time = 100 + category = CAT_WEAPON + +/datum/crafting_recipe/chainsaw + name = "Chainsaw" + result = /obj/item/weapon/twohanded/required/chainsaw + reqs = list(/obj/item/weapon/circular_saw = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/stack/sheet/plasteel = 1) + tools = list(/obj/item/weapon/weldingtool) + time = 50 + category = CAT_WEAPON + +/datum/crafting_recipe/spear + name = "Spear" + result = /obj/item/weapon/twohanded/spear + reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1, + /obj/item/weapon/shard = 1, + /obj/item/stack/rods = 1) + time = 40 category = CAT_WEAPON /datum/crafting_recipe/spooky_camera @@ -205,10 +253,17 @@ /datum/reagent/holywater = 10) parts = list(/obj/item/device/camera = 1) +/datum/crafting_recipe/papersack + name = "Paper Sack" + result = /obj/item/weapon/storage/box/papersack + time = 10 + reqs = list(/obj/item/weapon/paper = 5) + category = CAT_MISC + /datum/crafting_recipe/notreallysoap name = "Homemade Soap" result = /obj/item/weapon/soap/ducttape - time = 100 + time = 50 reqs = list(/obj/item/stack/tape_roll = 1, /datum/reagent/liquidgibs = 10) @@ -224,7 +279,7 @@ /datum/crafting_recipe/makeshift_bolt name = "Makeshift Bolt" result = /obj/item/weapon/arrow/rod - time = 15 + time = 5 reqs = list(/obj/item/stack/rods = 1) tools = list(/obj/item/weapon/weldingtool) category = CAT_AMMO @@ -232,7 +287,7 @@ /datum/crafting_recipe/crossbow name = "Powered Crossbow" result = /obj/item/weapon/gun/throw/crossbow - time = 300 + time = 150 reqs = list(/obj/item/stack/rods = 3, /obj/item/stack/cable_coil = 10, /obj/item/stack/sheet/mineral/plastic = 3, @@ -247,3 +302,11 @@ time = 15 reqs = list(/obj/item/clothing/gloves/color/latex = 1, /obj/item/stack/cable_coil = 5) + +/datum/crafting_recipe/gold_horn + name = "Golden bike horn" + result = /obj/item/weapon/bikehorn/golden + time = 20 + reqs = list(/obj/item/stack/sheet/mineral/bananium = 5, + /obj/item/weapon/bikehorn) + category = CAT_MISC \ No newline at end of file diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 5955d60cbec..deaa1b85aa8 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -149,7 +149,7 @@ var/list/event_last_fired = list() new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 100)), //new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100)), //new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100)), - //new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 60)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 60)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 250, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 50), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 30), 1), diff --git a/code/modules/food/beverages/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm similarity index 100% rename from code/modules/food/beverages/bottler.dm rename to code/modules/food_and_drinks/drinks/bottler/bottler.dm diff --git a/code/modules/food/beverages/bottler_recipes.dm b/code/modules/food_and_drinks/drinks/bottler/bottler_recipes.dm similarity index 100% rename from code/modules/food/beverages/bottler_recipes.dm rename to code/modules/food_and_drinks/drinks/bottler/bottler_recipes.dm diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm similarity index 97% rename from code/modules/reagents/reagent_containers/food/drinks.dm rename to code/modules/food_and_drinks/drinks/drinks.dm index 41486497be2..aae17abc961 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -1,327 +1,333 @@ -//////////////////////////////////////////////////////////////////////////////// -/// Drinks. -//////////////////////////////////////////////////////////////////////////////// -/obj/item/weapon/reagent_containers/food/drinks - name = "drink" - desc = "yummy" - icon = 'icons/obj/drinks.dmi' - icon_state = null - flags = OPENCONTAINER - consume_sound = 'sound/items/drink.ogg' - possible_transfer_amounts = list(5,10,15,20,25,30,50) - volume = 50 - -/obj/item/weapon/reagent_containers/food/drinks/New() - ..() - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) - bitesize = amount_per_transfer_from_this - if(bitesize < 5) - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/drinks/attack_self(mob/user) - return - -/obj/item/weapon/reagent_containers/food/drinks/attack(mob/M, mob/user, def_zone) - if(!reagents || !reagents.total_volume) - to_chat(user, " None of [src] left, oh no!") - return 0 - - if(istype(M, /mob/living/carbon)) - var/mob/living/carbon/C = M - if(C.eat(src, user)) - if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell - var/mob/living/silicon/robot/borg = user - borg.cell.use(30) - var/refill = reagents.get_master_reagent_id() - if(refill in drinks) // Only synthesize drinks - spawn(600) - reagents.add_reagent(refill, bitesize) - return 1 - return 0 - -/obj/item/weapon/reagent_containers/food/drinks/afterattack(obj/target, mob/user, proximity) - if(!proximity) return - - // Moved from the can code; not necessary since closed cans aren't open containers now, but, eh. - if(istype(target, /obj/item/weapon/reagent_containers/food/drinks/cans)) - var/obj/item/weapon/reagent_containers/food/drinks/cans/cantarget = target - if(cantarget.canopened == 0) - to_chat(user, "You need to open the drink you want to pour into!") - return - - if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. - - if(!target.reagents.total_volume) - to_chat(user, " [target] is empty.") - return - - if(reagents.total_volume >= reagents.maximum_volume) - to_chat(user, " [src] is full.") - return - - var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) - to_chat(user, " You fill [src] with [trans] units of the contents of [target].") - - else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it. - if(!reagents.total_volume) - to_chat(user, " [src] is empty.") - return - - if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, " [target] is full.") - return - - - - var/datum/reagent/refill - var/datum/reagent/refillName - if(isrobot(user)) - refill = reagents.get_master_reagent_id() - refillName = reagents.get_master_reagent_name() - - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - to_chat(user, " You transfer [trans] units of the solution to [target].") - - if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell - if(refill in drinks) // Only synthesize drinks - var/mob/living/silicon/robot/bro = user - var/chargeAmount = max(30,4*trans) - bro.cell.use(chargeAmount) - to_chat(user, "Now synthesizing [trans] units of [refillName]...") - - - spawn(300) - reagents.add_reagent(refill, trans) - to_chat(user, "Cyborg [src] refilled.") - - return - -/obj/item/weapon/reagent_containers/food/drinks/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird - return - if(is_hot(I)) - if(src.reagents) - src.reagents.chem_temp += 15 - to_chat(user, "You heat [src] with [I].") - src.reagents.handle_reactions() - -/obj/item/weapon/reagent_containers/food/drinks/examine(mob/user) - if(!..(user, 1)) - return - if(!reagents || reagents.total_volume==0) - to_chat(user, " \The [src] is empty!") - else if(reagents.total_volume<=src.volume/4) - to_chat(user, " \The [src] is almost empty!") - else if(reagents.total_volume<=src.volume*0.66) - to_chat(user, " \The [src] is half full!")// We're all optimistic, right?! - - else if(reagents.total_volume<=src.volume*0.90) - to_chat(user, " \The [src] is almost full!") - else - to_chat(user, " \The [src] is full!") - -//////////////////////////////////////////////////////////////////////////////// -/// Drinks. END -//////////////////////////////////////////////////////////////////////////////// - -/obj/item/weapon/reagent_containers/food/drinks/trophy - name = "pewter cup" - desc = "Everyone gets a trophy." - icon_state = "pewter_cup" - w_class = 1 - force = 1 - throwforce = 1 - amount_per_transfer_from_this = 5 - materials = list(MAT_METAL=100) - possible_transfer_amounts = list() - volume = 5 - flags = CONDUCT | OPENCONTAINER - -/obj/item/weapon/reagent_containers/food/drinks/trophy/gold_cup - name = "gold cup" - desc = "You're winner!" - icon_state = "golden_cup" - w_class = 4 - force = 14 - throwforce = 10 - amount_per_transfer_from_this = 20 - materials = list(MAT_GOLD=1000) - volume = 150 - -/obj/item/weapon/reagent_containers/food/drinks/trophy/silver_cup - name = "silver cup" - desc = "Best loser!" - icon_state = "silver_cup" - w_class = 3 - force = 10 - throwforce = 8 - amount_per_transfer_from_this = 15 - materials = list(MAT_SILVER=800) - volume = 100 - -/obj/item/weapon/reagent_containers/food/drinks/trophy/bronze_cup - name = "bronze cup" - desc = "At least you ranked!" - icon_state = "bronze_cup" - w_class = 2 - force = 5 - throwforce = 4 - amount_per_transfer_from_this = 10 - materials = list(MAT_METAL=400) - volume = 25 - - -///////////////////////////////////////////////Drinks -//Notes by Darem: Drinks are simply containers that start preloaded. Unlike condiments, the contents can be ingested directly -// rather then having to add it to something else first. They should only contain liquids. They have a default container size of 50. -// Formatting is the same as food. - - -/obj/item/weapon/reagent_containers/food/drinks/coffee - name = "Robust Coffee" - desc = "Careful, the beverage you're about to enjoy is extremely hot." - icon_state = "coffee" - list_reagents = list("coffee" = 30) - -/obj/item/weapon/reagent_containers/food/drinks/ice - name = "Ice Cup" - desc = "Careful, cold ice, do not chew." - icon_state = "coffee" - list_reagents = list("ice" = 30) - -/obj/item/weapon/reagent_containers/food/drinks/tea - name = "Duke Purple Tea" - desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea." - list_reagents = list("tea" = 30) - -/obj/item/weapon/reagent_containers/food/drinks/tea/New() - ..() - if(prob(20)) - reagents.add_reagent("mugwort", 3) - -/obj/item/weapon/reagent_containers/food/drinks/mugwort - name = "Mugwort Tea" - desc = "A bitter herbal tea." - icon_state = "manlydorfglass" - item_state = "coffee" - list_reagents = list("mugwort" = 30) - -/obj/item/weapon/reagent_containers/food/drinks/h_chocolate - name = "Dutch Hot Coco" - desc = "Made in Space South America." - list_reagents = list("hot_coco" = 30, "sugar" = 5) - -/obj/item/weapon/reagent_containers/food/drinks/chocolate - name = "Hot Chocolate" - desc = "Made in Space Switzerland." - icon_state = "hot_coco" - item_state = "coffee" - list_reagents = list("chocolate" = 30) - -/obj/item/weapon/reagent_containers/food/drinks/weightloss - name = "Weight-Loss Shake" - desc = "A shake designed to cause weight loss. The package proudly proclaims that it is 'tapeworm free.'" - icon_state = "coffee" - item_state = "coffee" - list_reagents = list("lipolicide" = 30, "chocolate" = 5) - -/obj/item/weapon/reagent_containers/food/drinks/dry_ramen - name = "Cup Ramen" - desc = "Just add 10ml of water, self heats! A taste that reminds you of your school years." - icon_state = "ramen" - list_reagents = list("dry_ramen" = 30) - -/obj/item/weapon/reagent_containers/food/drinks/dry_ramen/New() - ..() - if(prob(20)) - reagents.add_reagent("enzyme", 3) - -/obj/item/weapon/reagent_containers/food/drinks/chicken_soup - name = "Cup Chicken Soup" - desc = "A delicious and soothing cup of chicken noodle soup; just like spessmom used to make it." - icon_state = "ramen" - list_reagents = list("chicken_soup" = 30) - -/obj/item/weapon/reagent_containers/food/drinks/sillycup - name = "paper cup" - desc = "A paper water cup." - icon_state = "water_cup_e" - possible_transfer_amounts = list() - volume = 10 - -/obj/item/weapon/reagent_containers/food/drinks/sillycup/on_reagent_change() - if(reagents.total_volume) - icon_state = "water_cup" - else - icon_state = "water_cup_e" - -//////////////////////////drinkingglass and shaker// -//Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink -// itself), in Chemistry-Recipes.dm (for the reaction that changes the components into the drink), and here (for the drinking glass -// icon states. - -/obj/item/weapon/reagent_containers/food/drinks/shaker - name = "shaker" - desc = "A metal shaker to mix drinks in." - icon_state = "shaker" - materials = list(MAT_METAL=1500) - amount_per_transfer_from_this = 10 - volume = 100 - -/obj/item/weapon/reagent_containers/food/drinks/flask - name = "flask" - desc = "Every good spaceman knows it's a good idea to bring along a couple of pints of whiskey wherever they go." - icon_state = "flask" - materials = list(MAT_METAL=250) - volume = 60 - -/obj/item/weapon/reagent_containers/food/drinks/flask/barflask - name = "flask" - desc = "For those who can't be bothered to hang out at the bar to drink." - icon_state = "barflask" - -/obj/item/weapon/reagent_containers/food/drinks/flask/gold - name = "captain's flask" - desc = "A gold flask belonging to the captain." - icon_state = "flask_gold" - materials = list(MAT_GOLD=500) - -/obj/item/weapon/reagent_containers/food/drinks/flask/detflask - name = "detective's flask" - desc = "The detective's only true friend." - icon_state = "detflask" - list_reagents = list("whiskey" = 30) - -/obj/item/weapon/reagent_containers/food/drinks/flask/hand_made - name = "handmade flask" - desc = "A wooden flask with a silver lid and bottom. It has a matte, dark blue paint on it with the initials \"W.H.\" etched in black." - icon = 'icons/obj/custom_items.dmi' - icon_state = "williamhackett" - materials = list() - -/obj/item/weapon/reagent_containers/food/drinks/flask/thermos - name = "vintage thermos" - desc = "An older thermos with a faint shine." - icon_state = "thermos" - volume = 50 - -/obj/item/weapon/reagent_containers/food/drinks/flask/shiny - name = "shiny flask" - desc = "A shiny metal flask. It appears to have a Greek symbol inscribed on it." - icon_state = "shinyflask" - volume = 50 - -/obj/item/weapon/reagent_containers/food/drinks/flask/lithium - name = "Lithium Flask" - desc = "A flask with a Lithium Atom symbol on it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "lithiumflask" - volume = 50 - - -/obj/item/weapon/reagent_containers/food/drinks/britcup - name = "cup" - desc = "A cup with the british flag emblazoned on it." - icon_state = "britcup" +//////////////////////////////////////////////////////////////////////////////// +/// Drinks. +//////////////////////////////////////////////////////////////////////////////// +/obj/item/weapon/reagent_containers/food/drinks + name = "drink" + desc = "yummy" + icon = 'icons/obj/drinks.dmi' + icon_state = null + flags = OPENCONTAINER + consume_sound = 'sound/items/drink.ogg' + possible_transfer_amounts = list(5,10,15,20,25,30,50) + volume = 50 + +/obj/item/weapon/reagent_containers/food/drinks/New() + ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) + bitesize = amount_per_transfer_from_this + if(bitesize < 5) + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/drinks/attack_self(mob/user) + return + +/obj/item/weapon/reagent_containers/food/drinks/attack(mob/M, mob/user, def_zone) + if(!reagents || !reagents.total_volume) + to_chat(user, " None of [src] left, oh no!") + return 0 + + if(istype(M, /mob/living/carbon)) + var/mob/living/carbon/C = M + if(C.eat(src, user)) + if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell + var/mob/living/silicon/robot/borg = user + borg.cell.use(30) + var/refill = reagents.get_master_reagent_id() + if(refill in drinks) // Only synthesize drinks + spawn(600) + reagents.add_reagent(refill, bitesize) + return 1 + return 0 + +/obj/item/weapon/reagent_containers/food/drinks/afterattack(obj/target, mob/user, proximity) + if(!proximity) return + + // Moved from the can code; not necessary since closed cans aren't open containers now, but, eh. + if(istype(target, /obj/item/weapon/reagent_containers/food/drinks/cans)) + var/obj/item/weapon/reagent_containers/food/drinks/cans/cantarget = target + if(cantarget.canopened == 0) + to_chat(user, "You need to open the drink you want to pour into!") + return + + if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. + + if(!target.reagents.total_volume) + to_chat(user, " [target] is empty.") + return + + if(reagents.total_volume >= reagents.maximum_volume) + to_chat(user, " [src] is full.") + return + + var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) + to_chat(user, " You fill [src] with [trans] units of the contents of [target].") + + else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it. + if(!reagents.total_volume) + to_chat(user, " [src] is empty.") + return + + if(target.reagents.total_volume >= target.reagents.maximum_volume) + to_chat(user, " [target] is full.") + return + + + + var/datum/reagent/refill + var/datum/reagent/refillName + if(isrobot(user)) + refill = reagents.get_master_reagent_id() + refillName = reagents.get_master_reagent_name() + + var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) + to_chat(user, " You transfer [trans] units of the solution to [target].") + + if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell + if(refill in drinks) // Only synthesize drinks + var/mob/living/silicon/robot/bro = user + var/chargeAmount = max(30,4*trans) + bro.cell.use(chargeAmount) + to_chat(user, "Now synthesizing [trans] units of [refillName]...") + + + spawn(300) + reagents.add_reagent(refill, trans) + to_chat(user, "Cyborg [src] refilled.") + + return + +/obj/item/weapon/reagent_containers/food/drinks/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird + return + if(is_hot(I)) + if(src.reagents) + src.reagents.chem_temp += 15 + to_chat(user, "You heat [src] with [I].") + src.reagents.handle_reactions() + +/obj/item/weapon/reagent_containers/food/drinks/examine(mob/user) + if(!..(user, 1)) + return + if(!reagents || reagents.total_volume==0) + to_chat(user, " \The [src] is empty!") + else if(reagents.total_volume<=src.volume/4) + to_chat(user, " \The [src] is almost empty!") + else if(reagents.total_volume<=src.volume*0.66) + to_chat(user, " \The [src] is half full!")// We're all optimistic, right?! + + else if(reagents.total_volume<=src.volume*0.90) + to_chat(user, " \The [src] is almost full!") + else + to_chat(user, " \The [src] is full!") + +//////////////////////////////////////////////////////////////////////////////// +/// Drinks. END +//////////////////////////////////////////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/drinks/trophy + name = "pewter cup" + desc = "Everyone gets a trophy." + icon_state = "pewter_cup" + w_class = 1 + force = 1 + throwforce = 1 + amount_per_transfer_from_this = 5 + materials = list(MAT_METAL=100) + possible_transfer_amounts = list() + volume = 5 + flags = CONDUCT | OPENCONTAINER + +/obj/item/weapon/reagent_containers/food/drinks/trophy/gold_cup + name = "gold cup" + desc = "You're winner!" + icon_state = "golden_cup" + w_class = 4 + force = 14 + throwforce = 10 + amount_per_transfer_from_this = 20 + materials = list(MAT_GOLD=1000) + volume = 150 + +/obj/item/weapon/reagent_containers/food/drinks/trophy/silver_cup + name = "silver cup" + desc = "Best loser!" + icon_state = "silver_cup" + w_class = 3 + force = 10 + throwforce = 8 + amount_per_transfer_from_this = 15 + materials = list(MAT_SILVER=800) + volume = 100 + +/obj/item/weapon/reagent_containers/food/drinks/trophy/bronze_cup + name = "bronze cup" + desc = "At least you ranked!" + icon_state = "bronze_cup" + w_class = 2 + force = 5 + throwforce = 4 + amount_per_transfer_from_this = 10 + materials = list(MAT_METAL=400) + volume = 25 + + +///////////////////////////////////////////////Drinks +//Notes by Darem: Drinks are simply containers that start preloaded. Unlike condiments, the contents can be ingested directly +// rather then having to add it to something else first. They should only contain liquids. They have a default container size of 50. +// Formatting is the same as food. + + +/obj/item/weapon/reagent_containers/food/drinks/coffee + name = "Robust Coffee" + desc = "Careful, the beverage you're about to enjoy is extremely hot." + icon_state = "coffee" + list_reagents = list("coffee" = 30) + +/obj/item/weapon/reagent_containers/food/drinks/ice + name = "Ice Cup" + desc = "Careful, cold ice, do not chew." + icon_state = "coffee" + list_reagents = list("ice" = 30) + +/obj/item/weapon/reagent_containers/food/drinks/tea + name = "Duke Purple Tea" + desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea." + icon_state = "teacup" + item_state = "coffee" + list_reagents = list("tea" = 30) + +/obj/item/weapon/reagent_containers/food/drinks/tea/New() + ..() + if(prob(20)) + reagents.add_reagent("mugwort", 3) + +/obj/item/weapon/reagent_containers/food/drinks/mugwort + name = "Mugwort Tea" + desc = "A bitter herbal tea." + icon_state = "manlydorfglass" + item_state = "coffee" + list_reagents = list("mugwort" = 30) + +/obj/item/weapon/reagent_containers/food/drinks/h_chocolate + name = "Dutch Hot Coco" + desc = "Made in Space South America." + icon_state = "hot_coco" + item_state = "coffee" + list_reagents = list("hot_coco" = 30, "sugar" = 5) + +/obj/item/weapon/reagent_containers/food/drinks/chocolate + name = "Hot Chocolate" + desc = "Made in Space Switzerland." + icon_state = "hot_coco" + item_state = "coffee" + list_reagents = list("chocolate" = 30) + +/obj/item/weapon/reagent_containers/food/drinks/weightloss + name = "Weight-Loss Shake" + desc = "A shake designed to cause weight loss. The package proudly proclaims that it is 'tapeworm free.'" + icon_state = "coffee" + list_reagents = list("lipolicide" = 30, "chocolate" = 5) + +/obj/item/weapon/reagent_containers/food/drinks/dry_ramen + name = "Cup Ramen" + desc = "Just add 10ml of water, self heats! A taste that reminds you of your school years." + icon_state = "ramen" + item_state = "coffee" + list_reagents = list("dry_ramen" = 30) + +/obj/item/weapon/reagent_containers/food/drinks/dry_ramen/New() + ..() + if(prob(20)) + reagents.add_reagent("enzyme", 3) + +/obj/item/weapon/reagent_containers/food/drinks/chicken_soup + name = "Cup Chicken Soup" + desc = "A delicious and soothing cup of chicken noodle soup; just like spessmom used to make it." + icon_state = "ramen" + item_state = "coffee" + list_reagents = list("chicken_soup" = 30) + +/obj/item/weapon/reagent_containers/food/drinks/sillycup + name = "paper cup" + desc = "A paper water cup." + icon_state = "water_cup_e" + item_state = "coffee" + possible_transfer_amounts = list() + volume = 10 + +/obj/item/weapon/reagent_containers/food/drinks/sillycup/on_reagent_change() + if(reagents.total_volume) + icon_state = "water_cup" + else + icon_state = "water_cup_e" + +//////////////////////////drinkingglass and shaker// +//Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink +// itself), in Chemistry-Recipes.dm (for the reaction that changes the components into the drink), and here (for the drinking glass +// icon states. + +/obj/item/weapon/reagent_containers/food/drinks/shaker + name = "shaker" + desc = "A metal shaker to mix drinks in." + icon_state = "shaker" + materials = list(MAT_METAL=1500) + amount_per_transfer_from_this = 10 + volume = 100 + +/obj/item/weapon/reagent_containers/food/drinks/flask + name = "flask" + desc = "Every good spaceman knows it's a good idea to bring along a couple of pints of whiskey wherever they go." + icon_state = "flask" + materials = list(MAT_METAL=250) + volume = 60 + +/obj/item/weapon/reagent_containers/food/drinks/flask/barflask + name = "flask" + desc = "For those who can't be bothered to hang out at the bar to drink." + icon_state = "barflask" + +/obj/item/weapon/reagent_containers/food/drinks/flask/gold + name = "captain's flask" + desc = "A gold flask belonging to the captain." + icon_state = "flask_gold" + materials = list(MAT_GOLD=500) + +/obj/item/weapon/reagent_containers/food/drinks/flask/detflask + name = "detective's flask" + desc = "The detective's only true friend." + icon_state = "detflask" + list_reagents = list("whiskey" = 30) + +/obj/item/weapon/reagent_containers/food/drinks/flask/hand_made + name = "handmade flask" + desc = "A wooden flask with a silver lid and bottom. It has a matte, dark blue paint on it with the initials \"W.H.\" etched in black." + icon = 'icons/obj/custom_items.dmi' + icon_state = "williamhackett" + materials = list() + +/obj/item/weapon/reagent_containers/food/drinks/flask/thermos + name = "vintage thermos" + desc = "An older thermos with a faint shine." + icon_state = "thermos" + volume = 50 + +/obj/item/weapon/reagent_containers/food/drinks/flask/shiny + name = "shiny flask" + desc = "A shiny metal flask. It appears to have a Greek symbol inscribed on it." + icon_state = "shinyflask" + volume = 50 + +/obj/item/weapon/reagent_containers/food/drinks/flask/lithium + name = "Lithium Flask" + desc = "A flask with a Lithium Atom symbol on it." + icon = 'icons/obj/custom_items.dmi' + icon_state = "lithiumflask" + volume = 50 + + +/obj/item/weapon/reagent_containers/food/drinks/britcup + name = "cup" + desc = "A cup with the british flag emblazoned on it." + icon_state = "britcup" volume = 30 \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm similarity index 79% rename from code/modules/reagents/reagent_containers/food/drinks/bottle.dm rename to code/modules/food_and_drinks/drinks/drinks/bottle.dm index 678078bc7fd..93d80552de6 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -1,279 +1,346 @@ - - -///////////////////////////////////////////////Alchohol bottles! -Agouri ////////////////////////// -//Functionally identical to regular drinks. The only difference is that the default bottle size is 100. - Darem -//Bottles now weaken and break when smashed on people's heads. - Giacom - -/obj/item/weapon/reagent_containers/food/drinks/bottle - amount_per_transfer_from_this = 10 - volume = 100 - throwforce = 15 - item_state = "broken_beer" //Generic held-item sprite until unique ones are made. - var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets) - var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it - -/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target, mob/living/user, ranged = 0) - - //Creates a shattering noise and replaces the bottle with a broken_bottle - var/new_location = get_turf(loc) - var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(new_location) - if(ranged) - B.loc = new_location - else - user.drop_item() - user.put_in_active_hand(B) - B.icon_state = src.icon_state - - var/icon/I = new('icons/obj/drinks.dmi', src.icon_state) - I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1) - I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0)) - B.icon = I - - if(isGlass) - if(prob(33)) - new/obj/item/weapon/shard(new_location) - playsound(src, "shatter", 70, 1) - else - B.name = "broken carton" - B.force = 0 - B.throwforce = 0 - B.desc = "A carton with the bottom half burst open. Might give you a papercut." - transfer_fingerprints_to(B) - - qdel(src) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target, mob/living/user) - - if(!target) - return - - if(user.a_intent != I_HARM || !isGlass) - return ..() - - force = 15 //Smashing bottles over someoen's head hurts. - - var/obj/item/organ/external/affecting = user.zone_sel.selecting //Find what the player is aiming at - - var/armor_block = 0 //Get the target's armor values for normal attack damage. - var/armor_duration = 0 //The more force the bottle has, the longer the duration. - - //Calculating duration and calculating damage. - if(ishuman(target)) - - var/mob/living/carbon/human/H = target - var/headarmor = 0 // Target's head armor - armor_block = H.run_armor_check(affecting, "melee","","",armour_penetration) // For normal attack damage - - //If they have a hat/helmet and the user is targeting their head. - if(istype(H.head, /obj/item/clothing/head) && affecting == "head") - - // If their head has an armor value, assign headarmor to it, else give it 0. - if(H.head.armor["melee"]) - headarmor = H.head.armor["melee"] - else - headarmor = 0 - else - headarmor = 0 - - //Calculate the weakening duration for the target. - armor_duration = (duration - headarmor) + force - - else - //Only humans can have armor, right? - armor_block = target.run_armor_check(affecting, "melee") - if(affecting == "head") - armor_duration = duration + force - armor_duration /= 10 - - //Apply the damage! - armor_block = min(90, armor_block) - target.apply_damage(force, BRUTE, affecting, armor_block) - - // You are going to knock someone out for longer if they are not wearing a helmet. - var/head_attack_message = "" - if(affecting == "head" && iscarbon(target)) - head_attack_message = " on the head" - //Weaken the target for the duration that we calculated and divide it by 5. - if(armor_duration) - target.apply_effect(min(armor_duration, 10) , WEAKEN) // Never weaken more than a flash! - - //Display an attack message. - if(target != user) - target.visible_message("[user] has hit [target][head_attack_message] with a bottle of [src.name]!", \ - "[user] has hit [target][head_attack_message] with a bottle of [src.name]!") - else - user.visible_message("[target] hits \himself with a bottle of [src.name][head_attack_message]!", \ - "[target] hits \himself with a bottle of [src.name][head_attack_message]!") - - //Attack logs - add_logs(target, user, "attacked", src) - - //The reagents in the bottle splash all over the target, thanks for the idea Nodrak - SplashReagents(target) - - //Finally, smash the bottle. This kills (del) the bottle. - smash(target, user) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/SplashReagents(mob/M) - if(reagents && reagents.total_volume) - M.visible_message("The contents of \the [src] splashes all over [M]!") - reagents.reaction(M, TOUCH) - reagents.clear_reagents() - -//Keeping this here for now, I'll ask if I should keep it here. -/obj/item/weapon/broken_bottle - name = "Broken Bottle" - desc = "A bottle with a sharp broken bottom." - icon = 'icons/obj/drinks.dmi' - icon_state = "broken_bottle" - force = 9 - throwforce = 5 - throw_speed = 3 - throw_range = 5 - w_class = 1 - item_state = "beer" - hitsound = 'sound/weapons/bladeslice.ogg' - attack_verb = list("stabbed", "slashed", "attacked") - var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") - sharp = 1 - edge = 1 - -/obj/item/weapon/reagent_containers/food/drinks/bottle/gin - name = "Griffeater Gin" - desc = "A bottle of high quality gin, produced in the New London Space Station." - icon_state = "ginbottle" - list_reagents = list("gin" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey - name = "Uncle Git's Special Reserve" - desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES." - icon_state = "whiskeybottle" - list_reagents = list("whiskey" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka - name = "Tunguska Triple Distilled" - desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide." - icon_state = "vodkabottle" - list_reagents = list("vodka" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka/badminka - name = "Badminka Vodka" - desc = "The label's written in Cyrillic. All you can make out is the name and a word that looks vaguely like 'Vodka'." - icon_state = "badminka" - list_reagents = list("vodka" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/tequila - name = "Caccavo Guaranteed Quality Tequila" - desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!" - icon_state = "tequilabottle" - list_reagents = list("tequila" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing - name = "Bottle of Nothing" - desc = "A bottle filled with nothing." - icon_state = "bottleofnothing" - list_reagents = list("nothing" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/patron - name = "Wrapp Artiste Patron" - desc = "Silver laced tequila, served in space night clubs across the galaxy." - icon_state = "patronbottle" - list_reagents = list("patron" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/rum - name = "Captain Pete's Cuban Spiced Rum" - desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle." - icon_state = "rumbottle" - list_reagents = list("rum" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater - name = "Flask of Holy Water" - desc = "A flask of the chaplain's holy water." - icon_state = "holyflask" - list_reagents = list("holywater" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/hell - desc = "A flask of holy water...it's been sitting in the Necropolis a while though." - list_reagents = list("hell_water" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth - name = "Goldeneye Vermouth" - desc = "Sweet, sweet dryness~" - icon_state = "vermouthbottle" - list_reagents = list("vermouth" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua - name = "Robert Robust's Coffee Liqueur" - desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK." - icon_state = "kahluabottle" - list_reagents = list("kahlua" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager - name = "College Girl Goldschlager" - desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps." - icon_state = "goldschlagerbottle" - list_reagents = list("goldschlager" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac - name = "Chateau De Baton Premium Cognac" - desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time." - icon_state = "cognacbottle" - list_reagents = list("cognac" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/wine - name = "Doublebeard Bearded Special Wine" - desc = "A faint aura of unease and asspainery surrounds the bottle." - icon_state = "winebottle" - list_reagents = list("wine" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe - name = "Extra-Strong Absinthe" - desc = "An strong alcoholic drink brewed and distributed by" - icon_state = "absinthebottle" - list_reagents = list("absinthe" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/premium - name = "Gwyn's Premium Absinthe" - desc = "A potent alcoholic beverage, almost makes you forget the ash in your lungs." - icon_state = "absinthepremium" - -/obj/item/weapon/reagent_containers/food/drinks/bottle/hcider - name = "Jian Hard Cider" - desc = "Apple juice for adults." - icon_state = "hcider" - volume = 50 - list_reagents = list("suicider" = 50) - -//////////////////////////JUICES AND STUFF /////////////////////// - -/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice - name = "Orange Juice" - desc = "Full of vitamins and deliciousness!" - icon_state = "orangejuice" - item_state = "carton" - isGlass = 0 - list_reagents = list("orangejuice" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/cream - name = "Milk Cream" - desc = "It's cream. Made from milk. What else did you think you'd find in there?" - icon_state = "cream" - item_state = "carton" - isGlass = 0 - list_reagents = list("cream" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice - name = "Tomato Juice" - desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness." - icon_state = "tomatojuice" - item_state = "carton" - isGlass = 0 - list_reagents = list("tomatojuice" = 100) - -/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice - name = "Lime Juice" - desc = "Sweet-sour goodness." - icon_state = "limejuice" - item_state = "carton" - isGlass = 0 - list_reagents = list("limejuice" = 100) + + +///////////////////////////////////////////////Alchohol bottles! -Agouri ////////////////////////// +//Functionally identical to regular drinks. The only difference is that the default bottle size is 100. - Darem +//Bottles now weaken and break when smashed on people's heads. - Giacom + +/obj/item/weapon/reagent_containers/food/drinks/bottle + amount_per_transfer_from_this = 10 + volume = 100 + throwforce = 15 + item_state = "broken_beer" //Generic held-item sprite until unique ones are made. + var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets) + var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it + +/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target, mob/living/user, ranged = 0) + + //Creates a shattering noise and replaces the bottle with a broken_bottle + var/new_location = get_turf(loc) + var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(new_location) + if(ranged) + B.loc = new_location + else + user.drop_item() + user.put_in_active_hand(B) + B.icon_state = src.icon_state + + var/icon/I = new('icons/obj/drinks.dmi', src.icon_state) + I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1) + I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0)) + B.icon = I + + if(isGlass) + if(prob(33)) + new/obj/item/weapon/shard(new_location) + playsound(src, "shatter", 70, 1) + else + B.name = "broken carton" + B.force = 0 + B.throwforce = 0 + B.desc = "A carton with the bottom half burst open. Might give you a papercut." + transfer_fingerprints_to(B) + + qdel(src) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target, mob/living/user) + + if(!target) + return + + if(user.a_intent != I_HARM || !isGlass) + return ..() + + force = 15 //Smashing bottles over someoen's head hurts. + + var/obj/item/organ/external/affecting = user.zone_sel.selecting //Find what the player is aiming at + + var/armor_block = 0 //Get the target's armor values for normal attack damage. + var/armor_duration = 0 //The more force the bottle has, the longer the duration. + + //Calculating duration and calculating damage. + if(ishuman(target)) + + var/mob/living/carbon/human/H = target + var/headarmor = 0 // Target's head armor + armor_block = H.run_armor_check(affecting, "melee","","",armour_penetration) // For normal attack damage + + //If they have a hat/helmet and the user is targeting their head. + if(istype(H.head, /obj/item/clothing/head) && affecting == "head") + + // If their head has an armor value, assign headarmor to it, else give it 0. + if(H.head.armor["melee"]) + headarmor = H.head.armor["melee"] + else + headarmor = 0 + else + headarmor = 0 + + //Calculate the weakening duration for the target. + armor_duration = (duration - headarmor) + force + + else + //Only humans can have armor, right? + armor_block = target.run_armor_check(affecting, "melee") + if(affecting == "head") + armor_duration = duration + force + armor_duration /= 10 + + //Apply the damage! + armor_block = min(90, armor_block) + target.apply_damage(force, BRUTE, affecting, armor_block) + + // You are going to knock someone out for longer if they are not wearing a helmet. + var/head_attack_message = "" + if(affecting == "head" && iscarbon(target)) + head_attack_message = " on the head" + //Weaken the target for the duration that we calculated and divide it by 5. + if(armor_duration) + target.apply_effect(min(armor_duration, 10) , WEAKEN) // Never weaken more than a flash! + + //Display an attack message. + if(target != user) + target.visible_message("[user] has hit [target][head_attack_message] with a bottle of [src.name]!", \ + "[user] has hit [target][head_attack_message] with a bottle of [src.name]!") + else + user.visible_message("[target] hits \himself with a bottle of [src.name][head_attack_message]!", \ + "[target] hits \himself with a bottle of [src.name][head_attack_message]!") + + //Attack logs + add_logs(target, user, "attacked", src) + + //The reagents in the bottle splash all over the target, thanks for the idea Nodrak + SplashReagents(target) + + //Finally, smash the bottle. This kills (del) the bottle. + smash(target, user) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/SplashReagents(mob/M) + if(reagents && reagents.total_volume) + M.visible_message("The contents of \the [src] splashes all over [M]!") + reagents.reaction(M, TOUCH) + reagents.clear_reagents() + +//Keeping this here for now, I'll ask if I should keep it here. +/obj/item/weapon/broken_bottle + name = "Broken Bottle" + desc = "A bottle with a sharp broken bottom." + icon = 'icons/obj/drinks.dmi' + icon_state = "broken_bottle" + force = 9 + throwforce = 5 + throw_speed = 3 + throw_range = 5 + w_class = 1 + item_state = "beer" + hitsound = 'sound/weapons/bladeslice.ogg' + attack_verb = list("stabbed", "slashed", "attacked") + var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") + sharp = 1 + edge = 1 + +/obj/item/weapon/reagent_containers/food/drinks/bottle/gin + name = "Griffeater Gin" + desc = "A bottle of high quality gin, produced in the New London Space Station." + icon_state = "ginbottle" + list_reagents = list("gin" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey + name = "Uncle Git's Special Reserve" + desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES." + icon_state = "whiskeybottle" + list_reagents = list("whiskey" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka + name = "Tunguska Triple Distilled" + desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide." + icon_state = "vodkabottle" + list_reagents = list("vodka" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka/badminka + name = "Badminka Vodka" + desc = "The label's written in Cyrillic. All you can make out is the name and a word that looks vaguely like 'Vodka'." + icon_state = "badminka" + list_reagents = list("vodka" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/tequila + name = "Caccavo Guaranteed Quality Tequila" + desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!" + icon_state = "tequilabottle" + list_reagents = list("tequila" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing + name = "Bottle of Nothing" + desc = "A bottle filled with nothing." + icon_state = "bottleofnothing" + list_reagents = list("nothing" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/patron + name = "Wrapp Artiste Patron" + desc = "Silver laced tequila, served in space night clubs across the galaxy." + icon_state = "patronbottle" + list_reagents = list("patron" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/rum + name = "Captain Pete's Cuban Spiced Rum" + desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle." + icon_state = "rumbottle" + list_reagents = list("rum" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater + name = "Flask of Holy Water" + desc = "A flask of the chaplain's holy water." + icon_state = "holyflask" + list_reagents = list("holywater" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/hell + desc = "A flask of holy water...it's been sitting in the Necropolis a while though." + list_reagents = list("hell_water" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth + name = "Goldeneye Vermouth" + desc = "Sweet, sweet dryness~" + icon_state = "vermouthbottle" + list_reagents = list("vermouth" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua + name = "Robert Robust's Coffee Liqueur" + desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK." + icon_state = "kahluabottle" + list_reagents = list("kahlua" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager + name = "College Girl Goldschlager" + desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps." + icon_state = "goldschlagerbottle" + list_reagents = list("goldschlager" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac + name = "Chateau De Baton Premium Cognac" + desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time." + icon_state = "cognacbottle" + list_reagents = list("cognac" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/wine + name = "Doublebeard Bearded Special Wine" + desc = "A faint aura of unease and asspainery surrounds the bottle." + icon_state = "winebottle" + list_reagents = list("wine" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe + name = "Extra-Strong Absinthe" + desc = "An strong alcoholic drink brewed and distributed by" + icon_state = "absinthebottle" + list_reagents = list("absinthe" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/premium + name = "Gwyn's Premium Absinthe" + desc = "A potent alcoholic beverage, almost makes you forget the ash in your lungs." + icon_state = "absinthepremium" + +/obj/item/weapon/reagent_containers/food/drinks/bottle/hcider + name = "Jian Hard Cider" + desc = "Apple juice for adults." + icon_state = "hcider" + volume = 50 + list_reagents = list("suicider" = 50) + +//////////////////////////JUICES AND STUFF /////////////////////// + +/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice + name = "Orange Juice" + desc = "Full of vitamins and deliciousness!" + icon_state = "orangejuice" + item_state = "carton" + isGlass = 0 + list_reagents = list("orangejuice" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/cream + name = "Milk Cream" + desc = "It's cream. Made from milk. What else did you think you'd find in there?" + icon_state = "cream" + item_state = "carton" + isGlass = 0 + list_reagents = list("cream" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice + name = "Tomato Juice" + desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness." + icon_state = "tomatojuice" + item_state = "carton" + isGlass = 0 + list_reagents = list("tomatojuice" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice + name = "Lime Juice" + desc = "Sweet-sour goodness." + icon_state = "limejuice" + item_state = "carton" + isGlass = 0 + list_reagents = list("limejuice" = 100) + +////////////////////////// MOLOTOV /////////////////////// +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov + name = "molotov cocktail" + desc = "A throwing weapon used to ignite things, typically filled with an accelerant. Recommended highly by rioters and revolutionaries. Light and toss." + icon_state = "vodkabottle" + list_reagents = list() + var/list/accelerants = list(/datum/reagent/ethanol,/datum/reagent/fuel,/datum/reagent/clf3,/datum/reagent/phlogiston, + /datum/reagent/napalm,/datum/reagent/hellwater,/datum/reagent/plasma,/datum/reagent/plasma_dust) + var/active = 0 + +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/CheckParts(list/parts_list) + ..() + var/obj/item/weapon/reagent_containers/food/drinks/bottle/B = locate() in contents + if(B) + icon_state = B.icon_state + B.reagents.copy_to(src, 100) + if(!B.isGlass) + desc += " You're not sure if making this out of a carton was the brightest idea." + isGlass = 0 + +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/throw_impact(atom/target,mob/thrower) + var/firestarter = 0 + for(var/datum/reagent/R in reagents.reagent_list) + for(var/A in accelerants) + if(istype(R, A)) + firestarter = 1 + break + SplashReagents(target) + if(firestarter && active) + target.fire_act() + new /obj/effect/hotspot(get_turf(target)) + ..() + +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params) + if(is_hot(I) && !active) + active = 1 + var/turf/bombturf = get_turf(src) + var/area/bombarea = get_area(bombturf) + message_admins("[key_name(user)]? has primed a [name] for detonation at [bombarea] (JMP).") + log_game("[key_name(user)] has primed a [name] for detonation at [bombarea] ([bombturf.x],[bombturf.y],[bombturf.z]).") + + to_chat(user, "You light [src] on fire.") + overlays += fire_overlay + if(!isGlass) + spawn(50) + if(active) + var/counter + var/target = loc + for(counter = 0, counter < 2, counter++) + if(istype(target, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = target + target = S.loc + if(istype(target, /atom)) + var/atom/A = target + SplashReagents(A) + A.fire_act() + qdel(src) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/attack_self(mob/user) + if(active) + if(!isGlass) + to_chat(user, "The flame's spread too far on it!") + return + to_chat(user, "You snuff out the flame on \the [src].") + overlays -= fire_overlay + active = 0 \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/food_and_drinks/drinks/drinks/cans.dm similarity index 100% rename from code/modules/reagents/reagent_containers/food/cans.dm rename to code/modules/food_and_drinks/drinks/drinks/cans.dm diff --git a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm similarity index 97% rename from code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm rename to code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index 23ce26cf5e4..ebdd151a4b5 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -1,559 +1,559 @@ - - -/obj/item/weapon/reagent_containers/food/drinks/drinkingglass - name = "glass" - desc = "Your standard drinking glass." - icon_state = "glass_empty" - item_state = "drinking_glass" - amount_per_transfer_from_this = 10 - volume = 50 - lefthand_file = 'icons/goonstation/mob/inhands/items_lefthand.dmi' - righthand_file = 'icons/goonstation/mob/inhands/items_righthand.dmi' - materials = list(MAT_GLASS=500) - -/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/egg)) //breaking eggs - var/obj/item/weapon/reagent_containers/food/snacks/egg/E = I - if(reagents) - if(reagents.total_volume >= reagents.maximum_volume) - to_chat(user, "[src] is full.") - else - to_chat(user, "You break [E] in [src].") - E.reagents.trans_to(src, E.reagents.total_volume) - qdel(E) - return - else - ..() - -/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change() // *scream - if(reagents.reagent_list.len > 0) - switch(reagents.get_master_reagent_id()) - if("beer") - icon_state = "beerglass" - name = "Beer glass" - desc = "A freezing pint of beer" - if("cider") - icon_state = "rewriter" - name = "Cider" - desc = "a refreshing glass of traditional cider" - if("beer2") - icon_state = "beerglass" - name = "Beer glass" - desc = "A freezing pint of beer" - if("ale") - icon_state = "aleglass" - name = "Ale glass" - desc = "A freezing pint of delicious Ale" - if("milk") - icon_state = "glass_white" - name = "Glass of milk" - desc = "White and nutritious goodness!" - if("cream") - icon_state = "glass_white" - name = "Glass of cream" - desc = "Ewwww..." - if("chocolate") - icon_state = "chocolateglass" - name = "Glass of chocolate" - desc = "Tasty" - if("hot_coco") - icon_state = "hot_coco" - name = "Glass of hot coco" - desc = "Delicious and cozy" - if("lemonjuice") - icon_state = "lemonglass" - name = "Glass of lemonjuice" - desc = "Sour..." - if("cola") - icon_state = "glass_brown" - name = "Glass of Space Cola" - desc = "A glass of refreshing Space Cola" - if("nuka_cola") - icon_state = "nuka_colaglass" - name = "Nuka Cola" - desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland" - if("orangejuice") - icon_state = "glass_orange" - name = "Glass of Orange juice" - desc = "Vitamins! Yay!" - if("tomatojuice") - icon_state = "glass_red" - name = "Glass of Tomato juice" - desc = "Are you sure this is tomato juice?" - if("blood") - icon_state = "glass_red" - name = "Glass of Tomato juice" - desc = "Are you sure this is tomato juice?" - if("limejuice") - icon_state = "glass_green" - name = "Glass of Lime juice" - desc = "A glass of sweet-sour lime juice." - if("whiskey") - icon_state = "whiskeyglass" - name = "Glass of whiskey" - desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." - if("gin") - icon_state = "ginvodkaglass" - name = "Glass of gin" - desc = "A crystal clear glass of Griffeater gin." - if("vodka") - icon_state = "ginvodkaglass" - name = "Glass of vodka" - desc = "The glass contain wodka. Xynta." - if("sake") - icon_state = "ginvodkaglass" - name = "Glass of Sake" - desc = "A glass of Sake." - if("goldschlager") - icon_state = "ginvodkaglass" - name = "Glass of goldschlager" - desc = "100 proof that teen girls will drink anything with gold in it." - if("wine") - icon_state = "wineglass" - name = "Glass of wine" - desc = "A very classy looking drink." - if("cognac") - icon_state = "cognacglass" - name = "Glass of cognac" - desc = "Damn, you feel like some kind of French aristocrat just by holding this." - if("kahlua") - icon_state = "kahluaglass" - name = "Glass of RR coffee Liquor" - desc = "DAMN, THIS THING LOOKS ROBUST" - if("vermouth") - icon_state = "vermouthglass" - name = "Glass of Vermouth" - desc = "You wonder why you're even drinking this straight." - if("triple_citrus") - icon_state = "triplecitrus" - name = "Glass of Triplecitrus Juice" - desc = "As colorful and healthy as it is delicious." - if("mojito") - icon_state = "mojito" - name = "Glass of Mojito" - desc = "Fresh from Spesscuba." - if("tequila") - icon_state = "tequilaglass" - name = "Glass of Tequila" - desc = "Now all that's missing is the weird colored shades!" - if("patron") - icon_state = "patronglass" - name = "Glass of Patron" - desc = "Drinking patron in the bar, with all the subpar ladies." - if("rum") - icon_state = "rumglass" - name = "Glass of Rum" - desc = "Now you want to Pray for a pirate suit, don't you?" - if("absinthe") - icon_state = "absinthebottle" - name = "Glass of Absinthe" - desc = "The green fairy is going to get you now!" - if("gintonic") - icon_state = "gintonicglass" - name = "Gin and Tonic" - desc = "A mild but still great cocktail. Drink up, like a true Englishman." - if("ginsonic") - icon_state = "ginsonic" - name = "Gin and Sonic" - desc = "An extremely high amperage drink. Absolutely not for the true Englishman." - if("whiskeycola") - icon_state = "whiskeycolaglass" - name = "Whiskey Cola" - desc = "An innocent-looking mixture of cola and Whiskey. Delicious." - if("whiterussian") - icon_state = "whiterussianglass" - name = "White Russian" - desc = "A very nice looking drink. But that's just, like, your opinion, man." - if("screwdrivercocktail") - icon_state = "screwdriverglass" - name = "Screwdriver" - desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." - if("bloodymary") - icon_state = "bloodymaryglass" - name = "Bloody Mary" - desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." - if("martini") - icon_state = "martiniglass" - name = "Classic Martini" - desc = "Damn, the bartender even stirred it, not shook it." - if("vodkamartini") - icon_state = "martiniglass" - name = "Vodka martini" - desc ="A bastardisation of the classic martini. Still great." - if("gargleblaster") - icon_state = "gargleblasterglass" - name = "Pan-Galactic Gargle Blaster" - desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." - if("bravebull") - icon_state = "bravebullglass" - name = "Brave Bull" - desc = "Tequila and Coffee liquor, brought together in a mouthwatering mixture. Drink up." - if("tequilasunrise") - icon_state = "tequilasunriseglass" - name = "Tequila Sunrise" - desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." - if("toxinsspecial") - icon_state = "toxinsspecialglass" - name = "Toxins Special" - desc = "Whoah, this thing is on FIRE" - if("beepskysmash") - icon_state = "beepskysmashglass" - name = "Beepsky Smash" - desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." - if("doctorsdelight") - icon_state = "doctorsdelightglass" - name = "Doctor's Delight" - desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place." - if("manlydorf") - icon_state = "manlydorfglass" - name = "The Manly Dorf" - desc = "A manly concotion made from Ale and Beer. Intended for true men only." - if("irishcream") - icon_state = "irishcreamglass" - name = "Irish Cream" - desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" - if("cubalibre") - icon_state = "cubalibreglass" - name = "Cuba Libre" - desc = "A classic mix of rum and cola." - if("b52") - icon_state = "b52glass" - name = "B-52" - desc = "Kahlua, Irish Cream, and congac. You will get bombed." - if("atomicbomb") - icon_state = "atomicbombglass" - name = "Atomic Bomb" - desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." - if("longislandicedtea") - icon_state = "longislandicedteaglass" - name = "Long Island Iced Tea" - desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - if("threemileisland") - icon_state = "threemileislandglass" - name = "Three Mile Island Ice Tea" - desc = "A glass of this is sure to prevent a meltdown." - if("margarita") - icon_state = "margaritaglass" - name = "Margarita" - desc = "On the rocks with salt on the rim. Arriba~!" - if("blackrussian") - icon_state = "blackrussianglass" - name = "Black Russian" - desc = "For the lactose-intolerant. Still as classy as a White Russian." - if("vodkatonic") - icon_state = "vodkatonicglass" - name = "Vodka and Tonic" - desc = "For when a gin and tonic isn't russian enough." - if("manhattan") - icon_state = "manhattanglass" - name = "Manhattan" - desc = "The Detective's undercover drink of choice. He never could stomach gin..." - if("manhattan_proj") - icon_state = "proj_manhattanglass" - name = "Manhattan Project" - desc = "A scienitst drink of choice, for thinking how to blow up the station." - if("ginfizz") - icon_state = "ginfizzglass" - name = "Gin Fizz" - desc = "Refreshingly lemony, deliciously dry." - if("irishcoffee") - icon_state = "irishcoffeeglass" - name = "Irish Coffee" - desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." - if("suicider") - icon_state = "suicider" - name = "Suicider" - desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - if("whiskeysoda") - icon_state = "whiskeysodaglass2" - name = "Whiskey Soda" - desc = "Ultimate refreshment." - if("tonic") - icon_state = "glass_clear" - name = "Glass of Tonic Water" - desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." - if("sodawater") - icon_state = "glass_clear" - name = "Glass of Soda Water" - desc = "Soda water. Why not make a scotch and soda?" - if("water") - icon_state = "glass_clear" - name = "Glass of Water" - desc = "The father of all refreshments." - if("spacemountainwind") - icon_state = "Space_mountain_wind_glass" - name = "Glass of Space Mountain Wind" - desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." - if("thirteenloko") - icon_state = "thirteen_loko_glass" - name = "Glass of Thirteen Loko" - desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass" - if("dr_gibb") - icon_state = "dr_gibb_glass" - name = "Glass of Dr. Gibb" - desc = "Dr. Gibb. Not as dangerous as the name might imply." - if("space_up") - icon_state = "space-up_glass" - name = "Glass of Space-up" - desc = "Space-up. It helps keep your cool." - if("moonshine") - icon_state = "glass_clear" - name = "Moonshine" - desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - if("soymilk") - icon_state = "glass_white" - name = "Glass of soy milk" - desc = "White and nutritious soy goodness!" - if("berryjuice") - icon_state = "berryjuice" - name = "Glass of berry juice" - desc = "Berry juice. Or maybe its jam. Who cares?" - if("poisonberryjuice") - icon_state = "poisonberryjuice" - name = "Glass of poison berry juice" - desc = "A glass of deadly juice." - if("carrotjuice") - icon_state = "carrotjuice" - name = "Glass of carrot juice" - desc = "It is just like a carrot but without crunching." - if("potato") - icon_state = "glass_brown" - name = "Glass of potato juice" - desc = "Who in the hell requests this? Gross!" - if("banana") - icon_state = "banana" - name = "Glass of banana juice" - desc = "The raw essence of a banana. HONK" - if("bahama_mama") - icon_state = "bahama_mama" - name = "Bahama Mama" - desc = "Tropic cocktail" - if("singulo") - icon_state = "singulo" - name = "Singulo" - desc = "A blue-space beverage." - if("alliescocktail") - icon_state = "alliescocktail" - name = "Allies cocktail" - desc = "A drink made from your allies." - if("antifreeze") - icon_state = "antifreeze" - name = "Anti-freeze" - desc = "The ultimate refreshment." - if("barefoot") - icon_state = "b&p" - name = "Barefoot" - desc = "Barefoot and pregnant" - if("demonsblood") - icon_state = "demonsblood" - name = "Demons Blood" - desc = "Just looking at this thing makes the hair at the back of your neck stand up." - if("booger") - icon_state = "booger" - name = "Booger" - desc = "Ewww..." - if("snowwhite") - icon_state = "snowwhite" - name = "Snow White" - desc = "A cold refreshment." - if("aloe") - icon_state = "aloe" - name = "Aloe" - desc = "Very, very, very good." - if("andalusia") - icon_state = "andalusia" - name = "Andalusia" - desc = "A nice, strange named drink." - if("sbiten") - icon_state = "sbitenglass" - name = "Sbiten" - desc = "A spicy mix of Vodka and Spice. Very hot." - if("red_mead") - icon_state = "red_meadglass" - name = "Red Mead" - desc = "A True Vikings Beverage, though its color is strange." - if("mead") - icon_state = "meadglass" - name = "Mead" - desc = "A Vikings Beverage, though a cheap one." - if("iced_beer") - icon_state = "iced_beerglass" - name = "Iced Beer" - desc = "A beer so frosty, the air around it freezes." - if("grog") - icon_state = "grogglass" - name = "Grog" - desc = "A fine and cepa drink for Space." - if("soy_latte") - icon_state = "soy_latte" - name = "Soy Latte" - desc = "A nice and refrshing beverage while you are reading." - if("cafe_latte") - icon_state = "cafe_latte" - name = "Cafe Latte" - desc = "A nice, strong and refreshing beverage while you are reading." - if("cafe_mocha") - icon_state = "cafe_latte" - name = "Cafe Mocha" - desc = "The perfect blend of coffe, milk, and chocolate." - if("acidspit") - icon_state = "acidspitglass" - name = "Acid Spit" - desc = "A drink from Nanotrasen. Made from live aliens." - if("amasec") - icon_state = "amasecglass" - name = "Amasec" - desc = "Always handy before COMBAT!!!" - if("neurotoxin") - icon_state = "neurotoxinglass" - name = "Neurotoxin" - desc = "A drink that is guaranteed to knock you silly." - if("hippiesdelight") - icon_state = "hippiesdelightglass" - name = "Hippie's Delight" - desc = "A drink enjoyed by people during the 1960's." - if("bananahonk") - icon_state = "bananahonkglass" - name = "Banana Honk" - desc = "A drink from Banana Heaven." - if("silencer") - icon_state = "silencerglass" - name = "Silencer" - desc = "A drink from mime Heaven." - if("nothing") - icon_state = "nothing" - name = "Nothing" - desc = "Absolutely nothing." - if("devilskiss") - icon_state = "devilskiss" - name = "Devils Kiss" - desc = "Creepy time!" - if("changelingsting") - icon_state = "changelingsting" - name = "Changeling Sting" - desc = "A stingy drink." - if("irishcarbomb") - icon_state = "irishcarbomb" - name = "Irish Car Bomb" - desc = "An irish car bomb." - if("syndicatebomb") - icon_state = "syndicatebomb" - name = "Syndicate Bomb" - desc = "A syndicate bomb." - if("erikasurprise") - icon_state = "erikasurprise" - name = "Erika Surprise" - desc = "The surprise is, it's green!" - if("driestmartini") - icon_state = "driestmartiniglass" - name = "Driest Martini" - desc = "Only for the experienced. You think you see sand floating in the glass." - if("ice") - icon_state = "iceglass" - name = "Glass of ice" - desc = "Generally, you're supposed to put something else in there too..." - if("icecoffee") - icon_state = "icedcoffeeglass" - name = "Iced Coffee" - desc = "A drink to perk you up and refresh you!" - if("coffee") - icon_state = "glass_brown" - name = "Glass of coffee" - desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." - if("bilk") - icon_state = "glass_brown" - name = "Glass of bilk" - desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." - if("fuel") - icon_state = "dr_gibb_glass" - name = "Glass of welder fuel" - desc = "Unless you are an industrial tool, this is probably not safe for consumption." - if("brownstar") - icon_state = "brownstar" - name = "Brown Star" - desc = "Its not what it sounds like..." - if("tea") - icon_state = "glass_brown" - name = "Glass of Tea" - desc = "A glass of hot tea. Perhaps a cup with a handle would have been smarter?" - if("icetea") - icon_state = "icetea" - name = "Iced Tea" - desc = "No relation to a certain rap artist/ actor." - if("milkshake") - icon_state = "milkshake" - name = "Milkshake" - desc = "Glorious brainfreezing mixture." - if("lemonade") - icon_state = "lemonade" - name = "Lemonade" - desc = "Oh the nostalgia..." - if("kiraspecial") - icon_state = "kiraspecial" - name = "Kira Special" - desc = "Long live the guy who everyone had mistaken for a girl. Baka!" - if("rewriter") - icon_state = "rewriter" - name = "Rewriter" - desc = "The secert of the sanctuary of the Libarian..." - if("applejack") - icon_state = "cognacglass" - name = "Glass of applejack" - desc = "When cider isn't strong enough, you gotta jack it." - if("jackrose") - icon_state = "patronglass" - name = "Jack Rose" - desc = "Drinking this makes you feel like you belong in a luxury hotel bar during the 1920s." - if("synthanol") - icon_state = "synthanolglass" - name = "Glass of Synthanol" - desc = "The equivalent of alcohol for synthetic crewmembers. They'd find it awful if they had tastebuds too." - if("robottears") - icon_state = "robottearsglass" - name = "Glass of Robot Tears" - desc = "No robots were hurt in the making of this drink." - if("trinary") - icon_state = "trinaryglass" - name = "Glass of Trinary" - desc = "Colorful drink made for synthetic crewmembers. It doesn't seem like it would taste well." - if("servo") - icon_state = "servoglass" - name = "Glass of Servo" - desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe." - if("synthnsoda") - icon_state = "synthnsodaglass" - name = "Glass of Synth 'n Soda" - desc = "Classic drink altered to fit the tastes of a robot. Bad idea to drink if you're made of carbon." - if("synthignon") - icon_state = "synthignonglass" - name = "Glass of Synthignon" - desc = "Someone mixed good wine and robot booze. Romantic, but atrocious." - if("uplink") - icon_state = "uplinkglass" - name = "Glass of Uplink" - desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics." - if("holywater") - icon_state = "glass_clear" - name = "Glass of Water" - desc = "The father of all refreshments." - - - else - icon_state ="glass_brown" - name = "Glass of ..what?" - desc = "You can't really tell what this is." - else - icon_state = "glass_empty" - name = "glass" - desc = "Your standard drinking glass." - -// for /obj/machinery/vending/sovietsoda -/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda - list_reagents = list("sodawater" = 50) - - -/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola - list_reagents = list("cola" = 50) - -/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/devilskiss + + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass + name = "glass" + desc = "Your standard drinking glass." + icon_state = "glass_empty" + item_state = "drinking_glass" + amount_per_transfer_from_this = 10 + volume = 50 + lefthand_file = 'icons/goonstation/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/goonstation/mob/inhands/items_righthand.dmi' + materials = list(MAT_GLASS=500) + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/egg)) //breaking eggs + var/obj/item/weapon/reagent_containers/food/snacks/egg/E = I + if(reagents) + if(reagents.total_volume >= reagents.maximum_volume) + to_chat(user, "[src] is full.") + else + to_chat(user, "You break [E] in [src].") + E.reagents.trans_to(src, E.reagents.total_volume) + qdel(E) + return + else + ..() + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change() // *scream + if(reagents.reagent_list.len > 0) + switch(reagents.get_master_reagent_id()) + if("beer") + icon_state = "beerglass" + name = "Beer glass" + desc = "A freezing pint of beer" + if("cider") + icon_state = "rewriter" + name = "Cider" + desc = "a refreshing glass of traditional cider" + if("beer2") + icon_state = "beerglass" + name = "Beer glass" + desc = "A freezing pint of beer" + if("ale") + icon_state = "aleglass" + name = "Ale glass" + desc = "A freezing pint of delicious Ale" + if("milk") + icon_state = "glass_white" + name = "Glass of milk" + desc = "White and nutritious goodness!" + if("cream") + icon_state = "glass_white" + name = "Glass of cream" + desc = "Ewwww..." + if("chocolate") + icon_state = "chocolateglass" + name = "Glass of chocolate" + desc = "Tasty" + if("hot_coco") + icon_state = "hot_coco" + name = "Glass of hot coco" + desc = "Delicious and cozy" + if("lemonjuice") + icon_state = "lemonglass" + name = "Glass of lemonjuice" + desc = "Sour..." + if("cola") + icon_state = "glass_brown" + name = "Glass of Space Cola" + desc = "A glass of refreshing Space Cola" + if("nuka_cola") + icon_state = "nuka_colaglass" + name = "Nuka Cola" + desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland" + if("orangejuice") + icon_state = "glass_orange" + name = "Glass of Orange juice" + desc = "Vitamins! Yay!" + if("tomatojuice") + icon_state = "glass_red" + name = "Glass of Tomato juice" + desc = "Are you sure this is tomato juice?" + if("blood") + icon_state = "glass_red" + name = "Glass of Tomato juice" + desc = "Are you sure this is tomato juice?" + if("limejuice") + icon_state = "glass_green" + name = "Glass of Lime juice" + desc = "A glass of sweet-sour lime juice." + if("whiskey") + icon_state = "whiskeyglass" + name = "Glass of whiskey" + desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." + if("gin") + icon_state = "ginvodkaglass" + name = "Glass of gin" + desc = "A crystal clear glass of Griffeater gin." + if("vodka") + icon_state = "ginvodkaglass" + name = "Glass of vodka" + desc = "The glass contain wodka. Xynta." + if("sake") + icon_state = "ginvodkaglass" + name = "Glass of Sake" + desc = "A glass of Sake." + if("goldschlager") + icon_state = "ginvodkaglass" + name = "Glass of goldschlager" + desc = "100 proof that teen girls will drink anything with gold in it." + if("wine") + icon_state = "wineglass" + name = "Glass of wine" + desc = "A very classy looking drink." + if("cognac") + icon_state = "cognacglass" + name = "Glass of cognac" + desc = "Damn, you feel like some kind of French aristocrat just by holding this." + if("kahlua") + icon_state = "kahluaglass" + name = "Glass of RR coffee Liquor" + desc = "DAMN, THIS THING LOOKS ROBUST" + if("vermouth") + icon_state = "vermouthglass" + name = "Glass of Vermouth" + desc = "You wonder why you're even drinking this straight." + if("triple_citrus") + icon_state = "triplecitrus" + name = "Glass of Triplecitrus Juice" + desc = "As colorful and healthy as it is delicious." + if("mojito") + icon_state = "mojito" + name = "Glass of Mojito" + desc = "Fresh from Spesscuba." + if("tequila") + icon_state = "tequilaglass" + name = "Glass of Tequila" + desc = "Now all that's missing is the weird colored shades!" + if("patron") + icon_state = "patronglass" + name = "Glass of Patron" + desc = "Drinking patron in the bar, with all the subpar ladies." + if("rum") + icon_state = "rumglass" + name = "Glass of Rum" + desc = "Now you want to Pray for a pirate suit, don't you?" + if("absinthe") + icon_state = "absinthebottle" + name = "Glass of Absinthe" + desc = "The green fairy is going to get you now!" + if("gintonic") + icon_state = "gintonicglass" + name = "Gin and Tonic" + desc = "A mild but still great cocktail. Drink up, like a true Englishman." + if("ginsonic") + icon_state = "ginsonic" + name = "Gin and Sonic" + desc = "An extremely high amperage drink. Absolutely not for the true Englishman." + if("whiskeycola") + icon_state = "whiskeycolaglass" + name = "Whiskey Cola" + desc = "An innocent-looking mixture of cola and Whiskey. Delicious." + if("whiterussian") + icon_state = "whiterussianglass" + name = "White Russian" + desc = "A very nice looking drink. But that's just, like, your opinion, man." + if("screwdrivercocktail") + icon_state = "screwdriverglass" + name = "Screwdriver" + desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." + if("bloodymary") + icon_state = "bloodymaryglass" + name = "Bloody Mary" + desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." + if("martini") + icon_state = "martiniglass" + name = "Classic Martini" + desc = "Damn, the bartender even stirred it, not shook it." + if("vodkamartini") + icon_state = "martiniglass" + name = "Vodka martini" + desc ="A bastardisation of the classic martini. Still great." + if("gargleblaster") + icon_state = "gargleblasterglass" + name = "Pan-Galactic Gargle Blaster" + desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." + if("bravebull") + icon_state = "bravebullglass" + name = "Brave Bull" + desc = "Tequila and Coffee liquor, brought together in a mouthwatering mixture. Drink up." + if("tequilasunrise") + icon_state = "tequilasunriseglass" + name = "Tequila Sunrise" + desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." + if("toxinsspecial") + icon_state = "toxinsspecialglass" + name = "Toxins Special" + desc = "Whoah, this thing is on FIRE" + if("beepskysmash") + icon_state = "beepskysmashglass" + name = "Beepsky Smash" + desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." + if("doctorsdelight") + icon_state = "doctorsdelightglass" + name = "Doctor's Delight" + desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place." + if("manlydorf") + icon_state = "manlydorfglass" + name = "The Manly Dorf" + desc = "A manly concotion made from Ale and Beer. Intended for true men only." + if("irishcream") + icon_state = "irishcreamglass" + name = "Irish Cream" + desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" + if("cubalibre") + icon_state = "cubalibreglass" + name = "Cuba Libre" + desc = "A classic mix of rum and cola." + if("b52") + icon_state = "b52glass" + name = "B-52" + desc = "Kahlua, Irish Cream, and congac. You will get bombed." + if("atomicbomb") + icon_state = "atomicbombglass" + name = "Atomic Bomb" + desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." + if("longislandicedtea") + icon_state = "longislandicedteaglass" + name = "Long Island Iced Tea" + desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." + if("threemileisland") + icon_state = "threemileislandglass" + name = "Three Mile Island Ice Tea" + desc = "A glass of this is sure to prevent a meltdown." + if("margarita") + icon_state = "margaritaglass" + name = "Margarita" + desc = "On the rocks with salt on the rim. Arriba~!" + if("blackrussian") + icon_state = "blackrussianglass" + name = "Black Russian" + desc = "For the lactose-intolerant. Still as classy as a White Russian." + if("vodkatonic") + icon_state = "vodkatonicglass" + name = "Vodka and Tonic" + desc = "For when a gin and tonic isn't russian enough." + if("manhattan") + icon_state = "manhattanglass" + name = "Manhattan" + desc = "The Detective's undercover drink of choice. He never could stomach gin..." + if("manhattan_proj") + icon_state = "proj_manhattanglass" + name = "Manhattan Project" + desc = "A scienitst drink of choice, for thinking how to blow up the station." + if("ginfizz") + icon_state = "ginfizzglass" + name = "Gin Fizz" + desc = "Refreshingly lemony, deliciously dry." + if("irishcoffee") + icon_state = "irishcoffeeglass" + name = "Irish Coffee" + desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." + if("suicider") + icon_state = "suicider" + name = "Suicider" + desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + if("whiskeysoda") + icon_state = "whiskeysodaglass2" + name = "Whiskey Soda" + desc = "Ultimate refreshment." + if("tonic") + icon_state = "glass_clear" + name = "Glass of Tonic Water" + desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." + if("sodawater") + icon_state = "glass_clear" + name = "Glass of Soda Water" + desc = "Soda water. Why not make a scotch and soda?" + if("water") + icon_state = "glass_clear" + name = "Glass of Water" + desc = "The father of all refreshments." + if("spacemountainwind") + icon_state = "Space_mountain_wind_glass" + name = "Glass of Space Mountain Wind" + desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." + if("thirteenloko") + icon_state = "thirteen_loko_glass" + name = "Glass of Thirteen Loko" + desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass" + if("dr_gibb") + icon_state = "dr_gibb_glass" + name = "Glass of Dr. Gibb" + desc = "Dr. Gibb. Not as dangerous as the name might imply." + if("space_up") + icon_state = "space-up_glass" + name = "Glass of Space-up" + desc = "Space-up. It helps keep your cool." + if("moonshine") + icon_state = "glass_clear" + name = "Moonshine" + desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + if("soymilk") + icon_state = "glass_white" + name = "Glass of soy milk" + desc = "White and nutritious soy goodness!" + if("berryjuice") + icon_state = "berryjuice" + name = "Glass of berry juice" + desc = "Berry juice. Or maybe its jam. Who cares?" + if("poisonberryjuice") + icon_state = "poisonberryjuice" + name = "Glass of poison berry juice" + desc = "A glass of deadly juice." + if("carrotjuice") + icon_state = "carrotjuice" + name = "Glass of carrot juice" + desc = "It is just like a carrot but without crunching." + if("potato") + icon_state = "glass_brown" + name = "Glass of potato juice" + desc = "Who in the hell requests this? Gross!" + if("banana") + icon_state = "banana" + name = "Glass of banana juice" + desc = "The raw essence of a banana. HONK" + if("bahama_mama") + icon_state = "bahama_mama" + name = "Bahama Mama" + desc = "Tropic cocktail" + if("singulo") + icon_state = "singulo" + name = "Singulo" + desc = "A blue-space beverage." + if("alliescocktail") + icon_state = "alliescocktail" + name = "Allies cocktail" + desc = "A drink made from your allies." + if("antifreeze") + icon_state = "antifreeze" + name = "Anti-freeze" + desc = "The ultimate refreshment." + if("barefoot") + icon_state = "b&p" + name = "Barefoot" + desc = "Barefoot and pregnant" + if("demonsblood") + icon_state = "demonsblood" + name = "Demons Blood" + desc = "Just looking at this thing makes the hair at the back of your neck stand up." + if("booger") + icon_state = "booger" + name = "Booger" + desc = "Ewww..." + if("snowwhite") + icon_state = "snowwhite" + name = "Snow White" + desc = "A cold refreshment." + if("aloe") + icon_state = "aloe" + name = "Aloe" + desc = "Very, very, very good." + if("andalusia") + icon_state = "andalusia" + name = "Andalusia" + desc = "A nice, strange named drink." + if("sbiten") + icon_state = "sbitenglass" + name = "Sbiten" + desc = "A spicy mix of Vodka and Spice. Very hot." + if("red_mead") + icon_state = "red_meadglass" + name = "Red Mead" + desc = "A True Vikings Beverage, though its color is strange." + if("mead") + icon_state = "meadglass" + name = "Mead" + desc = "A Vikings Beverage, though a cheap one." + if("iced_beer") + icon_state = "iced_beerglass" + name = "Iced Beer" + desc = "A beer so frosty, the air around it freezes." + if("grog") + icon_state = "grogglass" + name = "Grog" + desc = "A fine and cepa drink for Space." + if("soy_latte") + icon_state = "soy_latte" + name = "Soy Latte" + desc = "A nice and refrshing beverage while you are reading." + if("cafe_latte") + icon_state = "cafe_latte" + name = "Cafe Latte" + desc = "A nice, strong and refreshing beverage while you are reading." + if("cafe_mocha") + icon_state = "cafe_latte" + name = "Cafe Mocha" + desc = "The perfect blend of coffe, milk, and chocolate." + if("acidspit") + icon_state = "acidspitglass" + name = "Acid Spit" + desc = "A drink from Nanotrasen. Made from live aliens." + if("amasec") + icon_state = "amasecglass" + name = "Amasec" + desc = "Always handy before COMBAT!!!" + if("neurotoxin") + icon_state = "neurotoxinglass" + name = "Neurotoxin" + desc = "A drink that is guaranteed to knock you silly." + if("hippiesdelight") + icon_state = "hippiesdelightglass" + name = "Hippie's Delight" + desc = "A drink enjoyed by people during the 1960's." + if("bananahonk") + icon_state = "bananahonkglass" + name = "Banana Honk" + desc = "A drink from Banana Heaven." + if("silencer") + icon_state = "silencerglass" + name = "Silencer" + desc = "A drink from mime Heaven." + if("nothing") + icon_state = "nothing" + name = "Nothing" + desc = "Absolutely nothing." + if("devilskiss") + icon_state = "devilskiss" + name = "Devils Kiss" + desc = "Creepy time!" + if("changelingsting") + icon_state = "changelingsting" + name = "Changeling Sting" + desc = "A stingy drink." + if("irishcarbomb") + icon_state = "irishcarbomb" + name = "Irish Car Bomb" + desc = "An irish car bomb." + if("syndicatebomb") + icon_state = "syndicatebomb" + name = "Syndicate Bomb" + desc = "A syndicate bomb." + if("erikasurprise") + icon_state = "erikasurprise" + name = "Erika Surprise" + desc = "The surprise is, it's green!" + if("driestmartini") + icon_state = "driestmartiniglass" + name = "Driest Martini" + desc = "Only for the experienced. You think you see sand floating in the glass." + if("ice") + icon_state = "iceglass" + name = "Glass of ice" + desc = "Generally, you're supposed to put something else in there too..." + if("icecoffee") + icon_state = "icedcoffeeglass" + name = "Iced Coffee" + desc = "A drink to perk you up and refresh you!" + if("coffee") + icon_state = "glass_brown" + name = "Glass of coffee" + desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." + if("bilk") + icon_state = "glass_brown" + name = "Glass of bilk" + desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." + if("fuel") + icon_state = "dr_gibb_glass" + name = "Glass of welder fuel" + desc = "Unless you are an industrial tool, this is probably not safe for consumption." + if("brownstar") + icon_state = "brownstar" + name = "Brown Star" + desc = "Its not what it sounds like..." + if("tea") + icon_state = "glass_brown" + name = "Glass of Tea" + desc = "A glass of hot tea. Perhaps a cup with a handle would have been smarter?" + if("icetea") + icon_state = "icetea" + name = "Iced Tea" + desc = "No relation to a certain rap artist/ actor." + if("milkshake") + icon_state = "milkshake" + name = "Milkshake" + desc = "Glorious brainfreezing mixture." + if("lemonade") + icon_state = "lemonade" + name = "Lemonade" + desc = "Oh the nostalgia..." + if("kiraspecial") + icon_state = "kiraspecial" + name = "Kira Special" + desc = "Long live the guy who everyone had mistaken for a girl. Baka!" + if("rewriter") + icon_state = "rewriter" + name = "Rewriter" + desc = "The secert of the sanctuary of the Libarian..." + if("applejack") + icon_state = "cognacglass" + name = "Glass of applejack" + desc = "When cider isn't strong enough, you gotta jack it." + if("jackrose") + icon_state = "patronglass" + name = "Jack Rose" + desc = "Drinking this makes you feel like you belong in a luxury hotel bar during the 1920s." + if("synthanol") + icon_state = "synthanolglass" + name = "Glass of Synthanol" + desc = "The equivalent of alcohol for synthetic crewmembers. They'd find it awful if they had tastebuds too." + if("robottears") + icon_state = "robottearsglass" + name = "Glass of Robot Tears" + desc = "No robots were hurt in the making of this drink." + if("trinary") + icon_state = "trinaryglass" + name = "Glass of Trinary" + desc = "Colorful drink made for synthetic crewmembers. It doesn't seem like it would taste well." + if("servo") + icon_state = "servoglass" + name = "Glass of Servo" + desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe." + if("synthnsoda") + icon_state = "synthnsodaglass" + name = "Glass of Synth 'n Soda" + desc = "Classic drink altered to fit the tastes of a robot. Bad idea to drink if you're made of carbon." + if("synthignon") + icon_state = "synthignonglass" + name = "Glass of Synthignon" + desc = "Someone mixed good wine and robot booze. Romantic, but atrocious." + if("uplink") + icon_state = "uplinkglass" + name = "Glass of Uplink" + desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics." + if("holywater") + icon_state = "glass_clear" + name = "Glass of Water" + desc = "The father of all refreshments." + + + else + icon_state ="glass_brown" + name = "Glass of ..what?" + desc = "You can't really tell what this is." + else + icon_state = "glass_empty" + name = "glass" + desc = "Your standard drinking glass." + +// for /obj/machinery/vending/sovietsoda +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda + list_reagents = list("sodawater" = 50) + + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola + list_reagents = list("cola" = 50) + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/devilskiss list_reagents = list("devilskiss" = 50) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/drinks/shotglass.dm b/code/modules/food_and_drinks/drinks/drinks/shotglass.dm similarity index 100% rename from code/modules/reagents/reagent_containers/food/drinks/shotglass.dm rename to code/modules/food_and_drinks/drinks/drinks/shotglass.dm diff --git a/code/modules/reagents/reagent_containers/food.dm b/code/modules/food_and_drinks/food.dm similarity index 94% rename from code/modules/reagents/reagent_containers/food.dm rename to code/modules/food_and_drinks/food.dm index 6bf920f5e64..3e0cfb8f867 100644 --- a/code/modules/reagents/reagent_containers/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -1,18 +1,18 @@ -//////////////////////////////////////////////////////////////////////////////// -/// Food. -//////////////////////////////////////////////////////////////////////////////// -/obj/item/weapon/reagent_containers/food - possible_transfer_amounts = null - volume = 50 //Sets the default container amount for all food items. - var/filling_color = "#FFFFFF" //Used by sandwiches. - var/bitesize = 1 - var/consume_sound = 'sound/items/eatfood.ogg' - var/apply_type = INGEST - var/apply_method = "swallow" - var/transfer_efficiency = 1.0 - var/instant_application = 0 //if we want to bypass the forcedfeed delay - -/obj/item/weapon/reagent_containers/food/New() - ..() - pixel_x = rand(-10, 10) //Randomizes postion +//////////////////////////////////////////////////////////////////////////////// +/// Food. +//////////////////////////////////////////////////////////////////////////////// +/obj/item/weapon/reagent_containers/food + possible_transfer_amounts = null + volume = 50 //Sets the default container amount for all food items. + var/filling_color = "#FFFFFF" //Used by sandwiches. + var/bitesize = 1 + var/consume_sound = 'sound/items/eatfood.ogg' + var/apply_type = INGEST + var/apply_method = "swallow" + var/transfer_efficiency = 1.0 + var/instant_application = 0 //if we want to bypass the forcedfeed delay + +/obj/item/weapon/reagent_containers/food/New() + ..() + pixel_x = rand(-10, 10) //Randomizes postion pixel_y = rand(-10, 10) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/snacks/candy.dm b/code/modules/food_and_drinks/food/candy.dm similarity index 100% rename from code/modules/reagents/reagent_containers/food/snacks/candy.dm rename to code/modules/food_and_drinks/food/candy.dm diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm similarity index 97% rename from code/modules/reagents/reagent_containers/food/condiment.dm rename to code/modules/food_and_drinks/food/condiment.dm index 85cd8c05a87..bd740e2657b 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -1,253 +1,253 @@ - -///////////////////////////////////////////////Condiments -//Notes by Darem: The condiments food-subtype is for stuff you don't actually eat but you use to modify existing food. They all -// leave empty containers when used up and can be filled/re-filled with other items. Formatting for first section is identical -// to mixed-drinks code. If you want an object that starts pre-loaded, you need to make it in addition to the other code. - -//Food items that aren't eaten normally and leave an empty container behind. -/obj/item/weapon/reagent_containers/food/condiment - name = "condiment container" - desc = "Just your average condiment container." - icon = 'icons/obj/food/containers.dmi' - icon_state = "emptycondiment" - flags = OPENCONTAINER - possible_transfer_amounts = list(1, 5, 10, 15, 20, 25, 30, 50) - volume = 50 - //Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change() to change names, descs and sprites. - var/list/possible_states = list( - "ketchup" = list("ketchup", "ketchup bottle", "You feel more American already."), - "capsaicin" = list("hotsauce", "hotsauce bottle", "You can almost TASTE the stomach ulcers now!"), - "enzyme" = list("enzyme", "universal enzyme bottle", "Used in cooking various dishes"), - "soysauce" = list("soysauce", "soy sauce bottle", "A salty soy-based flavoring"), - "frostoil" = list("coldsauce", "coldsauce bottle", "Leaves the tongue numb in it's passage"), - "sodiumchloride" = list("saltshakersmall", "salt shaker", "Salt. From space oceans, presumably"), - "blackpepper" = list("peppermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"), - "cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"), - "sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!")) - var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters. - -/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/weapon/W, mob/user, params) - return - -/obj/item/weapon/reagent_containers/food/condiment/attack_self(mob/user) - return - -/obj/item/weapon/reagent_containers/food/condiment/attack(mob/M, mob/user, def_zone) - - if(!reagents || !reagents.total_volume) - to_chat(user, "None of [src] left, oh no!") - return 0 - - if(M == user) - to_chat(M, "You swallow some of contents of \the [src].") - else - user.visible_message("[user] attempts to feed [M] from [src].") - if(!do_mob(user, M)) - return - if(!reagents || !reagents.total_volume) - return // The condiment might be empty after the delay. - user.visible_message("[user] feeds [M] from [src].") - add_logs(M, user, "fed", reagentlist(src)) - - var/fraction = min(10/reagents.total_volume, 1) - reagents.reaction(M, INGEST, fraction) - reagents.trans_to(M, 10) - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 - -/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/I, mob/user, params) - return - -/obj/item/weapon/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity) - if(!proximity) - return - if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. - - if(!target.reagents.total_volume) - to_chat(user, "[target] is empty!") - return - - if(reagents.total_volume >= reagents.maximum_volume) - to_chat(user, "[src] is full!") - return - - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) - to_chat(user, "You fill [src] with [trans] units of the contents of [target].") - - //Something like a glass or a food item. Player probably wants to transfer TO it. - else if(target.is_open_container() || istype(target, /obj/item/weapon/reagent_containers/food/snacks)) - if(!reagents.total_volume) - to_chat(user, "[src] is empty!") - return - if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, "you can't add anymore to [target]!") - return - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - to_chat(user, "You transfer [trans] units of the condiment to [target].") - -/obj/item/weapon/reagent_containers/food/condiment/on_reagent_change() - if(!possible_states.len) - return - if(reagents.reagent_list.len > 0) - var/main_reagent = reagents.get_master_reagent_id() - if(main_reagent in possible_states) - var/list/temp_list = possible_states[main_reagent] - icon_state = temp_list[1] - name = temp_list[2] - desc = temp_list[3] - - else - name = "[originalname] bottle" - main_reagent = reagents.get_master_reagent_name() - if(reagents.reagent_list.len==1) - desc = "Looks like it is [lowertext(main_reagent)], but you are not sure." - else - desc = "A mixture of various condiments. [lowertext(main_reagent)] is one of them." - icon_state = "mixedcondiments" - else - icon_state = "emptycondiment" - name = "condiment bottle" - desc = "An empty condiment bottle." - -/obj/item/weapon/reagent_containers/food/condiment/enzyme - name = "universal enzyme" - desc = "Used in cooking various dishes." - icon_state = "enzyme" - list_reagents = list("enzyme" = 50) - -/obj/item/weapon/reagent_containers/food/condiment/sugar - name = "sugar bottle" - desc = "Tasty spacey sugar!" - list_reagents = list("sugar" = 50) - -/obj/item/weapon/reagent_containers/food/condiment/saltshaker //Seperate from above since it's a small shaker rather then - name = "salt shaker" // a large one. - desc = "Salt. From space oceans, presumably." - icon_state = "saltshakersmall" - possible_transfer_amounts = list(1,20) //for clown turning the lid off - amount_per_transfer_from_this = 1 - volume = 20 - list_reagents = list("sodiumchloride" = 20) - possible_states = list() - -/obj/item/weapon/reagent_containers/food/condiment/saltshaker/suicide_act(mob/user) - user.visible_message("[user] begins to swap forms with the salt shaker! It looks like \he's trying to commit suicide.") - var/newname = "[name]" - name = "[user.name]" - user.name = newname - user.real_name = newname - desc = "Salt. From dead crew, presumably." - return (TOXLOSS) - -/obj/item/weapon/reagent_containers/food/condiment/peppermill - name = "pepper mill" - desc = "Often used to flavor food or make people sneeze." - icon_state = "peppermillsmall" - possible_transfer_amounts = list(1,20) //for clown turning the lid off - amount_per_transfer_from_this = 1 - volume = 20 - list_reagents = list("blackpepper" = 20) - possible_states = list() - -/obj/item/weapon/reagent_containers/food/condiment/milk - name = "space milk" - desc = "It's milk. White and nutritious goodness!" - icon_state = "milk" - item_state = "carton" - list_reagents = list("milk" = 50) - possible_states = list() - -/obj/item/weapon/reagent_containers/food/condiment/flour - name = "flour sack" - desc = "A big bag of flour. Good for baking!" - icon_state = "flour" - item_state = "flour" - list_reagents = list("flour" = 30) - possible_states = list() - -/obj/item/weapon/reagent_containers/food/condiment/soymilk - name = "soy milk" - desc = "It's soy milk. White and nutritious goodness!" - icon_state = "soymilk" - item_state = "carton" - list_reagents = list("soymilk" = 50) - possible_states = list() - -/obj/item/weapon/reagent_containers/food/condiment/rice - name = "rice sack" - desc = "A big bag of rice. Good for cooking!" - icon_state = "rice" - item_state = "flour" - list_reagents = list("rice" = 30) - possible_states = list() - -/obj/item/weapon/reagent_containers/food/condiment/soysauce - name = "soy sauce" - desc = "A salty soy-based flavoring." - icon_state = "soysauce" - list_reagents = list("soysauce" = 50) - possible_states = list() - -/obj/item/weapon/reagent_containers/food/condiment/syndisauce - name = "\improper Chef Excellence's Special Sauce" - desc = "A potent sauce extracted from the potent amanita mushrooms. Death never tasted quite so delicious." - list_reagents = list("amanitin" = 50) - possible_states = list() - -//Food packs. To easily apply deadly toxi... delicious sauces to your food! - -/obj/item/weapon/reagent_containers/food/condiment/pack - name = "condiment pack" - desc = "A small plastic pack with condiments to put on your food" - icon_state = "condi_empty" - volume = 10 - amount_per_transfer_from_this = 10 - possible_transfer_amounts = list() - possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!")) - -/obj/item/weapon/reagent_containers/food/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly. - return - -/obj/item/weapon/reagent_containers/food/condiment/pack/afterattack(obj/target, mob/user , proximity) - if(!proximity) return - - //You can tear the bag open above food to put the condiments on it, obviously. - if(istype(target, /obj/item/weapon/reagent_containers/food/snacks)) - if(!reagents.total_volume) - to_chat(user, "You tear open [src], but there's nothing in it.") - qdel(src) - return - if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, "You tear open [src], but [target] is stacked so high that it just drips off!") //Not sure if food can ever be full, but better safe than sorry. - qdel(src) - return - else - to_chat(user, "You tear open [src] above [target] and the condiments drip onto it.") - src.reagents.trans_to(target, amount_per_transfer_from_this) - qdel(src) - -/obj/item/weapon/reagent_containers/food/condiment/pack/on_reagent_change() - if(reagents.reagent_list.len > 0) - var/main_reagent = reagents.get_master_reagent_id() - if(main_reagent in possible_states) - var/list/temp_list = possible_states[main_reagent] - icon_state = temp_list[1] - desc = temp_list[3] - else - icon_state = "condi_mixed" - desc = "A small condiment pack. The label says it contains [originalname]" - else - icon_state = "condi_empty" - desc = "A small condiment pack. It is empty." - -//Ketchup -/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup - name = "ketchup pack" - originalname = "ketchup" - list_reagents = list("ketchup" = 10) - -//Hot sauce -/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce - name = "hotsauce pack" - originalname = "hotsauce" - list_reagents = list("capsaicin" = 10) + +///////////////////////////////////////////////Condiments +//Notes by Darem: The condiments food-subtype is for stuff you don't actually eat but you use to modify existing food. They all +// leave empty containers when used up and can be filled/re-filled with other items. Formatting for first section is identical +// to mixed-drinks code. If you want an object that starts pre-loaded, you need to make it in addition to the other code. + +//Food items that aren't eaten normally and leave an empty container behind. +/obj/item/weapon/reagent_containers/food/condiment + name = "condiment container" + desc = "Just your average condiment container." + icon = 'icons/obj/food/containers.dmi' + icon_state = "emptycondiment" + flags = OPENCONTAINER + possible_transfer_amounts = list(1, 5, 10, 15, 20, 25, 30, 50) + volume = 50 + //Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change() to change names, descs and sprites. + var/list/possible_states = list( + "ketchup" = list("ketchup", "ketchup bottle", "You feel more American already."), + "capsaicin" = list("hotsauce", "hotsauce bottle", "You can almost TASTE the stomach ulcers now!"), + "enzyme" = list("enzyme", "universal enzyme bottle", "Used in cooking various dishes"), + "soysauce" = list("soysauce", "soy sauce bottle", "A salty soy-based flavoring"), + "frostoil" = list("coldsauce", "coldsauce bottle", "Leaves the tongue numb in it's passage"), + "sodiumchloride" = list("saltshakersmall", "salt shaker", "Salt. From space oceans, presumably"), + "blackpepper" = list("peppermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"), + "cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"), + "sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!")) + var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters. + +/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/weapon/W, mob/user, params) + return + +/obj/item/weapon/reagent_containers/food/condiment/attack_self(mob/user) + return + +/obj/item/weapon/reagent_containers/food/condiment/attack(mob/M, mob/user, def_zone) + + if(!reagents || !reagents.total_volume) + to_chat(user, "None of [src] left, oh no!") + return 0 + + if(M == user) + to_chat(M, "You swallow some of contents of \the [src].") + else + user.visible_message("[user] attempts to feed [M] from [src].") + if(!do_mob(user, M)) + return + if(!reagents || !reagents.total_volume) + return // The condiment might be empty after the delay. + user.visible_message("[user] feeds [M] from [src].") + add_logs(M, user, "fed", reagentlist(src)) + + var/fraction = min(10/reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) + reagents.trans_to(M, 10) + playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) + return 1 + +/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/I, mob/user, params) + return + +/obj/item/weapon/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity) + if(!proximity) + return + if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. + + if(!target.reagents.total_volume) + to_chat(user, "[target] is empty!") + return + + if(reagents.total_volume >= reagents.maximum_volume) + to_chat(user, "[src] is full!") + return + + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) + to_chat(user, "You fill [src] with [trans] units of the contents of [target].") + + //Something like a glass or a food item. Player probably wants to transfer TO it. + else if(target.is_open_container() || istype(target, /obj/item/weapon/reagent_containers/food/snacks)) + if(!reagents.total_volume) + to_chat(user, "[src] is empty!") + return + if(target.reagents.total_volume >= target.reagents.maximum_volume) + to_chat(user, "you can't add anymore to [target]!") + return + var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) + to_chat(user, "You transfer [trans] units of the condiment to [target].") + +/obj/item/weapon/reagent_containers/food/condiment/on_reagent_change() + if(!possible_states.len) + return + if(reagents.reagent_list.len > 0) + var/main_reagent = reagents.get_master_reagent_id() + if(main_reagent in possible_states) + var/list/temp_list = possible_states[main_reagent] + icon_state = temp_list[1] + name = temp_list[2] + desc = temp_list[3] + + else + name = "[originalname] bottle" + main_reagent = reagents.get_master_reagent_name() + if(reagents.reagent_list.len==1) + desc = "Looks like it is [lowertext(main_reagent)], but you are not sure." + else + desc = "A mixture of various condiments. [lowertext(main_reagent)] is one of them." + icon_state = "mixedcondiments" + else + icon_state = "emptycondiment" + name = "condiment bottle" + desc = "An empty condiment bottle." + +/obj/item/weapon/reagent_containers/food/condiment/enzyme + name = "universal enzyme" + desc = "Used in cooking various dishes." + icon_state = "enzyme" + list_reagents = list("enzyme" = 50) + +/obj/item/weapon/reagent_containers/food/condiment/sugar + name = "sugar bottle" + desc = "Tasty spacey sugar!" + list_reagents = list("sugar" = 50) + +/obj/item/weapon/reagent_containers/food/condiment/saltshaker //Seperate from above since it's a small shaker rather then + name = "salt shaker" // a large one. + desc = "Salt. From space oceans, presumably." + icon_state = "saltshakersmall" + possible_transfer_amounts = list(1,20) //for clown turning the lid off + amount_per_transfer_from_this = 1 + volume = 20 + list_reagents = list("sodiumchloride" = 20) + possible_states = list() + +/obj/item/weapon/reagent_containers/food/condiment/saltshaker/suicide_act(mob/user) + user.visible_message("[user] begins to swap forms with the salt shaker! It looks like \he's trying to commit suicide.") + var/newname = "[name]" + name = "[user.name]" + user.name = newname + user.real_name = newname + desc = "Salt. From dead crew, presumably." + return (TOXLOSS) + +/obj/item/weapon/reagent_containers/food/condiment/peppermill + name = "pepper mill" + desc = "Often used to flavor food or make people sneeze." + icon_state = "peppermillsmall" + possible_transfer_amounts = list(1,20) //for clown turning the lid off + amount_per_transfer_from_this = 1 + volume = 20 + list_reagents = list("blackpepper" = 20) + possible_states = list() + +/obj/item/weapon/reagent_containers/food/condiment/milk + name = "space milk" + desc = "It's milk. White and nutritious goodness!" + icon_state = "milk" + item_state = "carton" + list_reagents = list("milk" = 50) + possible_states = list() + +/obj/item/weapon/reagent_containers/food/condiment/flour + name = "flour sack" + desc = "A big bag of flour. Good for baking!" + icon_state = "flour" + item_state = "flour" + list_reagents = list("flour" = 30) + possible_states = list() + +/obj/item/weapon/reagent_containers/food/condiment/soymilk + name = "soy milk" + desc = "It's soy milk. White and nutritious goodness!" + icon_state = "soymilk" + item_state = "carton" + list_reagents = list("soymilk" = 50) + possible_states = list() + +/obj/item/weapon/reagent_containers/food/condiment/rice + name = "rice sack" + desc = "A big bag of rice. Good for cooking!" + icon_state = "rice" + item_state = "flour" + list_reagents = list("rice" = 30) + possible_states = list() + +/obj/item/weapon/reagent_containers/food/condiment/soysauce + name = "soy sauce" + desc = "A salty soy-based flavoring." + icon_state = "soysauce" + list_reagents = list("soysauce" = 50) + possible_states = list() + +/obj/item/weapon/reagent_containers/food/condiment/syndisauce + name = "\improper Chef Excellence's Special Sauce" + desc = "A potent sauce extracted from the potent amanita mushrooms. Death never tasted quite so delicious." + list_reagents = list("amanitin" = 50) + possible_states = list() + +//Food packs. To easily apply deadly toxi... delicious sauces to your food! + +/obj/item/weapon/reagent_containers/food/condiment/pack + name = "condiment pack" + desc = "A small plastic pack with condiments to put on your food" + icon_state = "condi_empty" + volume = 10 + amount_per_transfer_from_this = 10 + possible_transfer_amounts = list() + possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!")) + +/obj/item/weapon/reagent_containers/food/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly. + return + +/obj/item/weapon/reagent_containers/food/condiment/pack/afterattack(obj/target, mob/user , proximity) + if(!proximity) return + + //You can tear the bag open above food to put the condiments on it, obviously. + if(istype(target, /obj/item/weapon/reagent_containers/food/snacks)) + if(!reagents.total_volume) + to_chat(user, "You tear open [src], but there's nothing in it.") + qdel(src) + return + if(target.reagents.total_volume >= target.reagents.maximum_volume) + to_chat(user, "You tear open [src], but [target] is stacked so high that it just drips off!") //Not sure if food can ever be full, but better safe than sorry. + qdel(src) + return + else + to_chat(user, "You tear open [src] above [target] and the condiments drip onto it.") + src.reagents.trans_to(target, amount_per_transfer_from_this) + qdel(src) + +/obj/item/weapon/reagent_containers/food/condiment/pack/on_reagent_change() + if(reagents.reagent_list.len > 0) + var/main_reagent = reagents.get_master_reagent_id() + if(main_reagent in possible_states) + var/list/temp_list = possible_states[main_reagent] + icon_state = temp_list[1] + desc = temp_list[3] + else + icon_state = "condi_mixed" + desc = "A small condiment pack. The label says it contains [originalname]" + else + icon_state = "condi_empty" + desc = "A small condiment pack. It is empty." + +//Ketchup +/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup + name = "ketchup pack" + originalname = "ketchup" + list_reagents = list("ketchup" = 10) + +//Hot sauce +/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce + name = "hotsauce pack" + originalname = "hotsauce" + list_reagents = list("capsaicin" = 10) diff --git a/code/modules/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm similarity index 96% rename from code/modules/food/customizables.dm rename to code/modules/food_and_drinks/food/customizables.dm index d14731f9add..78651f97b0c 100644 --- a/code/modules/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -1,497 +1,497 @@ -/obj/item/weapon/reagent_containers/food/snacks/breadslice/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) - var/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich/S = new(get_turf(user)) - S.attackby(W,user, params) - qdel(src) - else - ..() - -/obj/item/weapon/reagent_containers/food/snacks/bun/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) - var/obj/item/weapon/reagent_containers/food/snacks/customizable/burger/S = new(get_turf(user)) - S.attackby(W,user, params) - qdel(src) - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) - var/obj/item/weapon/reagent_containers/food/snacks/customizable/pizza/S = new(get_turf(user)) - S.attackby(W,user, params) - qdel(src) - else - ..() - - -/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) - var/obj/item/weapon/reagent_containers/food/snacks/customizable/pasta/S = new(get_turf(user)) - S.attackby(W,user, params) - qdel(src) - else - ..() - - -/obj/item/trash/plate/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) - var/obj/item/weapon/reagent_containers/food/snacks/customizable/fullycustom/S = new(get_turf(user)) - S.attackby(W,user, params) - qdel(src) - else - ..() - -/obj/item/trash/bowl - name = "bowl" - desc = "An empty bowl. Put some food in it to start making a soup." - icon = 'icons/obj/food/food.dmi' - icon_state = "soup" - -/obj/item/trash/bowl/attackby(obj/item/W as obj, mob/user as mob, params) - - if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) - var/obj/item/weapon/reagent_containers/food/snacks/customizable/soup/S = new(get_turf(user)) - S.attackby(W,user, params) - qdel(src) - else - ..() - -/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich - /obj/item/weapon/reagent_containers/food/snacks/customizable - name = "sandwich" - desc = "A sandwich! A timeless classic." - icon_state = "breadslice" - baseicon = "sandwich" - basename = "sandwich" - toptype = new /obj/item/weapon/reagent_containers/food/snacks/breadslice() - - - -/obj/item/weapon/reagent_containers/food/snacks/customizable - name = "sandwich" - desc = "A sandwich! A timeless classic." - icon_state = "breadslice" - var/baseicon = "sandwich" - var/basename = "sandwich" - var/top = 1 //Do we have a top? - var/obj/item/toptype - var/add_overlays = 1 //Do we stack? -// var/offsetstuff = 1 //Do we offset the overlays? - var/sandwich_limit = 40 - var/fullycustom = 0 - trash = /obj/item/trash/plate - bitesize = 2 - var/list/ingredients = list() - - New() - ..() - - reagents.add_reagent("nutriment", 8) - - -/obj/item/weapon/reagent_containers/food/snacks/customizable/pizza - name = "personal pizza" - desc = "A personalized pan pizza meant for only one person." - icon_state = "personal_pizza" - baseicon = "personal_pizza" - basename = "personal pizza" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/pasta - name = "spagetti" - desc = "Noodles. With stuff. Delicious." - icon_state = "pasta_bot" - baseicon = "pasta_bot" - basename = "spagetti" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/bread - name = "bread" - desc = "Tasty bread." - icon_state = "breadcustom" - baseicon = "breadcustom" - basename = "bread" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/pie - name = "pie" - desc = "Tasty pie." - icon_state = "piecustom" - baseicon = "piecustom" - basename = "pie" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/cake - name = "cake" - desc = "A popular band." - icon_state = "cakecustom" - baseicon = "cakecustom" - basename = "cake" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/jelly - name = "jelly" - desc = "Totally jelly." - icon_state = "jellycustom" - baseicon = "jellycustom" - basename = "jelly" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/donkpocket - name = "donk pocket" - desc = "You wanna put a bangin-Oh nevermind." - icon_state = "donkcustom" - baseicon = "donkcustom" - basename = "donk pocket" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/kebab - name = "kebab" - desc = "Kebab or Kabab?" - icon_state = "kababcustom" - baseicon = "kababcustom" - basename = "kebab" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/salad - name = "salad" - desc = "Very tasty." - icon_state = "saladcustom" - baseicon = "saladcustom" - basename = "salad" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/waffles - name = "waffles" - desc = "Made with love." - icon_state = "wafflecustom" - baseicon = "wafflecustom" - basename = "waffles" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/cookie - name = "cookie" - desc = "COOKIE!!1!" - icon_state = "cookiecustom" - baseicon = "cookiecustom" - basename = "cookie" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/cotton - name = "flavored cotton candy" - desc = "Who can take a sunrise, sprinkle it with dew," - icon_state = "cottoncandycustom" - baseicon = "cottoncandycustom" - basename = "flavored cotton candy" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/gummybear - name = "flavored giant gummy bear" - desc = "Cover it in chocolate and a miracle or two," - icon_state = "gummybearcustom" - baseicon = "gummybearcustom" - basename = "flavored giant gummy bear" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/gummyworm - name = "flavored giant gummy worm" - desc = "The Candy Man can 'cause he mixes it with love," - icon_state = "gummywormcustom" - baseicon = "gummywormcustom" - basename = "flavored giant gummy worm" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/jellybean - name = "flavored giant jelly bean" - desc = "And makes the world taste good." - icon_state = "jellybeancustom" - baseicon = "jellybeancustom" - basename = "flavored giant jelly bean" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/jawbreaker - name = "flavored jawbreaker" - desc = "Who can take a rainbow, Wrap it in a sigh," - icon_state = "jawbreakercustom" - baseicon = "jawbreakercustom" - basename = "flavored jawbreaker" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/candycane - name = "flavored candy cane" - desc = "Soak it in the sun and make strawberry-lemon pie," - icon_state = "candycanecustom" - baseicon = "candycanecustom" - basename = "flavored candy cane" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/gum - name = "flavored gum" - desc = "The Candy Man can 'cause he mixes it with love and makes the world taste good. And the world tastes good 'cause the Candy Man thinks it should..." - icon_state = "gumcustom" - baseicon = "gumcustom" - basename = "flavored gum" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/donut - name = "filled donut" - desc = "Donut eat this!" // kill me - icon_state = "donutcustom" - baseicon = "donutcustom" - basename = "filled donut" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/bar - name = "flavored chocolate bar" - desc = "Made in a factory downtown." - icon_state = "barcustom" - baseicon = "barcustom" - basename = "flavored chocolate bar" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/sucker - name = "flavored sucker" - desc = "Suck suck suck." - icon_state = "suckercustom" - baseicon = "suckercustom" - basename = "flavored sucker" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/cash - name = "flavored chocolate cash" - desc = "I got piles!" - icon_state = "cashcustom" - baseicon = "cashcustom" - basename = "flavored cash" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/coin - name = "flavored chocolate coin" - desc = "Clink, clink, clink." - icon_state = "coincustom" - baseicon = "coincustom" - basename = "flavored coin" - add_overlays = 0 - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/fullycustom // In the event you fuckers find something I forgot to add a customizable food for. - name = "on a plate" - desc = "A unique dish." - icon_state = "fullycustom" - baseicon = "fullycustom" - basename = "on a plate" - add_overlays = 0 - top = 0 - sandwich_limit = 20 - fullycustom = 1 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/soup - name = "soup" - desc = "A bowl with liquid and... stuff in it." - icon_state = "soup" - baseicon = "soup" - basename = "soup" - add_overlays = 0 - trash = /obj/item/trash/bowl - top = 0 - -/obj/item/weapon/reagent_containers/food/snacks/customizable/burger - name = "burger bun" - desc = "A bun for a burger. Delicious." - icon_state = "burger" - baseicon = "burger" - basename = "burger" - toptype = new /obj/item/weapon/reagent_containers/food/snacks/bun() - -/obj/item/weapon/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user, params) - if(src.contents.len > sandwich_limit) - to_chat(user, "If you put anything else in or on [src] it's going to make a mess.") - return - if(!istype(I, /obj/item/weapon/reagent_containers/food/snacks)) - to_chat(user, "\The [I] isn't exactly something that you would want to eat.") - return - to_chat(user, "You add [I] to [src].") - if(istype(I, /obj/item/weapon/reagent_containers/)) - var/obj/item/weapon/reagent_containers/F = I - F.reagents.trans_to(src, F.reagents.total_volume) - if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/customizable)) - var/obj/item/weapon/reagent_containers/food/snacks/customizable/origin = I - ingredients += origin.ingredients - user.drop_item() - cooktype[basename] = 1 - I.loc = src - if(!istype(I, toptype)) - ingredients += I - updateicon() - name = newname() - - -/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/updateicon() - overlays = 0 - var/i=0 - for(var/obj/item/O in ingredients) - i++ - if(!fullycustom) - var/image/I = new(src.icon, "[baseicon]_filling") - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks)) - var/obj/item/weapon/reagent_containers/food/snacks/food = O - if(!food.filling_color == "#FFFFFF") - I.color = food.filling_color - else - I.color = pick("#FF0000","#0000FF","#008000","#FFFF00") - else - I.color = pick("#FF0000","#0000FF","#008000","#FFFF00") - if(add_overlays) - I.pixel_x = pick(list(-1,0,1)) - I.pixel_y = (i*2)+1 - overlays += I - else - var/image/F = new(O.icon, O.icon_state) - F.pixel_x = pick(list(-1,0,1)) - F.pixel_y = pick(list(-1,0,1)) - overlays += F - overlays += O.overlays - - if(top) - var/image/T = new(src.icon, "[baseicon]_top") - T.pixel_x = pick(list(-1,0,1)) - T.pixel_y = (ingredients.len * 2)+1 - overlays += T - -/obj/item/weapon/reagent_containers/food/snacks/customizable/Destroy() - for(var/obj/item/O in ingredients) - qdel(O) - return ..() - -/obj/item/weapon/reagent_containers/food/snacks/customizable/examine(mob/user) - ..(user) - var/whatsinside = pick(ingredients) - - to_chat(user, " You think you can see [whatsinside] in there.") - -/* -/obj/item/weapon/reagent_containers/food/snacks/customizable/attack(mob/M as mob, mob/user as mob, def_zone) //SNOOOOOOOWFLAAAAAAAAAAAAAAAAAKES - - var/obj/item/shard - for(var/obj/item/O in contents) - if(istype(O,/obj/item/weapon/shard)) - shard = O - break - - var/mob/living/H - if(istype(M,/mob/living)) - H = M - - if(H && shard && M == user) //This needs a check for feeding the food to other people, but that could be abusable. - to_chat(H, "\red You lacerate your mouth on a [shard.name] in the sandwich!") - H.adjustBruteLoss(5) //TODO: Target head if human. - ..() -*/ - -/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/newname() - var/unsorteditems[0] - var/sorteditems[0] - var/unsortedtypes[0] - var/sortedtypes[0] - var/endpart = "" - var/c = 0 - var/ci = 0 - var/ct = 0 - var/seperator = "" - var/sendback = "" - var/list/levels = list("", "double", "triple", "quad", "huge") - - for(var/obj/item/ing in ingredients) - if(istype(ing, /obj/item/weapon/shard)) - continue - - - if(istype(ing, /obj/item/weapon/reagent_containers/food/snacks/customizable)) // split the ingredients into ones with basenames (sandwich, burger, etc) and ones without, keeping track of how many of each there are - var/obj/item/weapon/reagent_containers/food/snacks/customizable/gettype = ing - if(unsortedtypes[gettype.basename]) - unsortedtypes[gettype.basename]++ - if(unsortedtypes[gettype.basename] > ct) - ct = unsortedtypes[gettype.basename] - else - (unsortedtypes[gettype.basename]) = 1 - if(unsortedtypes[gettype.basename] > ct) - ct = unsortedtypes[gettype.basename] - else - if(unsorteditems[ing.name]) - unsorteditems[ing.name]++ - if(unsorteditems[ing.name] > ci) - ci = unsorteditems[ing.name] - else - unsorteditems[ing.name] = 1 - if(unsorteditems[ing.name] > ci) - ci = unsorteditems[ing.name] - - sorteditems = sortlist(unsorteditems, ci) //order both types going from the lowest number to the highest number - sortedtypes = sortlist(unsortedtypes, ct) - - for(var/ings in sorteditems) //add the non-basename items to the name, sorting out the , and the and - c++ - if(c == sorteditems.len - 1) - seperator = " and " - else if(c == sorteditems.len) - seperator = " " - else - seperator = ", " - - if(sorteditems[ings] > levels.len) - sorteditems[ings] = levels.len - - if(sorteditems[ings] <= 1) - sendback +="[ings][seperator]" - else - sendback +="[levels[sorteditems[ings]]] [ings][seperator]" - - for(var/ingtype in sortedtypes) // now add the types basenames, keeping the src one seperate so it can go on the end - if(sortedtypes[ingtype] > levels.len) - sortedtypes[ingtype] = levels.len - if(ingtype == basename) - if(sortedtypes[ingtype] < levels.len) - sortedtypes[ingtype]++ - endpart = "[levels[sortedtypes[ingtype]]] decker [basename]" - continue - if(sortedtypes[ingtype] >= 2) - sendback += "[levels[sortedtypes[ingtype]]] decker [ingtype] " - else - sendback += "[ingtype] " - - if(endpart) - sendback += endpart - else - sendback += basename - - if(length(sendback) > 80) - sendback = "[pick(list("absurd","colossal","enormous","ridiculous","massive","oversized","cardiac-arresting","pipe-clogging","edible but sickening","sickening","gargantuan","mega","belly-burster","chest-burster"))] [basename]" - return sendback - -/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/sortlist(var/list/unsorted, var/highest) - var/sorted[0] - for(var/i = 1, i<= highest, i++) - for(var/it in unsorted) - if(unsorted[it] == i) - sorted[it] = i - return sorted - +/obj/item/weapon/reagent_containers/food/snacks/breadslice/attackby(obj/item/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) + var/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich/S = new(get_turf(user)) + S.attackby(W,user, params) + qdel(src) + else + ..() + +/obj/item/weapon/reagent_containers/food/snacks/bun/attackby(obj/item/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) + var/obj/item/weapon/reagent_containers/food/snacks/customizable/burger/S = new(get_turf(user)) + S.attackby(W,user, params) + qdel(src) + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough/attackby(obj/item/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) + var/obj/item/weapon/reagent_containers/food/snacks/customizable/pizza/S = new(get_turf(user)) + S.attackby(W,user, params) + qdel(src) + else + ..() + + +/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti/attackby(obj/item/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) + var/obj/item/weapon/reagent_containers/food/snacks/customizable/pasta/S = new(get_turf(user)) + S.attackby(W,user, params) + qdel(src) + else + ..() + + +/obj/item/trash/plate/attackby(obj/item/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) + var/obj/item/weapon/reagent_containers/food/snacks/customizable/fullycustom/S = new(get_turf(user)) + S.attackby(W,user, params) + qdel(src) + else + ..() + +/obj/item/trash/bowl + name = "bowl" + desc = "An empty bowl. Put some food in it to start making a soup." + icon = 'icons/obj/food/food.dmi' + icon_state = "soup" + +/obj/item/trash/bowl/attackby(obj/item/W as obj, mob/user as mob, params) + + if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) + var/obj/item/weapon/reagent_containers/food/snacks/customizable/soup/S = new(get_turf(user)) + S.attackby(W,user, params) + qdel(src) + else + ..() + +/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich + /obj/item/weapon/reagent_containers/food/snacks/customizable + name = "sandwich" + desc = "A sandwich! A timeless classic." + icon_state = "breadslice" + baseicon = "sandwich" + basename = "sandwich" + toptype = new /obj/item/weapon/reagent_containers/food/snacks/breadslice() + + + +/obj/item/weapon/reagent_containers/food/snacks/customizable + name = "sandwich" + desc = "A sandwich! A timeless classic." + icon_state = "breadslice" + var/baseicon = "sandwich" + var/basename = "sandwich" + var/top = 1 //Do we have a top? + var/obj/item/toptype + var/add_overlays = 1 //Do we stack? +// var/offsetstuff = 1 //Do we offset the overlays? + var/sandwich_limit = 40 + var/fullycustom = 0 + trash = /obj/item/trash/plate + bitesize = 2 + var/list/ingredients = list() + + New() + ..() + + reagents.add_reagent("nutriment", 8) + + +/obj/item/weapon/reagent_containers/food/snacks/customizable/pizza + name = "personal pizza" + desc = "A personalized pan pizza meant for only one person." + icon_state = "personal_pizza" + baseicon = "personal_pizza" + basename = "personal pizza" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/pasta + name = "spagetti" + desc = "Noodles. With stuff. Delicious." + icon_state = "pasta_bot" + baseicon = "pasta_bot" + basename = "spagetti" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/bread + name = "bread" + desc = "Tasty bread." + icon_state = "breadcustom" + baseicon = "breadcustom" + basename = "bread" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/pie + name = "pie" + desc = "Tasty pie." + icon_state = "piecustom" + baseicon = "piecustom" + basename = "pie" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/cake + name = "cake" + desc = "A popular band." + icon_state = "cakecustom" + baseicon = "cakecustom" + basename = "cake" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/jelly + name = "jelly" + desc = "Totally jelly." + icon_state = "jellycustom" + baseicon = "jellycustom" + basename = "jelly" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/donkpocket + name = "donk pocket" + desc = "You wanna put a bangin-Oh nevermind." + icon_state = "donkcustom" + baseicon = "donkcustom" + basename = "donk pocket" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/kebab + name = "kebab" + desc = "Kebab or Kabab?" + icon_state = "kababcustom" + baseicon = "kababcustom" + basename = "kebab" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/salad + name = "salad" + desc = "Very tasty." + icon_state = "saladcustom" + baseicon = "saladcustom" + basename = "salad" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/waffles + name = "waffles" + desc = "Made with love." + icon_state = "wafflecustom" + baseicon = "wafflecustom" + basename = "waffles" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/cookie + name = "cookie" + desc = "COOKIE!!1!" + icon_state = "cookiecustom" + baseicon = "cookiecustom" + basename = "cookie" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/cotton + name = "flavored cotton candy" + desc = "Who can take a sunrise, sprinkle it with dew," + icon_state = "cottoncandycustom" + baseicon = "cottoncandycustom" + basename = "flavored cotton candy" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/gummybear + name = "flavored giant gummy bear" + desc = "Cover it in chocolate and a miracle or two," + icon_state = "gummybearcustom" + baseicon = "gummybearcustom" + basename = "flavored giant gummy bear" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/gummyworm + name = "flavored giant gummy worm" + desc = "The Candy Man can 'cause he mixes it with love," + icon_state = "gummywormcustom" + baseicon = "gummywormcustom" + basename = "flavored giant gummy worm" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/jellybean + name = "flavored giant jelly bean" + desc = "And makes the world taste good." + icon_state = "jellybeancustom" + baseicon = "jellybeancustom" + basename = "flavored giant jelly bean" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/jawbreaker + name = "flavored jawbreaker" + desc = "Who can take a rainbow, Wrap it in a sigh," + icon_state = "jawbreakercustom" + baseicon = "jawbreakercustom" + basename = "flavored jawbreaker" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/candycane + name = "flavored candy cane" + desc = "Soak it in the sun and make strawberry-lemon pie," + icon_state = "candycanecustom" + baseicon = "candycanecustom" + basename = "flavored candy cane" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/gum + name = "flavored gum" + desc = "The Candy Man can 'cause he mixes it with love and makes the world taste good. And the world tastes good 'cause the Candy Man thinks it should..." + icon_state = "gumcustom" + baseicon = "gumcustom" + basename = "flavored gum" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/donut + name = "filled donut" + desc = "Donut eat this!" // kill me + icon_state = "donutcustom" + baseicon = "donutcustom" + basename = "filled donut" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/bar + name = "flavored chocolate bar" + desc = "Made in a factory downtown." + icon_state = "barcustom" + baseicon = "barcustom" + basename = "flavored chocolate bar" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/sucker + name = "flavored sucker" + desc = "Suck suck suck." + icon_state = "suckercustom" + baseicon = "suckercustom" + basename = "flavored sucker" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/cash + name = "flavored chocolate cash" + desc = "I got piles!" + icon_state = "cashcustom" + baseicon = "cashcustom" + basename = "flavored cash" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/coin + name = "flavored chocolate coin" + desc = "Clink, clink, clink." + icon_state = "coincustom" + baseicon = "coincustom" + basename = "flavored coin" + add_overlays = 0 + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/fullycustom // In the event you fuckers find something I forgot to add a customizable food for. + name = "on a plate" + desc = "A unique dish." + icon_state = "fullycustom" + baseicon = "fullycustom" + basename = "on a plate" + add_overlays = 0 + top = 0 + sandwich_limit = 20 + fullycustom = 1 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/soup + name = "soup" + desc = "A bowl with liquid and... stuff in it." + icon_state = "soup" + baseicon = "soup" + basename = "soup" + add_overlays = 0 + trash = /obj/item/trash/bowl + top = 0 + +/obj/item/weapon/reagent_containers/food/snacks/customizable/burger + name = "burger bun" + desc = "A bun for a burger. Delicious." + icon_state = "burger" + baseicon = "burger" + basename = "burger" + toptype = new /obj/item/weapon/reagent_containers/food/snacks/bun() + +/obj/item/weapon/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user, params) + if(src.contents.len > sandwich_limit) + to_chat(user, "If you put anything else in or on [src] it's going to make a mess.") + return + if(!istype(I, /obj/item/weapon/reagent_containers/food/snacks)) + to_chat(user, "\The [I] isn't exactly something that you would want to eat.") + return + to_chat(user, "You add [I] to [src].") + if(istype(I, /obj/item/weapon/reagent_containers/)) + var/obj/item/weapon/reagent_containers/F = I + F.reagents.trans_to(src, F.reagents.total_volume) + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/customizable)) + var/obj/item/weapon/reagent_containers/food/snacks/customizable/origin = I + ingredients += origin.ingredients + user.drop_item() + cooktype[basename] = 1 + I.loc = src + if(!istype(I, toptype)) + ingredients += I + updateicon() + name = newname() + + +/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/updateicon() + overlays = 0 + var/i=0 + for(var/obj/item/O in ingredients) + i++ + if(!fullycustom) + var/image/I = new(src.icon, "[baseicon]_filling") + if(istype(O, /obj/item/weapon/reagent_containers/food/snacks)) + var/obj/item/weapon/reagent_containers/food/snacks/food = O + if(!food.filling_color == "#FFFFFF") + I.color = food.filling_color + else + I.color = pick("#FF0000","#0000FF","#008000","#FFFF00") + else + I.color = pick("#FF0000","#0000FF","#008000","#FFFF00") + if(add_overlays) + I.pixel_x = pick(list(-1,0,1)) + I.pixel_y = (i*2)+1 + overlays += I + else + var/image/F = new(O.icon, O.icon_state) + F.pixel_x = pick(list(-1,0,1)) + F.pixel_y = pick(list(-1,0,1)) + overlays += F + overlays += O.overlays + + if(top) + var/image/T = new(src.icon, "[baseicon]_top") + T.pixel_x = pick(list(-1,0,1)) + T.pixel_y = (ingredients.len * 2)+1 + overlays += T + +/obj/item/weapon/reagent_containers/food/snacks/customizable/Destroy() + for(var/obj/item/O in ingredients) + qdel(O) + return ..() + +/obj/item/weapon/reagent_containers/food/snacks/customizable/examine(mob/user) + ..(user) + var/whatsinside = pick(ingredients) + + to_chat(user, " You think you can see [whatsinside] in there.") + +/* +/obj/item/weapon/reagent_containers/food/snacks/customizable/attack(mob/M as mob, mob/user as mob, def_zone) //SNOOOOOOOWFLAAAAAAAAAAAAAAAAAKES + + var/obj/item/shard + for(var/obj/item/O in contents) + if(istype(O,/obj/item/weapon/shard)) + shard = O + break + + var/mob/living/H + if(istype(M,/mob/living)) + H = M + + if(H && shard && M == user) //This needs a check for feeding the food to other people, but that could be abusable. + to_chat(H, "\red You lacerate your mouth on a [shard.name] in the sandwich!") + H.adjustBruteLoss(5) //TODO: Target head if human. + ..() +*/ + +/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/newname() + var/unsorteditems[0] + var/sorteditems[0] + var/unsortedtypes[0] + var/sortedtypes[0] + var/endpart = "" + var/c = 0 + var/ci = 0 + var/ct = 0 + var/seperator = "" + var/sendback = "" + var/list/levels = list("", "double", "triple", "quad", "huge") + + for(var/obj/item/ing in ingredients) + if(istype(ing, /obj/item/weapon/shard)) + continue + + + if(istype(ing, /obj/item/weapon/reagent_containers/food/snacks/customizable)) // split the ingredients into ones with basenames (sandwich, burger, etc) and ones without, keeping track of how many of each there are + var/obj/item/weapon/reagent_containers/food/snacks/customizable/gettype = ing + if(unsortedtypes[gettype.basename]) + unsortedtypes[gettype.basename]++ + if(unsortedtypes[gettype.basename] > ct) + ct = unsortedtypes[gettype.basename] + else + (unsortedtypes[gettype.basename]) = 1 + if(unsortedtypes[gettype.basename] > ct) + ct = unsortedtypes[gettype.basename] + else + if(unsorteditems[ing.name]) + unsorteditems[ing.name]++ + if(unsorteditems[ing.name] > ci) + ci = unsorteditems[ing.name] + else + unsorteditems[ing.name] = 1 + if(unsorteditems[ing.name] > ci) + ci = unsorteditems[ing.name] + + sorteditems = sortlist(unsorteditems, ci) //order both types going from the lowest number to the highest number + sortedtypes = sortlist(unsortedtypes, ct) + + for(var/ings in sorteditems) //add the non-basename items to the name, sorting out the , and the and + c++ + if(c == sorteditems.len - 1) + seperator = " and " + else if(c == sorteditems.len) + seperator = " " + else + seperator = ", " + + if(sorteditems[ings] > levels.len) + sorteditems[ings] = levels.len + + if(sorteditems[ings] <= 1) + sendback +="[ings][seperator]" + else + sendback +="[levels[sorteditems[ings]]] [ings][seperator]" + + for(var/ingtype in sortedtypes) // now add the types basenames, keeping the src one seperate so it can go on the end + if(sortedtypes[ingtype] > levels.len) + sortedtypes[ingtype] = levels.len + if(ingtype == basename) + if(sortedtypes[ingtype] < levels.len) + sortedtypes[ingtype]++ + endpart = "[levels[sortedtypes[ingtype]]] decker [basename]" + continue + if(sortedtypes[ingtype] >= 2) + sendback += "[levels[sortedtypes[ingtype]]] decker [ingtype] " + else + sendback += "[ingtype] " + + if(endpart) + sendback += endpart + else + sendback += basename + + if(length(sendback) > 80) + sendback = "[pick(list("absurd","colossal","enormous","ridiculous","massive","oversized","cardiac-arresting","pipe-clogging","edible but sickening","sickening","gargantuan","mega","belly-burster","chest-burster"))] [basename]" + return sendback + +/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/sortlist(var/list/unsorted, var/highest) + var/sorted[0] + for(var/i = 1, i<= highest, i++) + for(var/it in unsorted) + if(unsorted[it] == i) + sorted[it] = i + return sorted + diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/food_and_drinks/food/meat.dm similarity index 96% rename from code/modules/reagents/reagent_containers/food/snacks/meat.dm rename to code/modules/food_and_drinks/food/meat.dm index 2572c42c69d..76de76530ea 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/meat.dm @@ -1,54 +1,54 @@ -/obj/item/weapon/reagent_containers/food/snacks/meat - name = "meat" - desc = "A slab of meat" - icon_state = "meat" - health = 180 - filling_color = "#FF1C1C" - New() - ..() - reagents.add_reagent("protein", 3) - src.bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/meat/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if( \ - istype(W, /obj/item/weapon/kitchen/knife) || \ - istype(W, /obj/item/weapon/scalpel) \ - ) - new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) - new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) - new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) - to_chat(user, "You cut the meat in thin strips.") - qdel(src) - else - ..() - -/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh - name = "synthetic meat" - desc = "A synthetic slab of flesh." - -/obj/item/weapon/reagent_containers/food/snacks/meat/human - name = "-meat" - var/subjectname = "" - var/subjectjob = null - -/obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct - name = "meat product" - desc = "A slab of station reclaimed and chemically processed meat product." - -/obj/item/weapon/reagent_containers/food/snacks/meat/monkey - //same as plain meat - -/obj/item/weapon/reagent_containers/food/snacks/meat/corgi - name = "Corgi meat" - desc = "Tastes like... well you know..." - -/obj/item/weapon/reagent_containers/food/snacks/meat/pug - name = "Pug meat" - desc = "Tastes like... well you know..." - -/obj/item/weapon/reagent_containers/food/snacks/meat/ham - name = "Ham" - desc = "Taste like bacon." - New() - ..() - reagents.add_reagent("porktonium", 10) +/obj/item/weapon/reagent_containers/food/snacks/meat + name = "meat" + desc = "A slab of meat" + icon_state = "meat" + health = 180 + filling_color = "#FF1C1C" + New() + ..() + reagents.add_reagent("protein", 3) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/meat/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if( \ + istype(W, /obj/item/weapon/kitchen/knife) || \ + istype(W, /obj/item/weapon/scalpel) \ + ) + new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) + new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) + new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) + to_chat(user, "You cut the meat in thin strips.") + qdel(src) + else + ..() + +/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh + name = "synthetic meat" + desc = "A synthetic slab of flesh." + +/obj/item/weapon/reagent_containers/food/snacks/meat/human + name = "-meat" + var/subjectname = "" + var/subjectjob = null + +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct + name = "meat product" + desc = "A slab of station reclaimed and chemically processed meat product." + +/obj/item/weapon/reagent_containers/food/snacks/meat/monkey + //same as plain meat + +/obj/item/weapon/reagent_containers/food/snacks/meat/corgi + name = "Corgi meat" + desc = "Tastes like... well you know..." + +/obj/item/weapon/reagent_containers/food/snacks/meat/pug + name = "Pug meat" + desc = "Tastes like... well you know..." + +/obj/item/weapon/reagent_containers/food/snacks/meat/ham + name = "Ham" + desc = "Taste like bacon." + New() + ..() + reagents.add_reagent("porktonium", 10) diff --git a/code/modules/reagents/reagent_containers/food/snacks/seafood.dm b/code/modules/food_and_drinks/food/seafood.dm similarity index 100% rename from code/modules/reagents/reagent_containers/food/snacks/seafood.dm rename to code/modules/food_and_drinks/food/seafood.dm diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm similarity index 96% rename from code/modules/reagents/reagent_containers/food/snacks.dm rename to code/modules/food_and_drinks/food/snacks.dm index c63a857ea0a..a012afa74f9 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -1,3404 +1,3404 @@ -//Food items that are eaten normally and don't leave anything behind. -/obj/item/weapon/reagent_containers/food/snacks - name = "snack" - desc = "yummy" - icon = 'icons/obj/food/food.dmi' - icon_state = null - bitesize = 1 - var/bitecount = 0 - var/trash = null - var/slice_path - var/slices_num - var/eatverb - var/wrapped = 0 - var/dried_type = null - var/cooktype[0] - - - //Placeholder for effect that trigger on eating that aren't tied to reagents. -/obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume(mob/M, mob/user) - if(!user) - return - spawn(0) - if(!reagents.total_volume) - if(M == user) - to_chat(user, "You finish eating \the [src].") - user.visible_message("[user] finishes eating \the [src].") - user.unEquip(src) //so icons update :[ - Post_Consume(M) - if(trash) - if(ispath(trash,/obj/item)) - var/obj/item/TrashItem = new trash(user) - user.put_in_hands(TrashItem) - else if(istype(trash,/obj/item)) - user.put_in_hands(trash) - qdel(src) - return - -/obj/item/weapon/reagent_containers/food/snacks/proc/Post_Consume(mob/living/M) - return - -/obj/item/weapon/reagent_containers/food/snacks/attack_self(mob/user as mob) - return - -/obj/item/weapon/reagent_containers/food/snacks/attack(mob/M as mob, mob/user as mob, def_zone) - if(reagents && !reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it. - to_chat(user, "None of [src] left, oh no!") - M.unEquip(src) //so icons update :[ - qdel(src) - return 0 - - if(istype(M, /mob/living/carbon)) - var/mob/living/carbon/C = M - if(C.eat(src, user)) - bitecount++ - On_Consume(C, user) - return 1 - return 0 - -/obj/item/weapon/reagent_containers/food/snacks/afterattack(obj/target, mob/user, proximity) - return - -/obj/item/weapon/reagent_containers/food/snacks/examine(mob/user) - if(..(user, 0)) - if(bitecount==0) - return - else if(bitecount==1) - to_chat(user, "\blue \The [src] was bitten by someone!") - else if(bitecount<=3) - to_chat(user, "\blue \The [src] was bitten [bitecount] times!") - else - to_chat(user, "\blue \The [src] was bitten multiple times!") - - -/obj/item/weapon/reagent_containers/food/snacks/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W,/obj/item/weapon/pen)) - var/n_name = sanitize(copytext(input(usr, "What would you like to name this dish?", "Food Renaming", null) as text, 1, MAX_NAME_LEN)) - if((loc == usr && usr.stat == 0)) - name = "[n_name]" - return - if(istype(W,/obj/item/weapon/storage)) - ..() // -> item/attackby(, params) - - if(istype(W,/obj/item/weapon/kitchen/utensil)) - - var/obj/item/weapon/kitchen/utensil/U = W - - if(U.contents.len >= U.max_contents) - to_chat(user, "You cannot fit anything else on your [U].") - return - - user.visible_message( \ - "[user] scoops up some [src] with \the [U]!", \ - "You scoop up some [src] with \the [U]!" \ - ) - - src.bitecount++ - U.overlays.Cut() - var/image/I = new(U.icon, "loadedfood") - I.color = src.filling_color - U.overlays += I - - var/obj/item/weapon/reagent_containers/food/snacks/collected = new type - collected.loc = U - collected.reagents.remove_any(collected.reagents.total_volume) - collected.trash = null - if(reagents.total_volume > bitesize) - reagents.trans_to(collected, bitesize) - else - reagents.trans_to(collected, reagents.total_volume) - if(trash) - var/obj/item/TrashItem - if(ispath(trash,/obj/item)) - TrashItem = new trash(src) - else if(istype(trash,/obj/item)) - TrashItem = trash - TrashItem.forceMove(loc) - qdel(src) - return 1 - - if((slices_num <= 0 || !slices_num) || !slice_path) - return 0 - - var/inaccurate = 0 - if( \ - istype(W, /obj/item/weapon/kitchen/knife) || \ - istype(W, /obj/item/weapon/scalpel) \ - ) - else if( \ - istype(W, /obj/item/weapon/circular_saw) || \ - istype(W, /obj/item/weapon/melee/energy/sword/saber) && W:active || \ - istype(W, /obj/item/weapon/melee/energy/blade) || \ - istype(W, /obj/item/weapon/shovel) || \ - istype(W, /obj/item/weapon/hatchet) \ - ) - inaccurate = 1 - else if(W.w_class <= 2 && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable)) - if(!iscarbon(user)) - return 1 - to_chat(user, "\red You slip [W] inside [src].") - user.unEquip(W) - if((user.client && user.s_active != src)) - user.client.screen -= W - W.dropped(user) - add_fingerprint(user) - contents += W - return - else - return 1 - if( \ - !isturf(src.loc) || \ - !(locate(/obj/structure/table) in src.loc) && \ - !(locate(/obj/machinery/optable) in src.loc) && \ - !(locate(/obj/item/weapon/storage/bag/tray) in src.loc) \ - ) - to_chat(user, "\red You cannot slice [src] here! You need a table or at least a tray to do it.") - return 1 - var/slices_lost = 0 - if(!inaccurate) - user.visible_message( \ - "\blue [user] slices \the [src]!", \ - "\blue You slice \the [src]!" \ - ) - else - user.visible_message( \ - "\blue [user] crudely slices \the [src] with [W]!", \ - "\blue You crudely slice \the [src] with your [W]!" \ - ) - slices_lost = rand(1,min(1,round(slices_num/2))) - var/reagents_per_slice = reagents.total_volume/slices_num - for(var/i=1 to (slices_num-slices_lost)) - var/obj/slice = new slice_path (src.loc) - reagents.trans_to(slice,reagents_per_slice) - qdel(src) - - return - -/obj/item/weapon/reagent_containers/food/snacks/Destroy() - if(contents) - for(var/atom/movable/something in contents) - something.loc = get_turf(src) - return ..() - -/obj/item/weapon/reagent_containers/food/snacks/attack_animal(mob/M) - if(isanimal(M)) - M.changeNext_move(CLICK_CD_MELEE) - if(iscorgi(M)) - if(bitecount >= 4) - M.visible_message("[M] [pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [src] was")].","You swallow up the last part of \the [src].") - playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) - var/mob/living/simple_animal/pet/corgi/C = M - C.adjustBruteLoss(-5) - C.adjustFireLoss(-5) - qdel(src) - else - M.visible_message("[M] takes a bite of \the [src].","You take a bite of \the [src].") - playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) - bitecount++ - else if(ismouse(M)) - var/mob/living/simple_animal/mouse/N = M - to_chat(N, text("\blue You nibble away at [src].")) - if(prob(50)) - N.visible_message("[N] nibbles away at [src].", "") - //N.emote("nibbles away at the [src]") - N.adjustBruteLoss(-1) - N.adjustFireLoss(-1) - - -//////////////////////////////////////////////////////////////////////////////// -/// FOOD END -//////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - - -////////////////////////////////////////////////// -////////////////////////////////////////////Snacks -////////////////////////////////////////////////// -//Items in the "Snacks" subcategory are food items that people actually eat. The key points are that they are created -// already filled with reagents and are destroyed when empty. Additionally, they make a "munching" noise when eaten. - -//Notes by Darem: Food in the "snacks" subtype can hold a maximum of 50 units Generally speaking, you don't want to go over 40 -// total for the item because you want to leave space for extra condiments. If you want effect besides healing, add a reagent for -// it. Try to stick to existing reagents when possible (so if you want a stronger healing effect, just use Tricordrazine). On use -// effect (such as the old officer eating a donut code) requires a unique reagent (unless you can figure out a better way). - -//The nutriment reagent and bitesize variable replace the old heal_amt and amount variables. Each unit of nutriment is equal to -// 2 of the old heal_amt variable. Bitesize is the rate at which the reagents are consumed. So if you have 6 nutriment and a -// bitesize of 2, then it'll take 3 bites to eat. Unlike the old system, the contained reagents are evenly spread among all -// the bites. No more contained reagents = no more bites. - -//Here is an example of the new formatting for anyone who wants to add more food items. -///obj/item/weapon/reagent_containers/food/snacks/xenoburger //Identification path for the object. -// name = "Xenoburger" //Name that displays in the UI. -// desc = "Smells caustic. Tastes like heresy." //Duh -// icon_state = "xburger" //Refers to an icon in food/food.dmi -// New() //Don't mess with this. -// ..() //Same here. -// reagents.add_reagent("xenomicrobes", 10) //This is what is in the food item. you may copy/paste -// reagents.add_reagent("nutriment", 2) // this line of code for all the contents. -// bitesize = 3 //This is the amount each bite consumes. - - - - -/obj/item/weapon/reagent_containers/food/snacks/aesirsalad - name = "Aesir salad" - desc = "Probably too incredible for mortal men to fully enjoy." - icon_state = "aesirsalad" - trash = /obj/item/trash/snack_bowl - filling_color = "#468C00" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("omnizine", 8) - bitesize = 3 - -/* -/obj/item/weapon/reagent_containers/food/snacks/candy - name = "candy" - desc = "Nougat, love it or hate it." - icon_state = "candy" - trash = /obj/item/trash/candy - filling_color = "#7D5F46" - - New() - ..() - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("sugar", 3) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/candy/donor - name = "Donor Candy" - desc = "A little treat for blood donors." - trash = /obj/item/trash/candy - New() - ..() - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("sugar", 3) - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/snacks/candy_corn - name = "candy corn" - desc = "It's a handful of candy corn. Cannot be stored in a detective's hat, alas." - icon_state = "candy_corn" - filling_color = "#FFFCB0" - - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("sugar", 2) - bitesize = 2 -*/ - -/obj/item/weapon/reagent_containers/food/snacks/chips - name = "chips" - desc = "Commander Riker's What-The-Crisps" - icon_state = "chips" - trash = /obj/item/trash/chips - filling_color = "#E8C31E" - - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sodiumchloride", 1) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/cornchips - name = "corn chips" - desc = "Goes great with salsa! OLE!" - icon_state = "chips" - trash = /obj/item/trash/chips - filling_color = "#E8C31E" - - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/cookie - name = "cookie" - desc = "COOKIE!!!" - icon_state = "COOKIE!!!" - filling_color = "#DBC94F" - - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/chocolatebar - name = "Chocolate Bar" - desc = "Such sweet, fattening food." - icon_state = "chocolatebar" - filling_color = "#7D5F46" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("chocolate",4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/choc_pile //for reagent chocolate being spilled on turfs - name = "Pile of Chocolate" - desc = "A pile of pure chocolate pieces." - icon_state = "cocoa" - filling_color = "#7D5F46" - - New() - ..() - reagents.add_reagent("chocolate",5) //no longer can be used to generate the reagent infinitely - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/chocolateegg - name = "Chocolate Egg" - desc = "Such sweet, fattening food." - icon_state = "chocolateegg" - filling_color = "#7D5F46" - - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("chocolate",4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/donut - name = "donut" - desc = "Goes great with Robust Coffee." - icon_state = "donut1" - filling_color = "#D9C386" - -/obj/item/weapon/reagent_containers/food/snacks/donut/normal - name = "donut" - desc = "Goes great with Robust Coffee." - icon_state = "donut1" - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - src.bitesize = 3 - if(prob(30)) - src.icon_state = "donut2" - src.name = "frosted donut" - reagents.add_reagent("sprinkles", 2) - -/obj/item/weapon/reagent_containers/food/snacks/donut/sprinkles - name = "frosted donut" - icon_state = "donut2" - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 3) - -/obj/item/weapon/reagent_containers/food/snacks/donut/chaos - name = "Chaos Donut" - desc = "Like life, it never quite tastes the same." - icon_state = "donut1" - filling_color = "#ED11E6" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sprinkles", 1) - bitesize = 10 - var/chaosselect = pick(1,2,3,4,5,6,7,8,9,10) - switch(chaosselect) - if(1) - reagents.add_reagent("nutriment", 3) - if(2) - reagents.add_reagent("capsaicin", 3) - if(3) - reagents.add_reagent("frostoil", 3) - if(4) - reagents.add_reagent("sprinkles", 3) - if(5) - reagents.add_reagent("plasma", 3) - if(6) - reagents.add_reagent("chocolate", 3) - if(7) - reagents.add_reagent("slimejelly", 3) - if(8) - reagents.add_reagent("banana", 3) - if(9) - reagents.add_reagent("berryjuice", 3) - if(10) - reagents.add_reagent("omnizine", 3) - if(prob(30)) - src.icon_state = "donut2" - src.name = "Frosted Chaos Donut" - reagents.add_reagent("sprinkles", 2) - - -/obj/item/weapon/reagent_containers/food/snacks/donut/jelly - name = "Jelly Donut" - desc = "You jelly?" - icon_state = "jdonut1" - filling_color = "#ED1169" - - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("berryjuice", 5) - bitesize = 5 - if(prob(30)) - src.icon_state = "jdonut2" - src.name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) - -/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly - name = "Jelly Donut" - desc = "You jelly?" - icon_state = "jdonut1" - filling_color = "#ED1169" - - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("slimejelly", 5) - bitesize = 5 - if(prob(30)) - src.icon_state = "jdonut2" - src.name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) - -/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly - name = "Jelly Donut" - desc = "You jelly?" - icon_state = "jdonut1" - filling_color = "#ED1169" - - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("sprinkles", 1) - reagents.add_reagent("cherryjelly", 5) - bitesize = 5 - if(prob(30)) - src.icon_state = "jdonut2" - src.name = "Frosted Jelly Donut" - reagents.add_reagent("sprinkles", 2) - -/obj/item/weapon/reagent_containers/food/snacks/egg - name = "egg" - desc = "An egg!" - icon_state = "egg" - filling_color = "#FDFFD1" - - New() - ..() - reagents.add_reagent("protein", 1) - reagents.add_reagent("egg", 5) - - throw_impact(atom/hit_atom) - ..() - var/turf/T = get_turf(hit_atom) - new/obj/effect/decal/cleanable/egg_smudge(T) - if(reagents) - reagents.reaction(hit_atom, TOUCH) - qdel(src) - - attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype( W, /obj/item/toy/crayon )) - var/obj/item/toy/crayon/C = W - var/clr = C.colourName - - if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) - to_chat(usr, "\blue The egg refuses to take on this color!") - return - - to_chat(usr, "\blue You color \the [src] [clr]") - icon_state = "egg-[clr]" - item_color = clr - else - ..() - -/obj/item/weapon/reagent_containers/food/snacks/egg/blue - icon_state = "egg-blue" - item_color = "blue" - -/obj/item/weapon/reagent_containers/food/snacks/egg/green - icon_state = "egg-green" - item_color = "green" - -/obj/item/weapon/reagent_containers/food/snacks/egg/mime - icon_state = "egg-mime" - item_color = "mime" - -/obj/item/weapon/reagent_containers/food/snacks/egg/orange - icon_state = "egg-orange" - item_color = "orange" - -/obj/item/weapon/reagent_containers/food/snacks/egg/purple - icon_state = "egg-purple" - item_color = "purple" - -/obj/item/weapon/reagent_containers/food/snacks/egg/rainbow - icon_state = "egg-rainbow" - item_color = "rainbow" - -/obj/item/weapon/reagent_containers/food/snacks/egg/red - icon_state = "egg-red" - item_color = "red" - -/obj/item/weapon/reagent_containers/food/snacks/egg/yellow - icon_state = "egg-yellow" - item_color = "yellow" - -/obj/item/weapon/reagent_containers/food/snacks/friedegg - name = "Fried egg" - desc = "A fried egg, with a touch of salt and pepper." - icon_state = "friedegg" - filling_color = "#FFDF78" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("egg", 5) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/boiledegg - name = "Boiled egg" - desc = "A hard boiled egg." - icon_state = "egg" - filling_color = "#FFFFFF" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("egg", 5) - -/obj/item/weapon/reagent_containers/food/snacks/organ - - name = "organ" - desc = "It's good for you." - icon = 'icons/obj/surgery.dmi' - icon_state = "appendix" - filling_color = "#E00D34" - - New() - ..() - reagents.add_reagent("protein", 4) - src.bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/appendix -//yes, this is the same as meat. I might do something different in future - name = "appendix" - desc = "An appendix which looks perfectly healthy." - icon = 'icons/obj/surgery.dmi' - icon_state = "appendix" - filling_color = "#E00D34" - - New() - ..() - reagents.add_reagent("protein", 3) - src.bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed - name = "inflamed appendix" - desc = "An appendix which appears to be inflamed." - icon_state = "appendixinflamed" - filling_color = "#E00D7A" - -/obj/item/weapon/reagent_containers/food/snacks/tofu - name = "Tofu" - icon_state = "tofu" - desc = "We all love tofu." - filling_color = "#FFFEE0" - - New() - ..() - reagents.add_reagent("plantmatter", 3) - src.bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/fried_tofu - name = "Fried Tofu" - icon_state = "tofu" - desc = "Proof that even vegetarians crave unhealthy foods." - filling_color = "#FFFEE0" - - New() - ..() - reagents.add_reagent("nutriment", 3) - src.bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/tofurkey - name = "Tofurkey" - desc = "A fake turkey made from tofu." - icon_state = "tofurkey" - filling_color = "#FFFEE0" - - New() - ..() - reagents.add_reagent("nutriment", 12) - reagents.add_reagent("ether", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/stuffing - name = "Stuffing" - desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!" - icon_state = "stuffing" - filling_color = "#C9AC83" - - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice - name = "huge mushroom slice" - desc = "A slice from a huge mushroom." - icon_state = "hugemushroomslice" - filling_color = "#E0D7C5" - - New() - ..() - reagents.add_reagent("plantmatter", 3) - reagents.add_reagent("psilocybin", 3) - src.bitesize = 6 - -/obj/item/weapon/reagent_containers/food/snacks/tomatomeat - name = "tomato slice" - desc = "A slice from a huge tomato" - icon_state = "tomatomeat" - filling_color = "#DB0000" - - New() - ..() - reagents.add_reagent("protein", 3) - src.bitesize = 6 - -/obj/item/weapon/reagent_containers/food/snacks/bearmeat - name = "bear meat" - desc = "A very manly slab of meat." - icon_state = "bearmeat" - filling_color = "#DB0000" - - New() - ..() - reagents.add_reagent("protein", 12) - reagents.add_reagent("methamphetamine", 5) - src.bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/xenomeat - name = "meat" - desc = "A slab of meat" - icon_state = "xenomeat" - filling_color = "#43DE18" - - New() - ..() - reagents.add_reagent("protein", 3) - src.bitesize = 6 - -/obj/item/weapon/reagent_containers/food/snacks/spidermeat - name = "spider meat" - desc = "A slab of spider meat." - icon_state = "spidermeat" - New() - ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("toxin", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/lizardmeat - name = "mutant lizard meat" - desc = "Seems to be a slab of meat from some mutant lizard thing?" - icon_state = "xenomeat" - filling_color = "#43DE18" - - New() - ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("toxin", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/spiderleg - name = "spider leg" - desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?" - icon_state = "spiderleg" - New() - ..() - reagents.add_reagent("protein", 2) - reagents.add_reagent("toxin", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/meatball - name = "Meatball" - desc = "A great meal all round." - icon_state = "meatball" - filling_color = "#DB0000" - New() - ..() - reagents.add_reagent("protein", 3) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sausage - name = "Sausage" - desc = "A piece of mixed, long meat." - icon_state = "sausage" - filling_color = "#DB0000" - - New() - ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("porktonium", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/donkpocket - name = "Donk-pocket" - desc = "The food of choice for the seasoned traitor." - icon_state = "donkpocket" - filling_color = "#DEDEAB" - - New() - ..() - reagents.add_reagent("nutriment", 4) - -/obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket - name = "Warm Donk-pocket" - desc = "The food of choice for the seasoned traitor." - icon_state = "donkpocket" - filling_color = "#DEDEAB" - - New() - ..() - reagents.add_reagent("nutriment", 4) - - Post_Consume(mob/living/M) - M.reagents.add_reagent("omnizine", 15) - -/obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket - name = "Donk-pocket" - desc = "This donk-pocket is emitting a small amount of heat." - icon_state = "donkpocket" - filling_color = "#DEDEAB" - bitesize = 100 //nom the whole thing at once. - - New() - ..() - reagents.add_reagent("nutriment", 1) - - Post_Consume(mob/living/M) - M.reagents.add_reagent("omnizine", 15) - M.reagents.add_reagent("teporone", 15) - M.reagents.add_reagent("synaptizine", 15) - M.reagents.add_reagent("salglu_solution", 15) - M.reagents.add_reagent("salbutamol", 15) - M.reagents.add_reagent("methamphetamine", 15) - -/obj/item/weapon/reagent_containers/food/snacks/brainburger - name = "brainburger" - desc = "A strange looking burger. It looks almost sentient." - icon_state = "brainburger" - filling_color = "#F2B6EA" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("prions", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/ghostburger - name = "Ghost Burger" - desc = "Spooky! It doesn't look very filling." - icon_state = "ghostburger" - filling_color = "#FFF2FF" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 - - -/obj/item/weapon/reagent_containers/food/snacks/human - var/hname = "" - var/job = null - filling_color = "#D63C3C" - -/obj/item/weapon/reagent_containers/food/snacks/human/burger - name = "-burger" - desc = "A bloody burger." - icon_state = "hburger" - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/cheeseburger - name = "cheeseburger" - desc = "The cheese adds a good flavor." - icon_state = "cheeseburger" - New() - ..() - reagents.add_reagent("nutriment", 2) - -/obj/item/weapon/reagent_containers/food/snacks/monkeyburger - name = "burger" - desc = "The cornerstone of every nutritious breakfast." - icon_state = "hburger" - filling_color = "#D63C3C" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/tofuburger - name = "Tofu Burger" - desc = "What.. is that meat?" - icon_state = "tofuburger" - filling_color = "#FFFEE0" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/roburger - name = "roburger" - desc = "The lettuce is the only organic component. Beep." - icon_state = "roburger" - filling_color = "#CCCCCC" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("nanomachines", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/roburgerbig - name = "roburger" - desc = "This massive patty looks like poison. Beep." - icon_state = "roburger" - filling_color = "#CCCCCC" - volume = 100 - - New() - ..() - reagents.add_reagent("nanomachines", 100) - bitesize = 0.1 - -/obj/item/weapon/reagent_containers/food/snacks/xenoburger - name = "xenoburger" - desc = "Smells caustic. Tastes like heresy." - icon_state = "xburger" - filling_color = "#43DE18" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/clownburger - name = "Clown Burger" - desc = "This tastes funny..." - icon_state = "clownburger" - filling_color = "#FF00FF" - - New() - ..() -/* - var/datum/disease/F = new /datum/disease/pierrot_throat(0) - var/list/data = list("viruses"= list(F)) - reagents.add_reagent("blood", 4, data) -*/ - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/mimeburger - name = "Mime Burger" - desc = "Its taste defies language." - icon_state = "mimeburger" - filling_color = "#FFFFFF" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/omelette - name = "Omelette Du Fromage" - desc = "That's all you can say!" - icon_state = "omelette" - trash = /obj/item/trash/plate - filling_color = "#FFF9A8" - - //var/herp = 0 - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/muffin - name = "Muffin" - desc = "A delicious and spongy little cake" - icon_state = "muffin" - filling_color = "#E0CF9B" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/pie - name = "Banana Cream Pie" - desc = "Just like back home, on clown planet! HONK!" - icon_state = "pie" - trash = /obj/item/trash/plate - filling_color = "#FBFFB8" - -/obj/item/weapon/reagent_containers/food/snacks/pie/New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("banana",5) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/pie/throw_impact(atom/hit_atom) - ..() - new/obj/effect/decal/cleanable/pie_smudge(src.loc) - src.visible_message("\red [src.name] splats.","\red You hear a splat.") - qdel(src) - -/obj/item/weapon/reagent_containers/food/snacks/berryclafoutis - name = "Berry Clafoutis" - desc = "No black birds, this is a good sign." - icon_state = "berryclafoutis" - trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("berryjuice", 5) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/waffles - name = "waffles" - desc = "Mmm, waffles" - icon_state = "waffles" - trash = /obj/item/trash/waffles - filling_color = "#E6DEB5" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/eggplantparm - name = "Eggplant Parmigiana" - desc = "The only good recipe for eggplant." - icon_state = "eggplantparm" - trash = /obj/item/trash/plate - filling_color = "#4D2F5E" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/soylentgreen - name = "Soylent Green" - desc = "Not made of people. Honest." //Totally people. - icon_state = "soylent_green" - trash = /obj/item/trash/waffles - filling_color = "#B8E6B5" - - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/soylenviridians - name = "Soylen Virdians" - desc = "Not made of people. Honest." //Actually honest for once. - icon_state = "soylent_yellow" - trash = /obj/item/trash/waffles - filling_color = "#E6FA61" - - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 - - -/obj/item/weapon/reagent_containers/food/snacks/meatpie - name = "Meat-pie" - icon_state = "meatpie" - desc = "An old barber recipe, very delicious!" - trash = /obj/item/trash/plate - filling_color = "#948051" - - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/tofupie - name = "Tofu-pie" - icon_state = "meatpie" - desc = "A delicious tofu pie." - trash = /obj/item/trash/plate - filling_color = "#FFFEE0" - - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/amanita_pie - name = "amanita pie" - desc = "Sweet and tasty poison pie." - icon_state = "amanita_pie" - filling_color = "#FFCCCC" - - New() - ..() - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("amanitin", 3) - reagents.add_reagent("psilocybin", 1) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/plump_pie - name = "plump pie" - desc = "I bet you love stuff made out of plump helmets!" - icon_state = "plump_pie" - filling_color = "#B8279B" - - New() - ..() - if(prob(10)) - name = "exceptional plump pie" - desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("omnizine", 5) - bitesize = 2 - else - reagents.add_reagent("nutriment", 8) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/xemeatpie - name = "Xeno-pie" - icon_state = "xenomeatpie" - desc = "A delicious meatpie. Probably heretical." - trash = /obj/item/trash/plate - filling_color = "#43DE18" - - New() - ..() - reagents.add_reagent("nutriment", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/wingfangchu - name = "Wing Fang Chu" - desc = "A savory dish of alien wing wang in soy." - icon_state = "wingfangchu" - trash = /obj/item/trash/snack_bowl - filling_color = "#43DE18" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - - -/obj/item/weapon/reagent_containers/food/snacks/human/kabob - name = "-kabob" - icon_state = "kabob" - desc = "A human meat, on a stick." - trash = /obj/item/stack/rods - filling_color = "#A85340" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/monkeykabob - name = "Meat-kabob" - icon_state = "kabob" - desc = "Delicious meat, on a stick." - trash = /obj/item/stack/rods - filling_color = "#A85340" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/tofukabob - name = "Tofu-kabob" - icon_state = "kabob" - desc = "Vegan meat, on a stick." - trash = /obj/item/stack/rods - filling_color = "#FFFEE0" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/popcorn - name = "Popcorn" - desc = "Now let's find some cinema." - icon_state = "popcorn" - trash = /obj/item/trash/popcorn - var/unpopped = 0 - filling_color = "#FFFAD4" - - New() - ..() - unpopped = rand(1,10) - reagents.add_reagent("nutriment", 2) - bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 - On_Consume(mob/M, mob/user) - if(prob(unpopped)) //lol ...what's the point? - to_chat(user, "\red You bite down on an un-popped kernel!") - unpopped = max(0, unpopped-1) - ..() - - -/obj/item/weapon/reagent_containers/food/snacks/sosjerky - name = "Scaredy's Private Reserve Beef Jerky" - icon_state = "sosjerky" - desc = "Beef jerky made from the finest space cows." - trash = /obj/item/trash/sosjerky - filling_color = "#631212" - - New() - ..() - reagents.add_reagent("protein", 4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/pistachios - name = "Pistachios" - icon_state = "pistachios" - desc = "A snack of deliciously salted pistachios. A perfectly valid choice..." - trash = /obj/item/trash/pistachios - filling_color = "#BAD145" - - New() - ..() - reagents.add_reagent("plantmatter", 6) - reagents.add_reagent("sodiumchloride", 1) - -/obj/item/weapon/reagent_containers/food/snacks/no_raisin - name = "4no Raisins" - icon_state = "4no_raisins" - desc = "Best raisins in the universe. Not sure why." - trash = /obj/item/trash/raisins - filling_color = "#343834" - - New() - ..() - reagents.add_reagent("plantmatter", 6) - -/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie - name = "Space Twinkie" - icon_state = "space_twinkie" - desc = "Guaranteed to survive longer then you will." - filling_color = "#FFE591" - - New() - ..() - reagents.add_reagent("sugar", 4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers - name = "Cheesie Honkers" - icon_state = "cheesie_honkers" - desc = "Bite sized cheesie snacks that will honk all over your mouth" - trash = /obj/item/trash/cheesie - filling_color = "#FFA305" - - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("fake_cheese", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein - name = "chow mein" - desc = "What is in this anyways?" - icon_state = "chinese1" - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("beans", 3) - reagents.add_reagent("msg",4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/chinese/tao - name = "Admiral Yamamoto carp" - desc = "Tastes like chicken." - icon_state = "chinese2" - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("protein", 2) - reagents.add_reagent("msg",4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/chinese/newdles - name = "chinese newdles" - desc = "Made fresh, weekly!" - icon_state = "chinese3" - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("msg",4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/chinese/rice - name = "fried rice" - desc = "A timeless classic." - icon_state = "chinese4" - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("rice", 3) - reagents.add_reagent("msg",4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/syndicake - name = "Syndi-Cakes" - icon_state = "syndi_cakes" - desc = "An extremely moist snack cake that tastes just as good after being nuked." - filling_color = "#FF5D05" - - trash = /obj/item/trash/syndi_cakes - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("salglu_solution", 5) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato - name = "Loaded Baked Potato" - desc = "Totally baked." - icon_state = "loadedbakedpotato" - filling_color = "#9C7A68" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/fries - name = "Space Fries" - desc = "AKA: French Fries, Freedom Fries, etc." - icon_state = "fries" - trash = /obj/item/trash/plate - filling_color = "#EDDD00" - - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/soydope - name = "Soy Dope" - desc = "Dope from a soy." - icon_state = "soydope" - trash = /obj/item/trash/plate - filling_color = "#C4BF76" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/spagetti - name = "Spagetti" - desc = "A bundle of raw spaghetti." - icon_state = "spagetti" - filling_color = "#EDDD00" - - New() - ..() - reagents.add_reagent("nutriment", 1) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/cheesyfries - name = "Cheesy Fries" - desc = "Fries. Covered in cheese. Duh." - icon_state = "cheesyfries" - trash = /obj/item/trash/plate - filling_color = "#EDDD00" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/fortunecookie - name = "Fortune cookie" - desc = "A true prophecy in each cookie!" - icon_state = "fortune_cookie" - filling_color = "#E8E79E" - - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/badrecipe - name = "Burned mess" - desc = "Someone should be demoted from chef for this." - icon_state = "badrecipe" - filling_color = "#211F02" - - New() - ..() - reagents.add_reagent("????", 5) - reagents.add_reagent("carbon", 3) - bitesize = 2 - - // it's burned! it should start off being classed as any cooktype that burns - cooktype["grilled"] = 1 - cooktype["deep fried"] = 1 - -/obj/item/weapon/reagent_containers/food/snacks/meatsteak - name = "Meat steak" - desc = "A piece of hot spicy meat." - icon_state = "meatstake" - trash = /obj/item/trash/plate - filling_color = "#7A3D11" - - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff - name = "Spacy Liberty Duff" - desc = "Jello gelatin, from Alfred Hubbard's cookbook" - icon_state = "spacylibertyduff" - trash = /obj/item/trash/snack_bowl - filling_color = "#42B873" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("psilocybin", 6) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/amanitajelly - name = "Amanita Jelly" - desc = "Looks curiously toxic" - icon_state = "amanitajelly" - trash = /obj/item/trash/snack_bowl - filling_color = "#ED0758" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("amanitin", 6) - reagents.add_reagent("psilocybin", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/poppypretzel - name = "Poppy pretzel" - desc = "It's all twisted up!" - icon_state = "poppypretzel" - bitesize = 2 - filling_color = "#916E36" - - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 - - -/obj/item/weapon/reagent_containers/food/snacks/meatballsoup - name = "Meatball soup" - desc = "You've got balls kid, BALLS!" - icon_state = "meatballsoup" - trash = /obj/item/trash/snack_bowl - filling_color = "#785210" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/snacks/slimesoup - name = "slime soup" - desc = "If no water is available, you may substitute tears." - icon_state = "slimesoup" - filling_color = "#C4DBA0" - - New() - ..() - reagents.add_reagent("slimejelly", 5) - reagents.add_reagent("water", 10) - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/snacks/bloodsoup - name = "Tomato soup" - desc = "Smells like copper" - icon_state = "tomatosoup" - filling_color = "#FF0000" - - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("blood", 10) - reagents.add_reagent("water", 5) - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/snacks/clownstears - name = "Clown's Tears" - desc = "Not very funny." - icon_state = "clownstears" - filling_color = "#C4FBFF" - - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("banana", 5) - reagents.add_reagent("water", 10) - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/snacks/vegetablesoup - name = "Vegetable soup" - desc = "A true vegan meal" //TODO - icon_state = "vegetablesoup" - trash = /obj/item/trash/snack_bowl - filling_color = "#AFC4B5" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/snacks/nettlesoup - name = "Nettle soup" - desc = "To think, the botanist would've beat you to death with one of these." - icon_state = "nettlesoup" - trash = /obj/item/trash/snack_bowl - filling_color = "#AFC4B5" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - reagents.add_reagent("omnizine", 5) - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/snacks/mysterysoup - name = "Mystery soup" - desc = "The mystery is, why aren't you eating it?" - icon_state = "mysterysoup" - trash = /obj/item/trash/snack_bowl - filling_color = "#F082FF" - - New() - ..() - var/mysteryselect = pick(1,2,3,4,5,6,7,8,9,10) - switch(mysteryselect) - if(1) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("capsaicin", 3) - reagents.add_reagent("tomatojuice", 2) - if(2) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("frostoil", 3) - reagents.add_reagent("tomatojuice", 2) - if(3) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("water", 5) - reagents.add_reagent("omnizine", 5) - if(4) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("water", 10) - if(5) - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("banana", 10) - if(6) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("blood", 10) - if(7) - reagents.add_reagent("slimejelly", 10) - reagents.add_reagent("water", 10) - if(8) - reagents.add_reagent("carbon", 10) - reagents.add_reagent("toxin", 10) - if(9) - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("tomatojuice", 10) - if(10) - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("tomatojuice", 5) - reagents.add_reagent("oculine", 5) - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/snacks/wishsoup - name = "Wish Soup" - desc = "I wish this was soup." - icon_state = "wishsoup" - trash = /obj/item/trash/snack_bowl - filling_color = "#D1F4FF" - - New() - ..() - reagents.add_reagent("water", 10) - bitesize = 5 - if(prob(25)) - src.desc = "A wish come true!" - reagents.add_reagent("nutriment", 8) - -/obj/item/weapon/reagent_containers/food/snacks/hotchili - name = "Hot Chili" - desc = "A five alarm Texan Chili!" - icon_state = "hotchili" - trash = /obj/item/trash/snack_bowl - filling_color = "#FF3C00" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("capsaicin", 3) - reagents.add_reagent("tomatojuice", 2) - bitesize = 5 - - -/obj/item/weapon/reagent_containers/food/snacks/coldchili - name = "Cold Chili" - desc = "This slush is barely a liquid!" - icon_state = "coldchili" - filling_color = "#2B00FF" - - trash = /obj/item/trash/snack_bowl - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("frostoil", 3) - reagents.add_reagent("tomatojuice", 2) - bitesize = 5 - -/obj/item/weapon/reagent_containers/food/snacks/raw_bacon - name = "raw bacon" - desc = "It's fleshy and pink!" - icon_state = "raw_bacon" - bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("porktonium", 10) - -/obj/item/weapon/reagent_containers/food/snacks/bacon - name = "bacon" - desc = "It looks juicy and tastes amazing!" - icon_state = "bacon2" - bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("porktonium", 10) - reagents.add_reagent("msg", 4) - - -/obj/item/weapon/reagent_containers/food/snacks/telebacon - name = "Tele Bacon" - desc = "It tastes a little odd but it is still delicious." - icon_state = "bacon" - var/obj/item/device/radio/beacon/bacon/baconbeacon - bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("porktonium", 10) - baconbeacon = new /obj/item/device/radio/beacon/bacon(src) - On_Consume(mob/M, mob/user) - if(!reagents.total_volume) - baconbeacon.loc = user - baconbeacon.digest_delay() - - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube - name = "monkey cube" - desc = "Just add water!" - icon_state = "monkeycube" - bitesize = 12 - filling_color = "#ADAC7F" - var/monkey_type = "Monkey" - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/New() - ..() - reagents.add_reagent("protein",10) - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/afterattack(obj/O, mob/user, proximity) - if(!proximity) return - if(istype(O,/obj/structure/sink) && !wrapped) - to_chat(user, "You place [src] under a stream of water...") - user.drop_item() - forceMove(get_turf(O)) - return Expand() - if(istype(O, /obj/machinery/computer/camera_advanced/xenobio)) - var/obj/machinery/computer/camera_advanced/xenobio/X = O - X.monkeys++ - to_chat(user, "You feed [src] to the [X]. It now has [X.monkeys] monkey cubes stored.") - qdel(src) - return - ..() - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/attack_self(mob/user) - if(wrapped) - Unwrap(user) - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature) - if(volume >= 5) - return Expand() - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wash(mob/user, atom/source) - if(wrapped) - ..() - return - if(do_after(user, 40, target = source)) - return 1 - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand() - if(isnull(gcDestroyed)) - visible_message("[src] expands!") - new/mob/living/carbon/human(get_turf(src),monkey_type) - qdel(src) - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Unwrap(mob/user) - icon_state = "monkeycube" - desc = "Just add water!" - to_chat(user, "You unwrap the cube.") - wrapped = 0 - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped - desc = "Still wrapped in some paper." - icon_state = "monkeycubewrap" - wrapped = 1 - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/farwacube - name = "farwa cube" - monkey_type = "Farwa" - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube - name = "farwa cube" - monkey_type = "Farwa" - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wolpincube - name = "wolpin cube" - monkey_type = "Wolpin" - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube - name = "wolpin cube" - monkey_type = "Wolpin" - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/stokcube - name = "stok cube" - monkey_type = "Stok" - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube - name = "stok cube" - monkey_type = "Stok" - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/neaeracube - name = "neaera cube" - monkey_type = "Neara" - -/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube - name = "neaera cube" - monkey_type = "Neara" - - -/obj/item/weapon/reagent_containers/food/snacks/spellburger - name = "Spell Burger" - desc = "This is absolutely Ei Nath." - icon_state = "spellburger" - filling_color = "#D505FF" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger - name = "Big Bite Burger" - desc = "Forget the Big Mac. THIS is the future!" - icon_state = "bigbiteburger" - filling_color = "#E3D681" - - New() - ..() - reagents.add_reagent("nutriment", 14) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/enchiladas - name = "Enchiladas" - desc = "Viva La Mexico!" - icon_state = "enchiladas" - trash = /obj/item/trash/tray - filling_color = "#A36A1F" - - New() - ..() - reagents.add_reagent("nutriment",8) - reagents.add_reagent("capsaicin", 6) - bitesize = 4 - -/obj/item/weapon/reagent_containers/food/snacks/burrito - name = "Burrito" - desc = "Meat, beans, cheese, and rice wrapped up as an easy-to-hold meal." - icon_state = "burrito" - trash = /obj/item/trash/plate - filling_color = "#A36A1F" - -/obj/item/weapon/reagent_containers/food/snacks/burrito/New() - ..() - reagents.add_reagent("nutriment", 5) - -/obj/item/weapon/reagent_containers/food/snacks/chimichanga - name = "Chimichanga" - desc = "Time to eat a chimi-f***ing-changa." - icon_state = "chimichanga" - trash = /obj/item/trash/plate - filling_color = "#A36A1F" - -/obj/item/weapon/reagent_containers/food/snacks/chimichanga/New() - ..() - reagents.add_reagent("omnizine", 4) //Deadpool reference. Deal with it. - reagents.add_reagent("cheese", 2) - -/obj/item/weapon/reagent_containers/food/snacks/monkeysdelight - name = "monkey's Delight" - desc = "Eeee Eee!" - icon_state = "monkeysdelight" - trash = /obj/item/trash/tray - filling_color = "#5C3C11" - - New() - ..() - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("banana", 5) - reagents.add_reagent("blackpepper", 1) - reagents.add_reagent("sodiumchloride", 1) - bitesize = 6 - -/obj/item/weapon/reagent_containers/food/snacks/baguette - name = "Baguette" - desc = "Bon appetit!" - icon_state = "baguette" - filling_color = "#E3D796" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("blackpepper", 1) - reagents.add_reagent("sodiumchloride", 1) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/sandwich - name = "Sandwich" - desc = "A grand creation of meat, cheese, bread, and several leaves of lettuce! Arthur Dent would be proud." - icon_state = "sandwich" - trash = /obj/item/trash/plate - filling_color = "#D9BE29" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/toastedsandwich - name = "Toasted Sandwich" - desc = "Now if you only had a pepper bar." - icon_state = "toastedsandwich" - trash = /obj/item/trash/plate - filling_color = "#D9BE29" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("carbon", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/grilledcheese - name = "Grilled Cheese Sandwich" - desc = "Goes great with Tomato soup!" - icon_state = "toastedsandwich" - trash = /obj/item/trash/plate - filling_color = "#D9BE29" - - New() - ..() - reagents.add_reagent("nutriment", 7) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/tomatosoup - name = "Tomato Soup" - desc = "Drinking this feels like being a vampire! A tomato vampire..." - icon_state = "tomatosoup" - trash = /obj/item/trash/snack_bowl - filling_color = "#D92929" - - New() - ..() - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("tomatojuice", 10) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/rofflewaffles - name = "Roffle Waffles" - desc = "Waffles from Roffle. Co." - icon_state = "rofflewaffles" - trash = /obj/item/trash/waffles - filling_color = "#FF00F7" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("psilocybin", 8) - bitesize = 4 - -/obj/item/weapon/reagent_containers/food/snacks/stew - name = "Stew" - desc = "A nice and warm stew. Healthy and strong." - icon_state = "stew" - filling_color = "#9E673A" - - New() - ..() - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("tomatojuice", 5) - reagents.add_reagent("oculine", 5) - reagents.add_reagent("water", 5) - bitesize = 10 - -/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast - name = "Jellied Toast" - desc = "A slice of bread covered with delicious jam." - icon_state = "jellytoast" - trash = /obj/item/trash/plate - filling_color = "#B572AB" - - New() - ..() - reagents.add_reagent("nutriment", 1) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry - New() - ..() - reagents.add_reagent("cherryjelly", 5) - -/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/slime - New() - ..() - reagents.add_reagent("slimejelly", 5) - -/obj/item/weapon/reagent_containers/food/snacks/jellyburger - name = "Jelly Burger" - desc = "Culinary delight..?" - icon_state = "jellyburger" - filling_color = "#B572AB" - - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/jellyburger/slime - New() - ..() - reagents.add_reagent("slimejelly", 5) - -/obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry - New() - ..() - reagents.add_reagent("cherryjelly", 5) - -/obj/item/weapon/reagent_containers/food/snacks/milosoup - name = "Milosoup" - desc = "The universes best soup! Yum!!!" - icon_state = "milosoup" - trash = /obj/item/trash/snack_bowl - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("water", 5) - bitesize = 4 - -/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat - name = "Stewed Soy Meat" - desc = "Even non-vegetarians will LOVE this!" - icon_state = "stewedsoymeat" - trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti - name = "Boiled Spagetti" - desc = "A plain dish of noodles, this sucks." - icon_state = "spagettiboiled" - trash = /obj/item/trash/plate - filling_color = "#FCEE81" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/boiledrice - name = "Boiled Rice" - desc = "A boring dish of boring rice." - icon_state = "boiledrice" - trash = /obj/item/trash/snack_bowl - filling_color = "#FFFBDB" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/ricepudding - name = "Rice Pudding" - desc = "Where's the Jam!" - icon_state = "rpudding" - trash = /obj/item/trash/snack_bowl - filling_color = "#FFFBDB" - - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/pastatomato - name = "Spagetti" - desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!" - icon_state = "pastatomato" - trash = /obj/item/trash/plate - filling_color = "#DE4545" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("tomatojuice", 10) - bitesize = 4 - -/obj/item/weapon/reagent_containers/food/snacks/meatballspagetti - name = "Spagetti & Meatballs" - desc = "Now thats a nic'e meatball!" - icon_state = "meatballspagetti" - trash = /obj/item/trash/plate - filling_color = "#DE4545" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("synaptizine", 5) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/spesslaw - name = "Spesslaw" - desc = "A lawyers favourite" - icon_state = "spesslaw" - filling_color = "#DE4545" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("synaptizine", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/poppypretzel - name = "Poppy Pretzel" - desc = "A large soft pretzel full of POP!" - icon_state = "poppypretzel" - filling_color = "#AB7D2E" - - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/carrotfries - name = "Carrot Fries" - desc = "Tasty fries from fresh Carrots." - icon_state = "carrotfries" - trash = /obj/item/trash/plate - filling_color = "#FAA005" - - New() - ..() - reagents.add_reagent("plantmatter", 3) - reagents.add_reagent("oculine", 3) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/superbiteburger - name = "Super Bite Burger" - desc = "This is a mountain of a burger. FOOD!" - icon_state = "superbiteburger" - filling_color = "#CCA26A" - - New() - ..() - reagents.add_reagent("nutriment", 50) - bitesize = 10 - -/obj/item/weapon/reagent_containers/food/snacks/candiedapple - name = "Candied Apple" - desc = "An apple coated in sugary sweetness." - icon_state = "candiedapple" - filling_color = "#F21873" - - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/applepie - name = "Apple Pie" - desc = "A pie containing sweet sweet love... or apple." - icon_state = "applepie" - filling_color = "#E0EDC5" - - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 3 - - -/obj/item/weapon/reagent_containers/food/snacks/cherrypie - name = "Cherry Pie" - desc = "Taste so good, make a grown man cry." - icon_state = "cherrypie" - filling_color = "#FF525A" - - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/twobread - name = "Two Bread" - desc = "It is very bitter and winy." - icon_state = "twobread" - filling_color = "#DBCC9A" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/jellysandwich - name = "Jelly Sandwich" - desc = "You wish you had some peanut butter to go with this..." - icon_state = "jellysandwich" - trash = /obj/item/trash/plate - filling_color = "#9E3A78" - - New() - ..() - reagents.add_reagent("nutriment", 2) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime - New() - ..() - reagents.add_reagent("slimejelly", 5) - -/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry - New() - ..() - reagents.add_reagent("cherryjelly", 5) - -/obj/item/weapon/reagent_containers/food/snacks/boiledslimecore - name = "Boiled Slime Core" - desc = "A boiled red thing." - icon_state = "boiledrorocore" - New() - ..() - reagents.add_reagent("slimejelly", 5) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/mint - name = "mint" - desc = "it is only wafer thin." - icon_state = "mint" - filling_color = "#F2F2F2" - - New() - ..() - reagents.add_reagent("minttoxin", 1) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/mushroomsoup - name = "chantrelle soup" - desc = "A delicious and hearty mushroom soup." - icon_state = "mushroomsoup" - trash = /obj/item/trash/snack_bowl - filling_color = "#E386BF" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit - name = "plump helmet biscuit" - desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour." - icon_state = "phelmbiscuit" - filling_color = "#CFB4C4" - - New() - ..() - if(prob(10)) - name = "exceptional plump helmet biscuit" - desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("omnizine", 5) - bitesize = 2 - else - reagents.add_reagent("nutriment", 5) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/chawanmushi - name = "chawanmushi" - desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat." - icon_state = "chawanmushi" - trash = /obj/item/trash/snack_bowl - filling_color = "#F0F2E4" - - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/beetsoup - name = "beet soup" - desc = "Wait, how do you spell it again..?" - icon_state = "beetsoup" - trash = /obj/item/trash/snack_bowl - filling_color = "#FAC9FF" - - New() - ..() - switch(rand(1,6)) - if(1) - name = "borsch" - if(2) - name = "bortsch" - if(3) - name = "borstch" - if(4) - name = "borsh" - if(5) - name = "borshch" - if(6) - name = "borscht" - reagents.add_reagent("nutriment", 8) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/herbsalad - name = "herb salad" - desc = "A tasty salad with apples on top." - icon_state = "herbsalad" - trash = /obj/item/trash/snack_bowl - filling_color = "#76B87F" - - New() - ..() - reagents.add_reagent("nutriment", 8) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/validsalad - name = "valid salad" - desc = "It's just an herb salad with meatballs and fried potato slices. Nothing suspicious about it." - icon_state = "validsalad" - trash = /obj/item/trash/snack_bowl - filling_color = "#76B87F" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("omnizine", 5) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/appletart - name = "golden apple streusel tart" - desc = "A tasty dessert that won't make it through a metal detector." - icon_state = "gappletart" - trash = /obj/item/trash/plate - filling_color = "#FFFF00" - - New() - ..() - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("gold", 5) - spawn(1) - reagents.del_reagent("egg") - reagents.update_total() - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/dough_ball - name = "ball of raw dough" - desc = "A ball of raw dough, ready to be molded into new recipes." - icon = 'icons/obj/food/food_ingredients.dmi' - icon_state = "dough" - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 - attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W,/obj/item/weapon/kitchen/rollingpin)) - user.visible_message( \ - "[user] flattens the dough with the rolling pin!", \ - "\blue You flatten the dough with your rolling pin!" \ - ) - new /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough(src.loc) - qdel(src) - -/////////////////////////////////////////////////Sliceable//////////////////////////////////////// -// All the food items that can be sliced into smaller bits like Meatbread and Cheesewheels - -// sliceable is just an organization type path, it doesn't have any additional code or variables tied to it. - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough - name = "flattened dough" - desc = "Still raw. You resist the temptation to cover it in tomato sauce." - icon = 'icons/obj/food/food_ingredients.dmi' - icon_state = "flatdough" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice - slices_num = 3 - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/doughslice - name = "slice of dough" - desc = "an individual portion of raw dough, ready to be cooked." - icon = 'icons/obj/food/food_ingredients.dmi' - icon_state = "doughslice" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread - name = "meatbread loaf" - desc = "The culinary base of every self-respecting eloquen/tg/entleman." - icon_state = "meatbread" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice - slices_num = 5 - filling_color = "#FF7575" - New() - ..() - reagents.add_reagent("protein", 20) - reagents.add_reagent("nutriment", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/meatbreadslice - name = "meatbread slice" - desc = "A slice of delicious meatbread." - icon_state = "meatbreadslice" - trash = /obj/item/trash/plate - filling_color = "#FF7575" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/xenomeatbread - name = "xenomeatbread loaf" - desc = "The culinary base of every self-respecting eloquent gentleman. Extra Heretical." - icon_state = "xenomeatbread" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice - slices_num = 5 - filling_color = "#8AFF75" - New() - ..() - reagents.add_reagent("protein", 20) - reagents.add_reagent("nutriment", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice - name = "xenomeatbread slice" - desc = "A slice of delicious meatbread. Extra Heretical." - icon_state = "xenobreadslice" - trash = /obj/item/trash/plate - filling_color = "#8AFF75" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/spidermeatbread - name = "spider meat loaf" - desc = "Reassuringly green meatloaf made from spider meat." - icon_state = "spidermeatbread" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/spidermeatbreadslice - slices_num = 5 - New() - ..() - reagents.add_reagent("protein", 20) - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("toxin", 15) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/spidermeatbreadslice - name = "spider meat bread slice" - desc = "A slice of meatloaf made from an animal that most likely still wants you dead." - icon_state = "xenobreadslice" - trash = /obj/item/trash/plate - bitesize = 2 - New() - ..() - reagents.add_reagent("toxin", 2) - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread - name = "Banana-nut bread" - desc = "A heavenly and filling treat." - icon_state = "bananabread" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/bananabreadslice - slices_num = 5 - filling_color = "#EDE5AD" - New() - ..() - reagents.add_reagent("banana", 20) - reagents.add_reagent("nutriment", 20) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/bananabreadslice - name = "Banana-nut bread slice" - desc = "A slice of delicious banana bread." - icon_state = "bananabreadslice" - trash = /obj/item/trash/plate - filling_color = "#EDE5AD" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread - name = "Tofubread" - icon_state = "Like meatbread but for vegetarians. Not guaranteed to give superpowers." - icon_state = "tofubread" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice - slices_num = 5 - filling_color = "#F7FFE0" - New() - ..() - reagents.add_reagent("nutriment", 30) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/tofubreadslice - name = "Tofubread slice" - desc = "A slice of delicious tofubread." - icon_state = "tofubreadslice" - trash = /obj/item/trash/plate - filling_color = "#F7FFE0" - bitesize = 2 - - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake - name = "Carrot Cake" - desc = "A favorite desert of a certain wascally wabbit. Not a lie." - icon_state = "carrotcake" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice - slices_num = 5 - filling_color = "#FFD675" - New() - ..() - reagents.add_reagent("nutriment", 25) - reagents.add_reagent("oculine", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice - name = "Carrot Cake slice" - desc = "Carrotty slice of Carrot Cake, carrots are good for your eyes! Also not a lie." - icon_state = "carrotcake_slice" - trash = /obj/item/trash/plate - filling_color = "#FFD675" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake - name = "Brain Cake" - desc = "A squishy cake-thing." - icon_state = "braincake" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/braincakeslice - slices_num = 5 - filling_color = "#E6AEDB" - New() - ..() - reagents.add_reagent("protein", 15) - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("mannitol", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/braincakeslice - name = "Brain Cake slice" - desc = "Lemme tell you something about prions. THEY'RE DELICIOUS." - icon_state = "braincakeslice" - trash = /obj/item/trash/plate - filling_color = "#E6AEDB" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake - name = "Cheese Cake" - desc = "DANGEROUSLY cheesy." - icon_state = "cheesecake" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice - slices_num = 5 - filling_color = "#FAF7AF" - New() - ..() - reagents.add_reagent("nutriment", 25) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice - name = "Cheese Cake slice" - desc = "Slice of pure cheestisfaction" - icon_state = "cheesecake_slice" - trash = /obj/item/trash/plate - filling_color = "#FAF7AF" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake - name = "Vanilla Cake" - desc = "A plain cake, not a lie." - icon_state = "plaincake" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice - slices_num = 5 - filling_color = "#F7EDD5" - New() - ..() - reagents.add_reagent("nutriment", 20) - -/obj/item/weapon/reagent_containers/food/snacks/plaincakeslice - name = "Vanilla Cake slice" - desc = "Just a slice of cake, it is enough for everyone." - icon_state = "plaincake_slice" - trash = /obj/item/trash/plate - filling_color = "#F7EDD5" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake - name = "Orange Cake" - desc = "A cake with added orange." - icon_state = "orangecake" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice - slices_num = 5 - filling_color = "#FADA8E" - New() - ..() - reagents.add_reagent("nutriment", 20) - -/obj/item/weapon/reagent_containers/food/snacks/orangecakeslice - name = "Orange Cake slice" - desc = "Just a slice of cake, it is enough for everyone." - icon_state = "orangecake_slice" - trash = /obj/item/trash/plate - filling_color = "#FADA8E" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake - name = "Lime Cake" - desc = "A cake with added lime." - icon_state = "limecake" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/limecakeslice - slices_num = 5 - filling_color = "#CBFA8E" - New() - ..() - reagents.add_reagent("nutriment", 20) - -/obj/item/weapon/reagent_containers/food/snacks/limecakeslice - name = "Lime Cake slice" - desc = "Just a slice of cake, it is enough for everyone." - icon_state = "limecake_slice" - trash = /obj/item/trash/plate - filling_color = "#CBFA8E" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake - name = "Lemon Cake" - desc = "A cake with added lemon." - icon_state = "lemoncake" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice - slices_num = 5 - filling_color = "#FAFA8E" - New() - ..() - reagents.add_reagent("nutriment", 20) - -/obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice - name = "Lemon Cake slice" - desc = "Just a slice of cake, it is enough for everyone." - icon_state = "lemoncake_slice" - trash = /obj/item/trash/plate - filling_color = "#FAFA8E" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake - name = "Chocolate Cake" - desc = "A cake with added chocolate" - icon_state = "chocolatecake" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice - slices_num = 5 - filling_color = "#805930" - New() - ..() - reagents.add_reagent("nutriment", 20) - reagents.add_reagent("chocolate",20) - -/obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice - name = "Chocolate Cake slice" - desc = "Just a slice of cake, it is enough for everyone." - icon_state = "chocolatecake_slice" - trash = /obj/item/trash/plate - filling_color = "#805930" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel - name = "Cheese wheel" - desc = "A big wheel of delcious Cheddar." - icon_state = "cheesewheel" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesewedge - slices_num = 5 - filling_color = "#FFF700" - New() - ..() - reagents.add_reagent("nutriment", 20) - reagents.add_reagent("cheese", 20) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/cheesewedge - name = "Cheese wedge" - desc = "A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far." - icon_state = "cheesewedge" - filling_color = "#FFF700" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/weirdcheesewedge - name = "Weird Cheese" - desc = "Some kind of... gooey, messy, gloopy thing. Similar to cheese, but only in the looser sense of the word." - icon_state = "weirdcheesewedge" - filling_color = "#00FF33" - bitesize = 2 - New() - ..() - reagents.add_reagent("mercury", 5) - reagents.add_reagent("lsd", 5) - reagents.add_reagent("ethanol", 5) - reagents.add_reagent("weird_cheese", 5) - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake - name = "Birthday Cake" - desc = "Happy Birthday..." - icon_state = "birthdaycake" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice - slices_num = 5 - filling_color = "#FFD6D6" - New() - ..() - reagents.add_reagent("nutriment", 20) - reagents.add_reagent("sprinkles", 10) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice - name = "Birthday Cake slice" - desc = "A slice of your birthday" - icon_state = "birthdaycakeslice" - trash = /obj/item/trash/plate - filling_color = "#FFD6D6" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/bread - name = "Bread" - icon_state = "Some plain old Earthen bread." - icon_state = "bread" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice - slices_num = 6 - filling_color = "#FFE396" - - New() - ..() - reagents.add_reagent("nutriment", 6) - spawn(1) - reagents.del_reagent("egg") - reagents.update_total() - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/breadslice - name = "Bread slice" - desc = "A slice of home." - icon_state = "breadslice" - trash = /obj/item/trash/plate - filling_color = "#D27332" - bitesize = 2 - - New() - ..() - reagents.add_reagent("bread", 5) - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread - name = "Cream Cheese Bread" - desc = "Yum yum yum!" - icon_state = "creamcheesebread" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice - slices_num = 5 - filling_color = "#FFF896" - New() - ..() - reagents.add_reagent("nutriment", 20) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice - name = "Cream Cheese Bread slice" - desc = "A slice of yum!" - icon_state = "creamcheesebreadslice" - trash = /obj/item/trash/plate - filling_color = "#FFF896" - bitesize = 2 - - -/obj/item/weapon/reagent_containers/food/snacks/watermelonslice - name = "Watermelon Slice" - desc = "A slice of watery goodness." - icon_state = "watermelonslice" - filling_color = "#FF3867" - bitesize = 2 - - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake - name = "Apple Cake" - desc = "A cake centred with Apple" - icon_state = "applecake" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/applecakeslice - slices_num = 5 - filling_color = "#EBF5B8" - New() - ..() - reagents.add_reagent("nutriment", 15) - -/obj/item/weapon/reagent_containers/food/snacks/applecakeslice - name = "Apple Cake slice" - desc = "A slice of heavenly cake." - icon_state = "applecakeslice" - trash = /obj/item/trash/plate - filling_color = "#EBF5B8" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie - name = "Pumpkin Pie" - desc = "A delicious treat for the autumn months." - icon_state = "pumpkinpie" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice - slices_num = 5 - filling_color = "#F5B951" - - New() - ..() - reagents.add_reagent("nutriment", 15) - -/obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice - name = "Pumpkin Pie slice" - desc = "A slice of pumpkin pie, with whipped cream on top. Perfection." - icon_state = "pumpkinpieslice" - trash = /obj/item/trash/plate - filling_color = "#F5B951" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/cracker - name = "Cracker" - desc = "It's a salted cracker." - icon_state = "cracker" - filling_color = "#F5DEB8" - - New() - ..() - reagents.add_reagent("nutriment", 1) - -/obj/item/weapon/reagent_containers/food/snacks/rawcutlet - name = "raw cutlet" - desc = "A thin piece of raw meat." - icon = 'icons/obj/food/food_ingredients.dmi' - icon_state = "rawcutlet" - bitesize = 1 - New() - ..() - reagents.add_reagent("protein", 1) - attackby(obj/item/weapon/W, mob/user, params) - if(istype(W,/obj/item/weapon/kitchen/knife)) - user.visible_message( \ - "[user] cuts the raw cutlet with the knife!", \ - "You cut the raw cutlet with your knife!" \ - ) - new /obj/item/weapon/reagent_containers/food/snacks/raw_bacon(src.loc) - qdel(src) - - -/////////////////////////////////////////////////PIZZA//////////////////////////////////////// - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza - slices_num = 6 - filling_color = "#BAA14C" - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita - name = "Margherita" - desc = "The golden standard of pizzas." - icon_state = "pizzamargherita" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/margheritaslice - slices_num = 6 - New() - ..() - reagents.add_reagent("nutriment", 40) - reagents.add_reagent("tomatojuice", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/margheritaslice - name = "Margherita slice" - desc = "A slice of the classic pizza." - icon_state = "pizzamargheritaslice" - filling_color = "#BAA14C" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza - name = "Meatpizza" - desc = "A pizza with meat topping." - icon_state = "meatpizza" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice - slices_num = 6 - New() - ..() - reagents.add_reagent("protein", 30) - reagents.add_reagent("nutriment", 20) - reagents.add_reagent("tomatojuice", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice - name = "Meatpizza slice" - desc = "A slice of a meaty pizza." - icon_state = "meatpizzaslice" - filling_color = "#BAA14C" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza - name = "Mushroompizza" - desc = "Very special pizza" - icon_state = "mushroompizza" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice - slices_num = 6 - New() - ..() - reagents.add_reagent("plantmatter", 25) - reagents.add_reagent("nutriment", 10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice - name = "Mushroompizza slice" - desc = "Maybe it is the last slice of pizza in your life." - icon_state = "mushroompizzaslice" - filling_color = "#BAA14C" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza - name = "Vegetable pizza" - desc = "No one of Tomato Sapiens were harmed during making this pizza" - icon_state = "vegetablepizza" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice - slices_num = 6 - New() - ..() - reagents.add_reagent("plantmatter", 20) - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("tomatojuice", 6) - reagents.add_reagent("oculine", 12) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice - name = "Vegetable pizza slice" - desc = "A slice of the most green pizza of all pizzas not containing green ingredients " - icon_state = "vegetablepizzaslice" - filling_color = "#BAA14C" - bitesize = 2 - -/obj/item/pizzabox - name = "pizza box" - desc = "A box suited for pizzas." - icon = 'icons/obj/food/food.dmi' - icon_state = "pizzabox1" - - var/open = 0 // Is the box open? - var/ismessy = 0 // Fancy mess on the lid - var/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/pizza // Content pizza - var/list/boxes = list() // If the boxes are stacked, they come here - var/boxtag = "" - -/obj/item/pizzabox/update_icon() - - overlays = list() - - // Set appropriate description - if( open && pizza ) - desc = "A box suited for pizzas. It appears to have a [pizza.name] inside." - else if( boxes.len > 0 ) - desc = "A pile of boxes suited for pizzas. There appears to be [boxes.len + 1] boxes in the pile." - - var/obj/item/pizzabox/topbox = boxes[boxes.len] - var/toptag = topbox.boxtag - if( toptag != "" ) - desc = "[desc] The box on top has a tag, it reads: '[toptag]'." - else - desc = "A box suited for pizzas." - - if( boxtag != "" ) - desc = "[desc] The box has a tag, it reads: '[boxtag]'." - - // Icon states and overlays - if( open ) - if( ismessy ) - icon_state = "pizzabox_messy" - else - icon_state = "pizzabox_open" - - if( pizza ) - var/image/pizzaimg = image("food/food.dmi", icon_state = pizza.icon_state) - pizzaimg.pixel_y = -3 - overlays += pizzaimg - - return - else - // Stupid code because byondcode sucks - var/doimgtag = 0 - if( boxes.len > 0 ) - var/obj/item/pizzabox/topbox = boxes[boxes.len] - if( topbox.boxtag != "" ) - doimgtag = 1 - else - if( boxtag != "" ) - doimgtag = 1 - - if( doimgtag ) - var/image/tagimg = image("food/food.dmi", icon_state = "pizzabox_tag") - tagimg.pixel_y = boxes.len * 3 - overlays += tagimg - - icon_state = "pizzabox[boxes.len+1]" - -/obj/item/pizzabox/attack_hand( mob/user as mob ) - - if( open && pizza ) - user.put_in_hands( pizza ) - - to_chat(user, "\red You take the [src.pizza] out of the [src].") - src.pizza = null - update_icon() - return - - if( boxes.len > 0 ) - if( user.get_inactive_hand() != src ) - ..() - return - - var/obj/item/pizzabox/box = boxes[boxes.len] - boxes -= box - - user.put_in_hands( box ) - to_chat(user, "\red You remove the topmost [src] from your hand.") - box.update_icon() - update_icon() - return - ..() - -/obj/item/pizzabox/attack_self( mob/user as mob ) - - if( boxes.len > 0 ) - return - - open = !open - - if( open && pizza ) - ismessy = 1 - - update_icon() - -/obj/item/pizzabox/attackby( obj/item/I as obj, mob/user as mob , params) - if( istype(I, /obj/item/pizzabox/) ) - var/obj/item/pizzabox/box = I - - if( !box.open && !src.open ) - // Make a list of all boxes to be added - var/list/boxestoadd = list() - boxestoadd += box - for(var/obj/item/pizzabox/i in box.boxes) - boxestoadd += i - - if( (boxes.len+1) + boxestoadd.len <= 5 ) - user.drop_item() - - box.loc = src - box.boxes = list() // Clear the box boxes so we don't have boxes inside boxes. - Xzibit - src.boxes.Add( boxestoadd ) - - box.update_icon() - update_icon() - - to_chat(user, "\red You put the [box] ontop of the [src]!") - else - to_chat(user, "\red The stack is too high!") - else - to_chat(user, "\red Close the [box] first!") - - return - - if( istype(I, /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/) ) // Long ass fucking object name - - if( src.open ) - user.drop_item() - I.loc = src - src.pizza = I - - update_icon() - - to_chat(user, "\red You put the [I] in the [src]!") - else - to_chat(user, "\red You try to push the [I] through the lid but it doesn't work!") - return - - if( istype(I, /obj/item/weapon/pen/) ) - - if( src.open ) - return - - var/t = input("Enter what you want to add to the tag:", "Write", null, null) as text - - var/obj/item/pizzabox/boxtotagto = src - if( boxes.len > 0 ) - boxtotagto = boxes[boxes.len] - - boxtotagto.boxtag = copytext("[boxtotagto.boxtag][t]", 1, 30) - - update_icon() - return - ..() - -/obj/item/pizzabox/margherita/New() - pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita(src) - boxtag = "Margherita Deluxe" - -/obj/item/pizzabox/vegetable/New() - pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza(src) - boxtag = "Gourmet Vegatable" - -/obj/item/pizzabox/mushroom/New() - pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza(src) - boxtag = "Mushroom Special" - -/obj/item/pizzabox/meat/New() - pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza(src) - boxtag = "Meatlover's Supreme" - -////////////////////////////////FOOD ADDITIONS//////////////////////////////////////////// - -/obj/item/weapon/reagent_containers/food/snacks/wrap - name = "egg wrap" - desc = "The precursor to Pigs in a Blanket." - icon_state = "wrap" - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/beans - name = "tin of beans" - desc = "Musical fruit in a slightly less musical container." - icon_state = "beans" - New() - ..() - reagents.add_reagent("nutriment", 10) - reagents.add_reagent("beans",10) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/benedict - name = "eggs benedict" - desc = "There is only one egg on this, how rude." - icon_state = "benedict" - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("egg", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/hotdog - name = "hotdog" - desc = "Fresh footlong ready to go down on." - icon_state = "hotdog" - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("ketchup", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/meatbun - name = "meat bun" - desc = "Has the potential to not be Dog." - icon_state = "meatbun" - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 6 - -/obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich - name = "icecream sandwich" - desc = "Portable Ice-cream in it's own packaging." - icon_state = "icecreamsandwich" - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("ice", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/notasandwich - name = "not-a-sandwich" - desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache." - icon_state = "notasandwich" - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sugarcookie - name = "sugar cookie" - desc = "Just like your little sister used to make." - icon_state = "sugarcookie" - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sugar", 5) - spawn(1) - reagents.del_reagent("egg") - reagents.update_total() - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/friedbanana - name = "Fried Banana" - desc = "Goreng Pisang, also known as fried bananas." - icon_state = "friedbanana" - New() - ..() - reagents.add_reagent("sugar", 5) - reagents.add_reagent("nutriment", 8) - reagents.add_reagent("cornoil", 4) - -/obj/item/weapon/reagent_containers/food/snacks/tofurkey - name = "Tofurkey" - desc = "A fake turkey made from tofu." - icon_state = "tofurkey" - New() - ..() - reagents.add_reagent("nutriment", 12) - reagents.add_reagent("ether", 3) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/stuffing - name = "Stuffing" - desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!" - icon_state = "stuffing" - New() - ..() - reagents.add_reagent("nutriment", 3) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/dionaroast - name = "roast diona" - desc = "It's like an enormous, leathery carrot. With an eye." - icon_state = "dionaroast" - trash = /obj/item/trash/plate - filling_color = "#75754B" - - New() - ..() - reagents.add_reagent("plantmatter", 4) - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("radium", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/boiledspiderleg - name = "boiled spider leg" - desc = "A giant spider's leg that's still twitching after being cooked. Gross!" - icon_state = "spiderlegcooked" - trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 3) - reagents.add_reagent("toxin", 2) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/spidereggs - name = "spider eggs" - desc = "A cluster of juicy spider eggs. A great side dish for when you care not for your health." - icon_state = "spidereggs" - New() - ..() - reagents.add_reagent("protein", 2) - reagents.add_reagent("toxin", 3) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/spidereggsham - name = "green eggs and ham" - desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?" - icon_state = "spidereggsham" - trash = /obj/item/trash/plate - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("toxin", 3) - bitesize = 4 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/turkey - name = "Turkey" - desc = "A traditional turkey served with stuffing." - icon_state = "turkey" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/turkeyslice - slices_num = 6 - New() - ..() - reagents.add_reagent("protein", 24) - reagents.add_reagent("nutriment", 18) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/turkeyslice - name = "turkey serving" - desc = "A serving of some tender and delicious turkey." - icon_state = "turkeyslice" - trash = /obj/item/trash/plate - filling_color = "#B97A57" - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/mashed_potatoes //mashed taters - name = "mashed potatoes" - desc = "Some sot creamy, and irresistible mashed potatoes." - icon_state = "mashedtaters" - trash = /obj/item/trash/plate - filling_color = "#D6D9C1" - bitesize = 2 - - New() - ..() - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("gravy", 5) - reagents.add_reagent("mashedpotatoes", 10) - bitesize = 2 - -////////////////////////////////ICE CREAM/////////////////////////////////// -/obj/item/weapon/reagent_containers/food/snacks/icecream - name = "ice cream" - desc = "Delicious ice cream." - icon = 'icons/obj/kitchen.dmi' - icon_state = "icecream_cone" - New() - ..() - reagents.add_reagent("nutriment", 1) - reagents.add_reagent("sugar",1) - bitesize = 1 - update_icon() - - update_icon() - overlays.Cut() - var/image/filling = image('icons/obj/kitchen.dmi', src, "icecream_color") - filling.icon += mix_color_from_reagents(reagents.reagent_list) - overlays += filling - -/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcone - name = "ice cream cone" - desc = "Delicious ice cream." - icon_state = "icecream_cone" - volume = 50 - New() - ..() - reagents.add_reagent("nutriment", 2) - reagents.add_reagent("sugar",6) - reagents.add_reagent("ice",2) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcup - name = "chocolate ice cream cone" - desc = "Delicious ice cream." - icon_state = "icecream_cup" - volume = 50 - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("chocolate",8) - reagents.add_reagent("ice",2) - bitesize = 6 - -/obj/item/weapon/reagent_containers/food/snacks/cereal - name = "box of cereal" - desc = "A box of cereal." - icon = 'icons/obj/food/food.dmi' - icon_state = "cereal_box" - bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 3) -/obj/item/weapon/reagent_containers/food/snacks/deepfryholder - name = "Deep Fried Foods Holder Obj" - desc = "If you can see this description the code for the deep fryer fucked up." - icon = 'icons/obj/food/food.dmi' - icon_state = "deepfried_holder_icon" - bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 3) - -/obj/item/weapon/reagent_containers/food/snacks/dough - name = "dough" - desc = "A piece of dough." - icon = 'icons/obj/food/food_ingredients.dmi' - icon_state = "dough" - bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 3) - -// Dough + rolling pin = flat dough -/obj/item/weapon/reagent_containers/food/snacks/dough/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/kitchen/rollingpin)) - if(isturf(loc)) - new /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough(loc) - to_chat(user, "You flatten [src].") - qdel(src) - else - to_chat(user, "You need to put [src] on a surface to roll it out!") - else - ..() - -// slicable into 3xdoughslices -/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough - name = "flat dough" - desc = "Some flattened dough." - icon = 'icons/obj/food/food_ingredients.dmi' - icon_state = "flat dough" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice - slices_num = 3 - New() - ..() - reagents.add_reagent("nutriment", 3) - -/obj/item/weapon/reagent_containers/food/snacks/doughslice - name = "dough slice" - desc = "The building block of an impressive dish." - icon = 'icons/obj/food/food_ingredients.dmi' - icon_state = "doughslice" - bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 1) - -/obj/item/weapon/reagent_containers/food/snacks/bun - name = "bun" - desc = "The base for any self-respecting burger." - icon = 'icons/obj/food/food_ingredients.dmi' - icon_state = "bun" - bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 4) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/taco - name = "taco" - desc = "Take a bite!" - icon_state = "taco" - bitesize = 3 - New() - ..() - reagents.add_reagent("nutriment", 7) - -/obj/item/weapon/reagent_containers/food/snacks/cutlet - name = "cutlet" - desc = "A tasty meat slice." - icon = 'icons/obj/food/food_ingredients.dmi' - icon_state = "cutlet" - bitesize = 2 - New() - ..() - reagents.add_reagent("protein", 2) - -/obj/item/weapon/reagent_containers/food/snacks/rawmeatball - name = "raw meatball" - desc = "A raw meatball." - icon = 'icons/obj/food/food_ingredients.dmi' - icon_state = "rawmeatball" - bitesize = 2 - New() - ..() - reagents.add_reagent("protein", 2) - -/obj/item/weapon/reagent_containers/food/snacks/hotdog - name = "hotdog" - desc = "Unrelated to dogs, maybe." - icon_state = "hotdog" - bitesize = 2 - New() - ..() - reagents.add_reagent("protein", 6) - -/obj/item/weapon/reagent_containers/food/snacks/flatbread - name = "flatbread" - desc = "Bland but filling." - icon = 'icons/obj/food/food_ingredients.dmi' - icon_state = "flatbread" - bitesize = 2 - New() - ..() - reagents.add_reagent("nutriment", 3) - -/obj/item/weapon/reagent_containers/food/snacks/rawsticks - name = "raw potato sticks" - desc = "Raw fries, not very tasty." - icon = 'icons/obj/food/food_ingredients.dmi' - icon_state = "rawsticks" - bitesize = 2 - New() - ..() - reagents.add_reagent("plantmatter", 3) - -/obj/item/weapon/reagent_containers/food/snacks/ectoplasm - name = "ectoplasm" - desc = "A luminescent blob of what scientists refer to as 'ghost goo'." - icon = 'icons/obj/wizard.dmi' - icon_state = "ectoplasm" - New() - ..() - reagents.add_reagent("ectoplasm", 10) - -/obj/item/weapon/reagent_containers/food/snacks/liquidfood - name = "\improper LiquidFood Ration" - desc = "A prepackaged grey slurry of all the essential nutrients for a spacefarer on the go. Should this be crunchy?" - icon_state = "liquidfood" - trash = /obj/item/trash/liquidfood - filling_color = "#A8A8A8" - - New() - ..() - reagents.add_reagent("nutriment", 20) - reagents.add_reagent("iron", 3) - bitesize = 4 - - -/obj/item/weapon/reagent_containers/food/snacks/tastybread - name = "bread tube" - desc = "Bread in a tube. Chewy...and surprisingly tasty." - icon_state = "tastybread" - trash = /obj/item/trash/tastybread - filling_color = "#A66829" - - New() - ..() - reagents.add_reagent("nutriment", 6) - bitesize = 2 +//Food items that are eaten normally and don't leave anything behind. +/obj/item/weapon/reagent_containers/food/snacks + name = "snack" + desc = "yummy" + icon = 'icons/obj/food/food.dmi' + icon_state = null + bitesize = 1 + var/bitecount = 0 + var/trash = null + var/slice_path + var/slices_num + var/eatverb + var/wrapped = 0 + var/dried_type = null + var/cooktype[0] + + + //Placeholder for effect that trigger on eating that aren't tied to reagents. +/obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume(mob/M, mob/user) + if(!user) + return + spawn(0) + if(!reagents.total_volume) + if(M == user) + to_chat(user, "You finish eating \the [src].") + user.visible_message("[user] finishes eating \the [src].") + user.unEquip(src) //so icons update :[ + Post_Consume(M) + if(trash) + if(ispath(trash,/obj/item)) + var/obj/item/TrashItem = new trash(user) + user.put_in_hands(TrashItem) + else if(istype(trash,/obj/item)) + user.put_in_hands(trash) + qdel(src) + return + +/obj/item/weapon/reagent_containers/food/snacks/proc/Post_Consume(mob/living/M) + return + +/obj/item/weapon/reagent_containers/food/snacks/attack_self(mob/user as mob) + return + +/obj/item/weapon/reagent_containers/food/snacks/attack(mob/M as mob, mob/user as mob, def_zone) + if(reagents && !reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it. + to_chat(user, "None of [src] left, oh no!") + M.unEquip(src) //so icons update :[ + qdel(src) + return 0 + + if(istype(M, /mob/living/carbon)) + var/mob/living/carbon/C = M + if(C.eat(src, user)) + bitecount++ + On_Consume(C, user) + return 1 + return 0 + +/obj/item/weapon/reagent_containers/food/snacks/afterattack(obj/target, mob/user, proximity) + return + +/obj/item/weapon/reagent_containers/food/snacks/examine(mob/user) + if(..(user, 0)) + if(bitecount==0) + return + else if(bitecount==1) + to_chat(user, "\blue \The [src] was bitten by someone!") + else if(bitecount<=3) + to_chat(user, "\blue \The [src] was bitten [bitecount] times!") + else + to_chat(user, "\blue \The [src] was bitten multiple times!") + + +/obj/item/weapon/reagent_containers/food/snacks/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W,/obj/item/weapon/pen)) + var/n_name = sanitize(copytext(input(usr, "What would you like to name this dish?", "Food Renaming", null) as text, 1, MAX_NAME_LEN)) + if((loc == usr && usr.stat == 0)) + name = "[n_name]" + return + if(istype(W,/obj/item/weapon/storage)) + ..() // -> item/attackby(, params) + + if(istype(W,/obj/item/weapon/kitchen/utensil)) + + var/obj/item/weapon/kitchen/utensil/U = W + + if(U.contents.len >= U.max_contents) + to_chat(user, "You cannot fit anything else on your [U].") + return + + user.visible_message( \ + "[user] scoops up some [src] with \the [U]!", \ + "You scoop up some [src] with \the [U]!" \ + ) + + src.bitecount++ + U.overlays.Cut() + var/image/I = new(U.icon, "loadedfood") + I.color = src.filling_color + U.overlays += I + + var/obj/item/weapon/reagent_containers/food/snacks/collected = new type + collected.loc = U + collected.reagents.remove_any(collected.reagents.total_volume) + collected.trash = null + if(reagents.total_volume > bitesize) + reagents.trans_to(collected, bitesize) + else + reagents.trans_to(collected, reagents.total_volume) + if(trash) + var/obj/item/TrashItem + if(ispath(trash,/obj/item)) + TrashItem = new trash(src) + else if(istype(trash,/obj/item)) + TrashItem = trash + TrashItem.forceMove(loc) + qdel(src) + return 1 + + if((slices_num <= 0 || !slices_num) || !slice_path) + return 0 + + var/inaccurate = 0 + if( \ + istype(W, /obj/item/weapon/kitchen/knife) || \ + istype(W, /obj/item/weapon/scalpel) \ + ) + else if( \ + istype(W, /obj/item/weapon/circular_saw) || \ + istype(W, /obj/item/weapon/melee/energy/sword/saber) && W:active || \ + istype(W, /obj/item/weapon/melee/energy/blade) || \ + istype(W, /obj/item/weapon/shovel) || \ + istype(W, /obj/item/weapon/hatchet) \ + ) + inaccurate = 1 + else if(W.w_class <= 2 && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable)) + if(!iscarbon(user)) + return 1 + to_chat(user, "\red You slip [W] inside [src].") + user.unEquip(W) + if((user.client && user.s_active != src)) + user.client.screen -= W + W.dropped(user) + add_fingerprint(user) + contents += W + return + else + return 1 + if( \ + !isturf(src.loc) || \ + !(locate(/obj/structure/table) in src.loc) && \ + !(locate(/obj/machinery/optable) in src.loc) && \ + !(locate(/obj/item/weapon/storage/bag/tray) in src.loc) \ + ) + to_chat(user, "\red You cannot slice [src] here! You need a table or at least a tray to do it.") + return 1 + var/slices_lost = 0 + if(!inaccurate) + user.visible_message( \ + "\blue [user] slices \the [src]!", \ + "\blue You slice \the [src]!" \ + ) + else + user.visible_message( \ + "\blue [user] crudely slices \the [src] with [W]!", \ + "\blue You crudely slice \the [src] with your [W]!" \ + ) + slices_lost = rand(1,min(1,round(slices_num/2))) + var/reagents_per_slice = reagents.total_volume/slices_num + for(var/i=1 to (slices_num-slices_lost)) + var/obj/slice = new slice_path (src.loc) + reagents.trans_to(slice,reagents_per_slice) + qdel(src) + + return + +/obj/item/weapon/reagent_containers/food/snacks/Destroy() + if(contents) + for(var/atom/movable/something in contents) + something.loc = get_turf(src) + return ..() + +/obj/item/weapon/reagent_containers/food/snacks/attack_animal(mob/M) + if(isanimal(M)) + M.changeNext_move(CLICK_CD_MELEE) + if(iscorgi(M)) + if(bitecount >= 4) + M.visible_message("[M] [pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [src] was")].","You swallow up the last part of \the [src].") + playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) + var/mob/living/simple_animal/pet/corgi/C = M + C.adjustBruteLoss(-5) + C.adjustFireLoss(-5) + qdel(src) + else + M.visible_message("[M] takes a bite of \the [src].","You take a bite of \the [src].") + playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) + bitecount++ + else if(ismouse(M)) + var/mob/living/simple_animal/mouse/N = M + to_chat(N, text("\blue You nibble away at [src].")) + if(prob(50)) + N.visible_message("[N] nibbles away at [src].", "") + //N.emote("nibbles away at the [src]") + N.adjustBruteLoss(-1) + N.adjustFireLoss(-1) + + +//////////////////////////////////////////////////////////////////////////////// +/// FOOD END +//////////////////////////////////////////////////////////////////////////////// + + + + + + + + + + + +////////////////////////////////////////////////// +////////////////////////////////////////////Snacks +////////////////////////////////////////////////// +//Items in the "Snacks" subcategory are food items that people actually eat. The key points are that they are created +// already filled with reagents and are destroyed when empty. Additionally, they make a "munching" noise when eaten. + +//Notes by Darem: Food in the "snacks" subtype can hold a maximum of 50 units Generally speaking, you don't want to go over 40 +// total for the item because you want to leave space for extra condiments. If you want effect besides healing, add a reagent for +// it. Try to stick to existing reagents when possible (so if you want a stronger healing effect, just use Tricordrazine). On use +// effect (such as the old officer eating a donut code) requires a unique reagent (unless you can figure out a better way). + +//The nutriment reagent and bitesize variable replace the old heal_amt and amount variables. Each unit of nutriment is equal to +// 2 of the old heal_amt variable. Bitesize is the rate at which the reagents are consumed. So if you have 6 nutriment and a +// bitesize of 2, then it'll take 3 bites to eat. Unlike the old system, the contained reagents are evenly spread among all +// the bites. No more contained reagents = no more bites. + +//Here is an example of the new formatting for anyone who wants to add more food items. +///obj/item/weapon/reagent_containers/food/snacks/xenoburger //Identification path for the object. +// name = "Xenoburger" //Name that displays in the UI. +// desc = "Smells caustic. Tastes like heresy." //Duh +// icon_state = "xburger" //Refers to an icon in food/food.dmi +// New() //Don't mess with this. +// ..() //Same here. +// reagents.add_reagent("xenomicrobes", 10) //This is what is in the food item. you may copy/paste +// reagents.add_reagent("nutriment", 2) // this line of code for all the contents. +// bitesize = 3 //This is the amount each bite consumes. + + + + +/obj/item/weapon/reagent_containers/food/snacks/aesirsalad + name = "Aesir salad" + desc = "Probably too incredible for mortal men to fully enjoy." + icon_state = "aesirsalad" + trash = /obj/item/trash/snack_bowl + filling_color = "#468C00" + + New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("omnizine", 8) + bitesize = 3 + +/* +/obj/item/weapon/reagent_containers/food/snacks/candy + name = "candy" + desc = "Nougat, love it or hate it." + icon_state = "candy" + trash = /obj/item/trash/candy + filling_color = "#7D5F46" + + New() + ..() + reagents.add_reagent("nutriment", 1) + reagents.add_reagent("sugar", 3) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/candy/donor + name = "Donor Candy" + desc = "A little treat for blood donors." + trash = /obj/item/trash/candy + New() + ..() + reagents.add_reagent("nutriment", 10) + reagents.add_reagent("sugar", 3) + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/candy_corn + name = "candy corn" + desc = "It's a handful of candy corn. Cannot be stored in a detective's hat, alas." + icon_state = "candy_corn" + filling_color = "#FFFCB0" + + New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("sugar", 2) + bitesize = 2 +*/ + +/obj/item/weapon/reagent_containers/food/snacks/chips + name = "chips" + desc = "Commander Riker's What-The-Crisps" + icon_state = "chips" + trash = /obj/item/trash/chips + filling_color = "#E8C31E" + + New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sodiumchloride", 1) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/cornchips + name = "corn chips" + desc = "Goes great with salsa! OLE!" + icon_state = "chips" + trash = /obj/item/trash/chips + filling_color = "#E8C31E" + + New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/cookie + name = "cookie" + desc = "COOKIE!!!" + icon_state = "COOKIE!!!" + filling_color = "#DBC94F" + + New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/chocolatebar + name = "Chocolate Bar" + desc = "Such sweet, fattening food." + icon_state = "chocolatebar" + filling_color = "#7D5F46" + + New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("chocolate",4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/choc_pile //for reagent chocolate being spilled on turfs + name = "Pile of Chocolate" + desc = "A pile of pure chocolate pieces." + icon_state = "cocoa" + filling_color = "#7D5F46" + + New() + ..() + reagents.add_reagent("chocolate",5) //no longer can be used to generate the reagent infinitely + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/chocolateegg + name = "Chocolate Egg" + desc = "Such sweet, fattening food." + icon_state = "chocolateegg" + filling_color = "#7D5F46" + + New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("chocolate",4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/donut + name = "donut" + desc = "Goes great with Robust Coffee." + icon_state = "donut1" + filling_color = "#D9C386" + +/obj/item/weapon/reagent_containers/food/snacks/donut/normal + name = "donut" + desc = "Goes great with Robust Coffee." + icon_state = "donut1" + New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + src.bitesize = 3 + if(prob(30)) + src.icon_state = "donut2" + src.name = "frosted donut" + reagents.add_reagent("sprinkles", 2) + +/obj/item/weapon/reagent_containers/food/snacks/donut/sprinkles + name = "frosted donut" + icon_state = "donut2" + New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 3) + +/obj/item/weapon/reagent_containers/food/snacks/donut/chaos + name = "Chaos Donut" + desc = "Like life, it never quite tastes the same." + icon_state = "donut1" + filling_color = "#ED11E6" + + New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("sprinkles", 1) + bitesize = 10 + var/chaosselect = pick(1,2,3,4,5,6,7,8,9,10) + switch(chaosselect) + if(1) + reagents.add_reagent("nutriment", 3) + if(2) + reagents.add_reagent("capsaicin", 3) + if(3) + reagents.add_reagent("frostoil", 3) + if(4) + reagents.add_reagent("sprinkles", 3) + if(5) + reagents.add_reagent("plasma", 3) + if(6) + reagents.add_reagent("chocolate", 3) + if(7) + reagents.add_reagent("slimejelly", 3) + if(8) + reagents.add_reagent("banana", 3) + if(9) + reagents.add_reagent("berryjuice", 3) + if(10) + reagents.add_reagent("omnizine", 3) + if(prob(30)) + src.icon_state = "donut2" + src.name = "Frosted Chaos Donut" + reagents.add_reagent("sprinkles", 2) + + +/obj/item/weapon/reagent_containers/food/snacks/donut/jelly + name = "Jelly Donut" + desc = "You jelly?" + icon_state = "jdonut1" + filling_color = "#ED1169" + + New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + reagents.add_reagent("berryjuice", 5) + bitesize = 5 + if(prob(30)) + src.icon_state = "jdonut2" + src.name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) + +/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly + name = "Jelly Donut" + desc = "You jelly?" + icon_state = "jdonut1" + filling_color = "#ED1169" + + New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + reagents.add_reagent("slimejelly", 5) + bitesize = 5 + if(prob(30)) + src.icon_state = "jdonut2" + src.name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) + +/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly + name = "Jelly Donut" + desc = "You jelly?" + icon_state = "jdonut1" + filling_color = "#ED1169" + + New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("sprinkles", 1) + reagents.add_reagent("cherryjelly", 5) + bitesize = 5 + if(prob(30)) + src.icon_state = "jdonut2" + src.name = "Frosted Jelly Donut" + reagents.add_reagent("sprinkles", 2) + +/obj/item/weapon/reagent_containers/food/snacks/egg + name = "egg" + desc = "An egg!" + icon_state = "egg" + filling_color = "#FDFFD1" + + New() + ..() + reagents.add_reagent("protein", 1) + reagents.add_reagent("egg", 5) + + throw_impact(atom/hit_atom) + ..() + var/turf/T = get_turf(hit_atom) + new/obj/effect/decal/cleanable/egg_smudge(T) + if(reagents) + reagents.reaction(hit_atom, TOUCH) + qdel(src) + + attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(istype( W, /obj/item/toy/crayon )) + var/obj/item/toy/crayon/C = W + var/clr = C.colourName + + if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) + to_chat(usr, "\blue The egg refuses to take on this color!") + return + + to_chat(usr, "\blue You color \the [src] [clr]") + icon_state = "egg-[clr]" + item_color = clr + else + ..() + +/obj/item/weapon/reagent_containers/food/snacks/egg/blue + icon_state = "egg-blue" + item_color = "blue" + +/obj/item/weapon/reagent_containers/food/snacks/egg/green + icon_state = "egg-green" + item_color = "green" + +/obj/item/weapon/reagent_containers/food/snacks/egg/mime + icon_state = "egg-mime" + item_color = "mime" + +/obj/item/weapon/reagent_containers/food/snacks/egg/orange + icon_state = "egg-orange" + item_color = "orange" + +/obj/item/weapon/reagent_containers/food/snacks/egg/purple + icon_state = "egg-purple" + item_color = "purple" + +/obj/item/weapon/reagent_containers/food/snacks/egg/rainbow + icon_state = "egg-rainbow" + item_color = "rainbow" + +/obj/item/weapon/reagent_containers/food/snacks/egg/red + icon_state = "egg-red" + item_color = "red" + +/obj/item/weapon/reagent_containers/food/snacks/egg/yellow + icon_state = "egg-yellow" + item_color = "yellow" + +/obj/item/weapon/reagent_containers/food/snacks/friedegg + name = "Fried egg" + desc = "A fried egg, with a touch of salt and pepper." + icon_state = "friedegg" + filling_color = "#FFDF78" + + New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("egg", 5) + reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("blackpepper", 1) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/boiledegg + name = "Boiled egg" + desc = "A hard boiled egg." + icon_state = "egg" + filling_color = "#FFFFFF" + + New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("egg", 5) + +/obj/item/weapon/reagent_containers/food/snacks/organ + + name = "organ" + desc = "It's good for you." + icon = 'icons/obj/surgery.dmi' + icon_state = "appendix" + filling_color = "#E00D34" + + New() + ..() + reagents.add_reagent("protein", 4) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/appendix +//yes, this is the same as meat. I might do something different in future + name = "appendix" + desc = "An appendix which looks perfectly healthy." + icon = 'icons/obj/surgery.dmi' + icon_state = "appendix" + filling_color = "#E00D34" + + New() + ..() + reagents.add_reagent("protein", 3) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed + name = "inflamed appendix" + desc = "An appendix which appears to be inflamed." + icon_state = "appendixinflamed" + filling_color = "#E00D7A" + +/obj/item/weapon/reagent_containers/food/snacks/tofu + name = "Tofu" + icon_state = "tofu" + desc = "We all love tofu." + filling_color = "#FFFEE0" + + New() + ..() + reagents.add_reagent("plantmatter", 3) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/fried_tofu + name = "Fried Tofu" + icon_state = "tofu" + desc = "Proof that even vegetarians crave unhealthy foods." + filling_color = "#FFFEE0" + + New() + ..() + reagents.add_reagent("nutriment", 3) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/tofurkey + name = "Tofurkey" + desc = "A fake turkey made from tofu." + icon_state = "tofurkey" + filling_color = "#FFFEE0" + + New() + ..() + reagents.add_reagent("nutriment", 12) + reagents.add_reagent("ether", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/stuffing + name = "Stuffing" + desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!" + icon_state = "stuffing" + filling_color = "#C9AC83" + + New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice + name = "huge mushroom slice" + desc = "A slice from a huge mushroom." + icon_state = "hugemushroomslice" + filling_color = "#E0D7C5" + + New() + ..() + reagents.add_reagent("plantmatter", 3) + reagents.add_reagent("psilocybin", 3) + src.bitesize = 6 + +/obj/item/weapon/reagent_containers/food/snacks/tomatomeat + name = "tomato slice" + desc = "A slice from a huge tomato" + icon_state = "tomatomeat" + filling_color = "#DB0000" + + New() + ..() + reagents.add_reagent("protein", 3) + src.bitesize = 6 + +/obj/item/weapon/reagent_containers/food/snacks/bearmeat + name = "bear meat" + desc = "A very manly slab of meat." + icon_state = "bearmeat" + filling_color = "#DB0000" + + New() + ..() + reagents.add_reagent("protein", 12) + reagents.add_reagent("methamphetamine", 5) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/xenomeat + name = "meat" + desc = "A slab of meat" + icon_state = "xenomeat" + filling_color = "#43DE18" + + New() + ..() + reagents.add_reagent("protein", 3) + src.bitesize = 6 + +/obj/item/weapon/reagent_containers/food/snacks/spidermeat + name = "spider meat" + desc = "A slab of spider meat." + icon_state = "spidermeat" + New() + ..() + reagents.add_reagent("protein", 3) + reagents.add_reagent("toxin", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/lizardmeat + name = "mutant lizard meat" + desc = "Seems to be a slab of meat from some mutant lizard thing?" + icon_state = "xenomeat" + filling_color = "#43DE18" + + New() + ..() + reagents.add_reagent("protein", 3) + reagents.add_reagent("toxin", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/spiderleg + name = "spider leg" + desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?" + icon_state = "spiderleg" + New() + ..() + reagents.add_reagent("protein", 2) + reagents.add_reagent("toxin", 2) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/meatball + name = "Meatball" + desc = "A great meal all round." + icon_state = "meatball" + filling_color = "#DB0000" + New() + ..() + reagents.add_reagent("protein", 3) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sausage + name = "Sausage" + desc = "A piece of mixed, long meat." + icon_state = "sausage" + filling_color = "#DB0000" + + New() + ..() + reagents.add_reagent("protein", 6) + reagents.add_reagent("porktonium", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/donkpocket + name = "Donk-pocket" + desc = "The food of choice for the seasoned traitor." + icon_state = "donkpocket" + filling_color = "#DEDEAB" + + New() + ..() + reagents.add_reagent("nutriment", 4) + +/obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket + name = "Warm Donk-pocket" + desc = "The food of choice for the seasoned traitor." + icon_state = "donkpocket" + filling_color = "#DEDEAB" + + New() + ..() + reagents.add_reagent("nutriment", 4) + + Post_Consume(mob/living/M) + M.reagents.add_reagent("omnizine", 15) + +/obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket + name = "Donk-pocket" + desc = "This donk-pocket is emitting a small amount of heat." + icon_state = "donkpocket" + filling_color = "#DEDEAB" + bitesize = 100 //nom the whole thing at once. + + New() + ..() + reagents.add_reagent("nutriment", 1) + + Post_Consume(mob/living/M) + M.reagents.add_reagent("omnizine", 15) + M.reagents.add_reagent("teporone", 15) + M.reagents.add_reagent("synaptizine", 15) + M.reagents.add_reagent("salglu_solution", 15) + M.reagents.add_reagent("salbutamol", 15) + M.reagents.add_reagent("methamphetamine", 15) + +/obj/item/weapon/reagent_containers/food/snacks/brainburger + name = "brainburger" + desc = "A strange looking burger. It looks almost sentient." + icon_state = "brainburger" + filling_color = "#F2B6EA" + + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("prions", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/ghostburger + name = "Ghost Burger" + desc = "Spooky! It doesn't look very filling." + icon_state = "ghostburger" + filling_color = "#FFF2FF" + + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 2 + + +/obj/item/weapon/reagent_containers/food/snacks/human + var/hname = "" + var/job = null + filling_color = "#D63C3C" + +/obj/item/weapon/reagent_containers/food/snacks/human/burger + name = "-burger" + desc = "A bloody burger." + icon_state = "hburger" + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/cheeseburger + name = "cheeseburger" + desc = "The cheese adds a good flavor." + icon_state = "cheeseburger" + New() + ..() + reagents.add_reagent("nutriment", 2) + +/obj/item/weapon/reagent_containers/food/snacks/monkeyburger + name = "burger" + desc = "The cornerstone of every nutritious breakfast." + icon_state = "hburger" + filling_color = "#D63C3C" + + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/tofuburger + name = "Tofu Burger" + desc = "What.. is that meat?" + icon_state = "tofuburger" + filling_color = "#FFFEE0" + + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/roburger + name = "roburger" + desc = "The lettuce is the only organic component. Beep." + icon_state = "roburger" + filling_color = "#CCCCCC" + + New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("nanomachines", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/roburgerbig + name = "roburger" + desc = "This massive patty looks like poison. Beep." + icon_state = "roburger" + filling_color = "#CCCCCC" + volume = 100 + + New() + ..() + reagents.add_reagent("nanomachines", 100) + bitesize = 0.1 + +/obj/item/weapon/reagent_containers/food/snacks/xenoburger + name = "xenoburger" + desc = "Smells caustic. Tastes like heresy." + icon_state = "xburger" + filling_color = "#43DE18" + + New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/clownburger + name = "Clown Burger" + desc = "This tastes funny..." + icon_state = "clownburger" + filling_color = "#FF00FF" + + New() + ..() +/* + var/datum/disease/F = new /datum/disease/pierrot_throat(0) + var/list/data = list("viruses"= list(F)) + reagents.add_reagent("blood", 4, data) +*/ + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/mimeburger + name = "Mime Burger" + desc = "Its taste defies language." + icon_state = "mimeburger" + filling_color = "#FFFFFF" + + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/omelette + name = "Omelette Du Fromage" + desc = "That's all you can say!" + icon_state = "omelette" + trash = /obj/item/trash/plate + filling_color = "#FFF9A8" + + //var/herp = 0 + New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/muffin + name = "Muffin" + desc = "A delicious and spongy little cake" + icon_state = "muffin" + filling_color = "#E0CF9B" + + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/pie + name = "Banana Cream Pie" + desc = "Just like back home, on clown planet! HONK!" + icon_state = "pie" + trash = /obj/item/trash/plate + filling_color = "#FBFFB8" + +/obj/item/weapon/reagent_containers/food/snacks/pie/New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("banana",5) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/pie/throw_impact(atom/hit_atom) + ..() + new/obj/effect/decal/cleanable/pie_smudge(src.loc) + src.visible_message("\red [src.name] splats.","\red You hear a splat.") + qdel(src) + +/obj/item/weapon/reagent_containers/food/snacks/berryclafoutis + name = "Berry Clafoutis" + desc = "No black birds, this is a good sign." + icon_state = "berryclafoutis" + trash = /obj/item/trash/plate + New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("berryjuice", 5) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/waffles + name = "waffles" + desc = "Mmm, waffles" + icon_state = "waffles" + trash = /obj/item/trash/waffles + filling_color = "#E6DEB5" + + New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/eggplantparm + name = "Eggplant Parmigiana" + desc = "The only good recipe for eggplant." + icon_state = "eggplantparm" + trash = /obj/item/trash/plate + filling_color = "#4D2F5E" + + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/soylentgreen + name = "Soylent Green" + desc = "Not made of people. Honest." //Totally people. + icon_state = "soylent_green" + trash = /obj/item/trash/waffles + filling_color = "#B8E6B5" + + New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/soylenviridians + name = "Soylen Virdians" + desc = "Not made of people. Honest." //Actually honest for once. + icon_state = "soylent_yellow" + trash = /obj/item/trash/waffles + filling_color = "#E6FA61" + + New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 + + +/obj/item/weapon/reagent_containers/food/snacks/meatpie + name = "Meat-pie" + icon_state = "meatpie" + desc = "An old barber recipe, very delicious!" + trash = /obj/item/trash/plate + filling_color = "#948051" + + New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/tofupie + name = "Tofu-pie" + icon_state = "meatpie" + desc = "A delicious tofu pie." + trash = /obj/item/trash/plate + filling_color = "#FFFEE0" + + New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/amanita_pie + name = "amanita pie" + desc = "Sweet and tasty poison pie." + icon_state = "amanita_pie" + filling_color = "#FFCCCC" + + New() + ..() + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("amanitin", 3) + reagents.add_reagent("psilocybin", 1) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/plump_pie + name = "plump pie" + desc = "I bet you love stuff made out of plump helmets!" + icon_state = "plump_pie" + filling_color = "#B8279B" + + New() + ..() + if(prob(10)) + name = "exceptional plump pie" + desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("omnizine", 5) + bitesize = 2 + else + reagents.add_reagent("nutriment", 8) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/xemeatpie + name = "Xeno-pie" + icon_state = "xenomeatpie" + desc = "A delicious meatpie. Probably heretical." + trash = /obj/item/trash/plate + filling_color = "#43DE18" + + New() + ..() + reagents.add_reagent("nutriment", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/wingfangchu + name = "Wing Fang Chu" + desc = "A savory dish of alien wing wang in soy." + icon_state = "wingfangchu" + trash = /obj/item/trash/snack_bowl + filling_color = "#43DE18" + + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + + +/obj/item/weapon/reagent_containers/food/snacks/human/kabob + name = "-kabob" + icon_state = "kabob" + desc = "A human meat, on a stick." + trash = /obj/item/stack/rods + filling_color = "#A85340" + + New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/monkeykabob + name = "Meat-kabob" + icon_state = "kabob" + desc = "Delicious meat, on a stick." + trash = /obj/item/stack/rods + filling_color = "#A85340" + + New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/tofukabob + name = "Tofu-kabob" + icon_state = "kabob" + desc = "Vegan meat, on a stick." + trash = /obj/item/stack/rods + filling_color = "#FFFEE0" + + New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/popcorn + name = "Popcorn" + desc = "Now let's find some cinema." + icon_state = "popcorn" + trash = /obj/item/trash/popcorn + var/unpopped = 0 + filling_color = "#FFFAD4" + + New() + ..() + unpopped = rand(1,10) + reagents.add_reagent("nutriment", 2) + bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 + On_Consume(mob/M, mob/user) + if(prob(unpopped)) //lol ...what's the point? + to_chat(user, "\red You bite down on an un-popped kernel!") + unpopped = max(0, unpopped-1) + ..() + + +/obj/item/weapon/reagent_containers/food/snacks/sosjerky + name = "Scaredy's Private Reserve Beef Jerky" + icon_state = "sosjerky" + desc = "Beef jerky made from the finest space cows." + trash = /obj/item/trash/sosjerky + filling_color = "#631212" + + New() + ..() + reagents.add_reagent("protein", 4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/pistachios + name = "Pistachios" + icon_state = "pistachios" + desc = "A snack of deliciously salted pistachios. A perfectly valid choice..." + trash = /obj/item/trash/pistachios + filling_color = "#BAD145" + + New() + ..() + reagents.add_reagent("plantmatter", 6) + reagents.add_reagent("sodiumchloride", 1) + +/obj/item/weapon/reagent_containers/food/snacks/no_raisin + name = "4no Raisins" + icon_state = "4no_raisins" + desc = "Best raisins in the universe. Not sure why." + trash = /obj/item/trash/raisins + filling_color = "#343834" + + New() + ..() + reagents.add_reagent("plantmatter", 6) + +/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie + name = "Space Twinkie" + icon_state = "space_twinkie" + desc = "Guaranteed to survive longer then you will." + filling_color = "#FFE591" + + New() + ..() + reagents.add_reagent("sugar", 4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers + name = "Cheesie Honkers" + icon_state = "cheesie_honkers" + desc = "Bite sized cheesie snacks that will honk all over your mouth" + trash = /obj/item/trash/cheesie + filling_color = "#FFA305" + + New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("fake_cheese", 2) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein + name = "chow mein" + desc = "What is in this anyways?" + icon_state = "chinese1" + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("beans", 3) + reagents.add_reagent("msg",4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/chinese/tao + name = "Admiral Yamamoto carp" + desc = "Tastes like chicken." + icon_state = "chinese2" + New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("protein", 2) + reagents.add_reagent("msg",4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/chinese/newdles + name = "chinese newdles" + desc = "Made fresh, weekly!" + icon_state = "chinese3" + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("msg",4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/chinese/rice + name = "fried rice" + desc = "A timeless classic." + icon_state = "chinese4" + New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("rice", 3) + reagents.add_reagent("msg",4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/syndicake + name = "Syndi-Cakes" + icon_state = "syndi_cakes" + desc = "An extremely moist snack cake that tastes just as good after being nuked." + filling_color = "#FF5D05" + + trash = /obj/item/trash/syndi_cakes + New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("salglu_solution", 5) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato + name = "Loaded Baked Potato" + desc = "Totally baked." + icon_state = "loadedbakedpotato" + filling_color = "#9C7A68" + + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/fries + name = "Space Fries" + desc = "AKA: French Fries, Freedom Fries, etc." + icon_state = "fries" + trash = /obj/item/trash/plate + filling_color = "#EDDD00" + + New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/soydope + name = "Soy Dope" + desc = "Dope from a soy." + icon_state = "soydope" + trash = /obj/item/trash/plate + filling_color = "#C4BF76" + + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/spagetti + name = "Spagetti" + desc = "A bundle of raw spaghetti." + icon_state = "spagetti" + filling_color = "#EDDD00" + + New() + ..() + reagents.add_reagent("nutriment", 1) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/cheesyfries + name = "Cheesy Fries" + desc = "Fries. Covered in cheese. Duh." + icon_state = "cheesyfries" + trash = /obj/item/trash/plate + filling_color = "#EDDD00" + + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/fortunecookie + name = "Fortune cookie" + desc = "A true prophecy in each cookie!" + icon_state = "fortune_cookie" + filling_color = "#E8E79E" + + New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/badrecipe + name = "Burned mess" + desc = "Someone should be demoted from chef for this." + icon_state = "badrecipe" + filling_color = "#211F02" + + New() + ..() + reagents.add_reagent("????", 5) + reagents.add_reagent("carbon", 3) + bitesize = 2 + + // it's burned! it should start off being classed as any cooktype that burns + cooktype["grilled"] = 1 + cooktype["deep fried"] = 1 + +/obj/item/weapon/reagent_containers/food/snacks/meatsteak + name = "Meat steak" + desc = "A piece of hot spicy meat." + icon_state = "meatstake" + trash = /obj/item/trash/plate + filling_color = "#7A3D11" + + New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("blackpepper", 1) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff + name = "Spacy Liberty Duff" + desc = "Jello gelatin, from Alfred Hubbard's cookbook" + icon_state = "spacylibertyduff" + trash = /obj/item/trash/snack_bowl + filling_color = "#42B873" + + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("psilocybin", 6) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/amanitajelly + name = "Amanita Jelly" + desc = "Looks curiously toxic" + icon_state = "amanitajelly" + trash = /obj/item/trash/snack_bowl + filling_color = "#ED0758" + + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("amanitin", 6) + reagents.add_reagent("psilocybin", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/poppypretzel + name = "Poppy pretzel" + desc = "It's all twisted up!" + icon_state = "poppypretzel" + bitesize = 2 + filling_color = "#916E36" + + New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 2 + + +/obj/item/weapon/reagent_containers/food/snacks/meatballsoup + name = "Meatball soup" + desc = "You've got balls kid, BALLS!" + icon_state = "meatballsoup" + trash = /obj/item/trash/snack_bowl + filling_color = "#785210" + + New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("water", 5) + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/slimesoup + name = "slime soup" + desc = "If no water is available, you may substitute tears." + icon_state = "slimesoup" + filling_color = "#C4DBA0" + + New() + ..() + reagents.add_reagent("slimejelly", 5) + reagents.add_reagent("water", 10) + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/bloodsoup + name = "Tomato soup" + desc = "Smells like copper" + icon_state = "tomatosoup" + filling_color = "#FF0000" + + New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("blood", 10) + reagents.add_reagent("water", 5) + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/clownstears + name = "Clown's Tears" + desc = "Not very funny." + icon_state = "clownstears" + filling_color = "#C4FBFF" + + New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("banana", 5) + reagents.add_reagent("water", 10) + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/vegetablesoup + name = "Vegetable soup" + desc = "A true vegan meal" //TODO + icon_state = "vegetablesoup" + trash = /obj/item/trash/snack_bowl + filling_color = "#AFC4B5" + + New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("water", 5) + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/nettlesoup + name = "Nettle soup" + desc = "To think, the botanist would've beat you to death with one of these." + icon_state = "nettlesoup" + trash = /obj/item/trash/snack_bowl + filling_color = "#AFC4B5" + + New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("water", 5) + reagents.add_reagent("omnizine", 5) + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/mysterysoup + name = "Mystery soup" + desc = "The mystery is, why aren't you eating it?" + icon_state = "mysterysoup" + trash = /obj/item/trash/snack_bowl + filling_color = "#F082FF" + + New() + ..() + var/mysteryselect = pick(1,2,3,4,5,6,7,8,9,10) + switch(mysteryselect) + if(1) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("capsaicin", 3) + reagents.add_reagent("tomatojuice", 2) + if(2) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("frostoil", 3) + reagents.add_reagent("tomatojuice", 2) + if(3) + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("water", 5) + reagents.add_reagent("omnizine", 5) + if(4) + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("water", 10) + if(5) + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("banana", 10) + if(6) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("blood", 10) + if(7) + reagents.add_reagent("slimejelly", 10) + reagents.add_reagent("water", 10) + if(8) + reagents.add_reagent("carbon", 10) + reagents.add_reagent("toxin", 10) + if(9) + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("tomatojuice", 10) + if(10) + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("tomatojuice", 5) + reagents.add_reagent("oculine", 5) + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/wishsoup + name = "Wish Soup" + desc = "I wish this was soup." + icon_state = "wishsoup" + trash = /obj/item/trash/snack_bowl + filling_color = "#D1F4FF" + + New() + ..() + reagents.add_reagent("water", 10) + bitesize = 5 + if(prob(25)) + src.desc = "A wish come true!" + reagents.add_reagent("nutriment", 8) + +/obj/item/weapon/reagent_containers/food/snacks/hotchili + name = "Hot Chili" + desc = "A five alarm Texan Chili!" + icon_state = "hotchili" + trash = /obj/item/trash/snack_bowl + filling_color = "#FF3C00" + + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("capsaicin", 3) + reagents.add_reagent("tomatojuice", 2) + bitesize = 5 + + +/obj/item/weapon/reagent_containers/food/snacks/coldchili + name = "Cold Chili" + desc = "This slush is barely a liquid!" + icon_state = "coldchili" + filling_color = "#2B00FF" + + trash = /obj/item/trash/snack_bowl + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("frostoil", 3) + reagents.add_reagent("tomatojuice", 2) + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/raw_bacon + name = "raw bacon" + desc = "It's fleshy and pink!" + icon_state = "raw_bacon" + bitesize = 2 + New() + ..() + reagents.add_reagent("nutriment", 1) + reagents.add_reagent("porktonium", 10) + +/obj/item/weapon/reagent_containers/food/snacks/bacon + name = "bacon" + desc = "It looks juicy and tastes amazing!" + icon_state = "bacon2" + bitesize = 2 + New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("porktonium", 10) + reagents.add_reagent("msg", 4) + + +/obj/item/weapon/reagent_containers/food/snacks/telebacon + name = "Tele Bacon" + desc = "It tastes a little odd but it is still delicious." + icon_state = "bacon" + var/obj/item/device/radio/beacon/bacon/baconbeacon + bitesize = 2 + New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("porktonium", 10) + baconbeacon = new /obj/item/device/radio/beacon/bacon(src) + On_Consume(mob/M, mob/user) + if(!reagents.total_volume) + baconbeacon.loc = user + baconbeacon.digest_delay() + + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube + name = "monkey cube" + desc = "Just add water!" + icon_state = "monkeycube" + bitesize = 12 + filling_color = "#ADAC7F" + var/monkey_type = "Monkey" + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/New() + ..() + reagents.add_reagent("protein",10) + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/afterattack(obj/O, mob/user, proximity) + if(!proximity) return + if(istype(O,/obj/structure/sink) && !wrapped) + to_chat(user, "You place [src] under a stream of water...") + user.drop_item() + forceMove(get_turf(O)) + return Expand() + if(istype(O, /obj/machinery/computer/camera_advanced/xenobio)) + var/obj/machinery/computer/camera_advanced/xenobio/X = O + X.monkeys++ + to_chat(user, "You feed [src] to the [X]. It now has [X.monkeys] monkey cubes stored.") + qdel(src) + return + ..() + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/attack_self(mob/user) + if(wrapped) + Unwrap(user) + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature) + if(volume >= 5) + return Expand() + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wash(mob/user, atom/source) + if(wrapped) + ..() + return + if(do_after(user, 40, target = source)) + return 1 + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand() + if(isnull(gcDestroyed)) + visible_message("[src] expands!") + new/mob/living/carbon/human(get_turf(src),monkey_type) + qdel(src) + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Unwrap(mob/user) + icon_state = "monkeycube" + desc = "Just add water!" + to_chat(user, "You unwrap the cube.") + wrapped = 0 + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped + desc = "Still wrapped in some paper." + icon_state = "monkeycubewrap" + wrapped = 1 + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/farwacube + name = "farwa cube" + monkey_type = "Farwa" + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube + name = "farwa cube" + monkey_type = "Farwa" + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wolpincube + name = "wolpin cube" + monkey_type = "Wolpin" + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube + name = "wolpin cube" + monkey_type = "Wolpin" + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/stokcube + name = "stok cube" + monkey_type = "Stok" + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube + name = "stok cube" + monkey_type = "Stok" + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/neaeracube + name = "neaera cube" + monkey_type = "Neara" + +/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube + name = "neaera cube" + monkey_type = "Neara" + + +/obj/item/weapon/reagent_containers/food/snacks/spellburger + name = "Spell Burger" + desc = "This is absolutely Ei Nath." + icon_state = "spellburger" + filling_color = "#D505FF" + + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger + name = "Big Bite Burger" + desc = "Forget the Big Mac. THIS is the future!" + icon_state = "bigbiteburger" + filling_color = "#E3D681" + + New() + ..() + reagents.add_reagent("nutriment", 14) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/enchiladas + name = "Enchiladas" + desc = "Viva La Mexico!" + icon_state = "enchiladas" + trash = /obj/item/trash/tray + filling_color = "#A36A1F" + + New() + ..() + reagents.add_reagent("nutriment",8) + reagents.add_reagent("capsaicin", 6) + bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/burrito + name = "Burrito" + desc = "Meat, beans, cheese, and rice wrapped up as an easy-to-hold meal." + icon_state = "burrito" + trash = /obj/item/trash/plate + filling_color = "#A36A1F" + +/obj/item/weapon/reagent_containers/food/snacks/burrito/New() + ..() + reagents.add_reagent("nutriment", 5) + +/obj/item/weapon/reagent_containers/food/snacks/chimichanga + name = "Chimichanga" + desc = "Time to eat a chimi-f***ing-changa." + icon_state = "chimichanga" + trash = /obj/item/trash/plate + filling_color = "#A36A1F" + +/obj/item/weapon/reagent_containers/food/snacks/chimichanga/New() + ..() + reagents.add_reagent("omnizine", 4) //Deadpool reference. Deal with it. + reagents.add_reagent("cheese", 2) + +/obj/item/weapon/reagent_containers/food/snacks/monkeysdelight + name = "monkey's Delight" + desc = "Eeee Eee!" + icon_state = "monkeysdelight" + trash = /obj/item/trash/tray + filling_color = "#5C3C11" + + New() + ..() + reagents.add_reagent("nutriment", 10) + reagents.add_reagent("banana", 5) + reagents.add_reagent("blackpepper", 1) + reagents.add_reagent("sodiumchloride", 1) + bitesize = 6 + +/obj/item/weapon/reagent_containers/food/snacks/baguette + name = "Baguette" + desc = "Bon appetit!" + icon_state = "baguette" + filling_color = "#E3D796" + + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("blackpepper", 1) + reagents.add_reagent("sodiumchloride", 1) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sandwich + name = "Sandwich" + desc = "A grand creation of meat, cheese, bread, and several leaves of lettuce! Arthur Dent would be proud." + icon_state = "sandwich" + trash = /obj/item/trash/plate + filling_color = "#D9BE29" + + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/toastedsandwich + name = "Toasted Sandwich" + desc = "Now if you only had a pepper bar." + icon_state = "toastedsandwich" + trash = /obj/item/trash/plate + filling_color = "#D9BE29" + + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("carbon", 2) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/grilledcheese + name = "Grilled Cheese Sandwich" + desc = "Goes great with Tomato soup!" + icon_state = "toastedsandwich" + trash = /obj/item/trash/plate + filling_color = "#D9BE29" + + New() + ..() + reagents.add_reagent("nutriment", 7) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/tomatosoup + name = "Tomato Soup" + desc = "Drinking this feels like being a vampire! A tomato vampire..." + icon_state = "tomatosoup" + trash = /obj/item/trash/snack_bowl + filling_color = "#D92929" + + New() + ..() + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("tomatojuice", 10) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/rofflewaffles + name = "Roffle Waffles" + desc = "Waffles from Roffle. Co." + icon_state = "rofflewaffles" + trash = /obj/item/trash/waffles + filling_color = "#FF00F7" + + New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("psilocybin", 8) + bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/stew + name = "Stew" + desc = "A nice and warm stew. Healthy and strong." + icon_state = "stew" + filling_color = "#9E673A" + + New() + ..() + reagents.add_reagent("nutriment", 10) + reagents.add_reagent("tomatojuice", 5) + reagents.add_reagent("oculine", 5) + reagents.add_reagent("water", 5) + bitesize = 10 + +/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast + name = "Jellied Toast" + desc = "A slice of bread covered with delicious jam." + icon_state = "jellytoast" + trash = /obj/item/trash/plate + filling_color = "#B572AB" + + New() + ..() + reagents.add_reagent("nutriment", 1) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry + New() + ..() + reagents.add_reagent("cherryjelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/slime + New() + ..() + reagents.add_reagent("slimejelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/jellyburger + name = "Jelly Burger" + desc = "Culinary delight..?" + icon_state = "jellyburger" + filling_color = "#B572AB" + + New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/jellyburger/slime + New() + ..() + reagents.add_reagent("slimejelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry + New() + ..() + reagents.add_reagent("cherryjelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/milosoup + name = "Milosoup" + desc = "The universes best soup! Yum!!!" + icon_state = "milosoup" + trash = /obj/item/trash/snack_bowl + New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("water", 5) + bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat + name = "Stewed Soy Meat" + desc = "Even non-vegetarians will LOVE this!" + icon_state = "stewedsoymeat" + trash = /obj/item/trash/plate + New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti + name = "Boiled Spagetti" + desc = "A plain dish of noodles, this sucks." + icon_state = "spagettiboiled" + trash = /obj/item/trash/plate + filling_color = "#FCEE81" + + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/boiledrice + name = "Boiled Rice" + desc = "A boring dish of boring rice." + icon_state = "boiledrice" + trash = /obj/item/trash/snack_bowl + filling_color = "#FFFBDB" + + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/ricepudding + name = "Rice Pudding" + desc = "Where's the Jam!" + icon_state = "rpudding" + trash = /obj/item/trash/snack_bowl + filling_color = "#FFFBDB" + + New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/pastatomato + name = "Spagetti" + desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!" + icon_state = "pastatomato" + trash = /obj/item/trash/plate + filling_color = "#DE4545" + + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("tomatojuice", 10) + bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/meatballspagetti + name = "Spagetti & Meatballs" + desc = "Now thats a nic'e meatball!" + icon_state = "meatballspagetti" + trash = /obj/item/trash/plate + filling_color = "#DE4545" + + New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("synaptizine", 5) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/spesslaw + name = "Spesslaw" + desc = "A lawyers favourite" + icon_state = "spesslaw" + filling_color = "#DE4545" + + New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("synaptizine", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/poppypretzel + name = "Poppy Pretzel" + desc = "A large soft pretzel full of POP!" + icon_state = "poppypretzel" + filling_color = "#AB7D2E" + + New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/carrotfries + name = "Carrot Fries" + desc = "Tasty fries from fresh Carrots." + icon_state = "carrotfries" + trash = /obj/item/trash/plate + filling_color = "#FAA005" + + New() + ..() + reagents.add_reagent("plantmatter", 3) + reagents.add_reagent("oculine", 3) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/superbiteburger + name = "Super Bite Burger" + desc = "This is a mountain of a burger. FOOD!" + icon_state = "superbiteburger" + filling_color = "#CCA26A" + + New() + ..() + reagents.add_reagent("nutriment", 50) + bitesize = 10 + +/obj/item/weapon/reagent_containers/food/snacks/candiedapple + name = "Candied Apple" + desc = "An apple coated in sugary sweetness." + icon_state = "candiedapple" + filling_color = "#F21873" + + New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/applepie + name = "Apple Pie" + desc = "A pie containing sweet sweet love... or apple." + icon_state = "applepie" + filling_color = "#E0EDC5" + + New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 3 + + +/obj/item/weapon/reagent_containers/food/snacks/cherrypie + name = "Cherry Pie" + desc = "Taste so good, make a grown man cry." + icon_state = "cherrypie" + filling_color = "#FF525A" + + New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/twobread + name = "Two Bread" + desc = "It is very bitter and winy." + icon_state = "twobread" + filling_color = "#DBCC9A" + + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/jellysandwich + name = "Jelly Sandwich" + desc = "You wish you had some peanut butter to go with this..." + icon_state = "jellysandwich" + trash = /obj/item/trash/plate + filling_color = "#9E3A78" + + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime + New() + ..() + reagents.add_reagent("slimejelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry + New() + ..() + reagents.add_reagent("cherryjelly", 5) + +/obj/item/weapon/reagent_containers/food/snacks/boiledslimecore + name = "Boiled Slime Core" + desc = "A boiled red thing." + icon_state = "boiledrorocore" + New() + ..() + reagents.add_reagent("slimejelly", 5) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/mint + name = "mint" + desc = "it is only wafer thin." + icon_state = "mint" + filling_color = "#F2F2F2" + + New() + ..() + reagents.add_reagent("minttoxin", 1) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/mushroomsoup + name = "chantrelle soup" + desc = "A delicious and hearty mushroom soup." + icon_state = "mushroomsoup" + trash = /obj/item/trash/snack_bowl + filling_color = "#E386BF" + + New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit + name = "plump helmet biscuit" + desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour." + icon_state = "phelmbiscuit" + filling_color = "#CFB4C4" + + New() + ..() + if(prob(10)) + name = "exceptional plump helmet biscuit" + desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("omnizine", 5) + bitesize = 2 + else + reagents.add_reagent("nutriment", 5) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/chawanmushi + name = "chawanmushi" + desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat." + icon_state = "chawanmushi" + trash = /obj/item/trash/snack_bowl + filling_color = "#F0F2E4" + + New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/beetsoup + name = "beet soup" + desc = "Wait, how do you spell it again..?" + icon_state = "beetsoup" + trash = /obj/item/trash/snack_bowl + filling_color = "#FAC9FF" + + New() + ..() + switch(rand(1,6)) + if(1) + name = "borsch" + if(2) + name = "bortsch" + if(3) + name = "borstch" + if(4) + name = "borsh" + if(5) + name = "borshch" + if(6) + name = "borscht" + reagents.add_reagent("nutriment", 8) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/herbsalad + name = "herb salad" + desc = "A tasty salad with apples on top." + icon_state = "herbsalad" + trash = /obj/item/trash/snack_bowl + filling_color = "#76B87F" + + New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/validsalad + name = "valid salad" + desc = "It's just an herb salad with meatballs and fried potato slices. Nothing suspicious about it." + icon_state = "validsalad" + trash = /obj/item/trash/snack_bowl + filling_color = "#76B87F" + + New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("omnizine", 5) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/appletart + name = "golden apple streusel tart" + desc = "A tasty dessert that won't make it through a metal detector." + icon_state = "gappletart" + trash = /obj/item/trash/plate + filling_color = "#FFFF00" + + New() + ..() + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("gold", 5) + spawn(1) + reagents.del_reagent("egg") + reagents.update_total() + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/dough_ball + name = "ball of raw dough" + desc = "A ball of raw dough, ready to be molded into new recipes." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "dough" + New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 1 + attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(istype(W,/obj/item/weapon/kitchen/rollingpin)) + user.visible_message( \ + "[user] flattens the dough with the rolling pin!", \ + "\blue You flatten the dough with your rolling pin!" \ + ) + new /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough(src.loc) + qdel(src) + +/////////////////////////////////////////////////Sliceable//////////////////////////////////////// +// All the food items that can be sliced into smaller bits like Meatbread and Cheesewheels + +// sliceable is just an organization type path, it doesn't have any additional code or variables tied to it. + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough + name = "flattened dough" + desc = "Still raw. You resist the temptation to cover it in tomato sauce." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "flatdough" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice + slices_num = 3 + New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/doughslice + name = "slice of dough" + desc = "an individual portion of raw dough, ready to be cooked." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "doughslice" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread + name = "meatbread loaf" + desc = "The culinary base of every self-respecting eloquen/tg/entleman." + icon_state = "meatbread" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice + slices_num = 5 + filling_color = "#FF7575" + New() + ..() + reagents.add_reagent("protein", 20) + reagents.add_reagent("nutriment", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/meatbreadslice + name = "meatbread slice" + desc = "A slice of delicious meatbread." + icon_state = "meatbreadslice" + trash = /obj/item/trash/plate + filling_color = "#FF7575" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/xenomeatbread + name = "xenomeatbread loaf" + desc = "The culinary base of every self-respecting eloquent gentleman. Extra Heretical." + icon_state = "xenomeatbread" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice + slices_num = 5 + filling_color = "#8AFF75" + New() + ..() + reagents.add_reagent("protein", 20) + reagents.add_reagent("nutriment", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice + name = "xenomeatbread slice" + desc = "A slice of delicious meatbread. Extra Heretical." + icon_state = "xenobreadslice" + trash = /obj/item/trash/plate + filling_color = "#8AFF75" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/spidermeatbread + name = "spider meat loaf" + desc = "Reassuringly green meatloaf made from spider meat." + icon_state = "spidermeatbread" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/spidermeatbreadslice + slices_num = 5 + New() + ..() + reagents.add_reagent("protein", 20) + reagents.add_reagent("nutriment", 10) + reagents.add_reagent("toxin", 15) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/spidermeatbreadslice + name = "spider meat bread slice" + desc = "A slice of meatloaf made from an animal that most likely still wants you dead." + icon_state = "xenobreadslice" + trash = /obj/item/trash/plate + bitesize = 2 + New() + ..() + reagents.add_reagent("toxin", 2) + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread + name = "Banana-nut bread" + desc = "A heavenly and filling treat." + icon_state = "bananabread" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/bananabreadslice + slices_num = 5 + filling_color = "#EDE5AD" + New() + ..() + reagents.add_reagent("banana", 20) + reagents.add_reagent("nutriment", 20) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/bananabreadslice + name = "Banana-nut bread slice" + desc = "A slice of delicious banana bread." + icon_state = "bananabreadslice" + trash = /obj/item/trash/plate + filling_color = "#EDE5AD" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread + name = "Tofubread" + icon_state = "Like meatbread but for vegetarians. Not guaranteed to give superpowers." + icon_state = "tofubread" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice + slices_num = 5 + filling_color = "#F7FFE0" + New() + ..() + reagents.add_reagent("nutriment", 30) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/tofubreadslice + name = "Tofubread slice" + desc = "A slice of delicious tofubread." + icon_state = "tofubreadslice" + trash = /obj/item/trash/plate + filling_color = "#F7FFE0" + bitesize = 2 + + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake + name = "Carrot Cake" + desc = "A favorite desert of a certain wascally wabbit. Not a lie." + icon_state = "carrotcake" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice + slices_num = 5 + filling_color = "#FFD675" + New() + ..() + reagents.add_reagent("nutriment", 25) + reagents.add_reagent("oculine", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice + name = "Carrot Cake slice" + desc = "Carrotty slice of Carrot Cake, carrots are good for your eyes! Also not a lie." + icon_state = "carrotcake_slice" + trash = /obj/item/trash/plate + filling_color = "#FFD675" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake + name = "Brain Cake" + desc = "A squishy cake-thing." + icon_state = "braincake" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/braincakeslice + slices_num = 5 + filling_color = "#E6AEDB" + New() + ..() + reagents.add_reagent("protein", 15) + reagents.add_reagent("nutriment", 10) + reagents.add_reagent("mannitol", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/braincakeslice + name = "Brain Cake slice" + desc = "Lemme tell you something about prions. THEY'RE DELICIOUS." + icon_state = "braincakeslice" + trash = /obj/item/trash/plate + filling_color = "#E6AEDB" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake + name = "Cheese Cake" + desc = "DANGEROUSLY cheesy." + icon_state = "cheesecake" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice + slices_num = 5 + filling_color = "#FAF7AF" + New() + ..() + reagents.add_reagent("nutriment", 25) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice + name = "Cheese Cake slice" + desc = "Slice of pure cheestisfaction" + icon_state = "cheesecake_slice" + trash = /obj/item/trash/plate + filling_color = "#FAF7AF" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake + name = "Vanilla Cake" + desc = "A plain cake, not a lie." + icon_state = "plaincake" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice + slices_num = 5 + filling_color = "#F7EDD5" + New() + ..() + reagents.add_reagent("nutriment", 20) + +/obj/item/weapon/reagent_containers/food/snacks/plaincakeslice + name = "Vanilla Cake slice" + desc = "Just a slice of cake, it is enough for everyone." + icon_state = "plaincake_slice" + trash = /obj/item/trash/plate + filling_color = "#F7EDD5" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake + name = "Orange Cake" + desc = "A cake with added orange." + icon_state = "orangecake" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice + slices_num = 5 + filling_color = "#FADA8E" + New() + ..() + reagents.add_reagent("nutriment", 20) + +/obj/item/weapon/reagent_containers/food/snacks/orangecakeslice + name = "Orange Cake slice" + desc = "Just a slice of cake, it is enough for everyone." + icon_state = "orangecake_slice" + trash = /obj/item/trash/plate + filling_color = "#FADA8E" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake + name = "Lime Cake" + desc = "A cake with added lime." + icon_state = "limecake" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/limecakeslice + slices_num = 5 + filling_color = "#CBFA8E" + New() + ..() + reagents.add_reagent("nutriment", 20) + +/obj/item/weapon/reagent_containers/food/snacks/limecakeslice + name = "Lime Cake slice" + desc = "Just a slice of cake, it is enough for everyone." + icon_state = "limecake_slice" + trash = /obj/item/trash/plate + filling_color = "#CBFA8E" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake + name = "Lemon Cake" + desc = "A cake with added lemon." + icon_state = "lemoncake" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice + slices_num = 5 + filling_color = "#FAFA8E" + New() + ..() + reagents.add_reagent("nutriment", 20) + +/obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice + name = "Lemon Cake slice" + desc = "Just a slice of cake, it is enough for everyone." + icon_state = "lemoncake_slice" + trash = /obj/item/trash/plate + filling_color = "#FAFA8E" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake + name = "Chocolate Cake" + desc = "A cake with added chocolate" + icon_state = "chocolatecake" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice + slices_num = 5 + filling_color = "#805930" + New() + ..() + reagents.add_reagent("nutriment", 20) + reagents.add_reagent("chocolate",20) + +/obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice + name = "Chocolate Cake slice" + desc = "Just a slice of cake, it is enough for everyone." + icon_state = "chocolatecake_slice" + trash = /obj/item/trash/plate + filling_color = "#805930" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel + name = "Cheese wheel" + desc = "A big wheel of delcious Cheddar." + icon_state = "cheesewheel" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesewedge + slices_num = 5 + filling_color = "#FFF700" + New() + ..() + reagents.add_reagent("nutriment", 20) + reagents.add_reagent("cheese", 20) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/cheesewedge + name = "Cheese wedge" + desc = "A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far." + icon_state = "cheesewedge" + filling_color = "#FFF700" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/weirdcheesewedge + name = "Weird Cheese" + desc = "Some kind of... gooey, messy, gloopy thing. Similar to cheese, but only in the looser sense of the word." + icon_state = "weirdcheesewedge" + filling_color = "#00FF33" + bitesize = 2 + New() + ..() + reagents.add_reagent("mercury", 5) + reagents.add_reagent("lsd", 5) + reagents.add_reagent("ethanol", 5) + reagents.add_reagent("weird_cheese", 5) + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake + name = "Birthday Cake" + desc = "Happy Birthday..." + icon_state = "birthdaycake" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice + slices_num = 5 + filling_color = "#FFD6D6" + New() + ..() + reagents.add_reagent("nutriment", 20) + reagents.add_reagent("sprinkles", 10) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice + name = "Birthday Cake slice" + desc = "A slice of your birthday" + icon_state = "birthdaycakeslice" + trash = /obj/item/trash/plate + filling_color = "#FFD6D6" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/bread + name = "Bread" + icon_state = "Some plain old Earthen bread." + icon_state = "bread" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice + slices_num = 6 + filling_color = "#FFE396" + + New() + ..() + reagents.add_reagent("nutriment", 6) + spawn(1) + reagents.del_reagent("egg") + reagents.update_total() + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/breadslice + name = "Bread slice" + desc = "A slice of home." + icon_state = "breadslice" + trash = /obj/item/trash/plate + filling_color = "#D27332" + bitesize = 2 + + New() + ..() + reagents.add_reagent("bread", 5) + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread + name = "Cream Cheese Bread" + desc = "Yum yum yum!" + icon_state = "creamcheesebread" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice + slices_num = 5 + filling_color = "#FFF896" + New() + ..() + reagents.add_reagent("nutriment", 20) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice + name = "Cream Cheese Bread slice" + desc = "A slice of yum!" + icon_state = "creamcheesebreadslice" + trash = /obj/item/trash/plate + filling_color = "#FFF896" + bitesize = 2 + + +/obj/item/weapon/reagent_containers/food/snacks/watermelonslice + name = "Watermelon Slice" + desc = "A slice of watery goodness." + icon_state = "watermelonslice" + filling_color = "#FF3867" + bitesize = 2 + + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake + name = "Apple Cake" + desc = "A cake centred with Apple" + icon_state = "applecake" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/applecakeslice + slices_num = 5 + filling_color = "#EBF5B8" + New() + ..() + reagents.add_reagent("nutriment", 15) + +/obj/item/weapon/reagent_containers/food/snacks/applecakeslice + name = "Apple Cake slice" + desc = "A slice of heavenly cake." + icon_state = "applecakeslice" + trash = /obj/item/trash/plate + filling_color = "#EBF5B8" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie + name = "Pumpkin Pie" + desc = "A delicious treat for the autumn months." + icon_state = "pumpkinpie" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice + slices_num = 5 + filling_color = "#F5B951" + + New() + ..() + reagents.add_reagent("nutriment", 15) + +/obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice + name = "Pumpkin Pie slice" + desc = "A slice of pumpkin pie, with whipped cream on top. Perfection." + icon_state = "pumpkinpieslice" + trash = /obj/item/trash/plate + filling_color = "#F5B951" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/cracker + name = "Cracker" + desc = "It's a salted cracker." + icon_state = "cracker" + filling_color = "#F5DEB8" + + New() + ..() + reagents.add_reagent("nutriment", 1) + +/obj/item/weapon/reagent_containers/food/snacks/rawcutlet + name = "raw cutlet" + desc = "A thin piece of raw meat." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "rawcutlet" + bitesize = 1 + New() + ..() + reagents.add_reagent("protein", 1) + attackby(obj/item/weapon/W, mob/user, params) + if(istype(W,/obj/item/weapon/kitchen/knife)) + user.visible_message( \ + "[user] cuts the raw cutlet with the knife!", \ + "You cut the raw cutlet with your knife!" \ + ) + new /obj/item/weapon/reagent_containers/food/snacks/raw_bacon(src.loc) + qdel(src) + + +/////////////////////////////////////////////////PIZZA//////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza + slices_num = 6 + filling_color = "#BAA14C" + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita + name = "Margherita" + desc = "The golden standard of pizzas." + icon_state = "pizzamargherita" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/margheritaslice + slices_num = 6 + New() + ..() + reagents.add_reagent("nutriment", 40) + reagents.add_reagent("tomatojuice", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/margheritaslice + name = "Margherita slice" + desc = "A slice of the classic pizza." + icon_state = "pizzamargheritaslice" + filling_color = "#BAA14C" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza + name = "Meatpizza" + desc = "A pizza with meat topping." + icon_state = "meatpizza" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice + slices_num = 6 + New() + ..() + reagents.add_reagent("protein", 30) + reagents.add_reagent("nutriment", 20) + reagents.add_reagent("tomatojuice", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice + name = "Meatpizza slice" + desc = "A slice of a meaty pizza." + icon_state = "meatpizzaslice" + filling_color = "#BAA14C" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza + name = "Mushroompizza" + desc = "Very special pizza" + icon_state = "mushroompizza" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice + slices_num = 6 + New() + ..() + reagents.add_reagent("plantmatter", 25) + reagents.add_reagent("nutriment", 10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice + name = "Mushroompizza slice" + desc = "Maybe it is the last slice of pizza in your life." + icon_state = "mushroompizzaslice" + filling_color = "#BAA14C" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza + name = "Vegetable pizza" + desc = "No one of Tomato Sapiens were harmed during making this pizza" + icon_state = "vegetablepizza" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice + slices_num = 6 + New() + ..() + reagents.add_reagent("plantmatter", 20) + reagents.add_reagent("nutriment", 10) + reagents.add_reagent("tomatojuice", 6) + reagents.add_reagent("oculine", 12) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice + name = "Vegetable pizza slice" + desc = "A slice of the most green pizza of all pizzas not containing green ingredients " + icon_state = "vegetablepizzaslice" + filling_color = "#BAA14C" + bitesize = 2 + +/obj/item/pizzabox + name = "pizza box" + desc = "A box suited for pizzas." + icon = 'icons/obj/food/food.dmi' + icon_state = "pizzabox1" + + var/open = 0 // Is the box open? + var/ismessy = 0 // Fancy mess on the lid + var/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/pizza // Content pizza + var/list/boxes = list() // If the boxes are stacked, they come here + var/boxtag = "" + +/obj/item/pizzabox/update_icon() + + overlays = list() + + // Set appropriate description + if( open && pizza ) + desc = "A box suited for pizzas. It appears to have a [pizza.name] inside." + else if( boxes.len > 0 ) + desc = "A pile of boxes suited for pizzas. There appears to be [boxes.len + 1] boxes in the pile." + + var/obj/item/pizzabox/topbox = boxes[boxes.len] + var/toptag = topbox.boxtag + if( toptag != "" ) + desc = "[desc] The box on top has a tag, it reads: '[toptag]'." + else + desc = "A box suited for pizzas." + + if( boxtag != "" ) + desc = "[desc] The box has a tag, it reads: '[boxtag]'." + + // Icon states and overlays + if( open ) + if( ismessy ) + icon_state = "pizzabox_messy" + else + icon_state = "pizzabox_open" + + if( pizza ) + var/image/pizzaimg = image("food/food.dmi", icon_state = pizza.icon_state) + pizzaimg.pixel_y = -3 + overlays += pizzaimg + + return + else + // Stupid code because byondcode sucks + var/doimgtag = 0 + if( boxes.len > 0 ) + var/obj/item/pizzabox/topbox = boxes[boxes.len] + if( topbox.boxtag != "" ) + doimgtag = 1 + else + if( boxtag != "" ) + doimgtag = 1 + + if( doimgtag ) + var/image/tagimg = image("food/food.dmi", icon_state = "pizzabox_tag") + tagimg.pixel_y = boxes.len * 3 + overlays += tagimg + + icon_state = "pizzabox[boxes.len+1]" + +/obj/item/pizzabox/attack_hand( mob/user as mob ) + + if( open && pizza ) + user.put_in_hands( pizza ) + + to_chat(user, "\red You take the [src.pizza] out of the [src].") + src.pizza = null + update_icon() + return + + if( boxes.len > 0 ) + if( user.get_inactive_hand() != src ) + ..() + return + + var/obj/item/pizzabox/box = boxes[boxes.len] + boxes -= box + + user.put_in_hands( box ) + to_chat(user, "\red You remove the topmost [src] from your hand.") + box.update_icon() + update_icon() + return + ..() + +/obj/item/pizzabox/attack_self( mob/user as mob ) + + if( boxes.len > 0 ) + return + + open = !open + + if( open && pizza ) + ismessy = 1 + + update_icon() + +/obj/item/pizzabox/attackby( obj/item/I as obj, mob/user as mob , params) + if( istype(I, /obj/item/pizzabox/) ) + var/obj/item/pizzabox/box = I + + if( !box.open && !src.open ) + // Make a list of all boxes to be added + var/list/boxestoadd = list() + boxestoadd += box + for(var/obj/item/pizzabox/i in box.boxes) + boxestoadd += i + + if( (boxes.len+1) + boxestoadd.len <= 5 ) + user.drop_item() + + box.loc = src + box.boxes = list() // Clear the box boxes so we don't have boxes inside boxes. - Xzibit + src.boxes.Add( boxestoadd ) + + box.update_icon() + update_icon() + + to_chat(user, "\red You put the [box] ontop of the [src]!") + else + to_chat(user, "\red The stack is too high!") + else + to_chat(user, "\red Close the [box] first!") + + return + + if( istype(I, /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/) ) // Long ass fucking object name + + if( src.open ) + user.drop_item() + I.loc = src + src.pizza = I + + update_icon() + + to_chat(user, "\red You put the [I] in the [src]!") + else + to_chat(user, "\red You try to push the [I] through the lid but it doesn't work!") + return + + if( istype(I, /obj/item/weapon/pen/) ) + + if( src.open ) + return + + var/t = input("Enter what you want to add to the tag:", "Write", null, null) as text + + var/obj/item/pizzabox/boxtotagto = src + if( boxes.len > 0 ) + boxtotagto = boxes[boxes.len] + + boxtotagto.boxtag = copytext("[boxtotagto.boxtag][t]", 1, 30) + + update_icon() + return + ..() + +/obj/item/pizzabox/margherita/New() + pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita(src) + boxtag = "Margherita Deluxe" + +/obj/item/pizzabox/vegetable/New() + pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza(src) + boxtag = "Gourmet Vegatable" + +/obj/item/pizzabox/mushroom/New() + pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza(src) + boxtag = "Mushroom Special" + +/obj/item/pizzabox/meat/New() + pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza(src) + boxtag = "Meatlover's Supreme" + +////////////////////////////////FOOD ADDITIONS//////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/wrap + name = "egg wrap" + desc = "The precursor to Pigs in a Blanket." + icon_state = "wrap" + New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/beans + name = "tin of beans" + desc = "Musical fruit in a slightly less musical container." + icon_state = "beans" + New() + ..() + reagents.add_reagent("nutriment", 10) + reagents.add_reagent("beans",10) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/benedict + name = "eggs benedict" + desc = "There is only one egg on this, how rude." + icon_state = "benedict" + New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("egg", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/hotdog + name = "hotdog" + desc = "Fresh footlong ready to go down on." + icon_state = "hotdog" + New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("ketchup", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/meatbun + name = "meat bun" + desc = "Has the potential to not be Dog." + icon_state = "meatbun" + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 6 + +/obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich + name = "icecream sandwich" + desc = "Portable Ice-cream in it's own packaging." + icon_state = "icecreamsandwich" + New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("ice", 2) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/notasandwich + name = "not-a-sandwich" + desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache." + icon_state = "notasandwich" + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/sugarcookie + name = "sugar cookie" + desc = "Just like your little sister used to make." + icon_state = "sugarcookie" + New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("sugar", 5) + spawn(1) + reagents.del_reagent("egg") + reagents.update_total() + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/friedbanana + name = "Fried Banana" + desc = "Goreng Pisang, also known as fried bananas." + icon_state = "friedbanana" + New() + ..() + reagents.add_reagent("sugar", 5) + reagents.add_reagent("nutriment", 8) + reagents.add_reagent("cornoil", 4) + +/obj/item/weapon/reagent_containers/food/snacks/tofurkey + name = "Tofurkey" + desc = "A fake turkey made from tofu." + icon_state = "tofurkey" + New() + ..() + reagents.add_reagent("nutriment", 12) + reagents.add_reagent("ether", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/stuffing + name = "Stuffing" + desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!" + icon_state = "stuffing" + New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/dionaroast + name = "roast diona" + desc = "It's like an enormous, leathery carrot. With an eye." + icon_state = "dionaroast" + trash = /obj/item/trash/plate + filling_color = "#75754B" + + New() + ..() + reagents.add_reagent("plantmatter", 4) + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("radium", 2) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/boiledspiderleg + name = "boiled spider leg" + desc = "A giant spider's leg that's still twitching after being cooked. Gross!" + icon_state = "spiderlegcooked" + trash = /obj/item/trash/plate + New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("toxin", 2) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/spidereggs + name = "spider eggs" + desc = "A cluster of juicy spider eggs. A great side dish for when you care not for your health." + icon_state = "spidereggs" + New() + ..() + reagents.add_reagent("protein", 2) + reagents.add_reagent("toxin", 3) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/spidereggsham + name = "green eggs and ham" + desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?" + icon_state = "spidereggsham" + trash = /obj/item/trash/plate + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("toxin", 3) + bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/turkey + name = "Turkey" + desc = "A traditional turkey served with stuffing." + icon_state = "turkey" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/turkeyslice + slices_num = 6 + New() + ..() + reagents.add_reagent("protein", 24) + reagents.add_reagent("nutriment", 18) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/turkeyslice + name = "turkey serving" + desc = "A serving of some tender and delicious turkey." + icon_state = "turkeyslice" + trash = /obj/item/trash/plate + filling_color = "#B97A57" + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/mashed_potatoes //mashed taters + name = "mashed potatoes" + desc = "Some sot creamy, and irresistible mashed potatoes." + icon_state = "mashedtaters" + trash = /obj/item/trash/plate + filling_color = "#D6D9C1" + bitesize = 2 + + New() + ..() + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("gravy", 5) + reagents.add_reagent("mashedpotatoes", 10) + bitesize = 2 + +////////////////////////////////ICE CREAM/////////////////////////////////// +/obj/item/weapon/reagent_containers/food/snacks/icecream + name = "ice cream" + desc = "Delicious ice cream." + icon = 'icons/obj/kitchen.dmi' + icon_state = "icecream_cone" + New() + ..() + reagents.add_reagent("nutriment", 1) + reagents.add_reagent("sugar",1) + bitesize = 1 + update_icon() + + update_icon() + overlays.Cut() + var/image/filling = image('icons/obj/kitchen.dmi', src, "icecream_color") + filling.icon += mix_color_from_reagents(reagents.reagent_list) + overlays += filling + +/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcone + name = "ice cream cone" + desc = "Delicious ice cream." + icon_state = "icecream_cone" + volume = 50 + New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("sugar",6) + reagents.add_reagent("ice",2) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcup + name = "chocolate ice cream cone" + desc = "Delicious ice cream." + icon_state = "icecream_cup" + volume = 50 + New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("chocolate",8) + reagents.add_reagent("ice",2) + bitesize = 6 + +/obj/item/weapon/reagent_containers/food/snacks/cereal + name = "box of cereal" + desc = "A box of cereal." + icon = 'icons/obj/food/food.dmi' + icon_state = "cereal_box" + bitesize = 2 + New() + ..() + reagents.add_reagent("nutriment", 3) +/obj/item/weapon/reagent_containers/food/snacks/deepfryholder + name = "Deep Fried Foods Holder Obj" + desc = "If you can see this description the code for the deep fryer fucked up." + icon = 'icons/obj/food/food.dmi' + icon_state = "deepfried_holder_icon" + bitesize = 2 + New() + ..() + reagents.add_reagent("nutriment", 3) + +/obj/item/weapon/reagent_containers/food/snacks/dough + name = "dough" + desc = "A piece of dough." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "dough" + bitesize = 2 + New() + ..() + reagents.add_reagent("nutriment", 3) + +// Dough + rolling pin = flat dough +/obj/item/weapon/reagent_containers/food/snacks/dough/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/kitchen/rollingpin)) + if(isturf(loc)) + new /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough(loc) + to_chat(user, "You flatten [src].") + qdel(src) + else + to_chat(user, "You need to put [src] on a surface to roll it out!") + else + ..() + +// slicable into 3xdoughslices +/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough + name = "flat dough" + desc = "Some flattened dough." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "flat dough" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice + slices_num = 3 + New() + ..() + reagents.add_reagent("nutriment", 3) + +/obj/item/weapon/reagent_containers/food/snacks/doughslice + name = "dough slice" + desc = "The building block of an impressive dish." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "doughslice" + bitesize = 2 + New() + ..() + reagents.add_reagent("nutriment", 1) + +/obj/item/weapon/reagent_containers/food/snacks/bun + name = "bun" + desc = "The base for any self-respecting burger." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "bun" + bitesize = 2 + New() + ..() + reagents.add_reagent("nutriment", 4) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/taco + name = "taco" + desc = "Take a bite!" + icon_state = "taco" + bitesize = 3 + New() + ..() + reagents.add_reagent("nutriment", 7) + +/obj/item/weapon/reagent_containers/food/snacks/cutlet + name = "cutlet" + desc = "A tasty meat slice." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "cutlet" + bitesize = 2 + New() + ..() + reagents.add_reagent("protein", 2) + +/obj/item/weapon/reagent_containers/food/snacks/rawmeatball + name = "raw meatball" + desc = "A raw meatball." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "rawmeatball" + bitesize = 2 + New() + ..() + reagents.add_reagent("protein", 2) + +/obj/item/weapon/reagent_containers/food/snacks/hotdog + name = "hotdog" + desc = "Unrelated to dogs, maybe." + icon_state = "hotdog" + bitesize = 2 + New() + ..() + reagents.add_reagent("protein", 6) + +/obj/item/weapon/reagent_containers/food/snacks/flatbread + name = "flatbread" + desc = "Bland but filling." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "flatbread" + bitesize = 2 + New() + ..() + reagents.add_reagent("nutriment", 3) + +/obj/item/weapon/reagent_containers/food/snacks/rawsticks + name = "raw potato sticks" + desc = "Raw fries, not very tasty." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "rawsticks" + bitesize = 2 + New() + ..() + reagents.add_reagent("plantmatter", 3) + +/obj/item/weapon/reagent_containers/food/snacks/ectoplasm + name = "ectoplasm" + desc = "A luminescent blob of what scientists refer to as 'ghost goo'." + icon = 'icons/obj/wizard.dmi' + icon_state = "ectoplasm" + New() + ..() + reagents.add_reagent("ectoplasm", 10) + +/obj/item/weapon/reagent_containers/food/snacks/liquidfood + name = "\improper LiquidFood Ration" + desc = "A prepackaged grey slurry of all the essential nutrients for a spacefarer on the go. Should this be crunchy?" + icon_state = "liquidfood" + trash = /obj/item/trash/liquidfood + filling_color = "#A8A8A8" + + New() + ..() + reagents.add_reagent("nutriment", 20) + reagents.add_reagent("iron", 3) + bitesize = 4 + + +/obj/item/weapon/reagent_containers/food/snacks/tastybread + name = "bread tube" + desc = "Bread in a tube. Chewy...and surprisingly tasty." + icon_state = "tastybread" + trash = /obj/item/trash/tastybread + filling_color = "#A66829" + + New() + ..() + reagents.add_reagent("nutriment", 6) + bitesize = 2 diff --git a/code/modules/food/candy_maker.dm b/code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm similarity index 100% rename from code/modules/food/candy_maker.dm rename to code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm diff --git a/code/modules/food/cereal_maker.dm b/code/modules/food_and_drinks/kitchen_machinery/cereal_maker.dm similarity index 97% rename from code/modules/food/cereal_maker.dm rename to code/modules/food_and_drinks/kitchen_machinery/cereal_maker.dm index 3e682f5028c..d7b0d75a430 100644 --- a/code/modules/food/cereal_maker.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/cereal_maker.dm @@ -1,24 +1,24 @@ -/obj/machinery/cooker/cerealmaker - name = "cereal maker" - desc = "Now with Dann O's available!" - icon = 'icons/obj/cooking_machines.dmi' - icon_state = "cereal_off" - thiscooktype = "cerealized" - cooktime = 200 - onicon = "cereal_on" - officon = "cereal_off" - -obj/machinery/cooker/cerealmaker/setIcon(obj/item/copyme, obj/item/copyto) - var/image/img = new(copyme.icon, copyme.icon_state) - img.transform *= 0.7 - copyto.overlays += img - copyto.overlays += copyme.overlays - -obj/machinery/cooker/cerealmaker/changename(obj/item/name, obj/item/setme) - setme.name = "box of [name] cereal" - setme.desc = "[name.desc] It has been [thiscooktype]" - -obj/machinery/cooker/cerealmaker/gettype() - var/obj/item/weapon/reagent_containers/food/snacks/cereal/type = new(get_turf(src)) - return type - +/obj/machinery/cooker/cerealmaker + name = "cereal maker" + desc = "Now with Dann O's available!" + icon = 'icons/obj/cooking_machines.dmi' + icon_state = "cereal_off" + thiscooktype = "cerealized" + cooktime = 200 + onicon = "cereal_on" + officon = "cereal_off" + +obj/machinery/cooker/cerealmaker/setIcon(obj/item/copyme, obj/item/copyto) + var/image/img = new(copyme.icon, copyme.icon_state) + img.transform *= 0.7 + copyto.overlays += img + copyto.overlays += copyme.overlays + +obj/machinery/cooker/cerealmaker/changename(obj/item/name, obj/item/setme) + setme.name = "box of [name] cereal" + setme.desc = "[name.desc] It has been [thiscooktype]" + +obj/machinery/cooker/cerealmaker/gettype() + var/obj/item/weapon/reagent_containers/food/snacks/cereal/type = new(get_turf(src)) + return type + diff --git a/code/modules/food/cooker.dm b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm similarity index 100% rename from code/modules/food/cooker.dm rename to code/modules/food_and_drinks/kitchen_machinery/cooker.dm diff --git a/code/modules/food/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm similarity index 96% rename from code/modules/food/deep_fryer.dm rename to code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index b5aaef15fec..73607d4e3ab 100644 --- a/code/modules/food/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -1,100 +1,100 @@ -/obj/machinery/cooker/deepfryer - name = "deep fryer" - desc = "Deep fried everything." - icon = 'icons/obj/cooking_machines.dmi' - icon_state = "fryer_off" - thiscooktype = "deep fried" - burns = 1 - firechance = 100 - cooktime = 200 - foodcolor = "#FFAD33" - officon = "fryer_off" - onicon = "fryer_on" - openicon = "fryer_open" - has_specials = 1 - upgradeable = 1 - -/obj/machinery/cooker/deepfryer/New() - ..() - component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/deepfryer(null) - component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) - component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) - component_parts += new /obj/item/stack/cable_coil(null, 5) - RefreshParts() - -/obj/machinery/cooker/deepfryer/upgraded/New() - ..() - component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/deepfryer(null) - component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null) - component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null) - component_parts += new /obj/item/stack/cable_coil(null, 5) - RefreshParts() - -/obj/machinery/cooker/deepfryer/RefreshParts() - var/E = 0 - for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts) - E += L.rating - E -= 2 //Standard parts is 0 (1+1-2), Tier 4 parts is 6 (4+4-2) - cooktime = (200 - (E * 20)) //Effectively each laser improves cooktime by 20 per rating beyond the first (200 base, 80 max upgrade) - -/obj/machinery/cooker/deepfryer/gettype() - var/obj/item/weapon/reagent_containers/food/snacks/deepfryholder/type = new(get_turf(src)) - return type - -/obj/machinery/cooker/deepfryer/checkSpecials(obj/item/I) - if(!I) - return 0 - for(var/Type in subtypesof(/datum/deepfryer_special)) - var/datum/deepfryer_special/P = new Type() - if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/grown)) - var/obj/item/weapon/reagent_containers/food/snacks/grown/G = I - if(G.seed.kitchen_tag != P.input) - continue - else if(!istype(I, P.input)) - continue - return P - return 0 - -/obj/machinery/cooker/deepfryer/cookSpecial(special) - if(!special) - return 0 - var/datum/deepfryer_special/recipe = special - if(!recipe.output) - return 0 - new recipe.output(get_turf(src)) - - -////////////////////////////////// -// Deepfryer Special // -// Interaction Datums // -////////////////////////////////// - -/datum/deepfryer_special - var/input //Thing that goes in - var/output //Thing that comes out - -/datum/deepfryer_special/shrimp - input = /obj/item/weapon/reagent_containers/food/snacks/shrimp - output = /obj/item/weapon/reagent_containers/food/snacks/fried_shrimp - -/datum/deepfryer_special/banana - input = "banana" - output = /obj/item/weapon/reagent_containers/food/snacks/friedbanana - -/datum/deepfryer_special/potato_chips - input = /obj/item/weapon/reagent_containers/food/snacks/rawsticks - output = /obj/item/weapon/reagent_containers/food/snacks/chips - -/datum/deepfryer_special/corn_chips - input = "corn" - output = /obj/item/weapon/reagent_containers/food/snacks/cornchips - -/datum/deepfryer_special/fried_tofu - input = /obj/item/weapon/reagent_containers/food/snacks/tofu - output = /obj/item/weapon/reagent_containers/food/snacks/fried_tofu - -/datum/deepfryer_special/chimichanga - input = /obj/item/weapon/reagent_containers/food/snacks/burrito +/obj/machinery/cooker/deepfryer + name = "deep fryer" + desc = "Deep fried everything." + icon = 'icons/obj/cooking_machines.dmi' + icon_state = "fryer_off" + thiscooktype = "deep fried" + burns = 1 + firechance = 100 + cooktime = 200 + foodcolor = "#FFAD33" + officon = "fryer_off" + onicon = "fryer_on" + openicon = "fryer_open" + has_specials = 1 + upgradeable = 1 + +/obj/machinery/cooker/deepfryer/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/deepfryer(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) + component_parts += new /obj/item/stack/cable_coil(null, 5) + RefreshParts() + +/obj/machinery/cooker/deepfryer/upgraded/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/deepfryer(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null) + component_parts += new /obj/item/stack/cable_coil(null, 5) + RefreshParts() + +/obj/machinery/cooker/deepfryer/RefreshParts() + var/E = 0 + for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts) + E += L.rating + E -= 2 //Standard parts is 0 (1+1-2), Tier 4 parts is 6 (4+4-2) + cooktime = (200 - (E * 20)) //Effectively each laser improves cooktime by 20 per rating beyond the first (200 base, 80 max upgrade) + +/obj/machinery/cooker/deepfryer/gettype() + var/obj/item/weapon/reagent_containers/food/snacks/deepfryholder/type = new(get_turf(src)) + return type + +/obj/machinery/cooker/deepfryer/checkSpecials(obj/item/I) + if(!I) + return 0 + for(var/Type in subtypesof(/datum/deepfryer_special)) + var/datum/deepfryer_special/P = new Type() + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/grown)) + var/obj/item/weapon/reagent_containers/food/snacks/grown/G = I + if(G.seed.kitchen_tag != P.input) + continue + else if(!istype(I, P.input)) + continue + return P + return 0 + +/obj/machinery/cooker/deepfryer/cookSpecial(special) + if(!special) + return 0 + var/datum/deepfryer_special/recipe = special + if(!recipe.output) + return 0 + new recipe.output(get_turf(src)) + + +////////////////////////////////// +// Deepfryer Special // +// Interaction Datums // +////////////////////////////////// + +/datum/deepfryer_special + var/input //Thing that goes in + var/output //Thing that comes out + +/datum/deepfryer_special/shrimp + input = /obj/item/weapon/reagent_containers/food/snacks/shrimp + output = /obj/item/weapon/reagent_containers/food/snacks/fried_shrimp + +/datum/deepfryer_special/banana + input = "banana" + output = /obj/item/weapon/reagent_containers/food/snacks/friedbanana + +/datum/deepfryer_special/potato_chips + input = /obj/item/weapon/reagent_containers/food/snacks/rawsticks + output = /obj/item/weapon/reagent_containers/food/snacks/chips + +/datum/deepfryer_special/corn_chips + input = "corn" + output = /obj/item/weapon/reagent_containers/food/snacks/cornchips + +/datum/deepfryer_special/fried_tofu + input = /obj/item/weapon/reagent_containers/food/snacks/tofu + output = /obj/item/weapon/reagent_containers/food/snacks/fried_tofu + +/datum/deepfryer_special/chimichanga + input = /obj/item/weapon/reagent_containers/food/snacks/burrito output = /obj/item/weapon/reagent_containers/food/snacks/chimichanga \ No newline at end of file diff --git a/code/modules/food/food_grill.dm b/code/modules/food_and_drinks/kitchen_machinery/food_grill.dm similarity index 95% rename from code/modules/food/food_grill.dm rename to code/modules/food_and_drinks/kitchen_machinery/food_grill.dm index f3b0c296763..54290c80b37 100644 --- a/code/modules/food/food_grill.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/food_grill.dm @@ -1,29 +1,29 @@ -/obj/machinery/cooker/foodgrill - name = "grill" - desc = "Backyard grilling, IN SPACE." - icon = 'icons/obj/cooking_machines.dmi' - icon_state = "grill_off" - thiscooktype = "grilled" - burns = 1 - firechance = 20 - cooktime = 50 - foodcolor = "#A34719" - onicon = "grill_on" - officon = "grill_off" - -obj/machinery/cooker/foodgrill/putIn(obj/item/In, mob/chef) - ..() - var/image/img = new(In.icon, In.icon_state) - img.pixel_y = 5 - overlays += img - sleep(50) - overlays = 0 - img.color = "#C28566" - overlays += img - sleep(50) - overlays = 0 - img.color = "#A34719" - overlays += img - sleep(50) - overlays = 0 - +/obj/machinery/cooker/foodgrill + name = "grill" + desc = "Backyard grilling, IN SPACE." + icon = 'icons/obj/cooking_machines.dmi' + icon_state = "grill_off" + thiscooktype = "grilled" + burns = 1 + firechance = 20 + cooktime = 50 + foodcolor = "#A34719" + onicon = "grill_on" + officon = "grill_off" + +obj/machinery/cooker/foodgrill/putIn(obj/item/In, mob/chef) + ..() + var/image/img = new(In.icon, In.icon_state) + img.pixel_y = 5 + overlays += img + sleep(50) + overlays = 0 + img.color = "#C28566" + overlays += img + sleep(50) + overlays = 0 + img.color = "#A34719" + overlays += img + sleep(50) + overlays = 0 + diff --git a/code/game/machinery/kitchen/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm similarity index 96% rename from code/game/machinery/kitchen/gibber.dm rename to code/modules/food_and_drinks/kitchen_machinery/gibber.dm index ddf289d6189..b71bb0be2d4 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -1,393 +1,393 @@ -#define GIBBER_ANIMATION_DELAY 16 -/obj/machinery/gibber - name = "Gibber" - desc = "The name isn't descriptive enough?" - icon = 'icons/obj/kitchen.dmi' - icon_state = "grinder" - density = 1 - anchored = 1 - var/operating = 0 //Is it on? - var/dirty = 0 // Does it need cleaning? - var/mob/living/occupant // Mob who has been put inside - var/locked = 0 //Used to prevent mobs from breaking the feedin anim - - var/gib_throw_dir = WEST // Direction to spit meat and gibs in. Defaults to west. - var/gibtime = 40 // Time from starting until meat appears - - var/list/victims = list() - - use_power = 1 - idle_power_usage = 2 - active_power_usage = 500 - -/obj/machinery/gibber/Destroy() - if(contents.len) - for(var/atom/movable/A in contents) - A.loc = get_turf(src) - if(occupant) occupant = null - return ..() - -/obj/machinery/gibber/RefreshParts() //If you want to make the machine upgradable, this is where you would change any vars basd on its stock parts. - return - -/obj/machinery/gibber/New() - ..() - overlays += image('icons/obj/kitchen.dmi', "grjam") - -/obj/machinery/gibber/update_icon() - overlays.Cut() - - if(dirty) - overlays += image('icons/obj/kitchen.dmi', "grbloody") - - if(stat & (NOPOWER|BROKEN)) - return - - if(!occupant) - overlays += image('icons/obj/kitchen.dmi', "grjam") - - else if(operating) - overlays += image('icons/obj/kitchen.dmi', "gruse") - - else - overlays += image('icons/obj/kitchen.dmi', "gridle") - -/obj/machinery/gibber/relaymove(mob/user as mob) - if(locked) - return - - go_out() - -/obj/machinery/gibber/attack_hand(mob/user as mob) - if(stat & (NOPOWER|BROKEN)) - return - - if(operating) - to_chat(user, "The gibber is locked and running, wait for it to finish.") - return - - if(locked) - to_chat(user, "Wait for [occupant.name] to finish being loaded!") - return - - else - startgibbing(user) - -/obj/machinery/gibber/attackby(obj/item/P as obj, mob/user as mob, params) - if(istype(P, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = P - if(G.state < 2) - to_chat(user, "You need a better grip to do that!") - return - move_into_gibber(user,G.affecting) - qdel(G) - return - - if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P)) - return - - if(exchange_parts(user, P)) - return - - if(default_unfasten_wrench(user, P)) - return - - default_deconstruction_crowbar(P) - -/obj/machinery/gibber/MouseDrop_T(mob/target, mob/user) - if(user.incapacitated() || !ishuman(user)) - return - - if(!isliving(target)) - return - - var/mob/living/targetl = target - - if(targetl.buckled) - return - - move_into_gibber(user,target) - -/obj/machinery/gibber/proc/move_into_gibber(var/mob/user,var/mob/living/victim) - if(occupant) - to_chat(user, "The gibber is full, empty it first!") - return - - if(operating) - to_chat(user, "The gibber is locked and running, wait for it to finish.") - return - - if(!ishuman(victim) || issmall(victim)) - to_chat(user, "This is not suitable for the gibber!") - return - - if(victim.abiotic(1)) - to_chat(user, "Subject may not have abiotic items on.") - return - - user.visible_message("[user] starts to put [victim] into the gibber!") - src.add_fingerprint(user) - if(do_after(user, 30, target = victim) && user.Adjacent(src) && victim.Adjacent(user) && !occupant) - user.visible_message("[user] stuffs [victim] into the gibber!") - - victim.forceMove(src) - occupant = victim - - update_icon() - feedinTopanim() - -/obj/machinery/gibber/verb/eject() - set category = "Object" - set name = "Empty Gibber" - set src in oview(1) - - if(usr.stat != CONSCIOUS) - return - - go_out() - add_fingerprint(usr) - -/obj/machinery/gibber/proc/go_out() - if(operating || !occupant) //no going out if operating, just in case they manage to trigger go_out before being dead - return - - if(locked) - return - - for(var/obj/O in src) - O.loc = src.loc - - occupant.forceMove(get_turf(src)) - occupant = null - - update_icon() - - return - -/obj/machinery/gibber/proc/feedinTopanim() - if(!occupant) - return - - locked = 1 //lock gibber - - var/image/gibberoverlay = new //used to simulate 3D effects - gibberoverlay.icon = icon - gibberoverlay.icon_state = "grinderoverlay" - gibberoverlay.overlays += image('icons/obj/kitchen.dmi', "gridle") - - var/image/feedee = new - occupant.dir = 2 - feedee.icon = getFlatIcon(occupant, 2) //makes the image a copy of the occupant - - var/atom/movable/holder = new //holder for occupant image - holder.name = null //make unclickable - holder.overlays += feedee //add occupant to holder overlays - holder.pixel_y = 25 //above the gibber - holder.pixel_x = 2 - holder.loc = get_turf(src) - holder.layer = MOB_LAYER //simulate mob-like layering - holder.anchored = 1 - - var/atom/movable/holder2 = new //holder for gibber overlay, used to simulate 3D effect - holder2.name = null - holder2.overlays += gibberoverlay - holder2.loc = get_turf(src) - holder2.layer = MOB_LAYER + 0.1 //3D, it's above the mob, rest of the gibber is behind - holder2.anchored = 1 - - animate(holder, pixel_y = 16, time = GIBBER_ANIMATION_DELAY) //animate going down - - sleep(GIBBER_ANIMATION_DELAY) - - holder.overlays -= feedee //reset static icon - feedee.icon += icon('icons/obj/kitchen.dmi', "footicon") //this is some byond magic; += to the icon var with a black and white image will mask it - holder.overlays += feedee - animate(holder, pixel_y = -3, time = GIBBER_ANIMATION_DELAY) //animate going down further - - sleep(GIBBER_ANIMATION_DELAY) //time everything right, animate doesn't prevent proc from continuing - - qdel(holder) //get rid of holder object - qdel(holder2) //get rid of holder object - locked = 0 //unlock - -/obj/machinery/gibber/proc/startgibbing(var/mob/user, var/UserOverride=0) - if(!istype(user) && !UserOverride) - log_debug("Some shit just went down with the gibber at X[x], Y[y], Z[z] with an invalid user. (JMP)") - return - - if(UserOverride) - msg_admin_attack("[key_name_admin(occupant)] was gibbed by an autogibber (\the [src]) (JMP)") - - if(operating) - return - - if(!occupant) - visible_message("You hear a loud metallic grinding sound.") - return - - use_power(1000) - visible_message("You hear a loud squelchy grinding sound.") - - operating = 1 - update_icon() - var/offset = prob(50) ? -2 : 2 - animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking - - var/slab_name = occupant.name - var/slab_count = 3 - var/slab_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human //gibber can only gib humans on paracode, no need to check meat type - var/slab_nutrition = src.occupant.nutrition / 15 - - slab_nutrition /= slab_count - - for(var/i=1 to slab_count) - var/obj/item/weapon/reagent_containers/food/snacks/meat/new_meat = new slab_type(src) - new_meat.name = "[slab_name] [new_meat.name]" - new_meat.reagents.add_reagent("nutriment",slab_nutrition) - - - if(occupant.reagents) - occupant.reagents.trans_to(new_meat, round(occupant.reagents.total_volume/slab_count,1)) - - if(occupant.get_species() == "Human") - new /obj/item/stack/sheet/animalhide/human(src) - new /obj/effect/decal/cleanable/blood/gibs(src) - - if(!UserOverride) - occupant.attack_log += "\[[time_stamp()]\] Was gibbed by [key_name(user)]" //One shall not simply gib a mob unnoticed! - user.attack_log += "\[[time_stamp()]\] Gibbed [key_name(occupant)]" - - if(occupant.ckey) - msg_admin_attack("[key_name_admin(user)] gibbed [key_name_admin(occupant)]") - - if(!iscarbon(user)) - occupant.LAssailant = null - else - occupant.LAssailant = user - - else //this looks ugly but it's better than a copy-pasted startgibbing proc override - occupant.attack_log += "\[[time_stamp()]\] Was gibbed by an autogibber (\the [src])" - - occupant.emote("scream") - playsound(get_turf(src), 'sound/goonstation/effects/gib.ogg', 50, 1) - - victims += "\[[time_stamp()]\] [occupant.name] ([occupant.ckey]) killed by [UserOverride ? "Autogibbing" : "[user] ([user.ckey])"]" //have to do this before ghostizing - occupant.death(1) - occupant.ghostize() - - qdel(occupant) - - spawn(gibtime) - playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) - operating = 0 - - for(var/obj/item/thing in contents) //Meat is spawned inside the gibber and thrown out afterwards. - thing.loc = get_turf(thing) // Drop it onto the turf for throwing. - thing.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) // Being pelted with bits of meat and bone would hurt. - sleep(1) - - for(var/obj/effect/gibs in contents) //throw out the gibs too - gibs.loc = get_turf(gibs) //drop onto turf for throwing - gibs.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) - sleep(1) - - pixel_x = initial(pixel_x) //return to it's spot after shaking - operating = 0 - update_icon() - - - -/* AUTOGIBBER */ - - -//gibs anything that stands on it's input - -/obj/machinery/gibber/autogibber - var/acceptdir = NORTH - var/lastacceptdir = NORTH - var/turf/lturf - -/obj/machinery/gibber/autogibber/New() - ..() - spawn(5) - var/turf/T = get_step(src, acceptdir) - if(istype(T)) - lturf = T - component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/gibber(null) - component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) - component_parts += new /obj/item/weapon/stock_parts/manipulator(null) - RefreshParts() - -/obj/machinery/gibber/autogibber/process() - if(!lturf || occupant || locked || dirty || operating) - return - - if(acceptdir != lastacceptdir) - lturf = null - lastacceptdir = acceptdir - var/turf/T = get_step(src, acceptdir) - if(istype(T)) - lturf = T - - for(var/mob/living/carbon/human/H in lturf) - if(istype(H) && H.loc == lturf) - visible_message({"\The [src] states, "Food detected!""}) - sleep(30) - if(H.loc == lturf) //still standing there - if(force_move_into_gibber(H)) - ejectclothes(occupant) - cleanbay() - startgibbing(null, 1) - break - -/obj/machinery/gibber/autogibber/proc/force_move_into_gibber(var/mob/living/carbon/human/victim) - if(!istype(victim)) return 0 - visible_message("\The [victim.name] gets sucked into \the [src]!") - - victim.forceMove(src) - occupant = victim - - update_icon() - feedinTopanim() - return 1 - -/obj/machinery/gibber/autogibber/proc/ejectclothes(var/mob/living/carbon/human/H) - if(!istype(H)) return 0 - if(H != occupant) return 0 //only using H as a shortcut to typecast - for(var/obj/O in H) - if(istype(O,/obj/item/clothing)) //clothing gets skipped to avoid cleaning out shit - continue - if(istype(O,/obj/item/weapon/implant)) - var/obj/item/weapon/implant/I = O - if(I.implanted) - continue - if(istype(O,/obj/item/organ)) - continue - if(O.flags & NODROP) - qdel(O) //they are already dead by now - H.unEquip(O) - O.loc = src.loc - O.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) - sleep(1) - - for(var/obj/item/clothing/C in H) - if(C.flags & NODROP) - qdel(C) - H.unEquip(C) - C.loc = src.loc - C.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) - sleep(1) - - visible_message("\The [src] spits out \the [H.name]'s possessions!") - -/obj/machinery/gibber/autogibber/proc/cleanbay() - var/spats = 0 //keeps track of how many items get spit out. Don't show a message if none are found. - for(var/obj/O in src) - if(istype(O)) - O.loc = src.loc - O.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) - spats++ - sleep(1) - if(spats) - visible_message("\The [src] spits out more possessions!") +#define GIBBER_ANIMATION_DELAY 16 +/obj/machinery/gibber + name = "Gibber" + desc = "The name isn't descriptive enough?" + icon = 'icons/obj/kitchen.dmi' + icon_state = "grinder" + density = 1 + anchored = 1 + var/operating = 0 //Is it on? + var/dirty = 0 // Does it need cleaning? + var/mob/living/occupant // Mob who has been put inside + var/locked = 0 //Used to prevent mobs from breaking the feedin anim + + var/gib_throw_dir = WEST // Direction to spit meat and gibs in. Defaults to west. + var/gibtime = 40 // Time from starting until meat appears + + var/list/victims = list() + + use_power = 1 + idle_power_usage = 2 + active_power_usage = 500 + +/obj/machinery/gibber/Destroy() + if(contents.len) + for(var/atom/movable/A in contents) + A.loc = get_turf(src) + if(occupant) occupant = null + return ..() + +/obj/machinery/gibber/RefreshParts() //If you want to make the machine upgradable, this is where you would change any vars basd on its stock parts. + return + +/obj/machinery/gibber/New() + ..() + overlays += image('icons/obj/kitchen.dmi', "grjam") + +/obj/machinery/gibber/update_icon() + overlays.Cut() + + if(dirty) + overlays += image('icons/obj/kitchen.dmi', "grbloody") + + if(stat & (NOPOWER|BROKEN)) + return + + if(!occupant) + overlays += image('icons/obj/kitchen.dmi', "grjam") + + else if(operating) + overlays += image('icons/obj/kitchen.dmi', "gruse") + + else + overlays += image('icons/obj/kitchen.dmi', "gridle") + +/obj/machinery/gibber/relaymove(mob/user as mob) + if(locked) + return + + go_out() + +/obj/machinery/gibber/attack_hand(mob/user as mob) + if(stat & (NOPOWER|BROKEN)) + return + + if(operating) + to_chat(user, "The gibber is locked and running, wait for it to finish.") + return + + if(locked) + to_chat(user, "Wait for [occupant.name] to finish being loaded!") + return + + else + startgibbing(user) + +/obj/machinery/gibber/attackby(obj/item/P as obj, mob/user as mob, params) + if(istype(P, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = P + if(G.state < 2) + to_chat(user, "You need a better grip to do that!") + return + move_into_gibber(user,G.affecting) + qdel(G) + return + + if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P)) + return + + if(exchange_parts(user, P)) + return + + if(default_unfasten_wrench(user, P)) + return + + default_deconstruction_crowbar(P) + +/obj/machinery/gibber/MouseDrop_T(mob/target, mob/user) + if(user.incapacitated() || !ishuman(user)) + return + + if(!isliving(target)) + return + + var/mob/living/targetl = target + + if(targetl.buckled) + return + + move_into_gibber(user,target) + +/obj/machinery/gibber/proc/move_into_gibber(var/mob/user,var/mob/living/victim) + if(occupant) + to_chat(user, "The gibber is full, empty it first!") + return + + if(operating) + to_chat(user, "The gibber is locked and running, wait for it to finish.") + return + + if(!ishuman(victim) || issmall(victim)) + to_chat(user, "This is not suitable for the gibber!") + return + + if(victim.abiotic(1)) + to_chat(user, "Subject may not have abiotic items on.") + return + + user.visible_message("[user] starts to put [victim] into the gibber!") + src.add_fingerprint(user) + if(do_after(user, 30, target = victim) && user.Adjacent(src) && victim.Adjacent(user) && !occupant) + user.visible_message("[user] stuffs [victim] into the gibber!") + + victim.forceMove(src) + occupant = victim + + update_icon() + feedinTopanim() + +/obj/machinery/gibber/verb/eject() + set category = "Object" + set name = "Empty Gibber" + set src in oview(1) + + if(usr.stat != CONSCIOUS) + return + + go_out() + add_fingerprint(usr) + +/obj/machinery/gibber/proc/go_out() + if(operating || !occupant) //no going out if operating, just in case they manage to trigger go_out before being dead + return + + if(locked) + return + + for(var/obj/O in src) + O.loc = src.loc + + occupant.forceMove(get_turf(src)) + occupant = null + + update_icon() + + return + +/obj/machinery/gibber/proc/feedinTopanim() + if(!occupant) + return + + locked = 1 //lock gibber + + var/image/gibberoverlay = new //used to simulate 3D effects + gibberoverlay.icon = icon + gibberoverlay.icon_state = "grinderoverlay" + gibberoverlay.overlays += image('icons/obj/kitchen.dmi', "gridle") + + var/image/feedee = new + occupant.dir = 2 + feedee.icon = getFlatIcon(occupant, 2) //makes the image a copy of the occupant + + var/atom/movable/holder = new //holder for occupant image + holder.name = null //make unclickable + holder.overlays += feedee //add occupant to holder overlays + holder.pixel_y = 25 //above the gibber + holder.pixel_x = 2 + holder.loc = get_turf(src) + holder.layer = MOB_LAYER //simulate mob-like layering + holder.anchored = 1 + + var/atom/movable/holder2 = new //holder for gibber overlay, used to simulate 3D effect + holder2.name = null + holder2.overlays += gibberoverlay + holder2.loc = get_turf(src) + holder2.layer = MOB_LAYER + 0.1 //3D, it's above the mob, rest of the gibber is behind + holder2.anchored = 1 + + animate(holder, pixel_y = 16, time = GIBBER_ANIMATION_DELAY) //animate going down + + sleep(GIBBER_ANIMATION_DELAY) + + holder.overlays -= feedee //reset static icon + feedee.icon += icon('icons/obj/kitchen.dmi', "footicon") //this is some byond magic; += to the icon var with a black and white image will mask it + holder.overlays += feedee + animate(holder, pixel_y = -3, time = GIBBER_ANIMATION_DELAY) //animate going down further + + sleep(GIBBER_ANIMATION_DELAY) //time everything right, animate doesn't prevent proc from continuing + + qdel(holder) //get rid of holder object + qdel(holder2) //get rid of holder object + locked = 0 //unlock + +/obj/machinery/gibber/proc/startgibbing(var/mob/user, var/UserOverride=0) + if(!istype(user) && !UserOverride) + log_debug("Some shit just went down with the gibber at X[x], Y[y], Z[z] with an invalid user. (JMP)") + return + + if(UserOverride) + msg_admin_attack("[key_name_admin(occupant)] was gibbed by an autogibber (\the [src]) (JMP)") + + if(operating) + return + + if(!occupant) + visible_message("You hear a loud metallic grinding sound.") + return + + use_power(1000) + visible_message("You hear a loud squelchy grinding sound.") + + operating = 1 + update_icon() + var/offset = prob(50) ? -2 : 2 + animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking + + var/slab_name = occupant.name + var/slab_count = 3 + var/slab_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human //gibber can only gib humans on paracode, no need to check meat type + var/slab_nutrition = src.occupant.nutrition / 15 + + slab_nutrition /= slab_count + + for(var/i=1 to slab_count) + var/obj/item/weapon/reagent_containers/food/snacks/meat/new_meat = new slab_type(src) + new_meat.name = "[slab_name] [new_meat.name]" + new_meat.reagents.add_reagent("nutriment",slab_nutrition) + + + if(occupant.reagents) + occupant.reagents.trans_to(new_meat, round(occupant.reagents.total_volume/slab_count,1)) + + if(occupant.get_species() == "Human") + new /obj/item/stack/sheet/animalhide/human(src) + new /obj/effect/decal/cleanable/blood/gibs(src) + + if(!UserOverride) + occupant.attack_log += "\[[time_stamp()]\] Was gibbed by [key_name(user)]" //One shall not simply gib a mob unnoticed! + user.attack_log += "\[[time_stamp()]\] Gibbed [key_name(occupant)]" + + if(occupant.ckey) + msg_admin_attack("[key_name_admin(user)] gibbed [key_name_admin(occupant)]") + + if(!iscarbon(user)) + occupant.LAssailant = null + else + occupant.LAssailant = user + + else //this looks ugly but it's better than a copy-pasted startgibbing proc override + occupant.attack_log += "\[[time_stamp()]\] Was gibbed by an autogibber (\the [src])" + + occupant.emote("scream") + playsound(get_turf(src), 'sound/goonstation/effects/gib.ogg', 50, 1) + + victims += "\[[time_stamp()]\] [occupant.name] ([occupant.ckey]) killed by [UserOverride ? "Autogibbing" : "[user] ([user.ckey])"]" //have to do this before ghostizing + occupant.death(1) + occupant.ghostize() + + qdel(occupant) + + spawn(gibtime) + playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) + operating = 0 + + for(var/obj/item/thing in contents) //Meat is spawned inside the gibber and thrown out afterwards. + thing.loc = get_turf(thing) // Drop it onto the turf for throwing. + thing.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) // Being pelted with bits of meat and bone would hurt. + sleep(1) + + for(var/obj/effect/gibs in contents) //throw out the gibs too + gibs.loc = get_turf(gibs) //drop onto turf for throwing + gibs.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) + sleep(1) + + pixel_x = initial(pixel_x) //return to it's spot after shaking + operating = 0 + update_icon() + + + +/* AUTOGIBBER */ + + +//gibs anything that stands on it's input + +/obj/machinery/gibber/autogibber + var/acceptdir = NORTH + var/lastacceptdir = NORTH + var/turf/lturf + +/obj/machinery/gibber/autogibber/New() + ..() + spawn(5) + var/turf/T = get_step(src, acceptdir) + if(istype(T)) + lturf = T + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/gibber(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + RefreshParts() + +/obj/machinery/gibber/autogibber/process() + if(!lturf || occupant || locked || dirty || operating) + return + + if(acceptdir != lastacceptdir) + lturf = null + lastacceptdir = acceptdir + var/turf/T = get_step(src, acceptdir) + if(istype(T)) + lturf = T + + for(var/mob/living/carbon/human/H in lturf) + if(istype(H) && H.loc == lturf) + visible_message({"\The [src] states, "Food detected!""}) + sleep(30) + if(H.loc == lturf) //still standing there + if(force_move_into_gibber(H)) + ejectclothes(occupant) + cleanbay() + startgibbing(null, 1) + break + +/obj/machinery/gibber/autogibber/proc/force_move_into_gibber(var/mob/living/carbon/human/victim) + if(!istype(victim)) return 0 + visible_message("\The [victim.name] gets sucked into \the [src]!") + + victim.forceMove(src) + occupant = victim + + update_icon() + feedinTopanim() + return 1 + +/obj/machinery/gibber/autogibber/proc/ejectclothes(var/mob/living/carbon/human/H) + if(!istype(H)) return 0 + if(H != occupant) return 0 //only using H as a shortcut to typecast + for(var/obj/O in H) + if(istype(O,/obj/item/clothing)) //clothing gets skipped to avoid cleaning out shit + continue + if(istype(O,/obj/item/weapon/implant)) + var/obj/item/weapon/implant/I = O + if(I.implanted) + continue + if(istype(O,/obj/item/organ)) + continue + if(O.flags & NODROP) + qdel(O) //they are already dead by now + H.unEquip(O) + O.loc = src.loc + O.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) + sleep(1) + + for(var/obj/item/clothing/C in H) + if(C.flags & NODROP) + qdel(C) + H.unEquip(C) + C.loc = src.loc + C.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) + sleep(1) + + visible_message("\The [src] spits out \the [H.name]'s possessions!") + +/obj/machinery/gibber/autogibber/proc/cleanbay() + var/spats = 0 //keeps track of how many items get spit out. Don't show a message if none are found. + for(var/obj/O in src) + if(istype(O)) + O.loc = src.loc + O.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) + spats++ + sleep(1) + if(spats) + visible_message("\The [src] spits out more possessions!") diff --git a/code/modules/food/grill_new.dm b/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm similarity index 100% rename from code/modules/food/grill_new.dm rename to code/modules/food_and_drinks/kitchen_machinery/grill_new.dm diff --git a/code/modules/food/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm similarity index 97% rename from code/modules/food/icecream_vat.dm rename to code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 6c23d781818..8452009a390 100644 --- a/code/modules/food/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -1,253 +1,253 @@ -//ICE CREAM MACHINE -//Code made by Sawu at Sawu-Station. - -/obj/machinery/icemachine - name = "\improper Cream-Master Deluxe" - density = 1 - anchored = 1 - icon = 'icons/obj/cooking_machines.dmi' - icon_state = "icecream_vat" - use_power = 1 - idle_power_usage = 20 - var/obj/item/weapon/reagent_containers/glass/beaker = null - var/useramount = 15 //Last used amount - - -/obj/machinery/icemachine/proc/generate_name(reagent_name) - var/name_prefix = pick("Mr.","Mrs.","Super","Happy","Whippy") - var/name_suffix = pick(" Whippy "," Slappy "," Creamy "," Dippy "," Swirly "," Swirl ") - var/cone_name = null //Heart failure prevention. - cone_name += name_prefix - cone_name += name_suffix - cone_name += "[reagent_name]" - return cone_name - - -/obj/machinery/icemachine/New() - var/datum/reagents/R = new/datum/reagents(500) - reagents = R - R.my_atom = src - - -/obj/machinery/icemachine/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/reagent_containers/glass)) - if(beaker) - to_chat(user, "A container is already inside [src].") - return - if(!user.drop_item()) - to_chat(user, "\The [I] is stuck to you!") - return - beaker = I - I.forceMove(src) - to_chat(user, "You add [I] to [src]") - updateUsrDialog() - return - if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/icecream)) - if(!I.reagents.has_reagent("sprinkles")) - if(I.reagents.total_volume > 29) I.reagents.remove_any(1) - I.reagents.add_reagent("sprinkles",1) - var/image/sprinkles = image('icons/obj/kitchen.dmi', src, "sprinkles") - I.overlays += sprinkles - I.name += " with sprinkles" - I.desc += ". This also has sprinkles." - else - to_chat(user, "This [I] already has sprinkles.") - - -/obj/machinery/icemachine/proc/validexchange(reag) - if(reag == "sprinkles" | reag == "cola" | reag == "kahlua" | reag == "dr_gibb" | reag == "vodka" | reag == "space_up" | reag == "rum" | reag == "spacemountainwind" | reag == "gin" | reag == "cream" | reag == "water") - return 1 - else - if(reagents.total_volume < 500) - to_chat(usr, "[src] vibrates for a moment, apparently accepting the unknown liquid.") - playsound(loc, 'sound/machines/twobeep.ogg', 10, 1) - return 1 - - -/obj/machinery/icemachine/Topic(href, href_list) - if(..()) return - - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["close"]) - usr << browse(null, "window=cream_master") - usr.unset_machine() - return - - var/obj/item/weapon/reagent_containers/glass/A = null - var/datum/reagents/R = null - - if(beaker) - A = beaker - R = A.reagents - - if(href_list["add"]) - if(href_list["amount"]) - var/id = href_list["add"] - var/amount = text2num(href_list["amount"]) - if(validexchange(id)) - R.trans_id_to(src, id, amount) - - else if(href_list["remove"]) - if(href_list["amount"]) - var/id = href_list["remove"] - var/amount = text2num(href_list["amount"]) - if(beaker == null) - reagents.remove_reagent(id,amount) - else - if(validexchange(id)) - reagents.trans_id_to(A, id, amount) - else - reagents.remove_reagent(id,amount) - - else if(href_list["main"]) - attack_hand(usr) - return - - else if(href_list["eject"]) - if(beaker) - A.forceMove(loc) - beaker = null - reagents.trans_to(A,reagents.total_volume) - - else if(href_list["synthcond"]) - if(href_list["type"]) - var/ID = text2num(href_list["type"]) - /* - if(ID == 1) - reagents.add_reagent("sprinkles",1) - */ //Sprinkles are now created by using the ice cream on the machine - if(ID == 2 | ID == 3) - var/brand = pick(1,2,3,4) - if(brand == 1) - if(ID == 2) - reagents.add_reagent("cola",5) - else - reagents.add_reagent("kahlua",5) - else if(brand == 2) - if(ID == 2) - reagents.add_reagent("dr_gibb",5) - else - reagents.add_reagent("vodka",5) - else if(brand == 3) - if(ID == 2) - reagents.add_reagent("space_up",5) - else - reagents.add_reagent("rum",5) - else if(brand == 4) - if(ID == 2) - reagents.add_reagent("spacemountainwind",5) - else - reagents.add_reagent("gin",5) - else if(ID == 4) - if(reagents.total_volume <= 500 & reagents.total_volume >= 15) - reagents.add_reagent("cream",(30 - reagents.total_volume)) - else if(reagents.total_volume <= 15) - reagents.add_reagent("cream",(15 - reagents.total_volume)) - else if(ID == 5) - if(reagents.total_volume <= 500 & reagents.total_volume >= 15) - reagents.add_reagent("water",(30 - reagents.total_volume)) - else if(reagents.total_volume <= 15) - reagents.add_reagent("water",(15 - reagents.total_volume)) - - else if(href_list["createcup"]) - var/name = generate_name(reagents.get_master_reagent_name()) - name += " Chocolate Cone" - var/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcup/C - C = new/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcup(loc) - C.name = "[name]" - C.pixel_x = rand(-8, 8) - C.pixel_y = -16 - reagents.trans_to(C,30) - if(reagents) - reagents.clear_reagents() - C.update_icon() - - else if(href_list["createcone"]) - var/name = generate_name(reagents.get_master_reagent_name()) - name += " Cone" - var/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcone/C - C = new/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcone(loc) - C.name = "[name]" - C.pixel_x = rand(-8, 8) - C.pixel_y = -16 - reagents.trans_to(C,15) - if(reagents) - reagents.clear_reagents() - C.update_icon() - updateUsrDialog() - - -/obj/machinery/icemachine/attack_ai(mob/user) - return attack_hand(user) - - -/obj/machinery/icemachine/proc/show_toppings() - var/dat = "" - if(reagents.total_volume <= 500) - dat += "
" - dat += "Add fillings:
" - dat += "Soda
" - dat += "Alcohol
" - dat += "Finish With:
" - dat += "Cream
" - dat += "Water
" - dat += "Dispense in:
" - dat += "Chocolate Cone
" - dat += "Cone
" - dat += "" - return dat - - -/obj/machinery/icemachine/proc/show_reagents(container) - //1 = beaker / 2 = internal - var/dat = "" - if(container == 1) - var/obj/item/weapon/reagent_containers/glass/A = beaker - var/datum/reagents/R = A.reagents - dat += "The container has:
" - for(var/datum/reagent/G in R.reagent_list) - dat += "[G.volume] unit(s) of [G.name] | " - dat += "(5) " - dat += "(10) " - dat += "(15) " - dat += "(All)" - dat += "
" - else if(container == 2) - dat += "
The Cream-Master has:
" - if(reagents.total_volume) - for(var/datum/reagent/N in reagents.reagent_list) - dat += "[N.volume] unit(s) of [N.name] | " - dat += "(5) " - dat += "(10) " - dat += "(15) " - dat += "(All)" - dat += "
" - else - dat += "
SOMEONE ENTERED AN INVALID REAGENT CONTAINER; QUICK, BUG REPORT!
" - return dat - - -/obj/machinery/icemachine/attack_hand(mob/user) - if(..()) return - user.set_machine(src) - var/dat = "" - if(!beaker) - dat += "No container is loaded into the machine, external transfer offline.
" - dat += show_reagents(2) - dat += show_toppings() - dat += "Close" - else - var/obj/item/weapon/reagent_containers/glass/A = beaker - var/datum/reagents/R = A.reagents - dat += "Eject container and end transfer.
" - if(!R.total_volume) - dat += "Container is empty.

" - else - dat += show_reagents(1) - dat += show_reagents(2) - dat += show_toppings() - var/datum/browser/popup = new(user, "cream_master","Cream-Master Deluxe", 700, 400, src) - popup.set_content(dat) - popup.open() +//ICE CREAM MACHINE +//Code made by Sawu at Sawu-Station. + +/obj/machinery/icemachine + name = "\improper Cream-Master Deluxe" + density = 1 + anchored = 1 + icon = 'icons/obj/cooking_machines.dmi' + icon_state = "icecream_vat" + use_power = 1 + idle_power_usage = 20 + var/obj/item/weapon/reagent_containers/glass/beaker = null + var/useramount = 15 //Last used amount + + +/obj/machinery/icemachine/proc/generate_name(reagent_name) + var/name_prefix = pick("Mr.","Mrs.","Super","Happy","Whippy") + var/name_suffix = pick(" Whippy "," Slappy "," Creamy "," Dippy "," Swirly "," Swirl ") + var/cone_name = null //Heart failure prevention. + cone_name += name_prefix + cone_name += name_suffix + cone_name += "[reagent_name]" + return cone_name + + +/obj/machinery/icemachine/New() + var/datum/reagents/R = new/datum/reagents(500) + reagents = R + R.my_atom = src + + +/obj/machinery/icemachine/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/reagent_containers/glass)) + if(beaker) + to_chat(user, "A container is already inside [src].") + return + if(!user.drop_item()) + to_chat(user, "\The [I] is stuck to you!") + return + beaker = I + I.forceMove(src) + to_chat(user, "You add [I] to [src]") + updateUsrDialog() + return + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/icecream)) + if(!I.reagents.has_reagent("sprinkles")) + if(I.reagents.total_volume > 29) I.reagents.remove_any(1) + I.reagents.add_reagent("sprinkles",1) + var/image/sprinkles = image('icons/obj/kitchen.dmi', src, "sprinkles") + I.overlays += sprinkles + I.name += " with sprinkles" + I.desc += ". This also has sprinkles." + else + to_chat(user, "This [I] already has sprinkles.") + + +/obj/machinery/icemachine/proc/validexchange(reag) + if(reag == "sprinkles" | reag == "cola" | reag == "kahlua" | reag == "dr_gibb" | reag == "vodka" | reag == "space_up" | reag == "rum" | reag == "spacemountainwind" | reag == "gin" | reag == "cream" | reag == "water") + return 1 + else + if(reagents.total_volume < 500) + to_chat(usr, "[src] vibrates for a moment, apparently accepting the unknown liquid.") + playsound(loc, 'sound/machines/twobeep.ogg', 10, 1) + return 1 + + +/obj/machinery/icemachine/Topic(href, href_list) + if(..()) return + + add_fingerprint(usr) + usr.set_machine(src) + + if(href_list["close"]) + usr << browse(null, "window=cream_master") + usr.unset_machine() + return + + var/obj/item/weapon/reagent_containers/glass/A = null + var/datum/reagents/R = null + + if(beaker) + A = beaker + R = A.reagents + + if(href_list["add"]) + if(href_list["amount"]) + var/id = href_list["add"] + var/amount = text2num(href_list["amount"]) + if(validexchange(id)) + R.trans_id_to(src, id, amount) + + else if(href_list["remove"]) + if(href_list["amount"]) + var/id = href_list["remove"] + var/amount = text2num(href_list["amount"]) + if(beaker == null) + reagents.remove_reagent(id,amount) + else + if(validexchange(id)) + reagents.trans_id_to(A, id, amount) + else + reagents.remove_reagent(id,amount) + + else if(href_list["main"]) + attack_hand(usr) + return + + else if(href_list["eject"]) + if(beaker) + A.forceMove(loc) + beaker = null + reagents.trans_to(A,reagents.total_volume) + + else if(href_list["synthcond"]) + if(href_list["type"]) + var/ID = text2num(href_list["type"]) + /* + if(ID == 1) + reagents.add_reagent("sprinkles",1) + */ //Sprinkles are now created by using the ice cream on the machine + if(ID == 2 | ID == 3) + var/brand = pick(1,2,3,4) + if(brand == 1) + if(ID == 2) + reagents.add_reagent("cola",5) + else + reagents.add_reagent("kahlua",5) + else if(brand == 2) + if(ID == 2) + reagents.add_reagent("dr_gibb",5) + else + reagents.add_reagent("vodka",5) + else if(brand == 3) + if(ID == 2) + reagents.add_reagent("space_up",5) + else + reagents.add_reagent("rum",5) + else if(brand == 4) + if(ID == 2) + reagents.add_reagent("spacemountainwind",5) + else + reagents.add_reagent("gin",5) + else if(ID == 4) + if(reagents.total_volume <= 500 & reagents.total_volume >= 15) + reagents.add_reagent("cream",(30 - reagents.total_volume)) + else if(reagents.total_volume <= 15) + reagents.add_reagent("cream",(15 - reagents.total_volume)) + else if(ID == 5) + if(reagents.total_volume <= 500 & reagents.total_volume >= 15) + reagents.add_reagent("water",(30 - reagents.total_volume)) + else if(reagents.total_volume <= 15) + reagents.add_reagent("water",(15 - reagents.total_volume)) + + else if(href_list["createcup"]) + var/name = generate_name(reagents.get_master_reagent_name()) + name += " Chocolate Cone" + var/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcup/C + C = new/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcup(loc) + C.name = "[name]" + C.pixel_x = rand(-8, 8) + C.pixel_y = -16 + reagents.trans_to(C,30) + if(reagents) + reagents.clear_reagents() + C.update_icon() + + else if(href_list["createcone"]) + var/name = generate_name(reagents.get_master_reagent_name()) + name += " Cone" + var/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcone/C + C = new/obj/item/weapon/reagent_containers/food/snacks/icecream/icecreamcone(loc) + C.name = "[name]" + C.pixel_x = rand(-8, 8) + C.pixel_y = -16 + reagents.trans_to(C,15) + if(reagents) + reagents.clear_reagents() + C.update_icon() + updateUsrDialog() + + +/obj/machinery/icemachine/attack_ai(mob/user) + return attack_hand(user) + + +/obj/machinery/icemachine/proc/show_toppings() + var/dat = "" + if(reagents.total_volume <= 500) + dat += "
" + dat += "Add fillings:
" + dat += "Soda
" + dat += "Alcohol
" + dat += "Finish With:
" + dat += "Cream
" + dat += "Water
" + dat += "Dispense in:
" + dat += "Chocolate Cone
" + dat += "Cone
" + dat += "" + return dat + + +/obj/machinery/icemachine/proc/show_reagents(container) + //1 = beaker / 2 = internal + var/dat = "" + if(container == 1) + var/obj/item/weapon/reagent_containers/glass/A = beaker + var/datum/reagents/R = A.reagents + dat += "The container has:
" + for(var/datum/reagent/G in R.reagent_list) + dat += "[G.volume] unit(s) of [G.name] | " + dat += "(5) " + dat += "(10) " + dat += "(15) " + dat += "(All)" + dat += "
" + else if(container == 2) + dat += "
The Cream-Master has:
" + if(reagents.total_volume) + for(var/datum/reagent/N in reagents.reagent_list) + dat += "[N.volume] unit(s) of [N.name] | " + dat += "(5) " + dat += "(10) " + dat += "(15) " + dat += "(All)" + dat += "
" + else + dat += "
SOMEONE ENTERED AN INVALID REAGENT CONTAINER; QUICK, BUG REPORT!
" + return dat + + +/obj/machinery/icemachine/attack_hand(mob/user) + if(..()) return + user.set_machine(src) + var/dat = "" + if(!beaker) + dat += "No container is loaded into the machine, external transfer offline.
" + dat += show_reagents(2) + dat += show_toppings() + dat += "Close" + else + var/obj/item/weapon/reagent_containers/glass/A = beaker + var/datum/reagents/R = A.reagents + dat += "Eject container and end transfer.
" + if(!R.total_volume) + dat += "Container is empty.

" + else + dat += show_reagents(1) + dat += show_reagents(2) + dat += show_toppings() + var/datum/browser/popup = new(user, "cream_master","Cream-Master Deluxe", 700, 400, src) + popup.set_content(dat) + popup.open() diff --git a/code/game/machinery/kitchen/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm similarity index 100% rename from code/game/machinery/kitchen/icecream_vat.dm rename to code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm diff --git a/code/game/machinery/kitchen/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm similarity index 96% rename from code/game/machinery/kitchen/juicer.dm rename to code/modules/food_and_drinks/kitchen_machinery/juicer.dm index 895f4bad428..87baef54b18 100644 --- a/code/game/machinery/kitchen/juicer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm @@ -1,185 +1,185 @@ - -/obj/machinery/juicer - name = "Juicer" - icon = 'icons/obj/kitchen.dmi' - icon_state = "juicer1" - layer = 2.9 - density = 0 - anchored = 0 - use_power = 1 - idle_power_usage = 5 - active_power_usage = 100 - var/obj/item/weapon/reagent_containers/beaker = null - var/global/list/allowed_items = list( - /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = "watermelonjuice", - /obj/item/weapon/reagent_containers/food/snacks/grown = "water", - ) - - var/global/list/allowed_tags = list ( - "tomato" = "tomatojuice", - "carrot" = "carrotjuice", - "berries" = "berryjuice", - "banana" = "banana", - "potato" = "potato", - "lemon" = "lemonjuice", - "orange" = "orangejuice", - "lime" = "limejuice", - "poisonberries" = "poisonberryjuice", - ) - -/obj/machinery/juicer/New() - beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - -/obj/machinery/juicer/update_icon() - icon_state = "juicer"+num2text(!isnull(beaker)) - return - - -/obj/machinery/juicer/attackby(var/obj/item/O as obj, var/mob/user as mob, params) - if(istype(O,/obj/item/weapon/reagent_containers/glass) || \ - istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass)) - if(beaker) - return 1 - else - if(!user.unEquip(O)) - to_chat(user, "\the [O] is stuck to your hand, you cannot put it in \the [src]") - return 0 - O.forceMove(src) - beaker = O - src.verbs += /obj/machinery/juicer/verb/detach - update_icon() - src.updateUsrDialog() - return 0 - if(!is_type_in_list(O, allowed_items)) - to_chat(user, "It doesn't look like that contains any juice.") - return 1 - if(!user.unEquip(O)) - to_chat(user, "\the [O] is stuck to your hand, you cannot put it in \the [src]") - return 0 - O.forceMove(src) - src.updateUsrDialog() - return 0 - -/obj/machinery/juicer/attack_ai(mob/user as mob) - return 0 - -/obj/machinery/juicer/attack_hand(mob/user as mob) - user.set_machine(src) - interact(user) - -/obj/machinery/juicer/interact(mob/user as mob) // The microwave Menu - var/is_chamber_empty = 0 - var/is_beaker_ready = 0 - var/processing_chamber = "" - var/beaker_contents = "" - - for(var/i in allowed_items) - for(var/obj/item/O in src.contents) - if(!istype(O,i)) - continue - processing_chamber+= "some [O]
" - break - if(!processing_chamber) - is_chamber_empty = 1 - processing_chamber = "Nothing." - if(!beaker) - beaker_contents = "\The [src] has no beaker attached." - else if(!beaker.reagents.total_volume) - beaker_contents = "\The [src] has attached an empty beaker." - is_beaker_ready = 1 - else if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) - beaker_contents = "\The [src] has attached a beaker with something." - is_beaker_ready = 1 - else - beaker_contents = "\The [src] has attached a beaker and beaker is full!" - - var/dat = {" -Processing chamber contains:
-[processing_chamber]
-[beaker_contents]
-"} - if(is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN))) - dat += "Turn on!
" - if(beaker) - dat += "
Detach a beaker!
" - var/datum/browser/popup = new(user, "juicer", name, 400, 400) - popup.set_content(dat) - popup.open(0) - onclose(user, "juicer") - return - - -/obj/machinery/juicer/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - switch(href_list["action"]) - if("juice") - juice() - - if("detach") - detach() - src.updateUsrDialog() - return - -/obj/machinery/juicer/verb/detach() - set category = "Object" - set name = "Detach Beaker from the juicer" - set src in oview(1) - if(usr.stat != 0) - return - if(!beaker) - return - src.verbs -= /obj/machinery/juicer/verb/detach - beaker.forceMove(src.loc) - beaker = null - update_icon() - -/obj/machinery/juicer/proc/get_juice_id(var/obj/item/weapon/reagent_containers/food/snacks/O) - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/watermelonslice)) - return "watermelonjuice" - else if(istype(O, /obj.item/weapon/reagent_containers/food/snacks/grown)) - var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O - for(var/i in allowed_tags) - if(G.seed.kitchen_tag == allowed_tags[i]) - return allowed_tags[i] - return "water" - -/obj/machinery/juicer/proc/get_juice_amount(var/obj/item/weapon/reagent_containers/food/snacks/grown/O) - if(!istype(O)) - return 5 - else if(O.potency == -1) - return 5 - else - return round(5*sqrt(O.potency)) - -/obj/machinery/juicer/proc/juice() - power_change() //it is a portable machine - if(stat & (NOPOWER|BROKEN)) - return - if(!beaker || beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - return - playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) - for(var/obj/item/weapon/reagent_containers/food/snacks/O in src.contents) - var/r_id = get_juice_id(O) - beaker.reagents.add_reagent(r_id,get_juice_amount(O)) - qdel(O) - if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - break - -/obj/structure/closet/crate/juice - New() - ..() - new/obj/machinery/juicer(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src) - new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src) + +/obj/machinery/juicer + name = "Juicer" + icon = 'icons/obj/kitchen.dmi' + icon_state = "juicer1" + layer = 2.9 + density = 0 + anchored = 0 + use_power = 1 + idle_power_usage = 5 + active_power_usage = 100 + var/obj/item/weapon/reagent_containers/beaker = null + var/global/list/allowed_items = list( + /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = "watermelonjuice", + /obj/item/weapon/reagent_containers/food/snacks/grown = "water", + ) + + var/global/list/allowed_tags = list ( + "tomato" = "tomatojuice", + "carrot" = "carrotjuice", + "berries" = "berryjuice", + "banana" = "banana", + "potato" = "potato", + "lemon" = "lemonjuice", + "orange" = "orangejuice", + "lime" = "limejuice", + "poisonberries" = "poisonberryjuice", + ) + +/obj/machinery/juicer/New() + beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src) + +/obj/machinery/juicer/update_icon() + icon_state = "juicer"+num2text(!isnull(beaker)) + return + + +/obj/machinery/juicer/attackby(var/obj/item/O as obj, var/mob/user as mob, params) + if(istype(O,/obj/item/weapon/reagent_containers/glass) || \ + istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass)) + if(beaker) + return 1 + else + if(!user.unEquip(O)) + to_chat(user, "\the [O] is stuck to your hand, you cannot put it in \the [src]") + return 0 + O.forceMove(src) + beaker = O + src.verbs += /obj/machinery/juicer/verb/detach + update_icon() + src.updateUsrDialog() + return 0 + if(!is_type_in_list(O, allowed_items)) + to_chat(user, "It doesn't look like that contains any juice.") + return 1 + if(!user.unEquip(O)) + to_chat(user, "\the [O] is stuck to your hand, you cannot put it in \the [src]") + return 0 + O.forceMove(src) + src.updateUsrDialog() + return 0 + +/obj/machinery/juicer/attack_ai(mob/user as mob) + return 0 + +/obj/machinery/juicer/attack_hand(mob/user as mob) + user.set_machine(src) + interact(user) + +/obj/machinery/juicer/interact(mob/user as mob) // The microwave Menu + var/is_chamber_empty = 0 + var/is_beaker_ready = 0 + var/processing_chamber = "" + var/beaker_contents = "" + + for(var/i in allowed_items) + for(var/obj/item/O in src.contents) + if(!istype(O,i)) + continue + processing_chamber+= "some [O]
" + break + if(!processing_chamber) + is_chamber_empty = 1 + processing_chamber = "Nothing." + if(!beaker) + beaker_contents = "\The [src] has no beaker attached." + else if(!beaker.reagents.total_volume) + beaker_contents = "\The [src] has attached an empty beaker." + is_beaker_ready = 1 + else if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) + beaker_contents = "\The [src] has attached a beaker with something." + is_beaker_ready = 1 + else + beaker_contents = "\The [src] has attached a beaker and beaker is full!" + + var/dat = {" +Processing chamber contains:
+[processing_chamber]
+[beaker_contents]
+"} + if(is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN))) + dat += "
Turn on!
" + if(beaker) + dat += "
Detach a beaker!
" + var/datum/browser/popup = new(user, "juicer", name, 400, 400) + popup.set_content(dat) + popup.open(0) + onclose(user, "juicer") + return + + +/obj/machinery/juicer/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + switch(href_list["action"]) + if("juice") + juice() + + if("detach") + detach() + src.updateUsrDialog() + return + +/obj/machinery/juicer/verb/detach() + set category = "Object" + set name = "Detach Beaker from the juicer" + set src in oview(1) + if(usr.stat != 0) + return + if(!beaker) + return + src.verbs -= /obj/machinery/juicer/verb/detach + beaker.forceMove(src.loc) + beaker = null + update_icon() + +/obj/machinery/juicer/proc/get_juice_id(var/obj/item/weapon/reagent_containers/food/snacks/O) + if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/watermelonslice)) + return "watermelonjuice" + else if(istype(O, /obj.item/weapon/reagent_containers/food/snacks/grown)) + var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O + for(var/i in allowed_tags) + if(G.seed.kitchen_tag == allowed_tags[i]) + return allowed_tags[i] + return "water" + +/obj/machinery/juicer/proc/get_juice_amount(var/obj/item/weapon/reagent_containers/food/snacks/grown/O) + if(!istype(O)) + return 5 + else if(O.potency == -1) + return 5 + else + return round(5*sqrt(O.potency)) + +/obj/machinery/juicer/proc/juice() + power_change() //it is a portable machine + if(stat & (NOPOWER|BROKEN)) + return + if(!beaker || beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + return + playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) + for(var/obj/item/weapon/reagent_containers/food/snacks/O in src.contents) + var/r_id = get_juice_id(O) + beaker.reagents.add_reagent(r_id,get_juice_amount(O)) + qdel(O) + if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + +/obj/structure/closet/crate/juice + New() + ..() + new/obj/machinery/juicer(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src) + new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src) new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src) \ No newline at end of file diff --git a/code/game/machinery/kitchen/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm similarity index 100% rename from code/game/machinery/kitchen/kitchen_machine.dm rename to code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm diff --git a/code/game/machinery/kitchen/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm similarity index 96% rename from code/game/machinery/kitchen/microwave.dm rename to code/modules/food_and_drinks/kitchen_machinery/microwave.dm index e560f12e8db..49cfc3ad0e8 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -1,55 +1,55 @@ - -/obj/machinery/kitchen_machine/microwave - name = "microwave" - desc = "A microwave, perfect for reheating things with radiation." - icon = 'icons/obj/kitchen.dmi' - icon_state = "mw" - cook_verbs = list("Microwaving", "Reheating", "Heating") - recipe_type = /datum/recipe/microwave - off_icon = "mw" - on_icon = "mw1" - broken_icon = "mwb" - dirty_icon = "mwbloody" - open_icon = "mw-o" - -// see code/modules/food/recipes_microwave.dm for recipes - -/******************* -* Initialising -********************/ - -/obj/machinery/kitchen_machine/microwave/New() - ..() - component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/microwave(null) - component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) - component_parts += new /obj/item/weapon/stock_parts/console_screen(null) - component_parts += new /obj/item/stack/cable_coil(null, 2) - RefreshParts() - -/obj/machinery/kitchen_machine/microwave/upgraded/New() - ..() - component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/microwave(null) - component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null) - component_parts += new /obj/item/weapon/stock_parts/console_screen(null) - component_parts += new /obj/item/stack/cable_coil(null, 2) - RefreshParts() - -/obj/machinery/kitchen_machine/microwave/RefreshParts() - var/E - for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts) - E += M.rating - efficiency = E - -// The following code is present as temporary assurance for compatibility and to avoid merge conflicts for the TG mining port -// Please delete this portion once all maps are updated to use the new object path: /obj/machinery/kitchen_machine/microwave - -/obj/machinery/microwave - name = "Microwave spawner" - icon = 'icons/obj/kitchen.dmi' - icon_state = "mw" - -/obj/machinery/microwave/New() - new /obj/machinery/kitchen_machine/microwave(get_turf(src)) + +/obj/machinery/kitchen_machine/microwave + name = "microwave" + desc = "A microwave, perfect for reheating things with radiation." + icon = 'icons/obj/kitchen.dmi' + icon_state = "mw" + cook_verbs = list("Microwaving", "Reheating", "Heating") + recipe_type = /datum/recipe/microwave + off_icon = "mw" + on_icon = "mw1" + broken_icon = "mwb" + dirty_icon = "mwbloody" + open_icon = "mw-o" + +// see code/modules/food/recipes_microwave.dm for recipes + +/******************* +* Initialising +********************/ + +/obj/machinery/kitchen_machine/microwave/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/microwave(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + component_parts += new /obj/item/stack/cable_coil(null, 2) + RefreshParts() + +/obj/machinery/kitchen_machine/microwave/upgraded/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/microwave(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + component_parts += new /obj/item/stack/cable_coil(null, 2) + RefreshParts() + +/obj/machinery/kitchen_machine/microwave/RefreshParts() + var/E + for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts) + E += M.rating + efficiency = E + +// The following code is present as temporary assurance for compatibility and to avoid merge conflicts for the TG mining port +// Please delete this portion once all maps are updated to use the new object path: /obj/machinery/kitchen_machine/microwave + +/obj/machinery/microwave + name = "Microwave spawner" + icon = 'icons/obj/kitchen.dmi' + icon_state = "mw" + +/obj/machinery/microwave/New() + new /obj/machinery/kitchen_machine/microwave(get_turf(src)) qdel(src) \ No newline at end of file diff --git a/code/game/machinery/kitchen/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm similarity index 100% rename from code/game/machinery/kitchen/monkeyrecycler.dm rename to code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm diff --git a/code/modules/food/oven.dm b/code/modules/food_and_drinks/kitchen_machinery/oven.dm similarity index 96% rename from code/modules/food/oven.dm rename to code/modules/food_and_drinks/kitchen_machinery/oven.dm index 604adaaf142..796e8c4bd4b 100644 --- a/code/modules/food/oven.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/oven.dm @@ -1,79 +1,79 @@ -/obj/machinery/cooking - name = "oven" - desc = "Cookies are ready, dear." - icon = 'icons/obj/cooking_machines.dmi' - icon_state = "oven_off" - layer = 2.9 - density = 1 - anchored = 1 - use_power = 1 - var/candy = 0 - idle_power_usage = 5 - var/on = FALSE //Is it making food already? - var/list/food_choices = list() -/obj/machinery/cooking/New() - ..() - updatefood() - -/obj/machinery/cooking/attackby(obj/item/I, mob/user, params) - if(on) - to_chat(user, "The machine is already running.") - return - else - var/obj/item/F = I - var/obj/item/weapon/reagent_containers/food/snacks/customizable/C - C = input("Select food to make.", "Cooking", C) in food_choices - if(!C) - return - else - to_chat(user, "You put [F] into [src] for cooking.") - user.drop_item() - F.loc = src - on = TRUE - if(!candy) - icon_state = "oven_on" - else - icon_state = "mixer_on" - sleep(100) - on = FALSE - if(!candy) - icon_state = "oven_off" - else - icon_state = "mixer_off" - C.loc = get_turf(src) - C.attackby(F,user, params) - playsound(loc, 'sound/machines/ding.ogg', 50, 1) - updatefood() - return - -/obj/machinery/cooking/proc/updatefood() - return - -/obj/machinery/cooking/oven - name = "oven" - desc = "Cookies are ready, dear." - icon = 'icons/obj/cooking_machines.dmi' - icon_state = "oven_off" - -/obj/machinery/cooking/oven/updatefood() - for(var/U in food_choices) - food_choices.Remove(U) - for(var/U in subtypesof(/obj/item/weapon/reagent_containers/food/snacks/customizable/cook)) - var/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/V = new U - src.food_choices += V - return - -/obj/machinery/cooking/candy - name = "candy machine" - desc = "Get yer box of deep fried deep fried deep fried deep fried cotton candy cereal sandwich cookies here!" - icon = 'icons/obj/cooking_machines.dmi' - icon_state = "mixer_off" - candy = 1 - -/obj/machinery/cooking/candy/updatefood() - for(var/U in food_choices) - food_choices.Remove(U) - for(var/U in subtypesof(/obj/item/weapon/reagent_containers/food/snacks/customizable/candy)) - var/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/V = new U - src.food_choices += V - return +/obj/machinery/cooking + name = "oven" + desc = "Cookies are ready, dear." + icon = 'icons/obj/cooking_machines.dmi' + icon_state = "oven_off" + layer = 2.9 + density = 1 + anchored = 1 + use_power = 1 + var/candy = 0 + idle_power_usage = 5 + var/on = FALSE //Is it making food already? + var/list/food_choices = list() +/obj/machinery/cooking/New() + ..() + updatefood() + +/obj/machinery/cooking/attackby(obj/item/I, mob/user, params) + if(on) + to_chat(user, "The machine is already running.") + return + else + var/obj/item/F = I + var/obj/item/weapon/reagent_containers/food/snacks/customizable/C + C = input("Select food to make.", "Cooking", C) in food_choices + if(!C) + return + else + to_chat(user, "You put [F] into [src] for cooking.") + user.drop_item() + F.loc = src + on = TRUE + if(!candy) + icon_state = "oven_on" + else + icon_state = "mixer_on" + sleep(100) + on = FALSE + if(!candy) + icon_state = "oven_off" + else + icon_state = "mixer_off" + C.loc = get_turf(src) + C.attackby(F,user, params) + playsound(loc, 'sound/machines/ding.ogg', 50, 1) + updatefood() + return + +/obj/machinery/cooking/proc/updatefood() + return + +/obj/machinery/cooking/oven + name = "oven" + desc = "Cookies are ready, dear." + icon = 'icons/obj/cooking_machines.dmi' + icon_state = "oven_off" + +/obj/machinery/cooking/oven/updatefood() + for(var/U in food_choices) + food_choices.Remove(U) + for(var/U in subtypesof(/obj/item/weapon/reagent_containers/food/snacks/customizable/cook)) + var/obj/item/weapon/reagent_containers/food/snacks/customizable/cook/V = new U + src.food_choices += V + return + +/obj/machinery/cooking/candy + name = "candy machine" + desc = "Get yer box of deep fried deep fried deep fried deep fried cotton candy cereal sandwich cookies here!" + icon = 'icons/obj/cooking_machines.dmi' + icon_state = "mixer_off" + candy = 1 + +/obj/machinery/cooking/candy/updatefood() + for(var/U in food_choices) + food_choices.Remove(U) + for(var/U in subtypesof(/obj/item/weapon/reagent_containers/food/snacks/customizable/candy)) + var/obj/item/weapon/reagent_containers/food/snacks/customizable/candy/V = new U + src.food_choices += V + return diff --git a/code/modules/food/oven_new.dm b/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm similarity index 100% rename from code/modules/food/oven_new.dm rename to code/modules/food_and_drinks/kitchen_machinery/oven_new.dm diff --git a/code/game/machinery/kitchen/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm similarity index 96% rename from code/game/machinery/kitchen/processor.dm rename to code/modules/food_and_drinks/kitchen_machinery/processor.dm index cf0aeba069e..d2b810dc7bb 100644 --- a/code/game/machinery/kitchen/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -1,230 +1,230 @@ -/obj/machinery/processor - name = "Food Processor" - icon = 'icons/obj/kitchen.dmi' - icon_state = "processor" - layer = 2.9 - density = 1 - anchored = 1 - - var/broken = 0 - var/processing = 0 - - use_power = 1 - idle_power_usage = 5 - active_power_usage = 50 - var/rating_speed = 1 - var/rating_amount = 1 - -/obj/machinery/processor/New() - ..() - component_parts = list() - component_parts += new /obj/item/weapon/circuitboard/processor(null) - component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) - component_parts += new /obj/item/weapon/stock_parts/manipulator(null) - RefreshParts() - -/obj/machinery/processor/RefreshParts() - for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) - rating_amount = B.rating - for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) - rating_speed = M.rating - -/obj/machinery/processor/process() - ..() - // The irony - // To be clear, if it's grinding, then it can't suck them up - if(processing) - return - var/mob/living/carbon/slime/picked_slime - for(var/mob/living/carbon/slime/slime in range(1, src)) - if(slime.loc == src) - continue - if(slime.stat) - picked_slime = slime - break - if(!picked_slime) - return - var/datum/food_processor_process/P = select_recipe(picked_slime) - if(!P) - return - - visible_message("[picked_slime] is sucked into \the [src].") - picked_slime.forceMove(src) - -//RECIPE DATUMS -/datum/food_processor_process - var/input - var/output - var/time = 40 - -/datum/food_processor_process/proc/process_food(loc, what, obj/machinery/processor/processor) - if(src.output && loc && processor) - for(var/i = 0, i < processor.rating_amount, i++) - new src.output(loc) - if(what) - qdel(what) - -///////////////////////// -/////OBJECT RECIPIES///// -///////////////////////// -/datum/food_processor_process/meat - input = /obj/item/weapon/reagent_containers/food/snacks/meat - output = /obj/item/weapon/reagent_containers/food/snacks/meatball - -/datum/food_processor_process/potato - input = "potato" - output = /obj/item/weapon/reagent_containers/food/snacks/fries - -/datum/food_processor_process/carrot - input = "carrot" - output = /obj/item/weapon/reagent_containers/food/snacks/carrotfries - -/datum/food_processor_process/soybeans - input = "soybeans" - output = /obj/item/weapon/reagent_containers/food/snacks/soydope - -/datum/food_processor_process/spaghetti - input = /obj/item/weapon/reagent_containers/food/snacks/doughslice - output = /obj/item/weapon/reagent_containers/food/snacks/spagetti -///////////////////////// -///END OBJECT RECIPIES/// -///////////////////////// - -/datum/food_processor_process/mob/process_food(loc, what, processor) - ..() - -////////////////////// -/////MOB RECIPIES///// -////////////////////// -/datum/food_processor_process/mob/slime - input = /mob/living/carbon/slime - output = null - -/datum/food_processor_process/mob/slime/process_food(loc, what, obj/machinery/processor/processor) - var/mob/living/carbon/slime/S = what - var/C = S.cores - if(S.stat != DEAD) - S.loc = loc - S.visible_message("[S] crawls free of the processor!") - return - for(var/i in 1 to (C+processor.rating_amount-1)) - new S.coretype(loc) - feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]") - ..() - -/datum/food_processor_process/mob/monkey - input = /mob/living/carbon/human/monkey - output = null - -/datum/food_processor_process/mob/monkey/process_food(loc, what, processor) - var/mob/living/carbon/human/monkey/O = what - if(O.client) //grief-proof - O.loc = loc - O.visible_message("Suddenly [O] jumps out from the processor!", \ - "You jump out of \the [src].", \ - "You hear a chimp.") - return - var/obj/item/weapon/reagent_containers/glass/bucket/bucket_of_blood = new(loc) - var/datum/reagent/blood/B = new() - B.holder = bucket_of_blood - B.volume = 70 - //set reagent data - B.data["donor"] = O.name - B.data["blood_DNA"] = copytext(O.dna.unique_enzymes,1,0) - bucket_of_blood.reagents.reagent_list += B - bucket_of_blood.reagents.update_total() - bucket_of_blood.on_reagent_change() - //bucket_of_blood.reagents.handle_reactions() //blood doesn't react - ..() -//////////////////////// -////END MOB RECIPIES//// -//////////////////////// - -//END RECIPE DATUMS - -/obj/machinery/processor/proc/select_recipe(var/X) - for(var/Type in subtypesof(/datum/food_processor_process) - /datum/food_processor_process/mob) - var/datum/food_processor_process/P = new Type() - if(istype(X, /obj/item/weapon/reagent_containers/food/snacks/grown)) - var/obj/item/weapon/reagent_containers/food/snacks/grown/G = X - if(G.seed.kitchen_tag != P.input) - continue - else if(!istype(X, P.input)) - continue - return P - return 0 - -/obj/machinery/processor/attackby(var/obj/item/O as obj, var/mob/user as mob, params) - - if(src.processing) - to_chat(user, "\the [src] is already processing something!") - return 1 - - if(default_deconstruction_screwdriver(user, "processor1", "processor", O)) - return - - if(exchange_parts(user, O)) - return - - if(default_unfasten_wrench(user, O)) - return - - default_deconstruction_crowbar(O) - - var/obj/item/what = O - - if(istype(O, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = O - what = G.affecting - - var/datum/food_processor_process/P = select_recipe(what) - - if(!P) - to_chat(user, "That probably won't blend.") - return 1 - - user.visible_message("\the [user] puts \the [what] into \the [src].", \ - "You put \the [what] into \the [src].") - - user.drop_item() - - what.loc = src - return - -/obj/machinery/processor/attack_hand(var/mob/user as mob) - if(stat & (NOPOWER|BROKEN)) //no power or broken - return - - if(src.processing) - to_chat(user, "\the [src] is already processing something!") - return 1 - - if(src.contents.len == 0) - to_chat(user, "\the [src] is empty.") - return 1 - src.processing = 1 - user.visible_message("[user] turns on [src].", \ - "You turn on [src].", \ - "You hear a food processor.") - playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) - use_power(500) - var/total_time = 0 - for(var/O in src.contents) - var/datum/food_processor_process/P = select_recipe(O) - if(!P) - log_debug("The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.") - continue - total_time += P.time - sleep(total_time / rating_speed) - - for(var/O in src.contents) - var/datum/food_processor_process/P = select_recipe(O) - if(!P) - log_debug("The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.") - continue - P.process_food(src.loc, O, src) - src.processing = 0 - - src.visible_message("\the [src] has finished processing.", \ - "\the [src] has finished processing.", \ - "You hear a food processor stopping.") +/obj/machinery/processor + name = "Food Processor" + icon = 'icons/obj/kitchen.dmi' + icon_state = "processor" + layer = 2.9 + density = 1 + anchored = 1 + + var/broken = 0 + var/processing = 0 + + use_power = 1 + idle_power_usage = 5 + active_power_usage = 50 + var/rating_speed = 1 + var/rating_amount = 1 + +/obj/machinery/processor/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/processor(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + RefreshParts() + +/obj/machinery/processor/RefreshParts() + for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) + rating_amount = B.rating + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + rating_speed = M.rating + +/obj/machinery/processor/process() + ..() + // The irony + // To be clear, if it's grinding, then it can't suck them up + if(processing) + return + var/mob/living/carbon/slime/picked_slime + for(var/mob/living/carbon/slime/slime in range(1, src)) + if(slime.loc == src) + continue + if(slime.stat) + picked_slime = slime + break + if(!picked_slime) + return + var/datum/food_processor_process/P = select_recipe(picked_slime) + if(!P) + return + + visible_message("[picked_slime] is sucked into \the [src].") + picked_slime.forceMove(src) + +//RECIPE DATUMS +/datum/food_processor_process + var/input + var/output + var/time = 40 + +/datum/food_processor_process/proc/process_food(loc, what, obj/machinery/processor/processor) + if(src.output && loc && processor) + for(var/i = 0, i < processor.rating_amount, i++) + new src.output(loc) + if(what) + qdel(what) + +///////////////////////// +/////OBJECT RECIPIES///// +///////////////////////// +/datum/food_processor_process/meat + input = /obj/item/weapon/reagent_containers/food/snacks/meat + output = /obj/item/weapon/reagent_containers/food/snacks/meatball + +/datum/food_processor_process/potato + input = "potato" + output = /obj/item/weapon/reagent_containers/food/snacks/fries + +/datum/food_processor_process/carrot + input = "carrot" + output = /obj/item/weapon/reagent_containers/food/snacks/carrotfries + +/datum/food_processor_process/soybeans + input = "soybeans" + output = /obj/item/weapon/reagent_containers/food/snacks/soydope + +/datum/food_processor_process/spaghetti + input = /obj/item/weapon/reagent_containers/food/snacks/doughslice + output = /obj/item/weapon/reagent_containers/food/snacks/spagetti +///////////////////////// +///END OBJECT RECIPIES/// +///////////////////////// + +/datum/food_processor_process/mob/process_food(loc, what, processor) + ..() + +////////////////////// +/////MOB RECIPIES///// +////////////////////// +/datum/food_processor_process/mob/slime + input = /mob/living/carbon/slime + output = null + +/datum/food_processor_process/mob/slime/process_food(loc, what, obj/machinery/processor/processor) + var/mob/living/carbon/slime/S = what + var/C = S.cores + if(S.stat != DEAD) + S.loc = loc + S.visible_message("[S] crawls free of the processor!") + return + for(var/i in 1 to (C+processor.rating_amount-1)) + new S.coretype(loc) + feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]") + ..() + +/datum/food_processor_process/mob/monkey + input = /mob/living/carbon/human/monkey + output = null + +/datum/food_processor_process/mob/monkey/process_food(loc, what, processor) + var/mob/living/carbon/human/monkey/O = what + if(O.client) //grief-proof + O.loc = loc + O.visible_message("Suddenly [O] jumps out from the processor!", \ + "You jump out of \the [src].", \ + "You hear a chimp.") + return + var/obj/item/weapon/reagent_containers/glass/bucket/bucket_of_blood = new(loc) + var/datum/reagent/blood/B = new() + B.holder = bucket_of_blood + B.volume = 70 + //set reagent data + B.data["donor"] = O.name + B.data["blood_DNA"] = copytext(O.dna.unique_enzymes,1,0) + bucket_of_blood.reagents.reagent_list += B + bucket_of_blood.reagents.update_total() + bucket_of_blood.on_reagent_change() + //bucket_of_blood.reagents.handle_reactions() //blood doesn't react + ..() +//////////////////////// +////END MOB RECIPIES//// +//////////////////////// + +//END RECIPE DATUMS + +/obj/machinery/processor/proc/select_recipe(var/X) + for(var/Type in subtypesof(/datum/food_processor_process) - /datum/food_processor_process/mob) + var/datum/food_processor_process/P = new Type() + if(istype(X, /obj/item/weapon/reagent_containers/food/snacks/grown)) + var/obj/item/weapon/reagent_containers/food/snacks/grown/G = X + if(G.seed.kitchen_tag != P.input) + continue + else if(!istype(X, P.input)) + continue + return P + return 0 + +/obj/machinery/processor/attackby(var/obj/item/O as obj, var/mob/user as mob, params) + + if(src.processing) + to_chat(user, "\the [src] is already processing something!") + return 1 + + if(default_deconstruction_screwdriver(user, "processor1", "processor", O)) + return + + if(exchange_parts(user, O)) + return + + if(default_unfasten_wrench(user, O)) + return + + default_deconstruction_crowbar(O) + + var/obj/item/what = O + + if(istype(O, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = O + what = G.affecting + + var/datum/food_processor_process/P = select_recipe(what) + + if(!P) + to_chat(user, "That probably won't blend.") + return 1 + + user.visible_message("\the [user] puts \the [what] into \the [src].", \ + "You put \the [what] into \the [src].") + + user.drop_item() + + what.loc = src + return + +/obj/machinery/processor/attack_hand(var/mob/user as mob) + if(stat & (NOPOWER|BROKEN)) //no power or broken + return + + if(src.processing) + to_chat(user, "\the [src] is already processing something!") + return 1 + + if(src.contents.len == 0) + to_chat(user, "\the [src] is empty.") + return 1 + src.processing = 1 + user.visible_message("[user] turns on [src].", \ + "You turn on [src].", \ + "You hear a food processor.") + playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) + use_power(500) + var/total_time = 0 + for(var/O in src.contents) + var/datum/food_processor_process/P = select_recipe(O) + if(!P) + log_debug("The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.") + continue + total_time += P.time + sleep(total_time / rating_speed) + + for(var/O in src.contents) + var/datum/food_processor_process/P = select_recipe(O) + if(!P) + log_debug("The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.") + continue + P.process_food(src.loc, O, src) + src.processing = 0 + + src.visible_message("\the [src] has finished processing.", \ + "\the [src] has finished processing.", \ + "You hear a food processor stopping.") diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm similarity index 96% rename from code/game/machinery/kitchen/smartfridge.dm rename to code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 8f2c4e58cd9..9a670e42d7a 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -1,410 +1,410 @@ -/* SmartFridge. Much todo -*/ -/obj/machinery/smartfridge - name = "\improper SmartFridge" - icon = 'icons/obj/vending.dmi' - icon_state = "smartfridge" - layer = 2.9 - density = 1 - anchored = 1 - use_power = 1 - idle_power_usage = 5 - active_power_usage = 100 - flags = NOREACT - var/max_n_of_items = 1500 - var/icon_on = "smartfridge" - var/icon_off = "smartfridge-off" - var/icon_panel = "smartfridge-panel" - var/item_quants = list() - var/seconds_electrified = 0; - var/shoot_inventory = 0 - var/locked = 0 - var/scan_id = 1 - var/is_secure = 0 - var/datum/wires/smartfridge/wires = null - -/obj/machinery/smartfridge/New() - ..() - component_parts = list() - var/obj/item/weapon/circuitboard/smartfridge/board = new(null) - board.set_type(type) - component_parts += board - component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) - RefreshParts() - -/obj/machinery/smartfridge/RefreshParts() - for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) - max_n_of_items = 1500 * B.rating - -/obj/machinery/smartfridge/secure - is_secure = 1 - -/obj/machinery/smartfridge/New() - ..() - if(is_secure) - wires = new/datum/wires/smartfridge/secure(src) - else - wires = new/datum/wires/smartfridge(src) - -/obj/machinery/smartfridge/Destroy() - qdel(wires) - wires = null - return ..() - -/obj/machinery/smartfridge/proc/accept_check(var/obj/item/O as obj) - if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/)) - return 1 - return 0 - -/obj/machinery/smartfridge/seeds - name = "\improper MegaSeed Servitor" - desc = "When you need seeds fast!" - icon = 'icons/obj/vending.dmi' - icon_state = "seeds" - icon_on = "seeds" - icon_off = "seeds-off" - -/obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O as obj) - if(istype(O,/obj/item/seeds/)) - return 1 - return 0 - -/obj/machinery/smartfridge/medbay - name = "\improper Refrigerated Medicine Storage" - desc = "A refrigerated storage unit for storing medicine and chemicals." - icon_state = "smartfridge" //To fix the icon in the map editor. - icon_on = "smartfridge_chem" - -/obj/machinery/smartfridge/medbay/accept_check(var/obj/item/O as obj) - if(istype(O,/obj/item/weapon/reagent_containers/glass/)) - return 1 - if(istype(O,/obj/item/weapon/storage/pill_bottle/)) - return 1 - if(istype(O,/obj/item/weapon/reagent_containers/food/pill/)) - return 1 - return 0 - -/obj/machinery/smartfridge/secure/extract - name = "\improper Slime Extract Storage" - desc = "A refrigerated storage unit for slime extracts" - req_access_txt = "47" - -/obj/machinery/smartfridge/secure/extract/accept_check(var/obj/item/O as obj) - if(istype(O,/obj/item/slime_extract)) - return 1 - return 0 - -/obj/machinery/smartfridge/secure/medbay - name = "\improper Secure Refrigerated Medicine Storage" - desc = "A refrigerated storage unit for storing medicine and chemicals." - icon_state = "smartfridge" //To fix the icon in the map editor. - icon_on = "smartfridge_chem" - req_one_access_txt = "5;33" - -/obj/machinery/smartfridge/secure/medbay/accept_check(var/obj/item/O as obj) - if(istype(O,/obj/item/weapon/reagent_containers/glass/)) - return 1 - if(istype(O,/obj/item/weapon/storage/pill_bottle/)) - return 1 - if(istype(O,/obj/item/weapon/reagent_containers/food/pill/)) - return 1 - return 0 - -/obj/machinery/smartfridge/secure/chemistry - name = "\improper Smart Chemical Storage" - desc = "A refrigerated storage unit for medicine and chemical storage." - icon_state = "smartfridge" //To fix the icon in the map editor. - icon_on = "smartfridge_chem" - req_access_txt = "33" - var/list/spawn_meds = list() - -/obj/machinery/smartfridge/secure/chemistry/New() - ..() - for(var/typekey in spawn_meds) - var/amount = spawn_meds[typekey] - if(isnull(amount)) amount = 1 - while(amount) - var/obj/item/I = new typekey(src) - if(item_quants[I.name]) - item_quants[I.name]++ - else - item_quants[I.name] = 1 - nanomanager.update_uis(src) - amount-- - -/obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O as obj) - if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers)) - return 1 - return 0 - - -// ---------------------------- -// Virology Medical Smartfridge -// ---------------------------- -/obj/machinery/smartfridge/secure/chemistry/virology - name = "smart virus storage" - desc = "A refrigerated storage unit for volatile sample storage." - req_access_txt = "39" - spawn_meds = list(/obj/item/weapon/reagent_containers/syringe/antiviral = 4, - /obj/item/weapon/reagent_containers/glass/bottle/cold = 1, - /obj/item/weapon/reagent_containers/glass/bottle/flu_virion = 1, - /obj/item/weapon/reagent_containers/glass/bottle/mutagen = 1, - /obj/item/weapon/reagent_containers/glass/bottle/plasma = 1, - /obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine = 1) - -/obj/machinery/smartfridge/secure/chemistry/virology/accept_check(var/obj/item/O as obj) - if(istype(O, /obj/item/weapon/reagent_containers/syringe) || istype(O, /obj/item/weapon/reagent_containers/glass/bottle) || istype(O, /obj/item/weapon/reagent_containers/glass/beaker)) - return 1 - return 0 - -/obj/machinery/smartfridge/drinks - name = "\improper Drink Showcase" - desc = "A refrigerated storage unit for tasty tasty alcohol." - -/obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O as obj) - if(istype(O,/obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/food/drinks) || istype(O,/obj/item/weapon/reagent_containers/food/condiment)) - return 1 - -/obj/machinery/smartfridge/process() - if(stat & (BROKEN|NOPOWER)) - return - if(src.seconds_electrified > 0) - src.seconds_electrified-- - if(src.shoot_inventory && prob(2)) - src.throw_item() - -/obj/machinery/smartfridge/power_change() - var/old_stat = stat - ..() - if(old_stat != stat) - update_icon() - -/obj/machinery/smartfridge/update_icon() - if(stat & (BROKEN|NOPOWER)) - icon_state = icon_off - else - icon_state = icon_on - - -/******************* -* Item Adding -********************/ - -/obj/machinery/smartfridge/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O, /obj/item/weapon/screwdriver) && anchored) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - panel_open = !panel_open - to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") - overlays.Cut() - if(panel_open) - overlays += image(icon, "[initial(icon_state)]-panel") - return - - if(exchange_parts(user, O)) - return - - if(default_unfasten_wrench(user, O)) - power_change() - return - - default_deconstruction_crowbar(O) - - if(istype(O, /obj/item/device/multitool)||istype(O, /obj/item/weapon/wirecutters)) - if(panel_open) - attack_hand(user) - return - - if(stat & NOPOWER) - to_chat(user, "\The [src] is unpowered and useless.") - return - - if(load(O, user)) - user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].") - - nanomanager.update_uis(src) - - else if(istype(O, /obj/item/weapon/storage/bag)) - var/obj/item/weapon/storage/bag/P = O - var/plants_loaded = 0 - for(var/obj/G in P.contents) - if(load(G, user)) - plants_loaded++ - if(plants_loaded) - user.visible_message("[user] loads \the [src] with \the [P].", "You load \the [src] with \the [P].") - if(P.contents.len > 0) - to_chat(user, "Some items are refused.") - - nanomanager.update_uis(src) - - else - to_chat(user, "\The [src] smartly refuses [O].") - return 1 - -/obj/machinery/smartfridge/proc/load(obj/I, mob/user) - if(accept_check(I)) - if(contents.len >= max_n_of_items) - to_chat(user, "\The [src] is full.") - return 0 - else - if(istype(I.loc, /obj/item/weapon/storage)) - var/obj/item/weapon/storage/S = I.loc - S.remove_from_storage(I, src) - else if(istype(I.loc, /mob)) - var/mob/M = I.loc - if(M.get_active_hand() == I) - if(!M.drop_item()) - to_chat(user, "\The [I] is stuck to you!") - return 0 - else - M.unEquip(I) - I.forceMove(src) - else - I.forceMove(src) - - if(item_quants[I.name]) - item_quants[I.name]++ - else - item_quants[I.name] = 1 - return 1 - return 0 - -/obj/machinery/smartfridge/attack_ai(mob/user as mob) - return 0 - -/obj/machinery/smartfridge/attack_ghost(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/smartfridge/attack_hand(mob/user as mob) - if(stat & (NOPOWER|BROKEN)) - return - wires.Interact(user) - ui_interact(user) - -//Drag pill bottle to fridge to empty it into the fridge -/obj/machinery/smartfridge/MouseDrop_T(obj/over_object as obj, mob/user as mob) - if(!istype(over_object, /obj/item/weapon/storage/pill_bottle)) //Only pill bottles, please - return - - if(stat & NOPOWER) - to_chat(user, "\The [src] is unpowered and useless.") - return - - var/obj/item/weapon/storage/box/pillbottles/P = over_object - var/items_loaded = 0 - for(var/obj/G in P.contents) - if(load(G, user)) - items_loaded++ - if(items_loaded) - user.visible_message( \ - "[user] empties \the [P] into \the [src].", \ - "You empty \the [P] into \the [src].") - if(P.contents.len > 0) - to_chat(user, "Some items are refused.") - nanomanager.update_uis(src) - -/obj/machinery/smartfridge/secure/emag_act(user as mob) - emagged = 1 - locked = -1 - to_chat(user, "You short out the product lock on [src].") - -/******************* -* SmartFridge Menu -********************/ - -/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - user.set_machine(src) - - var/data[0] - data["contents"] = null - data["electrified"] = seconds_electrified > 0 - data["shoot_inventory"] = shoot_inventory - data["locked"] = locked - data["secure"] = is_secure - - var/list/items[0] - for(var/i=1 to length(item_quants)) - var/K = item_quants[i] - var/count = item_quants[K] - if(count > 0) - items.Add(list(list("display_name" = html_encode(capitalize(K)), "vend" = i, "quantity" = count))) - - if(items.len > 0) - data["contents"] = items - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if(!ui) - ui = new(user, src, ui_key, "smartfridge.tmpl", src.name, 400, 500) - ui.set_initial_data(data) - ui.open() - -/obj/machinery/smartfridge/Topic(href, href_list) - if(..()) return 0 - - var/mob/user = usr - var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main") - - src.add_fingerprint(user) - - if(href_list["close"]) - user.unset_machine() - ui.close() - return 0 - - if(href_list["vend"]) - var/index = text2num(href_list["vend"]) - var/amount = text2num(href_list["amount"]) - var/K = item_quants[index] - var/count = item_quants[K] - - // Sanity check, there are probably ways to press the button when it shouldn't be possible. - if(count > 0) - item_quants[K] = max(count - amount, 0) - - var/i = amount - for(var/obj/O in contents) - if(O.name == K) - O.forceMove(loc) - i-- - if(i <= 0) - return 1 - - return 1 - return 0 - -/obj/machinery/smartfridge/proc/throw_item() - var/obj/throw_item = null - var/mob/living/target = locate() in view(7,src) - if(!target) - return 0 - - for(var/O in item_quants) - if(item_quants[O] <= 0) //Try to use a record that actually has something to dump. - continue - - item_quants[O]-- - for(var/obj/T in contents) - if(T.name == O) - T.forceMove(src.loc) - throw_item = T - break - break - if(!throw_item) - return 0 - spawn(0) - throw_item.throw_at(target,16,3,src) - src.visible_message("[src] launches [throw_item.name] at [target.name]!") - return 1 - -/************************ -* Secure SmartFridges -*************************/ - -/obj/machinery/smartfridge/secure/Topic(href, href_list) - if(stat & (NOPOWER|BROKEN)) - return 0 - if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) - if(!allowed(usr) && !emagged && locked != -1 && href_list["vend"]) - to_chat(usr, "Access denied.") - nanomanager.update_uis(src) - return 0 +/* SmartFridge. Much todo +*/ +/obj/machinery/smartfridge + name = "\improper SmartFridge" + icon = 'icons/obj/vending.dmi' + icon_state = "smartfridge" + layer = 2.9 + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 5 + active_power_usage = 100 + flags = NOREACT + var/max_n_of_items = 1500 + var/icon_on = "smartfridge" + var/icon_off = "smartfridge-off" + var/icon_panel = "smartfridge-panel" + var/item_quants = list() + var/seconds_electrified = 0; + var/shoot_inventory = 0 + var/locked = 0 + var/scan_id = 1 + var/is_secure = 0 + var/datum/wires/smartfridge/wires = null + +/obj/machinery/smartfridge/New() + ..() + component_parts = list() + var/obj/item/weapon/circuitboard/smartfridge/board = new(null) + board.set_type(type) + component_parts += board + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + RefreshParts() + +/obj/machinery/smartfridge/RefreshParts() + for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) + max_n_of_items = 1500 * B.rating + +/obj/machinery/smartfridge/secure + is_secure = 1 + +/obj/machinery/smartfridge/New() + ..() + if(is_secure) + wires = new/datum/wires/smartfridge/secure(src) + else + wires = new/datum/wires/smartfridge(src) + +/obj/machinery/smartfridge/Destroy() + qdel(wires) + wires = null + return ..() + +/obj/machinery/smartfridge/proc/accept_check(var/obj/item/O as obj) + if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/)) + return 1 + return 0 + +/obj/machinery/smartfridge/seeds + name = "\improper MegaSeed Servitor" + desc = "When you need seeds fast!" + icon = 'icons/obj/vending.dmi' + icon_state = "seeds" + icon_on = "seeds" + icon_off = "seeds-off" + +/obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O as obj) + if(istype(O,/obj/item/seeds/)) + return 1 + return 0 + +/obj/machinery/smartfridge/medbay + name = "\improper Refrigerated Medicine Storage" + desc = "A refrigerated storage unit for storing medicine and chemicals." + icon_state = "smartfridge" //To fix the icon in the map editor. + icon_on = "smartfridge_chem" + +/obj/machinery/smartfridge/medbay/accept_check(var/obj/item/O as obj) + if(istype(O,/obj/item/weapon/reagent_containers/glass/)) + return 1 + if(istype(O,/obj/item/weapon/storage/pill_bottle/)) + return 1 + if(istype(O,/obj/item/weapon/reagent_containers/food/pill/)) + return 1 + return 0 + +/obj/machinery/smartfridge/secure/extract + name = "\improper Slime Extract Storage" + desc = "A refrigerated storage unit for slime extracts" + req_access_txt = "47" + +/obj/machinery/smartfridge/secure/extract/accept_check(var/obj/item/O as obj) + if(istype(O,/obj/item/slime_extract)) + return 1 + return 0 + +/obj/machinery/smartfridge/secure/medbay + name = "\improper Secure Refrigerated Medicine Storage" + desc = "A refrigerated storage unit for storing medicine and chemicals." + icon_state = "smartfridge" //To fix the icon in the map editor. + icon_on = "smartfridge_chem" + req_one_access_txt = "5;33" + +/obj/machinery/smartfridge/secure/medbay/accept_check(var/obj/item/O as obj) + if(istype(O,/obj/item/weapon/reagent_containers/glass/)) + return 1 + if(istype(O,/obj/item/weapon/storage/pill_bottle/)) + return 1 + if(istype(O,/obj/item/weapon/reagent_containers/food/pill/)) + return 1 + return 0 + +/obj/machinery/smartfridge/secure/chemistry + name = "\improper Smart Chemical Storage" + desc = "A refrigerated storage unit for medicine and chemical storage." + icon_state = "smartfridge" //To fix the icon in the map editor. + icon_on = "smartfridge_chem" + req_access_txt = "33" + var/list/spawn_meds = list() + +/obj/machinery/smartfridge/secure/chemistry/New() + ..() + for(var/typekey in spawn_meds) + var/amount = spawn_meds[typekey] + if(isnull(amount)) amount = 1 + while(amount) + var/obj/item/I = new typekey(src) + if(item_quants[I.name]) + item_quants[I.name]++ + else + item_quants[I.name] = 1 + nanomanager.update_uis(src) + amount-- + +/obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O as obj) + if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers)) + return 1 + return 0 + + +// ---------------------------- +// Virology Medical Smartfridge +// ---------------------------- +/obj/machinery/smartfridge/secure/chemistry/virology + name = "smart virus storage" + desc = "A refrigerated storage unit for volatile sample storage." + req_access_txt = "39" + spawn_meds = list(/obj/item/weapon/reagent_containers/syringe/antiviral = 4, + /obj/item/weapon/reagent_containers/glass/bottle/cold = 1, + /obj/item/weapon/reagent_containers/glass/bottle/flu_virion = 1, + /obj/item/weapon/reagent_containers/glass/bottle/mutagen = 1, + /obj/item/weapon/reagent_containers/glass/bottle/plasma = 1, + /obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine = 1) + +/obj/machinery/smartfridge/secure/chemistry/virology/accept_check(var/obj/item/O as obj) + if(istype(O, /obj/item/weapon/reagent_containers/syringe) || istype(O, /obj/item/weapon/reagent_containers/glass/bottle) || istype(O, /obj/item/weapon/reagent_containers/glass/beaker)) + return 1 + return 0 + +/obj/machinery/smartfridge/drinks + name = "\improper Drink Showcase" + desc = "A refrigerated storage unit for tasty tasty alcohol." + +/obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O as obj) + if(istype(O,/obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/food/drinks) || istype(O,/obj/item/weapon/reagent_containers/food/condiment)) + return 1 + +/obj/machinery/smartfridge/process() + if(stat & (BROKEN|NOPOWER)) + return + if(src.seconds_electrified > 0) + src.seconds_electrified-- + if(src.shoot_inventory && prob(2)) + src.throw_item() + +/obj/machinery/smartfridge/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) + update_icon() + +/obj/machinery/smartfridge/update_icon() + if(stat & (BROKEN|NOPOWER)) + icon_state = icon_off + else + icon_state = icon_on + + +/******************* +* Item Adding +********************/ + +/obj/machinery/smartfridge/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(istype(O, /obj/item/weapon/screwdriver) && anchored) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + panel_open = !panel_open + to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") + overlays.Cut() + if(panel_open) + overlays += image(icon, "[initial(icon_state)]-panel") + return + + if(exchange_parts(user, O)) + return + + if(default_unfasten_wrench(user, O)) + power_change() + return + + default_deconstruction_crowbar(O) + + if(istype(O, /obj/item/device/multitool)||istype(O, /obj/item/weapon/wirecutters)) + if(panel_open) + attack_hand(user) + return + + if(stat & NOPOWER) + to_chat(user, "\The [src] is unpowered and useless.") + return + + if(load(O, user)) + user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].") + + nanomanager.update_uis(src) + + else if(istype(O, /obj/item/weapon/storage/bag)) + var/obj/item/weapon/storage/bag/P = O + var/plants_loaded = 0 + for(var/obj/G in P.contents) + if(load(G, user)) + plants_loaded++ + if(plants_loaded) + user.visible_message("[user] loads \the [src] with \the [P].", "You load \the [src] with \the [P].") + if(P.contents.len > 0) + to_chat(user, "Some items are refused.") + + nanomanager.update_uis(src) + + else + to_chat(user, "\The [src] smartly refuses [O].") + return 1 + +/obj/machinery/smartfridge/proc/load(obj/I, mob/user) + if(accept_check(I)) + if(contents.len >= max_n_of_items) + to_chat(user, "\The [src] is full.") + return 0 + else + if(istype(I.loc, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = I.loc + S.remove_from_storage(I, src) + else if(istype(I.loc, /mob)) + var/mob/M = I.loc + if(M.get_active_hand() == I) + if(!M.drop_item()) + to_chat(user, "\The [I] is stuck to you!") + return 0 + else + M.unEquip(I) + I.forceMove(src) + else + I.forceMove(src) + + if(item_quants[I.name]) + item_quants[I.name]++ + else + item_quants[I.name] = 1 + return 1 + return 0 + +/obj/machinery/smartfridge/attack_ai(mob/user as mob) + return 0 + +/obj/machinery/smartfridge/attack_ghost(mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/smartfridge/attack_hand(mob/user as mob) + if(stat & (NOPOWER|BROKEN)) + return + wires.Interact(user) + ui_interact(user) + +//Drag pill bottle to fridge to empty it into the fridge +/obj/machinery/smartfridge/MouseDrop_T(obj/over_object as obj, mob/user as mob) + if(!istype(over_object, /obj/item/weapon/storage/pill_bottle)) //Only pill bottles, please + return + + if(stat & NOPOWER) + to_chat(user, "\The [src] is unpowered and useless.") + return + + var/obj/item/weapon/storage/box/pillbottles/P = over_object + var/items_loaded = 0 + for(var/obj/G in P.contents) + if(load(G, user)) + items_loaded++ + if(items_loaded) + user.visible_message( \ + "[user] empties \the [P] into \the [src].", \ + "You empty \the [P] into \the [src].") + if(P.contents.len > 0) + to_chat(user, "Some items are refused.") + nanomanager.update_uis(src) + +/obj/machinery/smartfridge/secure/emag_act(user as mob) + emagged = 1 + locked = -1 + to_chat(user, "You short out the product lock on [src].") + +/******************* +* SmartFridge Menu +********************/ + +/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + user.set_machine(src) + + var/data[0] + data["contents"] = null + data["electrified"] = seconds_electrified > 0 + data["shoot_inventory"] = shoot_inventory + data["locked"] = locked + data["secure"] = is_secure + + var/list/items[0] + for(var/i=1 to length(item_quants)) + var/K = item_quants[i] + var/count = item_quants[K] + if(count > 0) + items.Add(list(list("display_name" = html_encode(capitalize(K)), "vend" = i, "quantity" = count))) + + if(items.len > 0) + data["contents"] = items + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "smartfridge.tmpl", src.name, 400, 500) + ui.set_initial_data(data) + ui.open() + +/obj/machinery/smartfridge/Topic(href, href_list) + if(..()) return 0 + + var/mob/user = usr + var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main") + + src.add_fingerprint(user) + + if(href_list["close"]) + user.unset_machine() + ui.close() + return 0 + + if(href_list["vend"]) + var/index = text2num(href_list["vend"]) + var/amount = text2num(href_list["amount"]) + var/K = item_quants[index] + var/count = item_quants[K] + + // Sanity check, there are probably ways to press the button when it shouldn't be possible. + if(count > 0) + item_quants[K] = max(count - amount, 0) + + var/i = amount + for(var/obj/O in contents) + if(O.name == K) + O.forceMove(loc) + i-- + if(i <= 0) + return 1 + + return 1 + return 0 + +/obj/machinery/smartfridge/proc/throw_item() + var/obj/throw_item = null + var/mob/living/target = locate() in view(7,src) + if(!target) + return 0 + + for(var/O in item_quants) + if(item_quants[O] <= 0) //Try to use a record that actually has something to dump. + continue + + item_quants[O]-- + for(var/obj/T in contents) + if(T.name == O) + T.forceMove(src.loc) + throw_item = T + break + break + if(!throw_item) + return 0 + spawn(0) + throw_item.throw_at(target,16,3,src) + src.visible_message("[src] launches [throw_item.name] at [target.name]!") + return 1 + +/************************ +* Secure SmartFridges +*************************/ + +/obj/machinery/smartfridge/secure/Topic(href, href_list) + if(stat & (NOPOWER|BROKEN)) + return 0 + if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) + if(!allowed(usr) && !emagged && locked != -1 && href_list["vend"]) + to_chat(usr, "Access denied.") + nanomanager.update_uis(src) + return 0 return ..() \ No newline at end of file diff --git a/code/modules/food/recipes_candy.dm b/code/modules/food_and_drinks/recipes/recipes_candy.dm similarity index 100% rename from code/modules/food/recipes_candy.dm rename to code/modules/food_and_drinks/recipes/recipes_candy.dm diff --git a/code/modules/food/recipes_grill.dm b/code/modules/food_and_drinks/recipes/recipes_grill.dm similarity index 100% rename from code/modules/food/recipes_grill.dm rename to code/modules/food_and_drinks/recipes/recipes_grill.dm diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food_and_drinks/recipes/recipes_microwave.dm similarity index 100% rename from code/modules/food/recipes_microwave.dm rename to code/modules/food_and_drinks/recipes/recipes_microwave.dm diff --git a/code/modules/food/recipes_oven.dm b/code/modules/food_and_drinks/recipes/recipes_oven.dm similarity index 100% rename from code/modules/food/recipes_oven.dm rename to code/modules/food_and_drinks/recipes/recipes_oven.dm diff --git a/code/modules/food/recipes_table.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm similarity index 100% rename from code/modules/food/recipes_table.dm rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm diff --git a/code/modules/library/computers/checkout.dm b/code/modules/library/computers/checkout.dm index ff62f15c276..139b464cf76 100644 --- a/code/modules/library/computers/checkout.dm +++ b/code/modules/library/computers/checkout.dm @@ -126,7 +126,7 @@ var/author = CB.author var/controls = "
\[Order\]" controls += {" \[Flag[CB.flagged ? "ged" : ""]\]"} - if(check_rights(R_ADMIN, user = user)) + if(check_rights(R_ADMIN, 0, user = user)) controls += " \[Delete\]" author += " ([ckey(CB.ckey)]))" dat += {"
 ↳ID:[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Empty"]
 ↳PDA:[(wear_pda && !(wear_pda.flags&ABSTRACT)) ? wear_pda : "Empty"]