diff --git a/.travis.yml b/.travis.yml index 6581931961..fa42ba3aef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ env: - BYOND_MAJOR="512" - BYOND_MINOR="1418" - NODE_VERSION="4" - - RUST_G_VERSION="0.2.0" + - RUST_G_VERSION="0.3.0" - BUILD_TOOLS=false - BUILD_TESTING=false - DM_MAPFILE="loadallmaps" @@ -32,6 +32,7 @@ addons: - gcc-multilib - python3 - python3-pip + - libssl-dev:i386 install: - tools/travis/install_build_tools.sh diff --git a/_maps/cit_map_files/generic/CentCom.dmm b/_maps/cit_map_files/generic/CentCom.dmm index 1b5d94d8c1..bb43763955 100644 --- a/_maps/cit_map_files/generic/CentCom.dmm +++ b/_maps/cit_map_files/generic/CentCom.dmm @@ -2526,6 +2526,10 @@ /obj/machinery/capture_the_flag/red, /turf/open/floor/circuit/green/anim, /area/ctf) +"hH" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood, +/area/centcom/holding) "hI" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -3324,6 +3328,10 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/centcom/supply) +"jO" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/wood, +/area/centcom/holding) "jP" = ( /obj/machinery/conveyor_switch/oneway{ dir = 8; @@ -4178,7 +4186,6 @@ /area/syndicate_mothership) "mb" = ( /obj/structure/table/reinforced, -/obj/machinery/computer/stockexchange, /turf/open/floor/plasteel/vault{ dir = 8 }, @@ -5254,7 +5261,6 @@ /area/centcom/ferry) "oM" = ( /obj/structure/table/reinforced, -/obj/machinery/computer/stockexchange, /obj/effect/turf_decal/stripes/line{ dir = 5 }, @@ -5320,6 +5326,19 @@ dir = 8 }, /area/tdome/tdomeobserve) +"oU" = ( +/obj/structure/closet/secure_closet/bar{ + req_access_txt = "25" + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"oV" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/wood, +/area/centcom/holding) "oW" = ( /obj/structure/flora/bush, /obj/effect/light_emitter{ @@ -5564,6 +5583,70 @@ dir = 8 }, /area/centcom/control) +"px" = ( +/obj/machinery/chem_dispenser/drinks/beer, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"py" = ( +/obj/machinery/chem_dispenser/drinks, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"pz" = ( +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"pA" = ( +/obj/machinery/vending/cola/random, +/turf/open/floor/wood, +/area/centcom/holding) +"pB" = ( +/obj/structure/rack, +/obj/item/toy/sword, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/coin/gold{ + pixel_x = 8; + pixel_y = -3 + }, +/obj/item/camera, +/turf/open/floor/wood, +/area/centcom/holding) +"pC" = ( +/obj/structure/rack, +/obj/item/toy/gun, +/obj/item/coin/gold{ + pixel_w = -9; + pixel_y = 6 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"pD" = ( +/obj/machinery/computer/arcade/battle, +/turf/open/floor/wood, +/area/centcom/holding) +"pE" = ( +/obj/machinery/computer/arcade/orion_trail, +/turf/open/floor/wood, +/area/centcom/holding) "pF" = ( /obj/machinery/door/airlock/centcom{ name = "Auxillary Dock"; @@ -5688,6 +5771,25 @@ dir = 5 }, /area/centcom/ferry) +"pS" = ( +/obj/machinery/computer/slot_machine, +/turf/open/floor/wood, +/area/centcom/holding) +"pT" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/wood, +/area/centcom/holding) +"pU" = ( +/turf/open/floor/wood, +/area/centcom/holding) +"pV" = ( +/obj/item/clothing/head/that, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"pW" = ( +/turf/open/floor/carpet/black, +/area/centcom/holding) "pX" = ( /obj/item/storage/crayons, /obj/structure/table, @@ -5953,6 +6055,30 @@ "qE" = ( /turf/closed/indestructible/riveted/uranium, /area/wizard_station) +"qF" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/carpet/black, +/area/centcom/holding) +"qG" = ( +/obj/structure/table/wood, +/obj/item/storage/box/drinkingglasses, +/obj/item/storage/box/drinkingglasses{ + pixel_x = 2; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"qH" = ( +/obj/item/reagent_containers/food/drinks/shaker, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"qI" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) "qJ" = ( /obj/machinery/computer/shuttle/syndicate/recall, /turf/open/floor/plasteel/bar{ @@ -6078,6 +6204,16 @@ /obj/machinery/computer/shuttle, /turf/open/floor/engine/cult, /area/wizard_station) +"rb" = ( +/obj/item/lighter, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"rc" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/cola, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) "rd" = ( /obj/structure/flora/grass/brown, /obj/effect/light_emitter{ @@ -6504,6 +6640,48 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) +"rY" = ( +/obj/item/dice/d20, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"rZ" = ( +/obj/structure/rack, +/obj/item/clothing/head/that, +/obj/item/clothing/under/suit_jacket, +/obj/item/clothing/accessory/waistcoat, +/turf/open/floor/wood, +/area/centcom/holding) +"sa" = ( +/obj/structure/rack, +/obj/item/storage/crayons, +/obj/item/gun/ballistic/automatic/toy/pistol, +/obj/item/ammo_box/foambox, +/turf/open/floor/wood, +/area/centcom/holding) +"sb" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"sc" = ( +/obj/structure/rack, +/obj/item/storage/crayons, +/obj/item/gun/ballistic/shotgun/toy/crossbow, +/turf/open/floor/wood, +/area/centcom/holding) +"sd" = ( +/obj/structure/rack, +/obj/item/clothing/shoes/laceup, +/obj/item/clothing/under/suit_jacket/female{ + desc = "A black trouser suit for women. Very formal."; + name = "black suit"; + pixel_x = 3; + pixel_y = 1 + }, +/turf/open/floor/wood, +/area/centcom/holding) "se" = ( /obj/machinery/light{ dir = 8 @@ -6905,6 +7083,34 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) +"sY" = ( +/mob/living/simple_animal/bot/medbot, +/turf/open/floor/wood, +/area/centcom/holding) +"sZ" = ( +/obj/machinery/sleeper{ + dir = 8 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"ta" = ( +/obj/machinery/light, +/turf/open/floor/wood, +/area/centcom/holding) +"tb" = ( +/obj/machinery/vending/clothing, +/turf/open/floor/wood, +/area/centcom/holding) +"tc" = ( +/obj/structure/closet/wardrobe/mixed, +/turf/open/floor/wood, +/area/centcom/holding) +"td" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/costume, +/obj/effect/spawner/lootdrop/costume, +/turf/open/floor/wood, +/area/centcom/holding) "te" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/pizzaslice/mushroom, @@ -6945,6 +7151,40 @@ }, /turf/open/floor/plating/airless, /area/syndicate_mothership/control) +"tj" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/costume, +/obj/effect/spawner/lootdrop/costume, +/obj/machinery/light, +/obj/machinery/button/door{ + id = "Ninjaholdingsuicide"; + name = "SUICIDE CHAMBER LOCK"; + normaldoorcontrol = 1; + pixel_x = 4; + pixel_y = -24; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"tk" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Private Rooms" + }, +/turf/open/floor/wood, +/area/centcom/holding) +"tl" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + id_tag = "Ninjaholdingsuicide"; + locked = 1; + name = "SUICIDE CHAMBER" + }, +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/centcom/holding) +"tm" = ( +/turf/open/floor/carpet, +/area/centcom/holding) "tn" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -7245,6 +7485,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/centcom/evac) +"tW" = ( +/obj/structure/table/wood/fancy/black, +/turf/open/floor/carpet, +/area/centcom/holding) "tX" = ( /obj/machinery/door/airlock{ icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; @@ -7252,6 +7496,40 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) +"tY" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"tZ" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"ua" = ( +/obj/structure/plasticflaps, +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/centcom/holding) +"ub" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Proom1"; + name = "Room 1" + }, +/turf/open/floor/wood, +/area/centcom/holding) +"uc" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/centcom/holding) "ud" = ( /obj/machinery/door/poddoor/shutters{ id = "nukeop_ready"; @@ -7265,6 +7543,25 @@ }, /turf/open/floor/plating/airless, /area/syndicate_mothership/control) +"uf" = ( +/turf/open/lava, +/area/centcom/holding) +"ug" = ( +/obj/machinery/button/door{ + id = "Proom1"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = -24; + pixel_y = 4; + specialfunctions = 4 + }, +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/floor/carpet, +/area/centcom/holding) +"uh" = ( +/turf/open/chasm/lavaland, +/area/centcom/holding) "ui" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7466,12 +7763,37 @@ /obj/structure/chair/wood/wings, /turf/open/floor/carpet, /area/wizard_station) +"uG" = ( +/obj/structure/chair/sofa/left, +/turf/open/floor/carpet, +/area/centcom/holding) +"uH" = ( +/obj/structure/chair/sofa/corner{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"uI" = ( +/obj/structure/chair/sofa, +/turf/open/floor/carpet, +/area/centcom/holding) "uJ" = ( /obj/machinery/door/airlock/external{ req_access_txt = "150" }, /turf/open/floor/plating, /area/syndicate_mothership/control) +"uK" = ( +/obj/machinery/button/door{ + id = "Proom2"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = 24; + pixel_y = 4; + specialfunctions = 4 + }, +/turf/open/floor/carpet, +/area/centcom/holding) "uL" = ( /obj/machinery/button/door{ id = "nukeop_ready"; @@ -7490,6 +7812,10 @@ }, /turf/open/floor/mineral/plastitanium, /area/syndicate_mothership/control) +"uN" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/carpet, +/area/centcom/holding) "uO" = ( /obj/machinery/door/airlock/centcom{ name = "Shuttle Control Office"; @@ -7695,6 +8021,45 @@ }, /turf/open/floor/carpet, /area/wizard_station) +"vo" = ( +/obj/structure/chair/sofa{ + icon_state = "sofamiddle"; + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"vp" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"vq" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Proom2"; + name = "Room 2" + }, +/turf/open/floor/wood, +/area/centcom/holding) +"vr" = ( +/obj/structure/chair/sofa/corner{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"vs" = ( +/obj/structure/chair/sofa/left{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"vt" = ( +/obj/machinery/vending/games, +/turf/open/floor/carpet, +/area/centcom/holding) "vu" = ( /obj/item/storage/box/drinkingglasses, /obj/item/reagent_containers/food/drinks/bottle/rum, @@ -7717,6 +8082,19 @@ /obj/item/toy/nuke, /turf/open/floor/wood, /area/syndicate_mothership/control) +"vy" = ( +/obj/structure/chair/sofa{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"vz" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Proom3"; + name = "Room 3" + }, +/turf/open/floor/wood, +/area/centcom/holding) "vA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/engineering{ @@ -7984,6 +8362,68 @@ }, /turf/open/floor/carpet, /area/wizard_station) +"we" = ( +/obj/machinery/button/door{ + id = "Proom3"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = -24; + pixel_y = 4; + specialfunctions = 4 + }, +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/floor/carpet, +/area/centcom/holding) +"wf" = ( +/obj/machinery/button/door{ + id = "Proom4"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = 24; + pixel_y = 4; + specialfunctions = 4 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"wg" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Proom4"; + name = "Room 4" + }, +/turf/open/floor/wood, +/area/centcom/holding) +"wh" = ( +/obj/structure/table/wood, +/obj/item/soap/nanotrasen, +/obj/item/reagent_containers/spray/cleaner, +/turf/open/floor/wood, +/area/centcom/holding) +"wi" = ( +/obj/structure/table/wood, +/obj/structure/bedsheetbin, +/turf/open/floor/wood, +/area/centcom/holding) +"wj" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Proom5"; + name = "Room 5" + }, +/turf/open/floor/wood, +/area/centcom/holding) +"wk" = ( +/obj/machinery/button/door{ + id = "Proom5"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = -24; + pixel_y = 4; + specialfunctions = 4 + }, +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/floor/carpet, +/area/centcom/holding) "wl" = ( /obj/machinery/light, /turf/open/floor/wood, @@ -10765,77 +11205,6 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) -"EZ" = ( -/obj/structure/table, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"Fa" = ( -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"Fb" = ( -/obj/structure/closet/secure_closet/bar{ - req_access_txt = "25" - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"Fc" = ( -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"Fd" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"Fe" = ( -/obj/structure/rack, -/obj/item/camera, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"Ff" = ( -/obj/structure/rack, -/obj/item/toy/sword, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"Fg" = ( -/obj/structure/rack, -/obj/item/toy/gun, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"Fh" = ( -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "Fi" = ( /turf/open/floor/plating/beach/sand, /area/centcom/holding) @@ -10952,19 +11321,6 @@ dir = 5 }, /area/tdome/tdomeobserve) -"FA" = ( -/obj/structure/table, -/obj/item/clothing/head/that, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"FB" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "FC" = ( /obj/item/camera, /turf/open/floor/plating/beach/sand, @@ -11071,41 +11427,6 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) -"FU" = ( -/obj/structure/table, -/obj/item/ammo_box/foambox, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"FV" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/shaker, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"FW" = ( -/obj/structure/table, -/obj/item/lighter, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"FX" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/soda_cans/cola, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"FY" = ( -/obj/structure/table, -/obj/item/dice/d20, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) "FZ" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -11226,13 +11547,6 @@ }, /turf/open/lava, /area/wizard_station) -"Gs" = ( -/obj/structure/rack, -/obj/item/clothing/head/that, -/obj/item/clothing/under/suit_jacket, -/obj/item/clothing/accessory/waistcoat, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "Gt" = ( /obj/item/toy/beach_ball, /turf/open/floor/plating/beach/sand, @@ -11280,18 +11594,6 @@ }, /turf/open/lava/airless, /area/wizard_station) -"GA" = ( -/obj/structure/rack, -/obj/item/storage/crayons, -/obj/item/gun/ballistic/automatic/toy/pistol, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"GB" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "GC" = ( /obj/structure/table, /obj/structure/bedsheetbin, @@ -11524,12 +11826,6 @@ /obj/structure/shuttle/engine/propulsion, /turf/open/space, /area/wizard_station) -"GY" = ( -/obj/structure/rack, -/obj/item/storage/crayons, -/obj/item/gun/ballistic/shotgun/toy/crossbow, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "GZ" = ( /turf/open/floor/plating/beach/coastline_b, /area/centcom/holding) @@ -11582,33 +11878,6 @@ dir = 4 }, /area/tdome/tdomeobserve) -"Hi" = ( -/obj/structure/rack, -/obj/item/clothing/shoes/laceup, -/obj/item/clothing/under/suit_jacket/female{ - desc = "A black trouser suit for women. Very formal."; - name = "black suit"; - pixel_x = 3; - pixel_y = 1 - }, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"Hj" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"Hk" = ( -/obj/structure/table, -/obj/item/gun/ballistic/automatic/toy/pistol, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"Hl" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "Hm" = ( /turf/open/floor/plating/beach/water, /area/centcom/holding) @@ -39485,25 +39754,25 @@ aa aa aa ED -EZ -EZ -FU -Gs -GA -GY -Hi +hH +pU +qG +rZ +sa +sc +sd +ED +ED +ED +ED +ED +ED +ED +ED ED ED ED ED -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -39742,25 +40011,25 @@ aa aa aa ED -Fa -Fa -Fa -Fh -Fh -Fh -Fh +jO +pU +pU +pW +pW +pW +pU Hy HH HH ED -aa -aa -aa -aa -aa -aa -aa -aa +uH +vo +vr +ED +uH +vo +vr +ED aa aa aa @@ -39999,25 +40268,25 @@ aa aa aa ED -Fb -Fa -FV -FB -Fh -Fh -Fh +oU +pU +qH +qF +pW +pW +pU Hz HH HH ED -aa -aa -aa -aa -aa -aa -aa -aa +uI +uN +vy +ED +uI +uN +vy +ED aa aa aa @@ -40256,25 +40525,25 @@ aa aa aa ED -Fc -Fa -EZ -FB -Fh -Fh -Fh +oV +pU +qI +qF +pW +pW +sY Hz HH HH ED -aa -aa -aa -aa -aa -aa -aa -aa +uG +uN +vs +ED +uG +uN +vs +ED aa aa aa @@ -40513,25 +40782,25 @@ aa aa aa ED -Fc -Fa -FW -FB -Fh -Fh -Fh +px +pU +rb +qF +pW +pW +sZ Hy HH HH ED -aa -aa -aa -aa -aa -aa -aa -aa +tm +tm +tm +ED +tm +tm +tm +ED aa aa aa @@ -40770,25 +41039,25 @@ aa aa aa ED -Fa -Fa -FX -FB -Fh -Fh -Hj +py +pU +rc +qF +pW +pW +ta ED ED ED ED -aa -aa -aa -aa -aa -aa -aa -aa +uK +tm +vt +ED +wf +tm +vt +ED aa aa aa @@ -41027,26 +41296,26 @@ aa aa aa ED -Fd -FA -FY -FB -Fh -Fh -Fh +pz +pV +rY +qF +pW +pW +pU +ED +ED +ED +ED +ED +vq +ED +ED +ED +wg +ED +ED ED -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -41284,13 +41553,25 @@ aa aa aa ED -Fe -Fh -Fh -Fh -Fh -Fh -Fh +pA +pW +pW +pW +pW +pW +pU +tk +pU +tZ +pU +pU +pU +pU +pU +pU +pU +tZ +wh ED aa aa @@ -41301,18 +41582,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa KH KU Lb @@ -41541,13 +41810,25 @@ aa aa aa ED -Ff -Fh -Fh -Fh -Fh -Fh -FB +pB +pW +pW +pW +pW +pW +pU +tk +pU +pU +pU +pU +vp +pU +pU +pU +pU +pU +wi ED aa aa @@ -41557,18 +41838,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa KH KH KS @@ -41798,26 +42067,26 @@ aa aa aa ED -Fg -Fh -Fh -Fh -Fh -FB -Hk +pC +pW +pW +pW +pW +pW +tb +ED +ED +ub +ED +ED +ED +vz +ED +ED +ED +wj +ED ED -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -42055,26 +42324,26 @@ aa aa aa ED -Fh -FB -Fh -Fh -Fh -Fh -FB +pD +qF +pW +pW +pW +pW +tc +ED +tY +tm +ug +ED +tY +tm +we +ED +tY +tm +wk ED -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -42312,26 +42581,26 @@ aa aa aa ED -Fi -Fi -Fi -Fi -GB -GB -Hl +pE +qF +pW +pW +pW +pW +td +ED +tW +uc +tm +ED +tW +uc +tm +ED +tW +uc +tm ED -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -42569,26 +42838,26 @@ aa aa aa ED -Fj -Fi -Fi -Fi -Fi -GZ -Hm +pS +qF +pW +pW +pW +pW +td +ED +ED +ED +ED +ED +ED +ED +ED +ED +ED +ED +ED ED -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -42826,6 +43095,777 @@ aa aa aa ED +pS +qF +pW +pW +pW +pW +tj +ED +ED +ED +ED +ED +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(115,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ED +pT +pU +pU +pU +sb +sb +sb +tl +ua +uf +uh +ED +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(116,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ED +Fj +Fi +Fi +Fi +Fi +GZ +Hm +ED +ED +ED +ED +ED +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(117,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ED Fi Fi FZ @@ -42892,7 +43932,7 @@ aa aa aa "} -(115,1,1) = {" +(118,1,1) = {" aa aa aa @@ -43149,7 +44189,7 @@ aa aa aa "} -(116,1,1) = {" +(119,1,1) = {" aa aa aa @@ -43406,7 +44446,7 @@ aa aa aa "} -(117,1,1) = {" +(120,1,1) = {" aa aa aa @@ -43663,777 +44703,6 @@ aa aa aa "} -(118,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ED -ED -ED -ED -ED -ED -ED -ED -ED -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(119,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(120,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} (121,1,1) = {" aa aa @@ -44624,15 +44893,15 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ED +ED +ED +ED +ED +ED +ED +ED +ED aa aa aa diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 650439de96..a422153bbb 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -33128,14 +33128,7 @@ /area/storage/tech) "bGt" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/borgupload{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/circuitboard/computer/aiupload{ - pixel_x = 2; - pixel_y = -2 - }, +/obj/effect/spawner/lootdrop/techstorage/AI, /turf/open/floor/plasteel, /area/storage/tech) "bGu" = ( @@ -33152,45 +33145,20 @@ /area/storage/tech) "bGw" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/pandemic{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/circuitboard/computer/rdconsole, -/obj/item/circuitboard/machine/rdserver{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/circuitboard/machine/destructive_analyzer, /obj/structure/cable{ icon_state = "1-2" }, -/obj/item/circuitboard/computer/aifixer, -/obj/item/circuitboard/computer/teleporter, -/obj/item/circuitboard/machine/circuit_imprinter, -/obj/item/circuitboard/machine/mechfab, +/obj/effect/spawner/lootdrop/techstorage/rnd, /turf/open/floor/plating, /area/storage/tech) "bGx" = ( /obj/structure/rack, -/obj/item/circuitboard/machine/telecomms/processor, -/obj/item/circuitboard/machine/telecomms/receiver, -/obj/item/circuitboard/machine/telecomms/server, -/obj/item/circuitboard/machine/telecomms/bus, -/obj/item/circuitboard/machine/telecomms/broadcaster, -/obj/item/circuitboard/computer/message_monitor{ - pixel_y = -5 - }, +/obj/effect/spawner/lootdrop/techstorage/tcomms, /turf/open/floor/plating, /area/storage/tech) "bGy" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/mining, -/obj/item/circuitboard/machine/autolathe{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/circuitboard/computer/arcade/battle, +/obj/effect/spawner/lootdrop/techstorage/service, /turf/open/floor/plating, /area/storage/tech) "bGz" = ( @@ -33668,21 +33636,10 @@ /area/crew_quarters/theatre) "bHG" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/crew{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/circuitboard/computer/card{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/circuitboard/computer/communications{ - pixel_x = 5; - pixel_y = -5 - }, /obj/machinery/light/small{ dir = 8 }, +/obj/effect/spawner/lootdrop/techstorage/command, /turf/open/floor/plasteel, /area/storage/tech) "bHH" = ( @@ -34387,14 +34344,7 @@ /area/storage/tech) "bJh" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/robotics{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/circuitboard/computer/mecha_control{ - pixel_x = 1; - pixel_y = -1 - }, +/obj/effect/spawner/lootdrop/techstorage/RnD_secure, /turf/open/floor/plasteel, /area/storage/tech) "bJi" = ( @@ -34410,43 +34360,17 @@ /area/storage/tech) "bJk" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/cloning, -/obj/item/circuitboard/computer/med_data{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/circuitboard/machine/clonescanner, -/obj/item/circuitboard/machine/clonepod, -/obj/item/circuitboard/computer/scan_consolenew, -/obj/item/circuitboard/machine/smoke_machine, +/obj/effect/spawner/lootdrop/techstorage/medical, /turf/open/floor/plating, /area/storage/tech) "bJl" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/powermonitor{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/circuitboard/computer/stationalert{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/circuitboard/computer/atmos_alert{ - pixel_x = 3; - pixel_y = -3 - }, +/obj/effect/spawner/lootdrop/techstorage/engineering, /turf/open/floor/plating, /area/storage/tech) "bJm" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/secure_data{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/circuitboard/computer/security{ - pixel_x = 1; - pixel_y = -1 - }, +/obj/effect/spawner/lootdrop/techstorage/security, /turf/open/floor/plating, /area/storage/tech) "bJn" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 9c869596c9..c0c19dc87b 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -32718,30 +32718,17 @@ /area/hallway/primary/port) "bwJ" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/robotics{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/circuitboard/computer/mecha_control, /obj/structure/cable/white{ icon_state = "4-8" }, /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/effect/spawner/lootdrop/techstorage/command, /turf/open/floor/plasteel, /area/storage/tech) "bwK" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/communications{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/circuitboard/computer/card, -/obj/item/circuitboard/computer/crew{ - pixel_x = 3; - pixel_y = -3 - }, /obj/structure/cable/white{ icon_state = "2-8" }, @@ -32752,25 +32739,18 @@ icon_state = "1-2" }, /obj/effect/turf_decal/stripes/line, +/obj/effect/spawner/lootdrop/techstorage/AI, /turf/open/floor/plasteel, /area/storage/tech) "bwL" = ( /obj/structure/rack, -/obj/item/circuitboard/aicore{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/circuitboard/computer/aiupload, -/obj/item/circuitboard/computer/borgupload{ - pixel_x = 3; - pixel_y = -3 - }, /obj/structure/cable/white{ icon_state = "4-8" }, /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/effect/spawner/lootdrop/techstorage/RnD_secure, /turf/open/floor/plasteel, /area/storage/tech) "bwM" = ( @@ -37169,32 +37149,14 @@ /area/storage/tech) "bET" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/scan_consolenew{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/circuitboard/computer/med_data, -/obj/item/circuitboard/computer/pandemic{ - pixel_x = 3; - pixel_y = -3 - }, /obj/effect/turf_decal/bot, -/obj/item/circuitboard/machine/smoke_machine, +/obj/effect/spawner/lootdrop/techstorage/service, /turf/open/floor/plasteel, /area/storage/tech) "bEU" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/aifixer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/circuitboard/computer/rdconsole, -/obj/item/circuitboard/machine/rdserver{ - pixel_x = 3; - pixel_y = -3 - }, /obj/effect/turf_decal/bot, -/obj/item/circuitboard/machine/autolathe, +/obj/effect/spawner/lootdrop/techstorage/medical, /turf/open/floor/plasteel, /area/storage/tech) "bEV" = ( @@ -38079,30 +38041,14 @@ /area/storage/tech) "bGD" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/cloning{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/circuitboard/machine/clonescanner, -/obj/item/circuitboard/machine/clonepod{ - pixel_x = 3; - pixel_y = -3 - }, /obj/effect/turf_decal/bot, +/obj/effect/spawner/lootdrop/techstorage/security, /turf/open/floor/plasteel, /area/storage/tech) "bGE" = ( /obj/structure/rack, -/obj/item/circuitboard/machine/destructive_analyzer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/circuitboard/machine/mechfab, -/obj/item/circuitboard/machine/circuit_imprinter{ - pixel_x = 3; - pixel_y = -3 - }, /obj/effect/turf_decal/bot, +/obj/effect/spawner/lootdrop/techstorage/rnd, /turf/open/floor/plasteel, /area/storage/tech) "bGF" = ( @@ -38971,7 +38917,6 @@ dir = 4 }, /obj/effect/turf_decal/bot, -/obj/item/circuitboard/machine/autolathe, /turf/open/floor/plasteel, /area/storage/tech) "bIu" = ( @@ -39924,31 +39869,16 @@ /area/storage/tech) "bKp" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/security{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/circuitboard/computer/prisoner, -/obj/item/circuitboard/computer/secure_data{ - pixel_x = 3; - pixel_y = -3 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/bot, +/obj/item/electronics/apc, +/obj/item/electronics/airalarm, /turf/open/floor/plasteel, /area/storage/tech) "bKq" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/atmos_alert{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/circuitboard/computer/powermonitor, -/obj/item/circuitboard/computer/stationalert{ - pixel_x = 3; - pixel_y = -3 - }, /obj/effect/turf_decal/bot, +/obj/effect/spawner/lootdrop/techstorage/engineering, /turf/open/floor/plasteel, /area/storage/tech) "bKr" = ( @@ -40845,30 +40775,14 @@ pixel_y = 3 }, /obj/item/circuitboard/machine/teleporter_station, -/obj/item/circuitboard/computer/teleporter{ - pixel_x = 3; - pixel_y = -3 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/storage/tech) "bMi" = ( /obj/structure/rack, -/obj/item/circuitboard/machine/telecomms/server{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/circuitboard/machine/telecomms/relay, -/obj/item/circuitboard/machine/telecomms/receiver, -/obj/item/circuitboard/machine/telecomms/processor, -/obj/item/circuitboard/machine/telecomms/hub, -/obj/item/circuitboard/machine/telecomms/bus, -/obj/item/circuitboard/machine/telecomms/broadcaster{ - pixel_x = 3; - pixel_y = -3 - }, /obj/effect/turf_decal/bot, +/obj/effect/spawner/lootdrop/techstorage/tcomms, /turf/open/floor/plasteel, /area/storage/tech) "bMj" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 303d28895d..12893085bc 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -7234,14 +7234,7 @@ /area/maintenance/port/fore) "apx" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/secure_data{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/circuitboard/computer/security{ - pixel_x = 1; - pixel_y = -1 - }, +/obj/effect/spawner/lootdrop/techstorage/service, /turf/open/floor/plasteel/dark, /area/storage/tech) "apy" = ( @@ -23157,45 +23150,20 @@ /area/storage/tech) "aYj" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/pandemic{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/circuitboard/computer/rdconsole, -/obj/item/circuitboard/machine/rdserver{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/circuitboard/machine/destructive_analyzer, -/obj/item/circuitboard/computer/aifixer, -/obj/item/circuitboard/computer/teleporter, -/obj/item/circuitboard/machine/circuit_imprinter, -/obj/item/circuitboard/machine/mechfab, +/obj/effect/spawner/lootdrop/techstorage/engineering, /turf/open/floor/plasteel/dark, /area/storage/tech) "aYk" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/mining, -/obj/item/circuitboard/machine/autolathe{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/circuitboard/computer/arcade/battle, /obj/machinery/ai_status_display{ pixel_y = 31 }, +/obj/effect/spawner/lootdrop/techstorage/medical, /turf/open/floor/plasteel/dark, /area/storage/tech) "aYl" = ( /obj/structure/rack, -/obj/item/circuitboard/machine/telecomms/processor, -/obj/item/circuitboard/machine/telecomms/receiver, -/obj/item/circuitboard/machine/telecomms/server, -/obj/item/circuitboard/machine/telecomms/bus, -/obj/item/circuitboard/machine/telecomms/broadcaster, -/obj/item/circuitboard/computer/message_monitor{ - pixel_y = -5 - }, +/obj/effect/spawner/lootdrop/techstorage/rnd, /turf/open/floor/plasteel/dark, /area/storage/tech) "aYm" = ( @@ -24761,14 +24729,7 @@ /area/maintenance/starboard/fore) "bbk" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/borgupload{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/circuitboard/computer/aiupload{ - pixel_x = 2; - pixel_y = -2 - }, +/obj/effect/spawner/lootdrop/techstorage/AI, /turf/open/floor/plasteel/dark, /area/storage/tech) "bbl" = ( @@ -24799,15 +24760,7 @@ /area/storage/tech) "bbn" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/cloning, -/obj/item/circuitboard/computer/med_data{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/circuitboard/machine/clonescanner, -/obj/item/circuitboard/machine/clonepod, -/obj/item/circuitboard/computer/scan_consolenew, -/obj/item/circuitboard/machine/smoke_machine, +/obj/effect/spawner/lootdrop/techstorage/security, /turf/open/floor/plasteel/dark, /area/storage/tech) "bbo" = ( @@ -24815,19 +24768,8 @@ /area/maintenance/solars/port/fore) "bbp" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/powermonitor{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/circuitboard/computer/stationalert{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/circuitboard/computer/atmos_alert{ - pixel_x = 3; - pixel_y = -3 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/lootdrop/techstorage/tcomms, /turf/open/floor/plasteel/dark, /area/storage/tech) "bbq" = ( @@ -25325,18 +25267,7 @@ /area/storage/tech) "bcv" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/crew{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/circuitboard/computer/card{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/circuitboard/computer/communications{ - pixel_x = 5; - pixel_y = -5 - }, +/obj/effect/spawner/lootdrop/techstorage/RnD_secure, /turf/open/floor/plasteel/dark, /area/storage/tech) "bcw" = ( @@ -26032,14 +25963,7 @@ /area/maintenance/starboard/fore) "bdX" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/robotics{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/circuitboard/computer/mecha_control{ - pixel_x = 1; - pixel_y = -1 - }, +/obj/effect/spawner/lootdrop/techstorage/command, /turf/open/floor/plasteel/dark, /area/storage/tech) "bdY" = ( @@ -58226,15 +58150,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/science/storage) -"ctk" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "ctl" = ( /obj/machinery/camera{ active_power_usage = 0; @@ -112953,7 +112868,7 @@ cJa cpG kVo dDu -ctk +kVo cuc cuZ dyp diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 735beb6d4c..7bac99a37c 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -31225,9 +31225,6 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"dWc" = ( -/turf/closed/mineral/random/labormineral, -/area/space) "dYC" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -79414,7 +79411,7 @@ bfP bjc bfP bfP -dWc +aad aaa aaa aaa diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 0cff240758..573dc2c707 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -38600,34 +38600,14 @@ /area/storage/tech) "bQv" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/pandemic{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/circuitboard/computer/rdconsole, -/obj/item/circuitboard/machine/rdserver{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/circuitboard/machine/destructive_analyzer, -/obj/item/circuitboard/computer/aifixer, -/obj/item/circuitboard/computer/teleporter, -/obj/item/circuitboard/machine/circuit_imprinter, -/obj/item/circuitboard/machine/mechfab, /obj/structure/sign/poster/official/random{ pixel_y = 32 }, -/obj/item/circuitboard/machine/smoke_machine, +/obj/effect/spawner/lootdrop/techstorage/engineering, /turf/open/floor/plasteel/darkgreen, /area/storage/tech) "bQw" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/mining, -/obj/item/circuitboard/machine/autolathe{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/circuitboard/computer/arcade/battle, /obj/machinery/light{ dir = 1; light_color = "#cee5d2" @@ -38637,18 +38617,12 @@ dir = 2 }, /obj/item/circuitboard/computer/monastery_shuttle, +/obj/effect/spawner/lootdrop/techstorage/service, /turf/open/floor/plasteel/darkgreen, /area/storage/tech) "bQx" = ( /obj/structure/rack, -/obj/item/circuitboard/machine/telecomms/processor, -/obj/item/circuitboard/machine/telecomms/receiver, -/obj/item/circuitboard/machine/telecomms/server, -/obj/item/circuitboard/machine/telecomms/bus, -/obj/item/circuitboard/machine/telecomms/broadcaster, -/obj/item/circuitboard/computer/message_monitor{ - pixel_y = -5 - }, +/obj/effect/spawner/lootdrop/techstorage/rnd, /turf/open/floor/plasteel/darkgreen, /area/storage/tech) "bQy" = ( @@ -39226,42 +39200,17 @@ /area/storage/tech) "bRO" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/cloning, -/obj/item/circuitboard/computer/med_data{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/circuitboard/machine/clonescanner, -/obj/item/circuitboard/machine/clonepod, -/obj/item/circuitboard/computer/scan_consolenew, +/obj/effect/spawner/lootdrop/techstorage/medical, /turf/open/floor/plasteel/darkgreen, /area/storage/tech) "bRP" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/secure_data{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/circuitboard/computer/security{ - pixel_x = 1; - pixel_y = -1 - }, +/obj/effect/spawner/lootdrop/techstorage/tcomms, /turf/open/floor/plasteel/darkgreen, /area/storage/tech) "bRQ" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/powermonitor{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/circuitboard/computer/stationalert{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/circuitboard/computer/atmos_alert{ - pixel_x = 3; - pixel_y = -3 - }, +/obj/effect/spawner/lootdrop/techstorage/security, /turf/open/floor/plasteel/darkgreen, /area/storage/tech) "bRR" = ( @@ -41189,46 +41138,21 @@ /area/crew_quarters/heads/chief) "bWs" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/robotics{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/circuitboard/computer/mecha_control{ - pixel_x = 1; - pixel_y = -1 - }, +/obj/effect/spawner/lootdrop/techstorage/AI, /turf/open/floor/plasteel/darkred, /area/storage/tech) "bWt" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/crew{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/circuitboard/computer/card{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/circuitboard/computer/communications{ - pixel_x = 5; - pixel_y = -5 - }, /obj/machinery/camera{ c_tag = "Secure Tech Storage"; dir = 1 }, +/obj/effect/spawner/lootdrop/techstorage/RnD_secure, /turf/open/floor/plasteel/darkred, /area/storage/tech) "bWu" = ( /obj/structure/rack, -/obj/item/circuitboard/computer/borgupload{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/circuitboard/computer/aiupload{ - pixel_x = 2; - pixel_y = -2 - }, +/obj/effect/spawner/lootdrop/techstorage/command, /turf/open/floor/plasteel/darkred, /area/storage/tech) "bWv" = ( diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index a308ce62f2..3629dd5f05 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -25,6 +25,9 @@ /area/engine/atmos) "ai" = ( /obj/machinery/power/rtg/advanced, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plating/airless, /area/space/nearstation) "aj" = ( @@ -73,7 +76,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "aq" = ( /obj/machinery/computer/monitor, @@ -84,11 +87,11 @@ /obj/machinery/light{ dir = 1 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "ar" = ( /obj/structure/closet/secure_closet/engineering_welding, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "as" = ( /obj/machinery/power/smes{ @@ -182,12 +185,6 @@ /obj/machinery/door/airlock/external/glass, /turf/open/floor/plating, /area/engine/engineering) -"aD" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) "aE" = ( /obj/structure/cable{ icon_state = "1-2" @@ -195,10 +192,16 @@ /obj/structure/cable{ icon_state = "2-8" }, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, /area/engine/engineering) "aF" = ( -/turf/open/floor/plating, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, /area/engine/engineering) "aG" = ( /obj/machinery/power/terminal{ @@ -292,7 +295,7 @@ }, /obj/item/storage/toolbox/syndicate, /obj/item/stock_parts/cell/infinite, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "aT" = ( /obj/structure/cable{ @@ -301,7 +304,8 @@ /obj/structure/cable{ icon_state = "2-4" }, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, /area/engine/engineering) "aU" = ( /obj/machinery/door/airlock/engineering/glass{ @@ -382,17 +386,18 @@ /obj/structure/table, /obj/item/weldingtool/experimental, /obj/item/inducer, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "be" = ( /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, /area/engine/engineering) "bf" = ( /obj/machinery/suit_storage_unit/captain, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "bg" = ( /obj/effect/turf_decal/stripes/line{ @@ -453,16 +458,15 @@ /turf/open/floor/plating, /area/engine/atmos) "bo" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/table, /obj/item/screwdriver/power, /obj/item/wirecutters/power, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "bp" = ( /obj/machinery/light, /obj/structure/tank_dispenser, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/engineering) "bq" = ( /obj/effect/turf_decal/stripes/line{ @@ -496,15 +500,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/bridge) -"bw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall, -/area/engine/engineering) "bx" = ( /obj/machinery/door/airlock, /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/engine/engineering) "by" = ( @@ -628,7 +629,7 @@ /turf/open/floor/plasteel/dark, /area/medical/chemistry) "bS" = ( -/obj/machinery/chem_dispenser, +/obj/machinery/chem_dispenser/fullupgrade, /turf/open/floor/plasteel/dark, /area/medical/chemistry) "bU" = ( @@ -741,16 +742,6 @@ /obj/machinery/door/airlock, /turf/open/floor/plating, /area/bridge) -"ci" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/medical/chemistry) "cj" = ( /obj/structure/cable{ icon_state = "4-8" @@ -791,8 +782,10 @@ /area/science) "cp" = ( /obj/machinery/light, -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/closet/secure_closet/engineering_chief, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, /turf/open/floor/plasteel/blue/side{ dir = 10 }, @@ -814,7 +807,6 @@ /turf/closed/wall/r_wall, /area/bridge) "ct" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/light{ dir = 8 }, @@ -888,8 +880,10 @@ /turf/closed/wall/r_wall, /area/medical/chemistry) "cF" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/medical/chemistry) "cG" = ( @@ -1003,12 +997,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/storage/primary) -"db" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plating, -/area/storage/primary) "dc" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -1310,6 +1298,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science) +"gM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/storage/primary) "gY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -1317,7 +1314,6 @@ /turf/open/floor/plasteel, /area/science) "hD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/power/apc{ dir = 1; pixel_y = 25 @@ -1398,6 +1394,11 @@ }, /turf/open/floor/plasteel, /area/medical/chemistry) +"sE" = ( +/obj/machinery/power/rtg/advanced, +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/space/nearstation) "vv" = ( /obj/machinery/door/airlock, /turf/open/floor/plating, @@ -1433,6 +1434,16 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/medical/chemistry) +"yp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/medical/chemistry) "AP" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -1462,12 +1473,24 @@ /obj/machinery/rnd/production/circuit_imprinter/department, /turf/open/floor/plasteel, /area/science) +"CK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/turf/open/floor/plasteel, +/area/medical/chemistry) "CV" = ( /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/medical/chemistry) +"EI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/blue/side, +/area/bridge) "If" = ( /obj/structure/cable{ icon_state = "1-2" @@ -1489,6 +1512,10 @@ /obj/machinery/door/airlock, /turf/open/floor/plating, /area/hallway/primary/central) +"Ly" = ( +/obj/machinery/chem_dispenser/chem_synthesizer, +/turf/open/floor/plasteel/dark, +/area/medical/chemistry) "NZ" = ( /obj/machinery/rnd/production/protolathe/department, /turf/open/floor/plasteel, @@ -1500,6 +1527,13 @@ /obj/machinery/door/airlock/external/glass, /turf/open/floor/plating, /area/medical/medbay) +"RC" = ( +/obj/machinery/power/rtg/advanced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "RY" = ( /obj/structure/cable{ icon_state = "4-8" @@ -1515,6 +1549,12 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/hallway/primary/central) +"Vy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "WT" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2627,14 +2667,14 @@ ae ab ai an -ai +RC aQ -ai +sE ab bv bI cf -cq +EI bv dU bE @@ -2683,7 +2723,7 @@ ai ao aA aR -ai +sE ab bv BG @@ -2897,7 +2937,7 @@ ae ac ac aj -aD +Vy aj ac ac @@ -3005,20 +3045,20 @@ ad af aj ap -aD +Vy aS bd bo -bw +aj hD -ci +cj ct -wT +Ce cF -bN -bN -cU -db +bE +bE +cS +dl dl dl dl @@ -3065,14 +3105,14 @@ be be bx CV -cj -Ce -Ce -oV -bE -bE -cS -dc +yp +wT +wT +CK +bN +bN +cU +gM dc dA dl @@ -3114,7 +3154,7 @@ af aj ar aF -aD +Vy bf bp aj @@ -3334,7 +3374,7 @@ aX aI aI ak -bS +Ly pQ Xg Ce diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 5ca6b8b965..499a89a0cd 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -2526,6 +2526,10 @@ /obj/machinery/capture_the_flag/red, /turf/open/floor/circuit/green/anim, /area/ctf) +"hH" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood, +/area/centcom/holding) "hI" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -3324,6 +3328,10 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/centcom/supply) +"jO" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/wood, +/area/centcom/holding) "jP" = ( /obj/machinery/conveyor_switch/oneway{ dir = 8; @@ -5318,6 +5326,20 @@ dir = 8 }, /area/tdome/tdomeobserve) +"oU" = ( +/obj/structure/closet/secure_closet/bar{ + locked = 0; + req_access_txt = "25" + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"oV" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/wood, +/area/centcom/holding) "oW" = ( /obj/structure/flora/bush, /obj/effect/light_emitter{ @@ -5562,6 +5584,70 @@ dir = 8 }, /area/centcom/control) +"px" = ( +/obj/machinery/chem_dispenser/drinks/beer, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"py" = ( +/obj/machinery/chem_dispenser/drinks, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"pz" = ( +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"pA" = ( +/obj/machinery/vending/cola/random, +/turf/open/floor/wood, +/area/centcom/holding) +"pB" = ( +/obj/structure/rack, +/obj/item/toy/sword, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/coin/gold{ + pixel_x = 8; + pixel_y = -3 + }, +/obj/item/camera, +/turf/open/floor/wood, +/area/centcom/holding) +"pC" = ( +/obj/structure/rack, +/obj/item/toy/gun, +/obj/item/coin/gold{ + pixel_w = -9; + pixel_y = 6 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"pD" = ( +/obj/machinery/computer/arcade/battle, +/turf/open/floor/wood, +/area/centcom/holding) +"pE" = ( +/obj/machinery/computer/arcade/orion_trail, +/turf/open/floor/wood, +/area/centcom/holding) "pF" = ( /obj/machinery/door/airlock/centcom{ name = "Auxillary Dock"; @@ -5686,6 +5772,25 @@ dir = 5 }, /area/centcom/ferry) +"pS" = ( +/obj/machinery/computer/slot_machine, +/turf/open/floor/wood, +/area/centcom/holding) +"pT" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/wood, +/area/centcom/holding) +"pU" = ( +/turf/open/floor/wood, +/area/centcom/holding) +"pV" = ( +/obj/item/clothing/head/that, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"pW" = ( +/turf/open/floor/carpet/black, +/area/centcom/holding) "pX" = ( /obj/item/storage/crayons, /obj/structure/table, @@ -5951,6 +6056,30 @@ "qE" = ( /turf/closed/indestructible/riveted/uranium, /area/wizard_station) +"qF" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/carpet/black, +/area/centcom/holding) +"qG" = ( +/obj/structure/table/wood, +/obj/item/storage/box/drinkingglasses, +/obj/item/storage/box/drinkingglasses{ + pixel_x = 2; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"qH" = ( +/obj/item/reagent_containers/food/drinks/shaker, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"qI" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) "qJ" = ( /obj/machinery/computer/shuttle/syndicate/recall, /turf/open/floor/plasteel/bar{ @@ -6076,6 +6205,16 @@ /obj/machinery/computer/shuttle, /turf/open/floor/engine/cult, /area/wizard_station) +"rb" = ( +/obj/item/lighter, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"rc" = ( +/obj/item/reagent_containers/food/drinks/soda_cans/cola, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) "rd" = ( /obj/structure/flora/grass/brown, /obj/effect/light_emitter{ @@ -6502,6 +6641,48 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) +"rY" = ( +/obj/item/dice/d20, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/centcom/holding) +"rZ" = ( +/obj/structure/rack, +/obj/item/clothing/head/that, +/obj/item/clothing/under/suit_jacket, +/obj/item/clothing/accessory/waistcoat, +/turf/open/floor/wood, +/area/centcom/holding) +"sa" = ( +/obj/structure/rack, +/obj/item/storage/crayons, +/obj/item/gun/ballistic/automatic/toy/pistol, +/obj/item/ammo_box/foambox, +/turf/open/floor/wood, +/area/centcom/holding) +"sb" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"sc" = ( +/obj/structure/rack, +/obj/item/storage/crayons, +/obj/item/gun/ballistic/shotgun/toy/crossbow, +/turf/open/floor/wood, +/area/centcom/holding) +"sd" = ( +/obj/structure/rack, +/obj/item/clothing/shoes/laceup, +/obj/item/clothing/under/suit_jacket/female{ + desc = "A black trouser suit for women. Very formal."; + name = "black suit"; + pixel_x = 3; + pixel_y = 1 + }, +/turf/open/floor/wood, +/area/centcom/holding) "se" = ( /obj/machinery/light{ dir = 8 @@ -6903,6 +7084,34 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) +"sY" = ( +/mob/living/simple_animal/bot/medbot, +/turf/open/floor/wood, +/area/centcom/holding) +"sZ" = ( +/obj/machinery/sleeper{ + dir = 8 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"ta" = ( +/obj/machinery/light, +/turf/open/floor/wood, +/area/centcom/holding) +"tb" = ( +/obj/machinery/vending/clothing, +/turf/open/floor/wood, +/area/centcom/holding) +"tc" = ( +/obj/structure/closet/wardrobe/mixed, +/turf/open/floor/wood, +/area/centcom/holding) +"td" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/costume, +/obj/effect/spawner/lootdrop/costume, +/turf/open/floor/wood, +/area/centcom/holding) "te" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/pizzaslice/mushroom, @@ -6943,6 +7152,40 @@ }, /turf/open/floor/plating/airless, /area/syndicate_mothership/control) +"tj" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/costume, +/obj/effect/spawner/lootdrop/costume, +/obj/machinery/light, +/obj/machinery/button/door{ + id = "Ninjaholdingsuicide"; + name = "SUICIDE CHAMBER LOCK"; + normaldoorcontrol = 1; + pixel_x = 4; + pixel_y = -24; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"tk" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Private Rooms" + }, +/turf/open/floor/wood, +/area/centcom/holding) +"tl" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + id_tag = "Ninjaholdingsuicide"; + locked = 1; + name = "SUICIDE CHAMBER" + }, +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/centcom/holding) +"tm" = ( +/turf/open/floor/carpet, +/area/centcom/holding) "tn" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -7243,6 +7486,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/centcom/evac) +"tW" = ( +/obj/structure/table/wood/fancy/black, +/turf/open/floor/carpet, +/area/centcom/holding) "tX" = ( /obj/machinery/door/airlock{ icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; @@ -7250,6 +7497,40 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) +"tY" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"tZ" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"ua" = ( +/obj/structure/plasticflaps, +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/centcom/holding) +"ub" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Proom1"; + name = "Room 1" + }, +/turf/open/floor/wood, +/area/centcom/holding) +"uc" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/centcom/holding) "ud" = ( /obj/machinery/door/poddoor/shutters{ id = "nukeop_ready"; @@ -7263,6 +7544,25 @@ }, /turf/open/floor/plating/airless, /area/syndicate_mothership/control) +"uf" = ( +/turf/open/lava, +/area/centcom/holding) +"ug" = ( +/obj/machinery/button/door{ + id = "Proom1"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = -24; + pixel_y = 4; + specialfunctions = 4 + }, +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/floor/carpet, +/area/centcom/holding) +"uh" = ( +/turf/open/chasm/lavaland, +/area/centcom/holding) "ui" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7464,12 +7764,37 @@ /obj/structure/chair/wood/wings, /turf/open/floor/carpet, /area/wizard_station) +"uG" = ( +/obj/structure/chair/sofa/left, +/turf/open/floor/carpet, +/area/centcom/holding) +"uH" = ( +/obj/structure/chair/sofa/corner{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"uI" = ( +/obj/structure/chair/sofa, +/turf/open/floor/carpet, +/area/centcom/holding) "uJ" = ( /obj/machinery/door/airlock/external{ req_access_txt = "150" }, /turf/open/floor/plating, /area/syndicate_mothership/control) +"uK" = ( +/obj/machinery/button/door{ + id = "Proom2"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = 24; + pixel_y = 4; + specialfunctions = 4 + }, +/turf/open/floor/carpet, +/area/centcom/holding) "uL" = ( /obj/machinery/button/door{ id = "nukeop_ready"; @@ -7488,6 +7813,10 @@ }, /turf/open/floor/mineral/plastitanium, /area/syndicate_mothership/control) +"uN" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/carpet, +/area/centcom/holding) "uO" = ( /obj/machinery/door/airlock/centcom{ name = "Shuttle Control Office"; @@ -7693,6 +8022,45 @@ }, /turf/open/floor/carpet, /area/wizard_station) +"vo" = ( +/obj/structure/chair/sofa{ + icon_state = "sofamiddle"; + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"vp" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/centcom/holding) +"vq" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Proom2"; + name = "Room 2" + }, +/turf/open/floor/wood, +/area/centcom/holding) +"vr" = ( +/obj/structure/chair/sofa/corner{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"vs" = ( +/obj/structure/chair/sofa/left{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"vt" = ( +/obj/machinery/vending/games, +/turf/open/floor/carpet, +/area/centcom/holding) "vu" = ( /obj/item/storage/box/drinkingglasses, /obj/item/reagent_containers/food/drinks/bottle/rum, @@ -7715,6 +8083,19 @@ /obj/item/toy/nuke, /turf/open/floor/wood, /area/syndicate_mothership/control) +"vy" = ( +/obj/structure/chair/sofa{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"vz" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Proom3"; + name = "Room 3" + }, +/turf/open/floor/wood, +/area/centcom/holding) "vA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/engineering{ @@ -7982,6 +8363,68 @@ }, /turf/open/floor/carpet, /area/wizard_station) +"we" = ( +/obj/machinery/button/door{ + id = "Proom3"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = -24; + pixel_y = 4; + specialfunctions = 4 + }, +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/floor/carpet, +/area/centcom/holding) +"wf" = ( +/obj/machinery/button/door{ + id = "Proom4"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = 24; + pixel_y = 4; + specialfunctions = 4 + }, +/turf/open/floor/carpet, +/area/centcom/holding) +"wg" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Proom4"; + name = "Room 4" + }, +/turf/open/floor/wood, +/area/centcom/holding) +"wh" = ( +/obj/structure/table/wood, +/obj/item/soap/nanotrasen, +/obj/item/reagent_containers/spray/cleaner, +/turf/open/floor/wood, +/area/centcom/holding) +"wi" = ( +/obj/structure/table/wood, +/obj/structure/bedsheetbin, +/turf/open/floor/wood, +/area/centcom/holding) +"wj" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "Proom5"; + name = "Room 5" + }, +/turf/open/floor/wood, +/area/centcom/holding) +"wk" = ( +/obj/machinery/button/door{ + id = "Proom5"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = -24; + pixel_y = 4; + specialfunctions = 4 + }, +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/floor/carpet, +/area/centcom/holding) "wl" = ( /obj/machinery/light, /turf/open/floor/wood, @@ -10763,77 +11206,6 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) -"EZ" = ( -/obj/structure/table, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"Fa" = ( -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"Fb" = ( -/obj/structure/closet/secure_closet/bar{ - req_access_txt = "25" - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"Fc" = ( -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"Fd" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"Fe" = ( -/obj/structure/rack, -/obj/item/camera, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"Ff" = ( -/obj/structure/rack, -/obj/item/toy/sword, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"Fg" = ( -/obj/structure/rack, -/obj/item/toy/gun, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"Fh" = ( -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "Fi" = ( /turf/open/floor/plating/beach/sand, /area/centcom/holding) @@ -10950,19 +11322,6 @@ dir = 5 }, /area/tdome/tdomeobserve) -"FA" = ( -/obj/structure/table, -/obj/item/clothing/head/that, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"FB" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "FC" = ( /obj/item/camera, /turf/open/floor/plating/beach/sand, @@ -11069,41 +11428,6 @@ }, /turf/open/floor/engine/cult, /area/wizard_station) -"FU" = ( -/obj/structure/table, -/obj/item/ammo_box/foambox, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"FV" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/shaker, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"FW" = ( -/obj/structure/table, -/obj/item/lighter, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"FX" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/soda_cans/cola, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) -"FY" = ( -/obj/structure/table, -/obj/item/dice/d20, -/turf/open/floor/plasteel/freezer{ - dir = 2 - }, -/area/centcom/holding) "FZ" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -11224,13 +11548,6 @@ }, /turf/open/lava, /area/wizard_station) -"Gs" = ( -/obj/structure/rack, -/obj/item/clothing/head/that, -/obj/item/clothing/under/suit_jacket, -/obj/item/clothing/accessory/waistcoat, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "Gt" = ( /obj/item/toy/beach_ball, /turf/open/floor/plating/beach/sand, @@ -11278,18 +11595,6 @@ }, /turf/open/lava/airless, /area/wizard_station) -"GA" = ( -/obj/structure/rack, -/obj/item/storage/crayons, -/obj/item/gun/ballistic/automatic/toy/pistol, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"GB" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "GC" = ( /obj/structure/table, /obj/structure/bedsheetbin, @@ -11522,12 +11827,6 @@ /obj/structure/shuttle/engine/propulsion, /turf/open/space, /area/wizard_station) -"GY" = ( -/obj/structure/rack, -/obj/item/storage/crayons, -/obj/item/gun/ballistic/shotgun/toy/crossbow, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "GZ" = ( /turf/open/floor/plating/beach/coastline_b, /area/centcom/holding) @@ -11580,33 +11879,6 @@ dir = 4 }, /area/tdome/tdomeobserve) -"Hi" = ( -/obj/structure/rack, -/obj/item/clothing/shoes/laceup, -/obj/item/clothing/under/suit_jacket/female{ - desc = "A black trouser suit for women. Very formal."; - name = "black suit"; - pixel_x = 3; - pixel_y = 1 - }, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"Hj" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"Hk" = ( -/obj/structure/table, -/obj/item/gun/ballistic/automatic/toy/pistol, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) -"Hl" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/cafeteria, -/area/centcom/holding) "Hm" = ( /turf/open/floor/plating/beach/water, /area/centcom/holding) @@ -39483,25 +39755,25 @@ aa aa aa ED -EZ -EZ -FU -Gs -GA -GY -Hi +hH +pU +qG +rZ +sa +sc +sd +ED +ED +ED +ED +ED +ED +ED +ED ED ED ED ED -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -39740,25 +40012,25 @@ aa aa aa ED -Fa -Fa -Fa -Fh -Fh -Fh -Fh +jO +pU +pU +pW +pW +pW +pU Hy HH HH ED -aa -aa -aa -aa -aa -aa -aa -aa +uH +vo +vr +ED +uH +vo +vr +ED aa aa aa @@ -39997,25 +40269,25 @@ aa aa aa ED -Fb -Fa -FV -FB -Fh -Fh -Fh +oU +pU +qH +qF +pW +pW +pU Hz HH HH ED -aa -aa -aa -aa -aa -aa -aa -aa +uI +uN +vy +ED +uI +uN +vy +ED aa aa aa @@ -40254,25 +40526,25 @@ aa aa aa ED -Fc -Fa -EZ -FB -Fh -Fh -Fh +oV +pU +qI +qF +pW +pW +sY Hz HH HH ED -aa -aa -aa -aa -aa -aa -aa -aa +uG +uN +vs +ED +uG +uN +vs +ED aa aa aa @@ -40511,25 +40783,25 @@ aa aa aa ED -Fc -Fa -FW -FB -Fh -Fh -Fh +px +pU +rb +qF +pW +pW +sZ Hy HH HH ED -aa -aa -aa -aa -aa -aa -aa -aa +tm +tm +tm +ED +tm +tm +tm +ED aa aa aa @@ -40768,25 +41040,25 @@ aa aa aa ED -Fa -Fa -FX -FB -Fh -Fh -Hj +py +pU +rc +qF +pW +pW +ta ED ED ED ED -aa -aa -aa -aa -aa -aa -aa -aa +uK +tm +vt +ED +wf +tm +vt +ED aa aa aa @@ -41025,26 +41297,26 @@ aa aa aa ED -Fd -FA -FY -FB -Fh -Fh -Fh +pz +pV +rY +qF +pW +pW +pU +ED +ED +ED +ED +ED +vq +ED +ED +ED +wg +ED +ED ED -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -41282,13 +41554,25 @@ aa aa aa ED -Fe -Fh -Fh -Fh -Fh -Fh -Fh +pA +pW +pW +pW +pW +pW +pU +tk +pU +tZ +pU +pU +pU +pU +pU +pU +pU +tZ +wh ED aa aa @@ -41299,18 +41583,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa KH KU Lb @@ -41539,13 +41811,25 @@ aa aa aa ED -Ff -Fh -Fh -Fh -Fh -Fh -FB +pB +pW +pW +pW +pW +pW +pU +tk +pU +pU +pU +pU +vp +pU +pU +pU +pU +pU +wi ED aa aa @@ -41555,18 +41839,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa KH KH KS @@ -41796,26 +42068,26 @@ aa aa aa ED -Fg -Fh -Fh -Fh -Fh -FB -Hk +pC +pW +pW +pW +pW +pW +tb +ED +ED +ub +ED +ED +ED +vz +ED +ED +ED +wj +ED ED -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -42053,26 +42325,26 @@ aa aa aa ED -Fh -FB -Fh -Fh -Fh -Fh -FB +pD +qF +pW +pW +pW +pW +tc +ED +tY +tm +ug +ED +tY +tm +we +ED +tY +tm +wk ED -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -42310,26 +42582,26 @@ aa aa aa ED -Fi -Fi -Fi -Fi -GB -GB -Hl +pE +qF +pW +pW +pW +pW +td +ED +tW +uc +tm +ED +tW +uc +tm +ED +tW +uc +tm ED -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -42567,26 +42839,26 @@ aa aa aa ED -Fj -Fi -Fi -Fi -Fi -GZ -Hm +pS +qF +pW +pW +pW +pW +td +ED +ED +ED +ED +ED +ED +ED +ED +ED +ED +ED +ED ED -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -42824,6 +43096,777 @@ aa aa aa ED +pS +qF +pW +pW +pW +pW +tj +ED +ED +ED +ED +ED +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(115,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ED +pT +pU +pU +pU +sb +sb +sb +tl +ua +uf +uh +ED +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(116,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ED +Fj +Fi +Fi +Fi +Fi +GZ +Hm +ED +ED +ED +ED +ED +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(117,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ED Fi Fi FZ @@ -42890,7 +43933,7 @@ aa aa aa "} -(115,1,1) = {" +(118,1,1) = {" aa aa aa @@ -43147,7 +44190,7 @@ aa aa aa "} -(116,1,1) = {" +(119,1,1) = {" aa aa aa @@ -43404,7 +44447,7 @@ aa aa aa "} -(117,1,1) = {" +(120,1,1) = {" aa aa aa @@ -43661,777 +44704,6 @@ aa aa aa "} -(118,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ED -ED -ED -ED -ED -ED -ED -ED -ED -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(119,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(120,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} (121,1,1) = {" aa aa @@ -44622,15 +44894,15 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ED +ED +ED +ED +ED +ED +ED +ED +ED aa aa aa diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 512e2cc4d9..a5aa63e6a1 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -138,11 +138,14 @@ #define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //(type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items. #define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //(obj, new_loc, force = FALSE) - returns bool #define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //(loc) - returns bool - if loc is null it will dump at parent location. -#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into) +#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE) #define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool /*******Non-Signal Component Related Defines*******/ +//Redirection component init flags +#define REDIRECT_TRANSFER_WITH_TURF 1 + //Arch #define ARCH_PROB "probability" //Probability for each item #define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 9350116635..9f0fdc27b2 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -6,6 +6,7 @@ #define PLANE_SPACE -95 #define PLANE_SPACE_PARALLAX -90 +#define FLOOR_PLANE -2 #define GAME_PLANE -1 #define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals #define SPACE_LAYER 1.8 diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 3267a43d5a..d0f8460053 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -445,3 +445,8 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define NO_INIT_PARAMETER "no-init" #define EGG_LAYING_MESSAGES list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.") + +// Used by PDA and cartridge code to reduce repetitiveness of spritesheets +#define PDAIMG(what) {""} +//Filters +#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA") diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 15033fcf48..64a4089543 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -258,7 +258,7 @@ // Roundstart trait system -#define MAX_TRAITS 6 //The maximum amount of traits one character can have at roundstart +#define MAX_QUIRKS 6 //The maximum amount of quirks one character can have at roundstart // AI Toggles #define AI_CAMERA_LUMINOSITY 5 diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 7ba693be0a..0dc8a38899 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -64,6 +64,7 @@ #define EXP_TYPE_ANTAG "Antag" #define EXP_TYPE_SPECIAL "Special" #define EXP_TYPE_GHOST "Ghost" +#define EXP_TYPE_ADMIN "Admin" //Flags in the players table in the db #define DB_FLAG_EXEMPT 1 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 36b25bf6c6..2b5e42e339 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -56,7 +56,7 @@ #define INIT_ORDER_RESEARCH 14 #define INIT_ORDER_EVENTS 13 #define INIT_ORDER_JOBS 12 -#define INIT_ORDER_TRAITS 11 +#define INIT_ORDER_QUIRKS 11 #define INIT_ORDER_TICKER 10 #define INIT_ORDER_MAPPING 9 #define INIT_ORDER_NETWORKS 8 diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index f16745979c..fcf5a5dd4a 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -359,7 +359,7 @@ for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots) borg_num-- if(robo.mind) - robolist += "[robo.name] (Played by: [robo.mind.key])[robo.stat ? " (Deactivated)" : ""][borg_num ?", ":""]
" + robolist += "[robo.name] (Played by: [robo.mind.key])[robo.stat == DEAD ? " (Deactivated)" : ""][borg_num ?", ":""]
" parts += "[robolist]" if(!borg_spacer) borg_spacer = TRUE diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index f0c56b84ac..6b9a02c009 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -16,12 +16,22 @@ //Trust me, you need one. Period. If you don't think you do, you're doing something extremely wrong. /obj/screen/plane_master/proc/backdrop(mob/mymob) +/obj/screen/plane_master/floor + name = "floor plane master" + plane = FLOOR_PLANE + appearance_flags = PLANE_MASTER + blend_mode = BLEND_OVERLAY + /obj/screen/plane_master/game_world name = "game world plane master" plane = GAME_PLANE appearance_flags = PLANE_MASTER //should use client color blend_mode = BLEND_OVERLAY +/obj/screen/plane_master/game_world/backdrop(mob/mymob) + if(istype(mymob) && mymob.client && mymob.client.prefs && mymob.client.prefs.ambientocclusion) + filters += AMBIENT_OCCLUSION + /obj/screen/plane_master/lighting name = "lighting plane master" plane = LIGHTING_PLANE diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/assets.dm index fd27c9424f..7285298283 100644 --- a/code/controllers/subsystem/assets.dm +++ b/code/controllers/subsystem/assets.dm @@ -6,9 +6,10 @@ SUBSYSTEM_DEF(assets) var/list/preload = list() /datum/controller/subsystem/assets/Initialize(timeofday) - for(var/type in typesof(/datum/asset) - list(/datum/asset, /datum/asset/simple)) - var/datum/asset/A = new type() - A.register() + for(var/type in typesof(/datum/asset)) + var/datum/asset/A = type + if (type != initial(A._abstract)) + get_asset_datum(type) preload = cache.Copy() //don't preload assets generated during the round diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm new file mode 100644 index 0000000000..cec8b2832b --- /dev/null +++ b/code/controllers/subsystem/processing/quirks.dm @@ -0,0 +1,34 @@ +//Used to process and handle roundstart quirks +// - Quirk strings are used for faster checking in code +// - Quirk datums are stored and hold different effects, as well as being a vector for applying trait string +PROCESSING_SUBSYSTEM_DEF(quirks) + name = "Quirks" + init_order = INIT_ORDER_QUIRKS + flags = SS_BACKGROUND + wait = 10 + runlevels = RUNLEVEL_GAME + + var/list/quirks = list() //Assoc. list of all roundstart quirk datum types; "name" = /path/ + var/list/quirk_points = list() //Assoc. list of quirk names and their "point cost"; positive numbers are good traits, and negative ones are bad + var/list/quirk_objects = list() //A list of all quirk objects in the game, since some may process + +/datum/controller/subsystem/processing/quirks/Initialize(timeofday) + if(!quirks.len) + SetupQuirks() + ..() + +/datum/controller/subsystem/processing/quirks/proc/SetupQuirks() + for(var/V in subtypesof(/datum/quirk)) + var/datum/quirk/T = V + quirks[initial(T.name)] = T + quirk_points[initial(T.name)] = initial(T.value) + +/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli, spawn_effects) + GenerateQuirks(cli) + for(var/V in cli.prefs.character_quirks) + user.add_quirk(V, spawn_effects) + +/datum/controller/subsystem/processing/quirks/proc/GenerateQuirks(client/user) + if(user.prefs.character_quirks.len) + return + user.prefs.character_quirks = user.prefs.all_quirks diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 5fc77669bc..270970c61b 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -391,7 +391,7 @@ SUBSYSTEM_DEF(ticker) if(player.mind.assigned_role != player.mind.special_role) SSjob.EquipRank(N, player.mind.assigned_role, 0) if(CONFIG_GET(flag/roundstart_traits)) - SStraits.AssignTraits(player, N.client, TRUE) + SSquirks.AssignQuirks(player, N.client, TRUE) CHECK_TICK if(captainless) for(var/mob/dead/new_player/N in GLOB.player_list) diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm new file mode 100644 index 0000000000..0b94c389ce --- /dev/null +++ b/code/datums/components/armor_plate.dm @@ -0,0 +1,78 @@ +/datum/component/armor_plate + var/amount = 0 + var/maxamount = 3 + var/upgrade_item = /obj/item/stack/sheet/animalhide/goliath_hide + var/datum/armor/added_armor = list("melee" = 10) + var/upgrade_name + +/datum/component/armor_plate/Initialize(_maxamount,obj/item/_upgrade_item,datum/armor/_added_armor) + if(!isobj(parent)) + return COMPONENT_INCOMPATIBLE + + RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/examine) + RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/applyplate) + RegisterSignal(COMSIG_PARENT_PREQDELETED, .proc/dropplates) + + if(_maxamount) + maxamount = _maxamount + if(_upgrade_item) + upgrade_item = _upgrade_item + if(_added_armor) + if(islist(_added_armor)) + added_armor = getArmor(arglist(_added_armor)) + else if (istype(_added_armor, /datum/armor)) + added_armor = _added_armor + else + stack_trace("Invalid type [_added_armor.type] passed as _armor_item argument to armorplate component") + else + added_armor = getArmor(arglist(added_armor)) + var/obj/item/typecast = upgrade_item + upgrade_name = initial(typecast.name) + +/datum/component/armor_plate/proc/examine(mob/user) + //upgrade_item could also be typecast here instead + if(ismecha(parent)) + if(amount) + if(amount < maxamount) + to_chat(user, "Its armor is enhanced with [amount] [upgrade_name].") + else + to_chat(user, "It's wearing a fearsome carapace entirely composed of [upgrade_name] - its pilot must be an experienced monster hunter.") + else + to_chat(user, "It has attachment points for strapping monster hide on for added protection.") + else + if(amount) + to_chat(user, "It has been strengthened with [amount]/[maxamount] [upgrade_name].") + else + to_chat(user, "It can be strengthened with up to [maxamount] [upgrade_name].") + +/datum/component/armor_plate/proc/applyplate(obj/item/I, mob/user, params) + if(!istype(I,upgrade_item)) + return + if(amount >= maxamount) + to_chat(user, "You can't improve [parent] any further!") + return + + if(istype(I,/obj/item/stack)) + I.use(1) + else + if(length(I.contents)) + to_chat(user, "[I] cannot be used for armoring while there's something inside!") + return + qdel(I) + + var/obj/O = parent + amount++ + O.armor = O.armor.attachArmor(added_armor) + + if(ismecha(O)) + var/obj/mecha/R = O + R.update_icon() + to_chat(user, "You strengthen [R], improving its resistance against melee, bullet and laser damage.") + else + to_chat(user, "You strengthen [O], improving its resistance against melee attacks.") + + +/datum/component/armor_plate/proc/dropplates(force) + if(ismecha(parent)) //items didn't drop the plates before and it causes erroneous behavior for the time being with collapsible helmets + for(var/i in 1 to amount) + new upgrade_item(get_turf(parent)) \ No newline at end of file diff --git a/code/datums/components/signal_redirect.dm b/code/datums/components/signal_redirect.dm index 764a44e4a9..8828c03c2d 100644 --- a/code/datums/components/signal_redirect.dm +++ b/code/datums/components/signal_redirect.dm @@ -1,8 +1,13 @@ /datum/component/redirect dupe_mode = COMPONENT_DUPE_ALLOWED -/datum/component/redirect/Initialize(list/signals, datum/callback/_callback) +/datum/component/redirect/Initialize(list/signals, datum/callback/_callback, flags=NONE) //It's not our job to verify the right signals are registered here, just do it. if(!LAZYLEN(signals) || !istype(_callback)) return COMPONENT_INCOMPATIBLE + if(flags & REDIRECT_TRANSFER_WITH_TURF && isturf(parent)) + RegisterSignal(COMSIG_TURF_CHANGE, .proc/turf_change) RegisterSignal(signals, _callback) + +/datum/component/redirect/proc/turf_change(path, new_baseturfs, flags, list/transfers) + transfers += src diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index a999624c32..54f8b107e0 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -28,13 +28,7 @@ CRASH("Unable to find a blobstart landmark") var/atom/movable/AM = parent - if(ismob(AM.loc)) - var/mob/M = AM.loc - M.transferItemToLoc(AM, targetturf, TRUE) //nodrops disks when? - else if(AM.loc.SendSignal(COMSIG_CONTAINS_STORAGE)) - AM.loc.SendSignal(COMSIG_TRY_STORAGE_TAKE, src, targetturf, TRUE) - else - AM.forceMove(targetturf) + AM.forceMove(targetturf) // move the disc, so ghosts remain orbiting it even if it's "destroyed" return targetturf diff --git a/code/datums/components/storage/concrete/_concrete.dm b/code/datums/components/storage/concrete/_concrete.dm index 4234dadd85..8701252fe6 100644 --- a/code/datums/components/storage/concrete/_concrete.dm +++ b/code/datums/components/storage/concrete/_concrete.dm @@ -73,6 +73,8 @@ slave.refresh_mob_views() /datum/component/storage/concrete/emp_act(severity) + if(emp_shielded) + return var/atom/real_location = real_location() for(var/i in real_location) var/atom/A = i diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 483ab07e47..084056fb10 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -369,10 +369,10 @@ . = TRUE //returns TRUE if any mobs actually got a close(M) call /datum/component/storage/proc/emp_act(severity) - var/atom/A = parent - if(!isliving(A.loc) && !emp_shielded) - var/datum/component/storage/concrete/master = master() - master.emp_act(severity) + if(emp_shielded) + return + var/datum/component/storage/concrete/master = master() + master.emp_act(severity) //This proc draws out the inventory and places the items on it. tx and ty are the upper left tile and mx, my are the bottm right. //The numbers are calculated from the bottom-left The bottom-left slot being 1,1. @@ -455,23 +455,24 @@ return FALSE handle_item_insertion(I, FALSE, M) -/datum/component/storage/proc/return_inv() - . = list() - . += contents() - for(var/i in contents()) - var/atom/a = i - GET_COMPONENT_FROM(STR, /datum/component/storage, a) - if(STR) - . += STR.return_inv() +/datum/component/storage/proc/return_inv(recursive) + var/list/ret = list() + ret |= contents() + if(recursive) + for(var/i in ret.Copy()) + var/atom/A = i + A.SendSignal(COMSIG_TRY_STORAGE_RETURN_INVENTORY, ret, TRUE) + return ret /datum/component/storage/proc/contents() //ONLY USE IF YOU NEED TO COPY CONTENTS OF REAL LOCATION, COPYING IS NOT AS FAST AS DIRECT ACCESS! var/atom/real_location = real_location() return real_location.contents.Copy() -/datum/component/storage/proc/signal_return_inv(list/interface) +//Abuses the fact that lists are just references, or something like that. +/datum/component/storage/proc/signal_return_inv(list/interface, recursive = TRUE) if(!islist(interface)) return FALSE - interface |= return_inv() + interface |= return_inv(recursive) return TRUE /datum/component/storage/proc/mousedrop_onto(atom/over_object, mob/M) diff --git a/code/datums/traits/_trait.dm b/code/datums/traits/_quirk.dm similarity index 60% rename from code/datums/traits/_trait.dm rename to code/datums/traits/_quirk.dm index 96f6857970..5f0d1be1f2 100644 --- a/code/datums/traits/_trait.dm +++ b/code/datums/traits/_quirk.dm @@ -1,94 +1,94 @@ -//every trait in this folder should be coded around being applied on spawn -//these are NOT "mob traits" like GOTTAGOFAST, but exist as a medium to apply them and other different effects -/datum/trait - var/name = "Test Trait" - var/desc = "This is a test trait." +//every quirk in this folder should be coded around being applied on spawn +//these are NOT "mob quirks" like GOTTAGOFAST, but exist as a medium to apply them and other different effects +/datum/quirk + var/name = "Test Quirk" + var/desc = "This is a test quirk." var/value = 0 var/human_only = TRUE var/gain_text var/lose_text var/medical_record_text //This text will appear on medical records for the trait. Not yet implemented - var/mood_trait = FALSE //if true, this trait affects mood and is unavailable if moodlets are disabled + var/mood_quirk = FALSE //if true, this quirk affects mood and is unavailable if moodlets are disabled var/mob_trait //if applicable, apply and remove this mob trait - var/mob/living/trait_holder + var/mob/living/quirk_holder -/datum/trait/New(mob/living/trait_mob, spawn_effects) +/datum/quirk/New(mob/living/quirk_mob, spawn_effects) ..() - if(!trait_mob || (human_only && !ishuman(trait_mob)) || trait_mob.has_trait_datum(type)) + if(!quirk_mob || (human_only && !ishuman(quirk_mob)) || quirk_mob.has_quirk(type)) qdel(src) - trait_holder = trait_mob - SStraits.trait_objects += src - to_chat(trait_holder, gain_text) - trait_holder.roundstart_traits += src + quirk_holder = quirk_mob + SSquirks.quirk_objects += src + to_chat(quirk_holder, gain_text) + quirk_holder.roundstart_quirks += src if(mob_trait) - trait_holder.add_trait(mob_trait, ROUNDSTART_TRAIT) - START_PROCESSING(SStraits, src) + quirk_holder.add_trait(mob_trait, ROUNDSTART_TRAIT) + START_PROCESSING(SSquirks, src) add() if(spawn_effects) on_spawn() addtimer(CALLBACK(src, .proc/post_add), 30) -/datum/trait/Destroy() - STOP_PROCESSING(SStraits, src) +/datum/quirk/Destroy() + STOP_PROCESSING(SSquirks, src) remove() - if(trait_holder) - to_chat(trait_holder, lose_text) - trait_holder.roundstart_traits -= src + if(quirk_holder) + to_chat(quirk_holder, lose_text) + quirk_holder.roundstart_quirks -= src if(mob_trait) - trait_holder.remove_trait(mob_trait, ROUNDSTART_TRAIT, TRUE) - SStraits.trait_objects -= src + quirk_holder.remove_trait(mob_trait, ROUNDSTART_TRAIT, TRUE) + SSquirks.quirk_objects -= src return ..() -/datum/trait/proc/transfer_mob(mob/living/to_mob) - trait_holder.roundstart_traits -= src - to_mob.roundstart_traits += src +/datum/quirk/proc/transfer_mob(mob/living/to_mob) + quirk_holder.roundstart_quirks -= src + to_mob.roundstart_quirks += src if(mob_trait) - trait_holder.remove_trait(mob_trait, ROUNDSTART_TRAIT) + quirk_holder.remove_trait(mob_trait, ROUNDSTART_TRAIT) to_mob.add_trait(mob_trait, ROUNDSTART_TRAIT) - trait_holder = to_mob + quirk_holder = to_mob on_transfer() -/datum/trait/proc/add() //special "on add" effects -/datum/trait/proc/on_spawn() //these should only trigger when the character is being created for the first time, i.e. roundstart/latejoin -/datum/trait/proc/remove() //special "on remove" effects -/datum/trait/proc/on_process() //process() has some special checks, so this is the actual process -/datum/trait/proc/post_add() //for text, disclaimers etc. given after you spawn in with the trait -/datum/trait/proc/on_transfer() //code called when the trait is transferred to a new mob +/datum/quirk/proc/add() //special "on add" effects +/datum/quirk/proc/on_spawn() //these should only trigger when the character is being created for the first time, i.e. roundstart/latejoin +/datum/quirk/proc/remove() //special "on remove" effects +/datum/quirk/proc/on_process() //process() has some special checks, so this is the actual process +/datum/quirk/proc/post_add() //for text, disclaimers etc. given after you spawn in with the trait +/datum/quirk/proc/on_transfer() //code called when the trait is transferred to a new mob -/datum/trait/process() - if(QDELETED(trait_holder)) - trait_holder = null +/datum/quirk/process() + if(QDELETED(quirk_holder)) + quirk_holder = null qdel(src) return - if(trait_holder.stat == DEAD) + if(quirk_holder.stat == DEAD) return on_process() /mob/living/proc/get_trait_string(medical) //helper string. gets a string of all the traits the mob has var/list/dat = list() if(!medical) - for(var/V in roundstart_traits) - var/datum/trait/T = V + for(var/V in roundstart_quirks) + var/datum/quirk/T = V dat += T.name if(!dat.len) return "None" return dat.Join(", ") else - for(var/V in roundstart_traits) - var/datum/trait/T = V + for(var/V in roundstart_quirks) + var/datum/quirk/T = V dat += T.medical_record_text if(!dat.len) return "None" return dat.Join("
") /mob/living/proc/cleanse_trait_datums() //removes all trait datums - for(var/V in roundstart_traits) - var/datum/trait/T = V + for(var/V in roundstart_quirks) + var/datum/quirk/T = V qdel(T) /mob/living/proc/transfer_trait_datums(mob/living/to_mob) - for(var/V in roundstart_traits) - var/datum/trait/T = V + for(var/V in roundstart_quirks) + var/datum/quirk/T = V T.transfer_mob(to_mob) /* @@ -96,7 +96,7 @@ Commented version of Nearsighted to help you add your own traits Use this as a guideline -/datum/trait/nearsighted +/datum/quirk/nearsighted name = "Nearsighted" ///The trait's name @@ -116,8 +116,8 @@ Use this as a guideline medical_record_text = "Subject has permanent nearsightedness." ///These three are self-explanatory -/datum/trait/nearsighted/on_spawn() - var/mob/living/carbon/human/H = trait_holder +/datum/quirk/nearsighted/on_spawn() + var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H)) H.put_in_hands(glasses) H.equip_to_slot(glasses, slot_glasses) diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index d05541fafb..d48c70f31b 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -1,7 +1,7 @@ //predominantly positive traits //this file is named weirdly so that positive traits are listed above negative ones -/datum/trait/alcohol_tolerance +/datum/quirk/alcohol_tolerance name = "Alcohol Tolerance" desc = "You become drunk more slowly and suffer fewer drawbacks from alcohol." value = 1 @@ -11,25 +11,25 @@ -/datum/trait/apathetic +/datum/quirk/apathetic name = "Apathetic" desc = "You just don't care as much as other people. That's nice to have in a place like this, I guess." value = 1 - mood_trait = TRUE + mood_quirk = TRUE -/datum/trait/apathetic/add() - GET_COMPONENT_FROM(mood, /datum/component/mood, trait_holder) +/datum/quirk/apathetic/add() + GET_COMPONENT_FROM(mood, /datum/component/mood, quirk_holder) if(mood) mood.mood_modifier = 0.8 -/datum/trait/apathetic/remove() - GET_COMPONENT_FROM(mood, /datum/component/mood, trait_holder) +/datum/quirk/apathetic/remove() + GET_COMPONENT_FROM(mood, /datum/component/mood, quirk_holder) if(mood) mood.mood_modifier = 1 //Change this once/if species get their own mood modifiers. -/datum/trait/freerunning +/datum/quirk/freerunning name = "Freerunning" desc = "You're great at quick moves! You can climb tables more quickly." value = 2 @@ -39,16 +39,16 @@ -/datum/trait/jolly +/datum/quirk/jolly name = "Jolly" desc = "You sometimes just feel happy, for no reason at all." value = 1 mob_trait = TRAIT_JOLLY - mood_trait = TRUE + mood_quirk = TRUE -/datum/trait/light_step +/datum/quirk/light_step name = "Light Step" desc = "You walk with a gentle step, making stepping on sharp objects quieter and less painful." value = 1 @@ -58,7 +58,7 @@ -/datum/trait/night_vision +/datum/quirk/night_vision name = "Night Vision" desc = "You can see slightly more clearly in full darkness than most people." value = 1 @@ -66,8 +66,8 @@ gain_text = "The shadows seem a little less dark." lose_text = "Everything seems a little darker." -/datum/trait/night_vision/on_spawn() - var/mob/living/carbon/human/H = trait_holder +/datum/quirk/night_vision/on_spawn() + var/mob/living/carbon/human/H = quirk_holder var/obj/item/organ/eyes/eyes = H.getorgan(/obj/item/organ/eyes) if(!eyes || eyes.lighting_alpha) return @@ -75,7 +75,7 @@ -/datum/trait/selfaware +/datum/quirk/selfaware name = "Self-Aware" desc = "You know your body well, and can accurately assess the extent of your wounds." value = 2 @@ -83,7 +83,7 @@ -/datum/trait/skittish +/datum/quirk/skittish name = "Skittish" desc = "You can conceal yourself in danger. Ctrl-shift-click a closed locker to jump into it, as long as you have access." value = 2 @@ -91,7 +91,7 @@ -/datum/trait/spiritual +/datum/quirk/spiritual name = "Spiritual" desc = "You're in tune with the gods, and your prayers may be more likely to be heard. Or not." value = 1 @@ -101,7 +101,7 @@ -/datum/trait/voracious +/datum/quirk/voracious name = "Voracious" desc = "Nothing gets between you and your food. You eat twice as fast as everyone else!" value = 1 diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 510a06819f..0a2ce2f24c 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -1,6 +1,6 @@ //predominantly negative traits -/datum/trait/blooddeficiency +/datum/quirk/blooddeficiency name = "Acute Blood Deficiency" desc = "Your body can't produce enough blood to sustain itself." value = -2 @@ -8,12 +8,12 @@ lose_text = "You feel vigorous again." medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood." -/datum/trait/blooddeficiency/on_process() - trait_holder.blood_volume -= 0.275 +/datum/quirk/blooddeficiency/on_process() + quirk_holder.blood_volume -= 0.275 -/datum/trait/depression +/datum/quirk/depression name = "Depression" desc = "You sometimes just hate life." mob_trait = TRAIT_DEPRESSION @@ -21,22 +21,22 @@ gain_text = "You start feeling depressed." lose_text = "You no longer feel depressed." //if only it were that easy! medical_record_text = "Patient has a severe mood disorder causing them to experience sudden moments of sadness." - mood_trait = TRUE + mood_quirk = TRUE -/datum/trait/family_heirloom +/datum/quirk/family_heirloom name = "Family Heirloom" desc = "You are the current owner of an heirloom. passed down for generations. You have to keep it safe!" value = -1 - mood_trait = TRUE + mood_quirk = TRUE var/obj/item/heirloom var/where_text -/datum/trait/family_heirloom/on_spawn() - var/mob/living/carbon/human/H = trait_holder +/datum/quirk/family_heirloom/on_spawn() + var/mob/living/carbon/human/H = quirk_holder var/obj/item/heirloom_type - switch(trait_holder.mind.assigned_role) + switch(quirk_holder.mind.assigned_role) if("Clown") heirloom_type = /obj/item/bikehorn/golden if("Mime") @@ -56,7 +56,7 @@ /obj/item/toy/cards/deck, /obj/item/lighter, /obj/item/dice/d20) - heirloom = new heirloom_type(get_turf(trait_holder)) + heirloom = new heirloom_type(get_turf(quirk_holder)) var/list/slots = list( "in your backpack" = slot_in_backpack, "in your left pocket" = slot_l_store, @@ -65,26 +65,26 @@ var/where = H.equip_in_one_of_slots(heirloom, slots) if(!where) where = "at your feet" - if(where == "in your backpack") - H.back.SendSignal(COMSIG_TRY_STORAGE_SHOW, H) + else if(where == "in your backpack") + H.back.SendSignal(COMSIG_TRY_STORAGE_SHOW, H) where_text = "There is a precious family [heirloom.name] [where], passed down from generation to generation. Keep it safe!" -/datum/trait/family_heirloom/post_add() - to_chat(trait_holder, where_text) - var/list/family_name = splittext(trait_holder.real_name, " ") +/datum/quirk/family_heirloom/post_add() + to_chat(quirk_holder, where_text) + var/list/family_name = splittext(quirk_holder.real_name, " ") heirloom.name = "\improper [family_name[family_name.len]] family [heirloom.name]" -/datum/trait/family_heirloom/on_process() - if(heirloom in trait_holder.GetAllContents()) - trait_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing") - trait_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom) +/datum/quirk/family_heirloom/on_process() + if(heirloom in quirk_holder.GetAllContents()) + quirk_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing") + quirk_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom) else - trait_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") - trait_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing) + quirk_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") + quirk_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing) -/datum/trait/heavy_sleeper +/datum/quirk/heavy_sleeper name = "Heavy Sleeper" desc = "You sleep like a rock! Whenever you're put to sleep, you sleep for a little bit longer." value = -1 @@ -93,7 +93,7 @@ lose_text = "You feel awake again." medical_record_text = "Patient has abnormal sleep study results and is difficult to wake up." -/datum/trait/brainproblems +/datum/quirk/brainproblems name = "Brain Tumor" desc = "You have a little friend in your brain that is slowly destroying it. Better bring some mannitol!" value = -3 @@ -101,12 +101,12 @@ lose_text = "You feel wrinkled again." medical_record_text = "Patient has a tumor in their brain that is slowly driving them to brain death." -/datum/trait/brainproblems/on_process() - trait_holder.adjustBrainLoss(0.2) +/datum/quirk/brainproblems/on_process() + quirk_holder.adjustBrainLoss(0.2) -/datum/trait/nearsighted //t. errorage +/datum/quirk/nearsighted //t. errorage name = "Nearsighted" desc = "You are nearsighted without prescription glasses, but spawn with a pair." value = -1 @@ -114,11 +114,11 @@ lose_text = "You start seeing faraway things normally again." medical_record_text = "Patient requires prescription glasses in order to counteract nearsightedness." -/datum/trait/nearsighted/add() - trait_holder.become_nearsighted(ROUNDSTART_TRAIT) +/datum/quirk/nearsighted/add() + quirk_holder.become_nearsighted(ROUNDSTART_TRAIT) -/datum/trait/nearsighted/on_spawn() - var/mob/living/carbon/human/H = trait_holder +/datum/quirk/nearsighted/on_spawn() + var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H)) H.put_in_hands(glasses) H.equip_to_slot(glasses, slot_glasses) @@ -126,28 +126,28 @@ -/datum/trait/nyctophobia +/datum/quirk/nyctophobia name = "Nyctophobia" desc = "As far as you can remember, you've always been afraid of the dark. While in the dark without a light source, you instinctually act careful, and constantly feel a sense of dread." value = -1 -/datum/trait/nyctophobia/on_process() - var/mob/living/carbon/human/H = trait_holder +/datum/quirk/nyctophobia/on_process() + var/mob/living/carbon/human/H = quirk_holder if(H.dna.species.id in list("shadow", "nightmare")) return //we're tied with the dark, so we don't get scared of it; don't cleanse outright to avoid cheese - var/turf/T = get_turf(trait_holder) + var/turf/T = get_turf(quirk_holder) var/lums = T.get_lumcount() if(lums <= 0.2) - if(trait_holder.m_intent == MOVE_INTENT_RUN) - to_chat(trait_holder, "Easy, easy, take it slow... you're in the dark...") - trait_holder.toggle_move_intent() - trait_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "nyctophobia", /datum/mood_event/nyctophobia) + if(quirk_holder.m_intent == MOVE_INTENT_RUN) + to_chat(quirk_holder, "Easy, easy, take it slow... you're in the dark...") + quirk_holder.toggle_move_intent() + quirk_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "nyctophobia", /datum/mood_event/nyctophobia) else - trait_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "nyctophobia") + quirk_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "nyctophobia") -/datum/trait/nonviolent +/datum/quirk/nonviolent name = "Pacifist" desc = "The thought of violence makes you sick. So much so, in fact, that you can't hurt anyone." value = -2 @@ -156,14 +156,14 @@ lose_text = "You think you can defend yourself again." medical_record_text = "Patient is unusually pacifistic and cannot bring themselves to cause physical harm." -/datum/trait/nonviolent/on_process() - if(trait_holder.mind && LAZYLEN(trait_holder.mind.antag_datums)) - to_chat(trait_holder, "Your antagonistic nature has caused you to renounce your pacifism.") +/datum/quirk/nonviolent/on_process() + if(quirk_holder.mind && LAZYLEN(quirk_holder.mind.antag_datums)) + to_chat(quirk_holder, "Your antagonistic nature has caused you to renounce your pacifism.") qdel(src) -/datum/trait/poor_aim +/datum/quirk/poor_aim name = "Poor Aim" desc = "You're terrible with guns and can't line up a straight shot to save your life. Dual-wielding is right out." value = -1 @@ -172,7 +172,7 @@ -/datum/trait/prosopagnosia +/datum/quirk/prosopagnosia name = "Prosopagnosia" desc = "You have a mental disorder that prevents you from being able to recognize faces at all." value = -1 @@ -181,41 +181,41 @@ -/datum/trait/prosthetic_limb +/datum/quirk/prosthetic_limb name = "Prosthetic Limb" desc = "An accident caused you to lose one of your limbs. Because of this, you now have a random prosthetic!" value = -1 var/slot_string = "limb" -/datum/trait/prosthetic_limb/on_spawn() +/datum/quirk/prosthetic_limb/on_spawn() var/limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - var/mob/living/carbon/human/H = trait_holder + var/mob/living/carbon/human/H = quirk_holder var/obj/item/bodypart/old_part = H.get_bodypart(limb_slot) var/obj/item/bodypart/prosthetic switch(limb_slot) if(BODY_ZONE_L_ARM) - prosthetic = new/obj/item/bodypart/l_arm/robot/surplus(trait_holder) + prosthetic = new/obj/item/bodypart/l_arm/robot/surplus(quirk_holder) slot_string = "left arm" if(BODY_ZONE_R_ARM) - prosthetic = new/obj/item/bodypart/r_arm/robot/surplus(trait_holder) + prosthetic = new/obj/item/bodypart/r_arm/robot/surplus(quirk_holder) slot_string = "right arm" if(BODY_ZONE_L_LEG) - prosthetic = new/obj/item/bodypart/l_leg/robot/surplus(trait_holder) + prosthetic = new/obj/item/bodypart/l_leg/robot/surplus(quirk_holder) slot_string = "left leg" if(BODY_ZONE_R_LEG) - prosthetic = new/obj/item/bodypart/r_leg/robot/surplus(trait_holder) + prosthetic = new/obj/item/bodypart/r_leg/robot/surplus(quirk_holder) slot_string = "right leg" prosthetic.replace_limb(H) qdel(old_part) H.regenerate_icons() -/datum/trait/prosthetic_limb/post_add() - to_chat(trait_holder, "Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \ +/datum/quirk/prosthetic_limb/post_add() + to_chat(quirk_holder, "Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \ you need to use a welding tool and cables to repair it, instead of bruise packs and ointment.") -/datum/trait/insanity +/datum/quirk/insanity name = "Reality Dissociation Syndrome" desc = "You suffer from a severe disorder that causes very vivid hallucinations. Mindbreaker toxin can suppress its effects, and you are immune to mindbreaker's hallucinogenic properties. This is not a license to grief." value = -2 @@ -224,9 +224,9 @@ lose_text = "You feel in tune with the world again." medical_record_text = "Patient suffers from acute Reality Dissociation Syndrome and experiences vivid hallucinations." -/datum/trait/insanity/on_process() - if(trait_holder.reagents.has_reagent("mindbreaker")) - trait_holder.hallucination = 0 +/datum/quirk/insanity/on_process() + if(quirk_holder.reagents.has_reagent("mindbreaker")) + quirk_holder.hallucination = 0 return if(prob(2)) //we'll all be mad soon enough madness() @@ -234,15 +234,15 @@ /datum/quirk/insanity/proc/madness() quirk_holder.hallucination += rand(10, 25) -/datum/trait/insanity/post_add() //I don't /think/ we'll need this but for newbies who think "roleplay as insane" = "license to kill" it's probably a good thing to have - if(!trait_holder.mind || trait_holder.mind.special_role) +/datum/quirk/insanity/post_add() //I don't /think/ we'll need this but for newbies who think "roleplay as insane" = "license to kill" it's probably a good thing to have + if(!quirk_holder.mind || quirk_holder.mind.special_role) return - to_chat(trait_holder, "Please note that your dissociation syndrome does NOT give you the right to attack people or otherwise cause any interference to \ + to_chat(quirk_holder, "Please note that your dissociation syndrome does NOT give you the right to attack people or otherwise cause any interference to \ the round. You are not an antagonist, and the rules will treat you the same as other crewmembers.") -/datum/trait/social_anxiety +/datum/quirk/social_anxiety name = "Social Anxiety" desc = "Talking to people is very difficult for you, and you often stutter or even lock up." value = -1 @@ -251,12 +251,12 @@ medical_record_text = "Patient is usually anxious in social encounters and prefers to avoid them." var/dumb_thing = TRUE -/datum/trait/social_anxiety/on_process() +/datum/quirk/social_anxiety/on_process() var/nearby_people = 0 - for(var/mob/living/carbon/human/H in view(5, trait_holder)) + for(var/mob/living/carbon/human/H in view(5, quirk_holder)) if(H.client) nearby_people++ - var/mob/living/carbon/human/H = trait_holder + var/mob/living/carbon/human/H = quirk_holder if(prob(2 + nearby_people)) H.stuttering = max(3, H.stuttering) else if(prob(min(3, nearby_people)) && !H.silent) diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 61c7addd6c..8ef9bf0a11 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -1,7 +1,7 @@ //traits with no real impact that can be taken freely //MAKE SURE THESE DO NOT MAJORLY IMPACT GAMEPLAY. those should be positive or negative traits. -/datum/trait/no_taste +/datum/quirk/no_taste name = "Ageusia" desc = "You can't taste anything! Toxic food will still poison you." value = 0 @@ -12,75 +12,75 @@ -/datum/trait/pineapple_liker +/datum/quirk/pineapple_liker name = "Ananas Affinity" desc = "You find yourself greatly enjoying fruits of the ananas genus. You can't seem to ever get enough of their sweet goodness!" value = 0 gain_text = "You feel an intense craving for pineapple." lose_text = "Your feelings towards pineapples seem to return to a lukewarm state." -/datum/trait/pineapple_liker/add() - var/mob/living/carbon/human/H = trait_holder +/datum/quirk/pineapple_liker/add() + var/mob/living/carbon/human/H = quirk_holder var/datum/species/species = H.dna.species species.liked_food |= PINEAPPLE -/datum/trait/pineapple_liker/remove() - var/mob/living/carbon/human/H = trait_holder +/datum/quirk/pineapple_liker/remove() + var/mob/living/carbon/human/H = quirk_holder var/datum/species/species = H.dna.species species.liked_food &= ~PINEAPPLE -/datum/trait/pineapple_hater +/datum/quirk/pineapple_hater name = "Ananas Aversion" desc = "You find yourself greatly detesting fruits of the ananas genus. Serious, how the hell can anyone say these things are good? And what kind of madman would even dare putting it on a pizza!?" value = 0 gain_text = "You find yourself pondering what kind of idiot actually enjoys pineapples..." lose_text = "Your feelings towards pineapples seem to return to a lukewarm state." -/datum/trait/pineapple_hater/add() - var/mob/living/carbon/human/H = trait_holder +/datum/quirk/pineapple_hater/add() + var/mob/living/carbon/human/H = quirk_holder var/datum/species/species = H.dna.species species.disliked_food |= PINEAPPLE -/datum/trait/pineapple_hater/remove() - var/mob/living/carbon/human/H = trait_holder +/datum/quirk/pineapple_hater/remove() + var/mob/living/carbon/human/H = quirk_holder var/datum/species/species = H.dna.species species.disliked_food &= ~PINEAPPLE -/datum/trait/deviant_tastes +/datum/quirk/deviant_tastes name = "Deviant Tastes" desc = "You dislike food that most people enjoy, and find delicious what they don't." value = 0 gain_text = "You start craving something that tastes strange." lose_text = "You feel like eating normal food again." -/datum/trait/deviant_tastes/add() - var/mob/living/carbon/human/H = trait_holder +/datum/quirk/deviant_tastes/add() + var/mob/living/carbon/human/H = quirk_holder var/datum/species/species = H.dna.species var/liked = species.liked_food species.liked_food = species.disliked_food species.disliked_food = liked -/datum/trait/deviant_tastes/remove() - var/mob/living/carbon/human/H = trait_holder +/datum/quirk/deviant_tastes/remove() + var/mob/living/carbon/human/H = quirk_holder var/datum/species/species = H.dna.species species.liked_food = initial(species.liked_food) species.disliked_food = initial(species.disliked_food) -/datum/trait/monochromatic +/datum/quirk/monochromatic name = "Monochromacy" desc = "You suffer from full colorblindness, and perceive nearly the entire world in blacks and whites." value = 0 medical_record_text = "Patient is afflicted with almost complete color blindness." -/datum/trait/monochromatic/add() - trait_holder.add_client_colour(/datum/client_colour/monochrome) +/datum/quirk/monochromatic/add() + quirk_holder.add_client_colour(/datum/client_colour/monochrome) -/datum/trait/monochromatic/post_add() - if(trait_holder.mind.assigned_role == "Detective") - to_chat(trait_holder, "Mmm. Nothing's ever clear on this station. It's all shades of gray...") - trait_holder.playsound_local(trait_holder, 'sound/ambience/ambidet1.ogg', 50, FALSE) +/datum/quirk/monochromatic/post_add() + if(quirk_holder.mind.assigned_role == "Detective") + to_chat(quirk_holder, "Mmm. Nothing's ever clear on this station. It's all shades of gray...") + quirk_holder.playsound_local(quirk_holder, 'sound/ambience/ambidet1.ogg', 50, FALSE) -/datum/trait/monochromatic/remove() - trait_holder.remove_client_colour(/datum/client_colour/monochrome) +/datum/quirk/monochromatic/remove() + quirk_holder.remove_client_colour(/datum/client_colour/monochrome) diff --git a/code/datums/weather/weather_types/floor_is_lava.dm b/code/datums/weather/weather_types/floor_is_lava.dm index 5db27b9f6e..00ecfff0b3 100644 --- a/code/datums/weather/weather_types/floor_is_lava.dm +++ b/code/datums/weather/weather_types/floor_is_lava.dm @@ -25,8 +25,10 @@ /datum/weather/floor_is_lava/weather_act(mob/living/L) if(issilicon(L)) return + if(istype(L.buckled, /obj/structure/bed)) + return for(var/obj/structure/O in L.loc) - if(O.density || (L in O.buckled_mobs && istype(O, /obj/structure/bed))) + if(O.density) return if(L.loc.density) return diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index 9fcec7cc11..ec00351b52 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -164,9 +164,16 @@ .["security_level"] = get_security_level() .["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 // Amount of world's ticks in seconds, useful for calculating round duration + + //Time dilation stats. + .["time_dilation_current"] = SStime_track.time_dilation_current + .["time_dilation_avg"] = SStime_track.time_dilation_avg + .["time_dilation_avg_slow"] = SStime_track.time_dilation_avg_slow + .["time_dilation_avg_fast"] = SStime_track.time_dilation_avg_fast if(SSshuttle && SSshuttle.emergency) .["shuttle_mode"] = SSshuttle.emergency.mode // Shuttle status, see /__DEFINES/stat.dm .["shuttle_timer"] = SSshuttle.emergency.timeLeft() // Shuttle timer, in seconds + diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 87894dd4d7..85a0fd1d4e 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -7,6 +7,7 @@ icon = 'icons/turf/areas.dmi' icon_state = "unknown" layer = AREA_LAYER + plane = BLACKNESS_PLANE //Keeping this on the default plane, GAME_PLANE, will make area overlays fail to render on FLOOR_PLANE. mouse_opacity = MOUSE_OPACITY_TRANSPARENT invisibility = INVISIBILITY_LIGHTING @@ -518,4 +519,4 @@ GLOBAL_LIST_EMPTY(teleportlocs) // A hook so areas can modify the incoming args /area/proc/PlaceOnTopReact(list/new_baseturfs, turf/fake_turf_type, flags) - return flags \ No newline at end of file + return flags diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 253f18f717..a09db0a3cc 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/device.dmi' icon_state = "ai-slipper0" layer = PROJECTILE_HIT_THRESHHOLD_LAYER + plane = FLOOR_PLANE anchored = TRUE max_integrity = 200 armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index a399e4f291..ac211efe58 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -126,7 +126,7 @@ return examine(user) //Start growing a human clone in the pod! -/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, se, mindref, datum/species/mrace, list/features, factions, list/traits) +/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, se, mindref, datum/species/mrace, list/features, factions, list/quirks) if(panel_open) return FALSE if(mess || attempting) @@ -203,7 +203,7 @@ if(H) H.faction |= factions - for(var/V in traits) + for(var/V in quirks) new V(H) H.set_cloned_appearance() diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index e90f69bf23..b58fb7ee34 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -291,6 +291,7 @@ /obj/machinery/computer/arcade/battle/emag_act(mob/user) if(obj_flags & EMAGGED) return + to_chat(user, "A mesmerizing Rhumba beat starts playing from the arcade machine's speakers!") temp = "If you die in the game, you die for real!" player_hp = 30 player_mp = 10 @@ -614,7 +615,7 @@ L.Stun(200, ignore_canstun = TRUE) //you can't run :^) var/S = new /obj/singularity/academy(usr.loc) addtimer(CALLBACK(src, /atom/movable/proc/say, "[S] winks out, just as suddenly as it appeared."), 50) - QDEL_IN(src, 50) + QDEL_IN(S, 50) else event = null turns += 1 diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index b43ffdfec8..95b4ea9f80 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -71,7 +71,7 @@ if(pod.occupant) continue //how though? - if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["traits"])) + if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"])) temp = "[R.fields["name"]] => Cloning cycle in progress..." records -= R @@ -400,7 +400,7 @@ else if(pod.occupant) temp = "Cloning cycle already in progress." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["traits"])) + else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"])) temp = "[C.fields["name"]] => Cloning cycle in progress..." playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) records.Remove(C) @@ -473,10 +473,10 @@ R.fields["blood_type"] = dna.blood_type R.fields["features"] = dna.features R.fields["factions"] = mob_occupant.faction - R.fields["traits"] = list() - for(var/V in mob_occupant.roundstart_traits) - var/datum/trait/T = V - R.fields["traits"] += T.type + R.fields["quirks"] = list() + for(var/V in mob_occupant.roundstart_quirks) + var/datum/quirk/T = V + R.fields["quirks"] += T.type if (!isnull(mob_occupant.mind)) //Save that mind so traitors can continue traitoring after cloning. R.fields["mind"] = "[REF(mob_occupant.mind)]" diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 978f7adcf0..93b997eee6 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -174,25 +174,26 @@ else var/list/S = power_station.linked_stations - if(!S.len) - to_chat(user, "No connected stations located.") - return for(var/obj/machinery/teleport/station/R in S) - if(is_eligible(R)) + if(is_eligible(R) && R.teleporter_hub) var/area/A = get_area(R) L[avoid_assoc_duplicate_keys(A.name, areaindex)] = R + if(!L.len) + to_chat(user, "No active connected stations located.") + return var/desc = input("Please select a station to lock in.", "Locking Computer") as null|anything in L - target = L[desc] - if(target) - var/obj/machinery/teleport/station/trg = target - trg.linked_stations |= power_station - trg.stat &= ~NOPOWER - if(trg.teleporter_hub) - trg.teleporter_hub.stat &= ~NOPOWER - trg.teleporter_hub.update_icon() - if(trg.teleporter_console) - trg.teleporter_console.stat &= ~NOPOWER - trg.teleporter_console.update_icon() + var/obj/machinery/teleport/station/target_station = L[desc] + if(!target_station || !target_station.teleporter_hub) + return + target = target_station.teleporter_hub + target_station.linked_stations |= power_station + target_station.stat &= ~NOPOWER + if(target_station.teleporter_hub) + target_station.teleporter_hub.stat &= ~NOPOWER + target_station.teleporter_hub.update_icon() + if(target_station.teleporter_console) + target_station.teleporter_console.stat &= ~NOPOWER + target_station.teleporter_console.update_icon() /obj/machinery/computer/teleporter/proc/is_eligible(atom/movable/AM) var/turf/T = get_turf(AM) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 1635b448f4..3f26e7d80d 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -355,8 +355,7 @@ return user.visible_message("[user] removes the wires from [src].", \ "You remove the wiring from [src], exposing the circuit board.") - var/obj/item/stack/cable_coil/B = new(get_turf(src)) - B.amount = 5 + new/obj/item/stack/cable_coil(get_turf(src), 5) constructionStep = CONSTRUCTION_GUTTED update_icon() return diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index ab2694769f..61ee4eb178 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -32,6 +32,7 @@ Possible to do for anyone motivated enough: desc = "It's a floor-mounted device for projecting holographic images." icon_state = "holopad0" layer = LOW_OBJ_LAYER + plane = FLOOR_PLANE flags_1 = HEAR_1 anchored = TRUE use_power = IDLE_POWER_USE @@ -66,7 +67,7 @@ Possible to do for anyone motivated enough: flags_1 = NODECONSTRUCT_1 on_network = FALSE var/proximity_range = 1 - + /obj/machinery/holopad/tutorial/Initialize(mapload) . = ..() if(proximity_range) @@ -86,7 +87,7 @@ Possible to do for anyone motivated enough: replay_stop() else if(disk && disk.record) replay_start() - + /obj/machinery/holopad/tutorial/HasProximity(atom/movable/AM) if (!isliving(AM)) return @@ -487,7 +488,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(QDELETED(user) || user.incapacitated() || !user.client) return FALSE return TRUE - + //Can we display holos there //Area check instead of line of sight check because this is a called a lot if AI wants to move around. /obj/machinery/holopad/proc/validate_location(turf/T,check_los = FALSE) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 79954693c3..f6182fdae0 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -3,6 +3,7 @@ desc = "It's useful for igniting plasma." icon = 'icons/obj/stationobjs.dmi' icon_state = "igniter0" + plane = FLOOR_PLANE var/id = null var/on = FALSE anchored = TRUE @@ -12,7 +13,7 @@ max_integrity = 300 armor = list("melee" = 50, "bullet" = 30, "laser" = 70, "energy" = 50, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) resistance_flags = FIRE_PROOF - + /obj/machinery/igniter/on on = TRUE icon_state = "igniter1" diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 7d7d010b2c..be5b404edc 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -5,7 +5,7 @@ name = "ominous beacon" desc = "This looks suspicious..." icon = 'icons/obj/singularity.dmi' - icon_state = "beacon" + icon_state = "beacon0" anchored = FALSE density = TRUE diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 7b66a57f59..cef200173c 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -47,7 +47,6 @@ return if(is_ready()) teleport(AM) - use_power(5000) /obj/machinery/teleport/hub/attackby(obj/item/W, mob/user, params) if(default_deconstruction_screwdriver(user, "tele-o", "tele0", W)) @@ -61,13 +60,15 @@ /obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj, turf/T) var/obj/machinery/computer/teleporter/com = power_station.teleporter_console - if (!com) + if (QDELETED(com)) return - if (!com.target) + if (QDELETED(com.target)) + com.target = null visible_message("Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.") return if (ismovableatom(M)) if(do_teleport(M, com.target)) + use_power(5000) if(!calibrated && prob(30 - ((accurate) * 10))) //oh dear a problem if(ishuman(M))//don't remove people from the round randomly you jerks var/mob/living/carbon/human/human = M diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index cdb12eaf5c..ab906f1bfa 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -65,8 +65,7 @@ return /obj/item/stack/sheet/hairlesshide/machine_wash(obj/machinery/washing_machine/WM) - var/obj/item/stack/sheet/wetleather/WL = new(loc) - WL.amount = amount + new /obj/item/stack/sheet/wetleather(drop_location(), amount) qdel(src) /obj/item/clothing/suit/hooded/ian_costume/machine_wash(obj/machinery/washing_machine/WM) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 980b7170c1..0d1651c491 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -367,8 +367,7 @@ return ..() /obj/item/mecha_parts/mecha_equipment/generator/proc/generator_init() - fuel = new /obj/item/stack/sheet/mineral/plasma(src) - fuel.amount = 0 + fuel = new /obj/item/stack/sheet/mineral/plasma(src, 0) /obj/item/mecha_parts/mecha_equipment/generator/detach() STOP_PROCESSING(SSobj, src) @@ -472,8 +471,7 @@ var/rad_per_cycle = 3 /obj/item/mecha_parts/mecha_equipment/generator/nuclear/generator_init() - fuel = new /obj/item/stack/sheet/mineral/uranium(src) - fuel.amount = 0 + fuel = new /obj/item/stack/sheet/mineral/uranium(src, 0) /obj/item/mecha_parts/mecha_equipment/generator/nuclear/critfail() return diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 2054a6ba9a..96adece298 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -301,8 +301,7 @@ /obj/item/mecha_parts/mecha_equipment/cable_layer/Initialize() . = ..() - cable = new(src) - cable.amount = 0 + cable = new(src, 0) /obj/item/mecha_parts/mecha_equipment/cable_layer/can_attach(obj/mecha/working/M) if(..()) @@ -333,8 +332,7 @@ if(to_load) to_load = min(target.amount, to_load) if(!cable) - cable = new(src) - cable.amount = 0 + cable = new(src, 0) cable.amount += to_load target.use(to_load) occupant_message("[to_load] meters of cable successfully loaded.") @@ -358,8 +356,7 @@ m = min(m, cable.amount) if(m) use_cable(m) - var/obj/item/stack/cable_coil/CC = new (get_turf(chassis)) - CC.amount = m + new /obj/item/stack/cable_coil(get_turf(chassis), m) else occupant_message("There's no more cable on the reel.") return diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 616cd27a2d..b00212b0de 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -812,16 +812,18 @@ to_chat(usr, "The [name] is already occupied!") log_append_to_last("Permission denied.") return - var/passed if(dna_lock) + var/passed = FALSE if(user.has_dna()) var/mob/living/carbon/C = user if(C.dna.unique_enzymes==dna_lock) - passed = 1 - else if(operation_allowed(user)) - passed = 1 - if(!passed) - to_chat(user, "Access denied.") + passed = TRUE + if (!passed) + to_chat(user, "Access denied. [name] is secured with a DNA lock.") + log_append_to_last("Permission denied.") + return + if(!operation_allowed(user)) + to_chat(user, "Access denied. Insufficient operation keycodes.") log_append_to_last("Permission denied.") return if(user.buckled) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 429d954451..21ecc26905 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -31,8 +31,6 @@ ore.forceMove(ore_box) /obj/mecha/working/ripley/Destroy() - for(var/i=1, i <= hides, i++) - new /obj/item/stack/sheet/animalhide/goliath_hide(loc) //If a goliath-plated ripley gets killed, all the plates drop for(var/atom/movable/A in cargo) A.forceMove(drop_location()) step_rand(A) @@ -49,13 +47,18 @@ /obj/mecha/working/ripley/update_icon() ..() - if (hides) + GET_COMPONENT(C,/datum/component/armor_plate) + if (C.amount) cut_overlays() - if(hides < 3) + if(C.amount < 3) add_overlay(occupant ? "ripley-g" : "ripley-g-open") else add_overlay(occupant ? "ripley-g-full" : "ripley-g-full-open") +/obj/mecha/working/ripley/Initialize() + . = ..() + AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list("melee" = 10, "bullet" = 5, "laser" = 5)) + /obj/mecha/working/ripley/firefighter desc = "Autonomous Power Loader Unit. This model is refitted with additional thermal protection." diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index b3cb0ff9c4..035fc845c4 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -8,7 +8,7 @@ anchored = TRUE light_range = 3 var/movechance = 70 - var/obj/item/assembly/signaler/anomaly/aSignal = null + var/obj/item/assembly/signaler/anomaly/aSignal var/area/impact_area var/lifespan = 990 @@ -26,10 +26,12 @@ aSignal = new(src) aSignal.name = "[name] core" aSignal.code = rand(1,100) + aSignal.anomaly_type = type - aSignal.frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ) - if(ISMULTIPLE(aSignal.frequency, 2))//signaller frequencies are always uneven! - aSignal.frequency++ + var/frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ) + if(ISMULTIPLE(frequency, 2))//signaller frequencies are always uneven! + frequency++ + aSignal.set_frequency(frequency) if(new_lifespan) lifespan = new_lifespan diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 0794b818da..43ee2991e0 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -1,7 +1,7 @@ /obj/effect/decal/cleanable gender = PLURAL layer = ABOVE_NORMAL_TURF_LAYER - var/list/random_icon_states = list() + var/list/random_icon_states = null var/blood_state = "" //I'm sorry but cleanable/blood code is ass, and so is blood_DNA var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints var/mergeable_decal = TRUE //when two of these are on a same tile or do we need to merge them into just one? diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index d26dbb72e7..eec91657a9 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -1,5 +1,6 @@ /obj/effect/decal name = "decal" + plane = FLOOR_PLANE anchored = TRUE resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF var/turf_loc_check = TRUE diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index add653238e..ef074f4cec 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -27,11 +27,11 @@ ///////////Mimewalls/////////// /obj/effect/forcefield/mime - icon_state = "empty" + icon_state = "nothing" name = "invisible wall" desc = "You have a bad feeling about this." /obj/effect/forcefield/mime/advanced name = "invisible blockade" - desc = "You're goona be here a while." - timeleft = 600 \ No newline at end of file + desc = "You're gonna be here awhile." + timeleft = 600 diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 0bf7edbd7b..bd4237a9db 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -5,7 +5,7 @@ var/lootcount = 1 //how many items will be spawned var/lootdoubles = TRUE //if the same item can be spawned twice var/list/loot //a list of possible items to spawn e.g. list(/obj/item, /obj/structure, /obj/effect) - var/fan_out_items = FALSE //Whether the items should be distributed to offsets 0,3,-3,6,-6,9,-9.. This overrides pixel_x/y on the spawner itself + var/fan_out_items = FALSE //Whether the items should be distributed to offsets 0,1,-1,2,-2,3,-3.. This overrides pixel_x/y on the spawner itself /obj/effect/spawner/lootdrop/Initialize(mapload) ..() @@ -26,7 +26,7 @@ spawned_loot.pixel_y = pixel_y else if (loot_spawned) - spawned_loot.pixel_x = spawned_loot.pixel_y = ((!(loot_spawned%2)*loot_spawned/2)*-3)+((loot_spawned%2)*(loot_spawned+1)/2*3) + spawned_loot.pixel_x = spawned_loot.pixel_y = ((!(loot_spawned%2)*loot_spawned/2)*-1)+((loot_spawned%2)*(loot_spawned+1)/2*1) loot_spawned++ return INITIALIZE_HINT_QDEL @@ -206,3 +206,115 @@ /obj/item/aiModule/core/full/thermurderdynamic, /obj/item/aiModule/core/full/damaged ) + +// Tech storage circuit board spawners +// For these, make sure that lootcount equals the number of list items + +/obj/effect/spawner/lootdrop/techstorage + name = "generic circuit board spawner" + lootdoubles = FALSE + fan_out_items = TRUE + +/obj/effect/spawner/lootdrop/techstorage/service + name = "service circuit board spawner" + lootcount = 10 + loot = list( + /obj/item/circuitboard/computer/arcade/battle, + /obj/item/circuitboard/computer/arcade/orion_trail, + /obj/item/circuitboard/machine/autolathe, + /obj/item/circuitboard/computer/mining, + /obj/item/circuitboard/machine/ore_redemption, + /obj/item/circuitboard/machine/mining_equipment_vendor, + /obj/item/circuitboard/machine/microwave, + /obj/item/circuitboard/machine/chem_dispenser/drinks, + /obj/item/circuitboard/machine/chem_dispenser/drinks/beer, + /obj/item/circuitboard/computer/slot_machine + ) + +/obj/effect/spawner/lootdrop/techstorage/rnd + name = "RnD circuit board spawner" + lootcount = 8 + loot = list( + /obj/item/circuitboard/computer/aifixer, + /obj/item/circuitboard/machine/rdserver, + /obj/item/circuitboard/computer/pandemic, + /obj/item/circuitboard/machine/mechfab, + /obj/item/circuitboard/machine/circuit_imprinter/department, + /obj/item/circuitboard/computer/teleporter, + /obj/item/circuitboard/machine/destructive_analyzer, + /obj/item/circuitboard/computer/rdconsole + ) + +/obj/effect/spawner/lootdrop/techstorage/security + name = "security circuit board spawner" + lootcount = 3 + loot = list( + /obj/item/circuitboard/computer/secure_data, + /obj/item/circuitboard/computer/security, + /obj/item/circuitboard/computer/prisoner + ) + +/obj/effect/spawner/lootdrop/techstorage/engineering + name = "engineering circuit board spawner" + lootcount = 3 + loot = list( + /obj/item/circuitboard/computer/atmos_alert, + /obj/item/circuitboard/computer/stationalert, + /obj/item/circuitboard/computer/powermonitor + ) + +/obj/effect/spawner/lootdrop/techstorage/tcomms + name = "tcomms circuit board spawner" + lootcount = 9 + loot = list( + /obj/item/circuitboard/computer/message_monitor, + /obj/item/circuitboard/machine/telecomms/broadcaster, + /obj/item/circuitboard/machine/telecomms/bus, + /obj/item/circuitboard/machine/telecomms/server, + /obj/item/circuitboard/machine/telecomms/receiver, + /obj/item/circuitboard/machine/telecomms/processor, + /obj/item/circuitboard/machine/announcement_system, + /obj/item/circuitboard/computer/comm_server, + /obj/item/circuitboard/computer/comm_monitor + ) + +/obj/effect/spawner/lootdrop/techstorage/medical + name = "medical circuit board spawner" + lootcount = 8 + loot = list( + /obj/item/circuitboard/computer/cloning, + /obj/item/circuitboard/machine/clonepod, + /obj/item/circuitboard/machine/chem_dispenser, + /obj/item/circuitboard/computer/scan_consolenew, + /obj/item/circuitboard/computer/med_data, + /obj/item/circuitboard/machine/smoke_machine, + /obj/item/circuitboard/machine/chem_master, + /obj/item/circuitboard/machine/clonescanner + ) + +/obj/effect/spawner/lootdrop/techstorage/AI + name = "secure AI circuit board spawner" + lootcount = 3 + loot = list( + /obj/item/circuitboard/computer/aiupload, + /obj/item/circuitboard/computer/borgupload, + /obj/item/circuitboard/aicore + ) + +/obj/effect/spawner/lootdrop/techstorage/command + name = "secure command circuit board spawner" + lootcount = 3 + loot = list( + /obj/item/circuitboard/computer/crew, + /obj/item/circuitboard/computer/communications, + /obj/item/circuitboard/computer/card + ) + +/obj/effect/spawner/lootdrop/techstorage/RnD_secure + name = "secure RnD circuit board spawner" + lootcount = 3 + loot = list( + /obj/item/circuitboard/computer/mecha_control, + /obj/item/circuitboard/computer/apc_control, + /obj/item/circuitboard/computer/robotics + ) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4e298032db..e5335049ec 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -766,3 +766,18 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) // Returns a numeric value for sorting items used as parts in machines, so they can be replaced by the rped /obj/item/proc/get_part_rating() return 0 + +/obj/item/doMove(atom/destination) + if (ismob(loc)) + var/mob/M = loc + var/hand_index = M.get_held_index_of_item(src) + if(hand_index) + M.held_items[hand_index] = null + M.update_inv_hands() + if(M.client) + M.client.screen -= src + layer = initial(layer) + plane = initial(plane) + appearance_flags &= ~NO_CLIENT_COLOR + dropped(M) + return ..() diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index b005d0dd64..2c977e9d09 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( return "makepipe=[id]&type=[dirtype]" /datum/pipe_info/meter - icon_state = "meterX" + icon_state = "meter" dirtype = PIPE_ONEDIR /datum/pipe_info/meter/New(label) @@ -228,7 +228,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - var/datum/asset/assets = get_asset_datum(/datum/asset/simple/icon_states/multiple_icons/pipes) + var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/pipes) assets.send(user) ui = new(user, src, ui_key, "rpd", name, 300, 550, master_ui, state) diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index 5048f6ed2d..87b90d5b8f 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -104,8 +104,7 @@ to_chat(user, "There is another network terminal here!") return else - var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(T) - C.amount = 10 + new /obj/item/stack/cable_coil(T, 10) to_chat(user, "You cut the cables and disassemble the unused power terminal.") qdel(E) return TRUE diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 43c12d451e..c263a7652c 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -204,7 +204,7 @@ /obj/item/circuitboard/machine/vendor name = "Booze-O-Mat Vendor (Machine Board)" - desc = "You could turn the \"brand selection\" dial using a screwdriver." + desc = "You can turn the \"brand selection\" dial using a screwdriver." build_path = /obj/machinery/vending/boozeomat req_components = list( /obj/item/vending_refill/boozeomat = 3) @@ -651,6 +651,7 @@ /obj/item/circuitboard/machine/chem_master name = "ChemMaster 3000 (Machine Board)" build_path = /obj/machinery/chem_master + desc = "You can turn the \"mode selection\" dial using a screwdriver." req_components = list( /obj/item/reagent_containers/glass/beaker = 2, /obj/item/stock_parts/manipulator = 1, diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 9b615b68b5..fa5748c1d9 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -118,6 +118,7 @@ /obj/item/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user) M.SendSignal(COMSIG_ADD_MOOD_EVENT, "honk", /datum/mood_event/honk) + return ..() /obj/item/bikehorn/suicide_act(mob/user) user.visible_message("[user] solemnly points the horn at [user.p_their()] temple! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 47d7b1e525..664ceb6e08 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -170,7 +170,6 @@ to_chat(user, "You need a free hand to hold the paddles!") update_icon() return - paddles.forceMove(user) else //Remove from their hands and back onto the defib unit paddles.unwield() @@ -276,8 +275,8 @@ name = "defibrillator paddles" desc = "A pair of plastic-gripped paddles with flat metal surfaces that are used to deliver powerful electric shocks." icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "defibpaddles" - item_state = "defibpaddles" + icon_state = "defibpaddles0" + item_state = "defibpaddles0" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index d2324aa56c..08ae20c792 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -178,20 +178,20 @@ GLOBAL_LIST_EMPTY(PDAs) . = ..() - var/datum/asset/assets = get_asset_datum(/datum/asset/simple/pda) + var/datum/asset/spritesheet/assets = get_asset_datum(/datum/asset/spritesheet/simple/pda) assets.send(user) user.set_machine(src) var/dat = "Personal Data Assistant" + dat += assets.css_tag() - - dat += "Refresh" + dat += "[PDAIMG(refresh)]Refresh" if ((!isnull(cartridge)) && (mode == 0)) - dat += " | Eject [cartridge]" + dat += " | [PDAIMG(eject)]Eject [cartridge]" if (mode) - dat += " | Return" + dat += " | [PDAIMG(menu)]Return" if (mode == 0) dat += "
" @@ -205,7 +205,7 @@ GLOBAL_LIST_EMPTY(PDAs) if (!owner) dat += "Warning: No owner information entered. Please swipe card.

" - dat += "Retry" + dat += "[PDAIMG(refresh)]Retry" else switch (mode) if (0) @@ -221,38 +221,38 @@ GLOBAL_LIST_EMPTY(PDAs) dat += "

General Functions

" dat += "" if (cartridge.access & CART_ENGINE) dat += "

Engineering Functions

" dat += "" if (cartridge.access & CART_MEDICAL) dat += "

Medical Functions

" dat += "" if (cartridge.access & CART_SECURITY) dat += "

Security Functions

" dat += "" if(cartridge.access & CART_QUARTERMASTER) dat += "

Quartermaster Functions:

" dat += "" dat += "" @@ -260,25 +260,25 @@ GLOBAL_LIST_EMPTY(PDAs) dat += "" if (1) - dat += "

Notekeeper V2.2

" + dat += "

[PDAIMG(notes)] Notekeeper V2.2

" dat += "Edit
" if(notescanned) dat += "(This is a scanned image, editing it may cause some text formatting to change.)
" dat += "
[(!notehtml ? note : notehtml)]" if (2) - dat += "

SpaceMessenger V3.9.6

" - dat += "Ringer: [silent == 1 ? "Off" : "On"] | " - dat += "Send / Receive: [toff == 1 ? "Off" : "On"] | " - dat += "Set Ringtone | " - dat += "Messages
" + dat += "

[PDAIMG(mail)] SpaceMessenger V3.9.6

" + dat += "[PDAIMG(bell)]Ringer: [silent == 1 ? "Off" : "On"] | " + dat += "[PDAIMG(mail)]Send / Receive: [toff == 1 ? "Off" : "On"] | " + dat += "[PDAIMG(bell)]Set Ringtone | " + dat += "[PDAIMG(mail)]Messages
" if(cartridge) dat += cartridge.message_header() - dat += "

Detected PDAs

" + dat += "

[PDAIMG(menu)] Detected PDAs

" dat += "
    " var/count = 0 @@ -326,16 +326,16 @@ GLOBAL_LIST_EMPTY(PDAs) dat += "Send To All" if(21) - dat += "

    SpaceMessenger V3.9.6

    " - dat += "Clear Messages" + dat += "

    [PDAIMG(mail)] SpaceMessenger V3.9.6

    " + dat += "[PDAIMG(blank)]Clear Messages" - dat += "

    Messages

    " + dat += "

    [PDAIMG(mail)] Messages

    " dat += tnote dat += "
    " if (3) - dat += "

    Atmospheric Readings

    " + dat += "

    [PDAIMG(atmos)] Atmospheric Readings

    " var/turf/T = user.loc if (isnull(T)) @@ -617,7 +617,8 @@ GLOBAL_LIST_EMPTY(PDAs) return if((last_text && world.time < last_text + 10) || (everyone && last_everyone && world.time < last_everyone + PDA_SPAM_DELAY)) return - + if(prob(1)) + message += "\nSent from my PDA" // Send the signal var/list/string_targets = list() for (var/obj/item/pda/P in targets) @@ -1017,4 +1018,4 @@ GLOBAL_LIST_EMPTY(PDAs) #undef PDA_SCANNER_REAGENT #undef PDA_SCANNER_HALOGEN #undef PDA_SCANNER_GAS -#undef PDA_SPAM_DELAY \ No newline at end of file +#undef PDA_SPAM_DELAY diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index c1cc5d69a3..089286efda 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -21,7 +21,7 @@ // Special AI/pAI PDAs that cannot explode. /obj/item/pda/ai - icon_state = "NONE" + icon = null ttone = "data" fon = FALSE detonatable = FALSE diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 2737f24cbe..e92eb6e617 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -207,13 +207,12 @@ frequency.post_signal(src, status_signal) - /obj/item/cartridge/proc/generate_menu(mob/user) if(!host_pda) return switch(host_pda.mode) if(40) //signaller - menu = "

    Remote Signaling System

    " + menu = "

    [PDAIMG(signaler)] Remote Signaling System

    " menu += {" Send Signal
    @@ -232,7 +231,7 @@ Code: +
    "} if (41) //crew manifest - menu = "

    Crew Manifest

    " + menu = "

    [PDAIMG(notes)] Crew Manifest

    " menu += "Entries cannot be modified from this terminal.

    " if(GLOB.data_core.general) for (var/datum/data/record/t in sortRecord(GLOB.data_core.general)) @@ -241,7 +240,7 @@ Code: if (42) //status displays - menu = "

    Station Status Display Interlink

    " + menu = "

    [PDAIMG(status)] Station Status Display Interlink

    " menu += "\[ Clear \]
    " menu += "\[ Shuttle ETA \]
    " @@ -254,7 +253,7 @@ Code: menu += " Biohazard \]
    " if (43) - menu = "

    Power Monitors - Please select one


    " + menu = "

    [PDAIMG(power)] Power Monitors - Please select one


    " powmonitor = null powermonitors = list() var/powercount = 0 @@ -280,7 +279,7 @@ Code: menu += "" if (433) - menu = "

    Power Monitor


    " + menu = "

    [PDAIMG(power)] Power Monitor


    " if(!powmonitor) menu += "No connection
    " else @@ -307,13 +306,13 @@ Code: menu += "" if (44) //medical records //This thing only displays a single screen so it's hard to really get the sub-menu stuff working. - menu = "

    Medical Record List

    " + menu = "

    [PDAIMG(medical)] Medical Record List

    " if(GLOB.data_core.general) for(var/datum/data/record/R in sortRecord(GLOB.data_core.general)) menu += "[R.fields["id"]]: [R.fields["name"]]
    " menu += "
    " if(441) - menu = "

    Medical Record

    " + menu = "

    [PDAIMG(medical)] Medical Record

    " if(active1 in GLOB.data_core.general) menu += "Name: [active1.fields["name"]] ID: [active1.fields["id"]]
    " @@ -328,7 +327,7 @@ Code: menu += "
    " - menu += "

    Medical Data

    " + menu += "

    [PDAIMG(medical)] Medical Data

    " if(active2 in GLOB.data_core.medical) menu += "Blood Type: [active2.fields["blood_type"]]

    " @@ -350,14 +349,14 @@ Code: menu += "
    " if (45) //security records - menu = "

    Security Record List

    " + menu = "

    [PDAIMG(cuffs)] Security Record List

    " if(GLOB.data_core.general) for (var/datum/data/record/R in sortRecord(GLOB.data_core.general)) menu += "
    [R.fields["id"]]: [R.fields["name"]]
    " menu += "
    " if(451) - menu = "

    Security Record

    " + menu = "

    [PDAIMG(cuffs)] Security Record

    " if(active1 in GLOB.data_core.general) menu += "Name: [active1.fields["name"]] ID: [active1.fields["id"]]
    " @@ -372,7 +371,7 @@ Code: menu += "
    " - menu += "

    Security Data

    " + menu += "

    [PDAIMG(cuffs)] Security Data

    " if(active3 in GLOB.data_core.security) menu += "Criminal Status: [active3.fields["criminal"]]
    " @@ -418,7 +417,7 @@ Code: menu += "
    " if (47) //quartermaster order records - menu = "

    Supply Record Interlink

    " + menu = "

    [PDAIMG(crate)] Supply Record Interlink

    " menu += "
    Supply shuttle
    " menu += "Location: " @@ -449,7 +448,7 @@ Code: menu += "Upgrade NOW to Space Parts & Space Vendors PLUS for full remote order control and inventory management." if (49) //janitorial locator - menu = "

    Persistent Custodial Object Locator

    " + menu = "

    [PDAIMG(bucket)] Persistent Custodial Object Locator

    " var/turf/cl = get_turf(src) if (cl) @@ -511,7 +510,7 @@ Code: menu += "

    Refresh GPS Locator" if (53) // Newscaster - menu = "

    Newscaster Access

    " + menu = "

    [PDAIMG(notes)] Newscaster Access

    " menu += "
    Current Newsfeed: [current_channel ? current_channel : "None"]
    " var/datum/newscaster/feed_channel/current for(var/datum/newscaster/feed_channel/chan in GLOB.news_network.network_channels) @@ -533,7 +532,7 @@ Code: menu += "
    Post Message" if (54) // Beepsky, Medibot, Floorbot, and Cleanbot access - menu = "

    Bots Interlink

    " + menu = "

    [PDAIMG(medbot)] Bots Interlink

    " bot_control() if (99) //Newscaster message permission error menu = "
    ERROR : NOT AUTHORIZED [host_pda.id ? "" : "- ID SLOT EMPTY"]
    " @@ -652,7 +651,7 @@ Code: var/mob/living/simple_animal/bot/Bot if(active_bot) - menu += "[active_bot]
    Status: (refresh)
    " + menu += "[active_bot]
    Status: ([PDAIMG(refresh)]refresh)
    " menu += "Model: [active_bot.model]
    " menu += "Location: [get_area(active_bot)]
    " menu += "Mode: [active_bot.get_mode()]" @@ -688,9 +687,9 @@ Code: menu += "\[Summon Bot\]
    " //summon menu += "Keep an ID inserted to upload access codes upon summoning." - menu += "
    Return to bot list" + menu += "
    [PDAIMG(back)]Return to bot list" else - menu += "
    Scan for active bots

    " + menu += "
    [PDAIMG(refresh)]Scan for active bots

    " var/turf/current_turf = get_turf(src) var/zlevel = current_turf.z var/botcount = 0 diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index b574d0c622..f174e833ae 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -174,7 +174,7 @@ GAS ANALYZER trauma_desc += B.scan_desc trauma_text += trauma_desc to_chat(user, "\tCerebral traumas detected: subjects appears to be suffering from [english_list(trauma_text)].") - if(C.roundstart_traits.len) + if(C.roundstart_quirks.len) to_chat(user, "\tSubject has the following physiological traits: [C.get_trait_string()].") if(advanced) to_chat(user, "\tBrain Activity Level: [(200 - M.getBrainLoss())/2]%.") diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index a6d0d285bf..514b2a5b55 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -87,7 +87,7 @@ return FALSE var/turf/there = get_turf(H) - return (H.z != 0 || (there && there.z == H.z)) + return (H.z != 0 || (there && there.z == here.z)) return FALSE diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index dd8d8f8a10..367a10d21f 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -45,6 +45,11 @@ lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' +/obj/item/shield/riot/roman/fake + desc = "Bears an inscription on the inside: \"Romanes venio domus\". It appears to be a bit flimsy." + block_chance = 0 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + /obj/item/shield/riot/buckler name = "wooden buckler" desc = "A medieval wooden buckler." diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 511f9754fe..bee37d1ff9 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -127,6 +127,18 @@ self_delay = 20 max_amount = 12 +/obj/item/stack/medical/gauze/wirecutter_act(mob/living/user, obj/item/I) + if(get_amount() < 2) + to_chat(user, "You need at least two gauze to do this!") + return + new /obj/item/stack/sheet/cloth(user.drop_location()) + user.visible_message("[user] cuts [src] into pieces of cloth with [I].", \ + "You cut [src] into pieces of cloth with [I].", \ + "You hear cutting.") + var/obj/item/stack/medical/gauze/R = src + src = null + R.use(2) + /obj/item/stack/medical/gauze/suicide_act(mob/living/user) user.visible_message("[user] begins tightening \the [src] around [user.p_their()] neck! It looks like [user.p_they()] forgot how to use medical supplies!") return OXYLOSS @@ -155,5 +167,5 @@ grind_results = list("silver_sulfadiazine" = 10) /obj/item/stack/medical/ointment/suicide_act(mob/living/user) - user.visible_message("[user] is squeezing \the [src] into [user.p_their()] mouth! Don't they know that stuff is toxic?") - return TOXLOSS \ No newline at end of file + user.visible_message("[user] is squeezing \the [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic?") + return TOXLOSS diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 9d32504c19..3264deae88 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -82,7 +82,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ singular_name = "plasma glass sheet" icon_state = "sheet-pglass" item_state = "sheet-pglass" - materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT) + materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmaglass @@ -133,7 +133,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ singular_name = "reinforced glass sheet" icon_state = "sheet-rglass" item_state = "sheet-rglass" - materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT) + materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/rglass @@ -175,7 +175,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ singular_name = "reinforced plasma glass sheet" icon_state = "sheet-prglass" item_state = "sheet-prglass" - materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT) + materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT, MAT_METAL = MINERAL_MATERIAL_AMOUNT * 0.5,) armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmarglass @@ -195,7 +195,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( singular_name = "titanium glass sheet" icon_state = "sheet-titaniumglass" item_state = "sheet-titaniumglass" - materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_GLASS=MINERAL_MATERIAL_AMOUNT) + materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/titaniumglass @@ -214,7 +214,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( singular_name = "plastitanium glass sheet" icon_state = "sheet-plastitaniumglass" item_state = "sheet-plastitaniumglass" - materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT, MAT_GLASS=MINERAL_MATERIAL_AMOUNT) + materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plastitaniumglass diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index cfccedcc3a..4eae35a98c 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -211,10 +211,9 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ if(W.is_sharp()) playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1) user.visible_message("[user] starts cutting hair off \the [src].", "You start cutting the hair off \the [src]...", "You hear the sound of a knife rubbing against flesh.") - if(do_after(user,50, target = src)) + if(do_after(user, 50, target = src)) to_chat(user, "You cut the hair from this [src.singular_name].") - var/obj/item/stack/sheet/hairlesshide/HS = new(user.loc) - HS.amount = 1 + new /obj/item/stack/sheet/hairlesshide(user.drop_location(), 1) use(1) else return ..() @@ -228,21 +227,11 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ if(exposed_temperature >= drying_threshold_temperature) wetness-- if(wetness == 0) - //Try locating an exisitng stack on the tile and add to there if possible - for(var/obj/item/stack/sheet/leather/HS in src.loc) - if(HS.amount < 50) - HS.amount++ - src.use(1) - wetness = initial(wetness) - break - //If it gets to here it means it did not find a suitable stack on the tile. - var/obj/item/stack/sheet/leather/HS = new(src.loc) - HS.amount = 1 + new /obj/item/stack/sheet/leather(drop_location(), 1) wetness = initial(wetness) - src.use(1) + use(1) /obj/item/stack/sheet/wetleather/microwave_act(obj/machinery/microwave/MW) ..() - var/obj/item/stack/sheet/leather/L = new(loc) - L.amount = amount + new /obj/item/stack/sheet/leather(drop_location(), amount) qdel(src) diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index b4482a72db..b7c2d5b3f9 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -14,13 +14,12 @@ grind_results = list("silicon" = 20, "copper" = 5) /obj/item/stack/light_w/attackby(obj/item/O, mob/user, params) - + var/atom/Tsec = user.drop_location() if(istype(O, /obj/item/wirecutters)) - var/obj/item/stack/cable_coil/CC = new (user.loc) - CC.amount = 5 + var/obj/item/stack/cable_coil/CC = new (Tsec, 5) CC.add_fingerprint(user) amount-- - var/obj/item/stack/sheet/glass/G = new (user.loc) + var/obj/item/stack/sheet/glass/G = new (Tsec) G.add_fingerprint(user) if(amount <= 0) qdel(src) @@ -28,7 +27,6 @@ else if(istype(O, /obj/item/stack/sheet/metal)) var/obj/item/stack/sheet/metal/M = O if (M.use(1)) - use(1) var/obj/item/L = new /obj/item/stack/tile/light(user.loc) to_chat(user, "You make a light tile.") L.add_fingerprint(user) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 6109f6b0d0..df3d5f799b 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -121,6 +121,9 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ /obj/item/stack/sheet/metal/twenty amount = 20 +/obj/item/stack/sheet/metal/ten + amount = 10 + /obj/item/stack/sheet/metal/five amount = 5 @@ -349,6 +352,11 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \ if(!iscultist(user)) to_chat(user, "Only one with forbidden knowledge could hope to work this metal...") return + var/turf/T = get_turf(user) //we may have moved. adjust as needed... + var/area/A = get_area(user) + if((!is_station_level(T.z) && !is_mining_level(T.z)) || (A && !A.blob_allowed)) + to_chat(user, "The veil is not weak enough here.") + return FALSE return ..() /obj/item/stack/sheet/runed_metal/Initialize(mapload, new_amount, merge = TRUE) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index e67efb0c8a..4d5bf2a449 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -33,10 +33,13 @@ return return TRUE -/obj/item/stack/Initialize(mapload, new_amount=null , merge = TRUE) +/obj/item/stack/Initialize(mapload, new_amount, merge = TRUE) . = ..() - if(new_amount) + if(new_amount != null) amount = new_amount + while(amount > max_amount) + amount -= max_amount + new type(loc, max_amount, FALSE) if(!merge_type) merge_type = type if(merge) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 89ce133fcc..e62b918f19 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -453,7 +453,7 @@ /obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun/PopulateContents() for(var/i in 1 to 6) new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g/buckshot(src) + new /obj/item/ammo_box/magazine/m12g/stun(src) new /obj/item/ammo_box/magazine/m12g/slug(src) new /obj/item/ammo_box/magazine/m12g/dragon(src) @@ -479,7 +479,7 @@ /obj/item/storage/backpack/duffelbag/syndie/bulldogbundle/PopulateContents() new /obj/item/ammo_box/magazine/m12g(src) new /obj/item/gun/ballistic/automatic/shotgun/bulldog(src) - new /obj/item/ammo_box/magazine/m12g/buckshot(src) + new /obj/item/ammo_box/magazine/m12g/stun(src) new /obj/item/clothing/glasses/thermal/syndi(src) /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index ec92961387..05d6338235 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -111,8 +111,8 @@ new /obj/item/clothing/suit/space/hardsuit/syndi(src) // 8 tc new /obj/item/gun/ballistic/automatic/shotgun/bulldog/unrestricted(src) // 8 tc new /obj/item/implanter/explosive(src) // 2 tc - new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc - new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc + new /obj/item/ammo_box/magazine/m12g(src) // 2 tc + new /obj/item/ammo_box/magazine/m12g(src) // 2 tc new /obj/item/grenade/plastic/c4 (src) // 1 tc new /obj/item/grenade/plastic/c4 (src) // 1 tc new /obj/item/card/emag(src) // 6 tc diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 5c7df452f0..2a5e92d375 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -49,7 +49,6 @@ on = FALSE to_chat(user, "You need a free hand to hold the mister!") return - noz.forceMove(user) else //Remove from their hands and put back "into" the tank remove_noz() diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index cc7e3249d4..dc6fbfe25b 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -219,3 +219,17 @@ if(active_portal_pairs[i] == P) return DESTINATION_PORTAL return FALSE + +/obj/item/hand_tele/suicide_act(mob/user) + if(iscarbon(user)) + user.visible_message("[user] is creating a weak portal and sticking [user.p_their()] head through! It looks like [user.p_theyre()] trying to commit suicide!") + var/mob/living/carbon/itemUser = user + var/obj/item/bodypart/head/head = itemUser.get_bodypart(BODY_ZONE_HEAD) + if(head) + head.drop_limb() + var/list/safeLevels = SSmapping.levels_by_any_trait(list(ZTRAIT_SPACE_RUINS, ZTRAIT_LAVA_RUINS, ZTRAIT_STATION, ZTRAIT_MINING)) + head.forceMove(locate(rand(1, world.maxx), rand(1, world.maxy), pick(safeLevels))) + itemUser.visible_message("The portal snaps closed taking [user]'s head with it!") + else + itemUser.visible_message("[user] looks even further depressed as they realize they do not have a head...and suddenly dies of shame!") + return (BRUTELOSS) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 52e98e4a9e..98a4906246 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -840,7 +840,7 @@ name = "card" desc = "a card" icon = 'icons/obj/toy.dmi' - icon_state = "singlecard_nanotrasen_down" + icon_state = "singlecard_down_nanotrasen" w_class = WEIGHT_CLASS_TINY var/cardname = null var/flipped = 0 diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 1e76bc7160..2dadafe2cf 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -1,6 +1,9 @@ //the essential proc to call when an obj must receive damage of any kind. /obj/proc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, armour_penetration = 0) + if(QDELETED(src)) + stack_trace("[src] taking damage after deletion") + return if(sound_effect) play_attack_sound(damage_amount, damage_type, damage_flag) if(!(resistance_flags & INDESTRUCTIBLE) && obj_integrity > 0) diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 0a6dfaa1cf..ed797e4256 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -147,8 +147,7 @@ to_chat(user, "You remove the cables.") state = SCREWED_CORE update_icon() - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc ) - A.amount = 5 + new /obj/item/stack/cable_coil(drop_location(), 5) return if(istype(P, /obj/item/stack/sheet/rglass)) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index b758b33355..ecfd0ba0c7 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -53,7 +53,7 @@ name = "resin" desc = "Looks like some kind of thick resin." icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi' - icon_state = "resin" + icon_state = "smooth" density = TRUE opacity = 1 anchored = TRUE @@ -77,7 +77,7 @@ name = "resin wall" desc = "Thick resin solidified into a wall." icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi' - icon_state = "wall0" //same as resin, but consistency ho! + icon_state = "smooth" //same as resin, but consistency ho! resintype = "wall" canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane) @@ -88,7 +88,7 @@ name = "resin membrane" desc = "Resin just thin enough to let light pass through." icon = 'icons/obj/smooth_structures/alien/resin_membrane.dmi' - icon_state = "membrane0" + icon_state = "smooth" opacity = 0 max_integrity = 160 resintype = "membrane" diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index eb7e7a3f93..90863441a2 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -148,6 +148,8 @@ new /obj/item/storage/backpack/duffelbag/sec(src) for(var/i in 1 to 3) new /obj/item/clothing/under/rank/security(src) + for(var/i in 1 to 2) + new /obj/item/clothing/under/rank/security/skirt(src) for(var/i in 1 to 3) new /obj/item/clothing/shoes/jackboots(src) for(var/i in 1 to 3) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/supplypod.dm b/code/game/objects/structures/crates_lockers/closets/secure/supplypod.dm index ef786dda03..2fcf670101 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/supplypod.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/supplypod.dm @@ -65,6 +65,7 @@ //------------------------------------FALLING SUPPLY POD-------------------------------------// /obj/effect/temp_visual/DPfall icon = 'icons/obj/2x2.dmi' + icon_state = "supplypod_falling" pixel_x = -16 pixel_y = -5 pixel_z = 200 diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 2214869098..3edbde93b7 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -1,115 +1,115 @@ -/obj/structure/closet/syndicate - name = "armory closet" - desc = "Why is this here?" - icon_state = "syndicate" - -/obj/structure/closet/syndicate/personal - desc = "It's a personal storage unit for operative gear." - -/obj/structure/closet/syndicate/personal/PopulateContents() - ..() - new /obj/item/clothing/under/syndicate(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/radio/headset/syndicate(src) - new /obj/item/ammo_box/magazine/m10mm(src) - new /obj/item/storage/belt/military(src) - new /obj/item/crowbar/red(src) - new /obj/item/clothing/glasses/night(src) - -/obj/structure/closet/syndicate/nuclear - desc = "It's a storage unit for a Syndicate boarding party." - -/obj/structure/closet/syndicate/nuclear/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/ammo_box/magazine/m10mm(src) - new /obj/item/storage/box/flashbangs(src) - new /obj/item/storage/box/teargas(src) - new /obj/item/storage/backpack/duffelbag/syndie/med(src) - new /obj/item/pda/syndicate(src) - -/obj/structure/closet/syndicate/resources - desc = "An old, dusty locker." - -/obj/structure/closet/syndicate/resources/PopulateContents() - ..() - var/common_min = 30 //Minimum amount of minerals in the stack for common minerals - var/common_max = 50 //Maximum amount of HONK in the stack for HONK common minerals - var/rare_min = 5 //Minimum HONK of HONK in the stack HONK HONK rare minerals - var/rare_max = 20 //Maximum HONK HONK HONK in the HONK for HONK rare HONK - - - var/pickednum = rand(1, 50) - - //Sad trombone - if(pickednum == 1) - var/obj/item/paper/P = new /obj/item/paper(src) - P.name = "\improper IOU" - P.info = "Sorry man, we needed the money so we sold your stash. It's ok, we'll double our money for sure this time!" - - //Metal (common ore) - if(pickednum >= 2) - new /obj/item/stack/sheet/metal(src, rand(common_min, common_max)) - - //Glass (common ore) - if(pickednum >= 5) - new /obj/item/stack/sheet/glass(src, rand(common_min, common_max)) - - //Plasteel (common ore) Because it has a million more uses then plasma - if(pickednum >= 10) - new /obj/item/stack/sheet/plasteel(src, rand(common_min, common_max)) - - //Plasma (rare ore) - if(pickednum >= 15) - new /obj/item/stack/sheet/mineral/plasma(src, rand(rare_min, rare_max)) - - //Silver (rare ore) - if(pickednum >= 20) - new /obj/item/stack/sheet/mineral/silver(src, rand(rare_min, rare_max)) - - //Gold (rare ore) - if(pickednum >= 30) - new /obj/item/stack/sheet/mineral/gold(src, rand(rare_min, rare_max)) - - //Uranium (rare ore) - if(pickednum >= 40) - new /obj/item/stack/sheet/mineral/uranium(src, rand(rare_min, rare_max)) - - //Titanium (rare ore) - if(pickednum >= 40) - new /obj/item/stack/sheet/mineral/titanium(src, rand(rare_min, rare_max)) - - //Plastitanium (rare ore) - if(pickednum >= 40) - new /obj/item/stack/sheet/mineral/plastitanium(src, rand(rare_min, rare_max)) - - //Diamond (rare HONK) - if(pickednum >= 45) - new /obj/item/stack/sheet/mineral/diamond(src, rand(rare_min, rare_max)) - - //Jetpack (You hit the jackpot!) - if(pickednum == 50) - new /obj/item/tank/jetpack/carbondioxide(src) - -/obj/structure/closet/syndicate/resources/everything - desc = "It's an emergency storage closet for repairs." - -/obj/structure/closet/syndicate/resources/everything/PopulateContents() - var/list/resources = list( - /obj/item/stack/sheet/metal, - /obj/item/stack/sheet/glass, - /obj/item/stack/sheet/mineral/gold, - /obj/item/stack/sheet/mineral/silver, - /obj/item/stack/sheet/mineral/plasma, - /obj/item/stack/sheet/mineral/uranium, - /obj/item/stack/sheet/mineral/diamond, - /obj/item/stack/sheet/mineral/bananium, - /obj/item/stack/sheet/plasteel, - /obj/item/stack/sheet/mineral/titanium, - /obj/item/stack/sheet/mineral/plastitanium, - /obj/item/stack/rods - ) - - for(var/i = 0, i<2, i++) - for(var/res in resources) - var/obj/item/stack/R = new res(src) - R.amount = R.max_amount +/obj/structure/closet/syndicate + name = "armory closet" + desc = "Why is this here?" + icon_state = "syndicate" + +/obj/structure/closet/syndicate/personal + desc = "It's a personal storage unit for operative gear." + +/obj/structure/closet/syndicate/personal/PopulateContents() + ..() + new /obj/item/clothing/under/syndicate(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/radio/headset/syndicate(src) + new /obj/item/ammo_box/magazine/m10mm(src) + new /obj/item/storage/belt/military(src) + new /obj/item/crowbar/red(src) + new /obj/item/clothing/glasses/night(src) + +/obj/structure/closet/syndicate/nuclear + desc = "It's a storage unit for a Syndicate boarding party." + +/obj/structure/closet/syndicate/nuclear/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/ammo_box/magazine/m10mm(src) + new /obj/item/storage/box/flashbangs(src) + new /obj/item/storage/box/teargas(src) + new /obj/item/storage/backpack/duffelbag/syndie/med(src) + new /obj/item/pda/syndicate(src) + +/obj/structure/closet/syndicate/resources + desc = "An old, dusty locker." + +/obj/structure/closet/syndicate/resources/PopulateContents() + ..() + var/common_min = 30 //Minimum amount of minerals in the stack for common minerals + var/common_max = 50 //Maximum amount of HONK in the stack for HONK common minerals + var/rare_min = 5 //Minimum HONK of HONK in the stack HONK HONK rare minerals + var/rare_max = 20 //Maximum HONK HONK HONK in the HONK for HONK rare HONK + + + var/pickednum = rand(1, 50) + + //Sad trombone + if(pickednum == 1) + var/obj/item/paper/P = new /obj/item/paper(src) + P.name = "\improper IOU" + P.info = "Sorry man, we needed the money so we sold your stash. It's ok, we'll double our money for sure this time!" + + //Metal (common ore) + if(pickednum >= 2) + new /obj/item/stack/sheet/metal(src, rand(common_min, common_max)) + + //Glass (common ore) + if(pickednum >= 5) + new /obj/item/stack/sheet/glass(src, rand(common_min, common_max)) + + //Plasteel (common ore) Because it has a million more uses then plasma + if(pickednum >= 10) + new /obj/item/stack/sheet/plasteel(src, rand(common_min, common_max)) + + //Plasma (rare ore) + if(pickednum >= 15) + new /obj/item/stack/sheet/mineral/plasma(src, rand(rare_min, rare_max)) + + //Silver (rare ore) + if(pickednum >= 20) + new /obj/item/stack/sheet/mineral/silver(src, rand(rare_min, rare_max)) + + //Gold (rare ore) + if(pickednum >= 30) + new /obj/item/stack/sheet/mineral/gold(src, rand(rare_min, rare_max)) + + //Uranium (rare ore) + if(pickednum >= 40) + new /obj/item/stack/sheet/mineral/uranium(src, rand(rare_min, rare_max)) + + //Titanium (rare ore) + if(pickednum >= 40) + new /obj/item/stack/sheet/mineral/titanium(src, rand(rare_min, rare_max)) + + //Plastitanium (rare ore) + if(pickednum >= 40) + new /obj/item/stack/sheet/mineral/plastitanium(src, rand(rare_min, rare_max)) + + //Diamond (rare HONK) + if(pickednum >= 45) + new /obj/item/stack/sheet/mineral/diamond(src, rand(rare_min, rare_max)) + + //Jetpack (You hit the jackpot!) + if(pickednum == 50) + new /obj/item/tank/jetpack/carbondioxide(src) + +/obj/structure/closet/syndicate/resources/everything + desc = "It's an emergency storage closet for repairs." + +/obj/structure/closet/syndicate/resources/everything/PopulateContents() + var/list/resources = list( + /obj/item/stack/sheet/metal, + /obj/item/stack/sheet/glass, + /obj/item/stack/sheet/mineral/gold, + /obj/item/stack/sheet/mineral/silver, + /obj/item/stack/sheet/mineral/plasma, + /obj/item/stack/sheet/mineral/uranium, + /obj/item/stack/sheet/mineral/diamond, + /obj/item/stack/sheet/mineral/bananium, + /obj/item/stack/sheet/plasteel, + /obj/item/stack/sheet/mineral/titanium, + /obj/item/stack/sheet/mineral/plastitanium, + /obj/item/stack/rods + ) + + for(var/i = 0, i<2, i++) + for(var/res in resources) + var/obj/item/stack/R = res + new res(src, initial(R.max_amount)) diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm index 7098520ef5..6c8feae50b 100644 --- a/code/game/objects/structures/crates_lockers/crates/large.dm +++ b/code/game/objects/structures/crates_lockers/crates/large.dm @@ -1,15 +1,14 @@ /obj/structure/closet/crate/large name = "large crate" - desc = "A hefty wooden crate." + desc = "A hefty wooden crate. You'll need a crowbar to get it open." icon_state = "largecrate" density = TRUE material_drop = /obj/item/stack/sheet/mineral/wood + material_drop_amount = 4 delivery_icon = "deliverybox" + integrity_failure = 0 //Makes the crate break when integrity reaches 0, instead of opening and becoming an invisible sprite. /obj/structure/closet/crate/large/attack_hand(mob/user) - . = ..() - if(.) - return add_fingerprint(user) if(manifest) tear_manifest(user) @@ -18,7 +17,6 @@ /obj/structure/closet/crate/large/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/crowbar)) - var/turf/T = get_turf(src) if(manifest) tear_manifest(user) @@ -27,11 +25,19 @@ "You hear splitting wood.") playsound(src.loc, 'sound/weapons/slashmiss.ogg', 75, 1) - for(var/i in 1 to rand(2, 5)) + var/turf/T = get_turf(src) + for(var/i in 1 to material_drop_amount) new material_drop(src) for(var/atom/movable/AM in contents) AM.forceMove(T) qdel(src) + else - return ..() + if(user.a_intent == INTENT_HARM) //Only return ..() if intent is harm, otherwise return 0 or just end it. + return ..() //Stops it from opening and turning invisible when items are used on it. + + else + to_chat(user, "You need a crowbar to pry this open!") + return FALSE //Just stop. Do nothing. Don't turn into an invisible sprite. Don't open like a locker. + //The large crate has no non-attack interactions other than the crowbar, anyway. \ No newline at end of file diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index c6273f3049..40435c2000 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -8,6 +8,7 @@ armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50) max_integrity = 50 layer = LATTICE_LAYER //under pipes + plane = FLOOR_PLANE var/number_of_rods = 1 canSmoothWith = list(/obj/structure/lattice, /turf/open/floor, diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 02df5ed3fb..2fc582229d 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -1,4 +1,5 @@ /turf/open + plane = FLOOR_PLANE var/slowdown = 0 //negative for faster, positive for slower var/mutable_appearance/wet_overlay diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index 78fe2b1bde..a51989d230 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -117,9 +117,8 @@ /turf/open/floor/engine/cult name = "engraved floor" - desc = "The air hangs heavy over this sinister flooring." + desc = "The air smells strangely over this sinister flooring." icon_state = "plating" - CanAtmosPass = ATMOS_PASS_NO floor_tile = null var/obj/effect/clockwork/overlay/floor/bloodcult/realappearance diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 49c7aeffb6..097076fc74 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -39,7 +39,7 @@ return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a byond account.") if (CONFIG_GET(flag/panic_bunker) && SSdbcore.Connect()) log_access("Failed Login: [key] - Guests not allowed during panic bunker") - return list("reason"="guest", "desc"="\nReason: You must first join the Discord to verify your account before joining this server. Please ping an admin once you've joined and read the rules. https://discord.gg/E6SQuhz") + return list("reason"="guest", "desc"="\nReason: You must first sign into your BYOND account or join the Discord to verify your account before joining this server. Please ping an admin once you've joined and read the rules. https://discord.gg/E6SQuhz") //Population Cap Checking var/extreme_popcap = CONFIG_GET(number/extreme_popcap) diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 1e96cc507e..0136efc3b3 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -95,7 +95,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/Getmob(mob/M in GLOB.mob_list) +/client/proc/Getmob(mob/M in GLOB.mob_list - GLOB.dummy_mob_list) set category = "Admin" set name = "Get Mob" set desc = "Mob to teleport" diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 54614cf8ef..2fc616d588 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -27,7 +27,7 @@ if(isnewplayer(M)) continue if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above - M.show_message(rendered, 2) + to_chat(M, rendered) SSblackbox.record_feedback("tally", "admin_verb", 1, "Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm index a16a52d7aa..4cba81595f 100644 --- a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm +++ b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm @@ -151,6 +151,7 @@ desc = "You get the feeling that you shouldn't be standing here." clockwork_desc = "A sigil that will soon erupt and smite any unenlightened nearby." icon = 'icons/effects/96x96.dmi' + icon_state = "" pixel_x = -32 pixel_y = -32 layer = BELOW_MOB_LAYER diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index a1c16aa078..4de5219d7d 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -33,10 +33,8 @@ desc = "A sword humming with unholy energy. It glows with a dim red light." icon_state = "cultblade" item_state = "cultblade" - lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' - righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' - inhand_x_dimension = 64 - inhand_y_dimension = 64 + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' flags_1 = CONDUCT_1 sharpness = IS_SHARP w_class = WEIGHT_CLASS_BULKY @@ -73,8 +71,6 @@ if(!iscultist(user)) if(!is_servant_of_ratvar(user)) to_chat(user, "\"I wouldn't advise that.\"") - to_chat(user, "An overwhelming sense of nausea overpowers you!") - user.Dizzy(120) else to_chat(user, "\"One of Ratvar's toys is trying to play with things [user.p_they()] shouldn't. Cute.\"") to_chat(user, "A horrible force yanks at your arm!") @@ -138,10 +134,7 @@ if(!iscultist(user)) if(!is_servant_of_ratvar(user)) to_chat(user, "\"I wouldn't advise that.\"") - to_chat(user, "An overwhelming sense of nausea overpowers you!") - user.Dizzy(80) - user.dropItemToGround(src, TRUE) - user.Knockdown(30) + force = 5 return else to_chat(user, "\"One of Ratvar's toys is trying to play with things [user.p_they()] shouldn't. Cute.\"") @@ -151,6 +144,7 @@ user.dropItemToGround(src, TRUE) user.Knockdown(50) return + force = initial(force) jaunt.Grant(user, src) linked_action.Grant(user, src) user.update_icons() diff --git a/code/modules/antagonists/cult/ritual.dm b/code/modules/antagonists/cult/ritual.dm index dd129708a8..ba2ea53ef2 100644 --- a/code/modules/antagonists/cult/ritual.dm +++ b/code/modules/antagonists/cult/ritual.dm @@ -144,7 +144,8 @@ This file contains the cult dagger and rune list code if(locate(/obj/effect/rune) in T) to_chat(user, "There is already a rune here.") return FALSE - if(!is_station_level(T.z) && !is_mining_level(T.z)) + var/area/A = get_area(T) + if((!is_station_level(T.z) && !is_mining_level(T.z)) || (A && !A.blob_allowed)) to_chat(user, "The veil is not weak enough here.") return FALSE return TRUE diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 4307f65a28..71e02fdf4c 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -708,6 +708,11 @@ structure_check() searches for nearby cultist structures required for the invoca fail_invoke() log_game("Summon Cultist rune failed - target died") return + if(cultist_to_summon.pulledby || cultist_to_summon.buckled) + to_chat(user, "[cultist_to_summon] is being held in place!") + fail_invoke() + log_game("Summon Cultist rune failed - target restrained") + return if(!iscultist(cultist_to_summon)) to_chat(user, "[cultist_to_summon] is not a follower of the Geometer!") fail_invoke() diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index 3ddbd0117c..6572584eab 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -190,7 +190,7 @@ return ..() /mob/living/simple_animal/hostile/morph/AttackingTarget() - if(!melee_damage_disguised) + if(morphed && !melee_damage_disguised) to_chat(src, "You can not attack while disguised!") return if(isliving(target)) //Eat Corpses to regen health diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 9457e3a8c8..aea9a1862a 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -66,7 +66,7 @@ name = "pile of viscera" desc = "A repulsive pile of guts and gore." gender = NEUTER - random_icon_states = list("innards") + icon_state = "innards" /mob/living/simple_animal/slaughter/phasein() . = ..() diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 4d6887f3e8..3ea2e1d739 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -493,10 +493,10 @@ D.pixel_z = target.pixel_z if(do_mob(src, target, 100)) to_chat(src, "Dismantling complete.") - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc) - M.amount = 5 + var/atom/Tsec = target.drop_location() + new /obj/item/stack/sheet/metal(Tsec, 5) for(var/obj/item/I in target.component_parts) - I.forceMove(M.drop_location()) + I.forceMove(Tsec) var/obj/effect/temp_visual/swarmer/disintegration/N = new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) N.pixel_x = target.pixel_x N.pixel_y = target.pixel_y @@ -505,7 +505,7 @@ if(istype(target, /obj/machinery/computer)) var/obj/machinery/computer/C = target if(C.circuit) - C.circuit.forceMove(M.drop_location()) + C.circuit.forceMove(Tsec) qdel(target) diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index c0a328b3ae..11882f65d1 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -33,7 +33,6 @@ ..() if(!iscultist(user) && !iswizard(user) && !usability) to_chat(user, "An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly.") - user.Dizzy(120) /obj/item/soulstone/examine(mob/user) ..() diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 20bcf25138..c293439431 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -111,7 +111,7 @@ Code: var/obj/item/assembly/signaler/signaler2 = W if(secured && signaler2.secured) code = signaler2.code - frequency = signaler2.frequency + set_frequency(signaler2.frequency) to_chat(user, "You transfer the frequency and code of \the [signaler2.name] to \the [name]") ..() @@ -186,6 +186,7 @@ Code: item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + var/anomaly_type = /obj/effect/anomaly /obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal) if(!signal) diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index 28148c0364..5dcf95f3cf 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -34,8 +34,10 @@ Iconnery var/turf/T = loc if(level == 2 || !T.intact) showpipe = TRUE + plane = GAME_PLANE else showpipe = FALSE + plane = FLOOR_PLANE if(!showpipe) return //no need to update the pipes if they aren't showing diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 37afb31a6b..9eec36f53a 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -101,7 +101,7 @@ export_types = list(/obj/machinery/iv_drip) /datum/export/large/barrier - cost = 325 + cost = 100 unit_name = "security barrier" export_types = list(/obj/item/grenade/barrier, /obj/structure/barricade/security) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index a961e87c48..2d3ed07505 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1649,8 +1649,9 @@ . = ..() if(prob(50)) var/mob/living/simple_animal/pet/dog/corgi/D = locate() in . - qdel(D) - new /mob/living/simple_animal/pet/dog/corgi/Lisa(.) + if(D.gender == FEMALE) + qdel(D) + new /mob/living/simple_animal/pet/dog/corgi/Lisa(.) /datum/supply_pack/critter/cow name = "Cow Crate" diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index c821204993..d3c09b2348 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -157,12 +157,14 @@ GLOBAL_LIST_EMPTY(asset_datums) //get an assetdatum or make a new one /proc/get_asset_datum(var/type) - if (!(type in GLOB.asset_datums)) - return new type() - return GLOB.asset_datums[type] + return GLOB.asset_datums[type] || new type() + +/datum/asset + var/_abstract = /datum/asset /datum/asset/New() GLOB.asset_datums[type] = src + register() /datum/asset/proc/register() return @@ -170,20 +172,173 @@ GLOBAL_LIST_EMPTY(asset_datums) /datum/asset/proc/send(client) return + //If you don't need anything complicated. /datum/asset/simple + _abstract = /datum/asset/simple var/assets = list() var/verify = FALSE /datum/asset/simple/register() for(var/asset_name in assets) register_asset(asset_name, assets[asset_name]) + /datum/asset/simple/send(client) send_asset_list(client,assets,verify) +// For registering or sending multiple others at once +/datum/asset/group + _abstract = /datum/asset/group + var/list/children + +/datum/asset/group/register() + for(var/type in children) + get_asset_datum(type) + +/datum/asset/group/send(client/C) + for(var/type in children) + var/datum/asset/A = get_asset_datum(type) + A.send(C) + + +// spritesheet implementation - coalesces various icons into a single .png file +// and uses CSS to select icons out of that file - saves on transferring some +// 1400-odd individual PNG files +#define SPR_SIZE 1 +#define SPR_IDX 2 +#define SPRSZ_COUNT 1 +#define SPRSZ_ICON 2 +#define SPRSZ_STRIPPED 3 + +/datum/asset/spritesheet + _abstract = /datum/asset/spritesheet + var/name + var/list/sizes = list() // "32x32" -> list(10, icon/normal, icon/stripped) + var/list/sprites = list() // "foo_bar" -> list("32x32", 5) + var/verify = FALSE + +/datum/asset/spritesheet/register() + if (!name) + CRASH("spritesheet [type] cannot register without a name") + ensure_stripped() + + var/res_name = "spritesheet_[name].css" + var/fname = "data/spritesheets/[res_name]" + call("rust_g", "file_write")(generate_css(), fname) + register_asset(res_name, file(fname)) + + for(var/size_id in sizes) + var/size = sizes[size_id] + register_asset("[name]_[size_id].png", size[SPRSZ_STRIPPED]) + +/datum/asset/spritesheet/send(client/C) + if (!name) + return + var/all = list("spritesheet_[name].css") + for(var/size_id in sizes) + all += "[name]_[size_id].png" + send_asset_list(C, all, verify) + +/datum/asset/spritesheet/proc/ensure_stripped(sizes_to_strip = sizes) + for(var/size_id in sizes_to_strip) + var/size = sizes[size_id] + if (size[SPRSZ_STRIPPED]) + continue + + // save flattened version + var/fname = "data/spritesheets/[name]_[size_id].png" + fcopy(size[SPRSZ_ICON], fname) + var/error = call("rust_g", "dmi_strip_metadata")(fname) + if(length(error)) + stack_trace("Failed to strip [name]_[size_id].png: [error]") + size[SPRSZ_STRIPPED] = icon(fname) + +/datum/asset/spritesheet/proc/generate_css() + var/list/out = list() + + for (var/size_id in sizes) + var/size = sizes[size_id] + var/icon/tiny = size[SPRSZ_ICON] + out += ".[name][size_id]{display:inline-block;width:[tiny.Width()]px;height:[tiny.Height()]px;background:url('[name]_[size_id].png') no-repeat;}" + + for (var/sprite_id in sprites) + var/sprite = sprites[sprite_id] + var/size_id = sprite[SPR_SIZE] + var/idx = sprite[SPR_IDX] + var/size = sizes[size_id] + + var/icon/tiny = size[SPRSZ_ICON] + var/icon/big = size[SPRSZ_STRIPPED] + var/per_line = big.Width() / tiny.Width() + var/x = (idx % per_line) * tiny.Width() + var/y = round(idx / per_line) * tiny.Height() + + out += ".[name][size_id].[sprite_id]{background-position:-[x]px -[y]px;}" + + return out.Join("\n") + +/datum/asset/spritesheet/proc/Insert(sprite_name, icon/I, icon_state="", dir=SOUTH, frame=1, moving=FALSE) + I = icon(I, icon_state=icon_state, dir=dir, frame=frame, moving=moving) + if (!I || !length(icon_states(I))) // that direction or state doesn't exist + return + var/size_id = "[I.Width()]x[I.Height()]" + var/size = sizes[size_id] + + if (sprites[sprite_name]) + CRASH("duplicate sprite \"[sprite_name]\" in sheet [name] ([type])") + + if (size) + var/position = size[SPRSZ_COUNT]++ + var/icon/sheet = size[SPRSZ_ICON] + size[SPRSZ_STRIPPED] = null + sheet.Insert(I, icon_state=sprite_name) + sprites[sprite_name] = list(size_id, position) + else + sizes[size_id] = size = list(1, I, null) + sprites[sprite_name] = list(size_id, 0) + +/datum/asset/spritesheet/proc/InsertAll(prefix, icon/I, list/directions) + if (length(prefix)) + prefix = "[prefix]-" + + if (!directions) + directions = list(SOUTH) + + for (var/icon_state_name in icon_states(I)) + for (var/direction in directions) + var/prefix2 = (directions.len > 1) ? "[dir2text(direction)]-" : "" + Insert("[prefix][prefix2][icon_state_name]", I, icon_state=icon_state_name, dir=direction) + +/datum/asset/spritesheet/proc/css_tag() + return {""} + +/datum/asset/spritesheet/proc/icon_tag(sprite_name) + var/sprite = sprites[sprite_name] + if (!sprite) + return null + var/size_id = sprite[SPR_SIZE] + return {""} + +#undef SPR_SIZE +#undef SPR_IDX +#undef SPRSZ_COUNT +#undef SPRSZ_ICON +#undef SPRSZ_STRIPPED + + +/datum/asset/spritesheet/simple + _abstract = /datum/asset/spritesheet/simple + var/list/assets + +/datum/asset/spritesheet/simple/register() + for (var/key in assets) + Insert(key, assets[key]) + ..() + //Generates assets based on iconstates of a single icon /datum/asset/simple/icon_states + _abstract = /datum/asset/simple/icon_states var/icon var/list/directions = list(SOUTH) var/frame = 1 @@ -209,6 +364,7 @@ GLOBAL_LIST_EMPTY(asset_datums) register_asset(asset_name, asset) /datum/asset/simple/icon_states/multiple_icons + _abstract = /datum/asset/simple/icon_states/multiple_icons var/list/icons /datum/asset/simple/icon_states/multiple_icons/register() @@ -260,50 +416,52 @@ GLOBAL_LIST_EMPTY(asset_datums) "smmon_6.gif" = 'icons/program_icons/smmon_6.gif' ) -/datum/asset/simple/pda +/datum/asset/spritesheet/simple/pda + name = "pda" assets = list( - "pda_atmos.png" = 'icons/pda_icons/pda_atmos.png', - "pda_back.png" = 'icons/pda_icons/pda_back.png', - "pda_bell.png" = 'icons/pda_icons/pda_bell.png', - "pda_blank.png" = 'icons/pda_icons/pda_blank.png', - "pda_boom.png" = 'icons/pda_icons/pda_boom.png', - "pda_bucket.png" = 'icons/pda_icons/pda_bucket.png', - "pda_medbot.png" = 'icons/pda_icons/pda_medbot.png', - "pda_floorbot.png" = 'icons/pda_icons/pda_floorbot.png', - "pda_cleanbot.png" = 'icons/pda_icons/pda_cleanbot.png', - "pda_crate.png" = 'icons/pda_icons/pda_crate.png', - "pda_cuffs.png" = 'icons/pda_icons/pda_cuffs.png', - "pda_eject.png" = 'icons/pda_icons/pda_eject.png', - "pda_flashlight.png" = 'icons/pda_icons/pda_flashlight.png', - "pda_honk.png" = 'icons/pda_icons/pda_honk.png', - "pda_mail.png" = 'icons/pda_icons/pda_mail.png', - "pda_medical.png" = 'icons/pda_icons/pda_medical.png', - "pda_menu.png" = 'icons/pda_icons/pda_menu.png', - "pda_mule.png" = 'icons/pda_icons/pda_mule.png', - "pda_notes.png" = 'icons/pda_icons/pda_notes.png', - "pda_power.png" = 'icons/pda_icons/pda_power.png', - "pda_rdoor.png" = 'icons/pda_icons/pda_rdoor.png', - "pda_reagent.png" = 'icons/pda_icons/pda_reagent.png', - "pda_refresh.png" = 'icons/pda_icons/pda_refresh.png', - "pda_scanner.png" = 'icons/pda_icons/pda_scanner.png', - "pda_signaler.png" = 'icons/pda_icons/pda_signaler.png', - "pda_status.png" = 'icons/pda_icons/pda_status.png', - "pda_dronephone.png" = 'icons/pda_icons/pda_dronephone.png' + "atmos" = 'icons/pda_icons/pda_atmos.png', + "back" = 'icons/pda_icons/pda_back.png', + "bell" = 'icons/pda_icons/pda_bell.png', + "blank" = 'icons/pda_icons/pda_blank.png', + "boom" = 'icons/pda_icons/pda_boom.png', + "bucket" = 'icons/pda_icons/pda_bucket.png', + "medbot" = 'icons/pda_icons/pda_medbot.png', + "floorbot" = 'icons/pda_icons/pda_floorbot.png', + "cleanbot" = 'icons/pda_icons/pda_cleanbot.png', + "crate" = 'icons/pda_icons/pda_crate.png', + "cuffs" = 'icons/pda_icons/pda_cuffs.png', + "eject" = 'icons/pda_icons/pda_eject.png', + "flashlight" = 'icons/pda_icons/pda_flashlight.png', + "honk" = 'icons/pda_icons/pda_honk.png', + "mail" = 'icons/pda_icons/pda_mail.png', + "medical" = 'icons/pda_icons/pda_medical.png', + "menu" = 'icons/pda_icons/pda_menu.png', + "mule" = 'icons/pda_icons/pda_mule.png', + "notes" = 'icons/pda_icons/pda_notes.png', + "power" = 'icons/pda_icons/pda_power.png', + "rdoor" = 'icons/pda_icons/pda_rdoor.png', + "reagent" = 'icons/pda_icons/pda_reagent.png', + "refresh" = 'icons/pda_icons/pda_refresh.png', + "scanner" = 'icons/pda_icons/pda_scanner.png', + "signaler" = 'icons/pda_icons/pda_signaler.png', + "status" = 'icons/pda_icons/pda_status.png', + "dronephone" = 'icons/pda_icons/pda_dronephone.png' ) -/datum/asset/simple/paper +/datum/asset/spritesheet/simple/paper + name = "paper" assets = list( - "large_stamp-clown.png" = 'icons/stamp_icons/large_stamp-clown.png', - "large_stamp-deny.png" = 'icons/stamp_icons/large_stamp-deny.png', - "large_stamp-ok.png" = 'icons/stamp_icons/large_stamp-ok.png', - "large_stamp-hop.png" = 'icons/stamp_icons/large_stamp-hop.png', - "large_stamp-cmo.png" = 'icons/stamp_icons/large_stamp-cmo.png', - "large_stamp-ce.png" = 'icons/stamp_icons/large_stamp-ce.png', - "large_stamp-hos.png" = 'icons/stamp_icons/large_stamp-hos.png', - "large_stamp-rd.png" = 'icons/stamp_icons/large_stamp-rd.png', - "large_stamp-cap.png" = 'icons/stamp_icons/large_stamp-cap.png', - "large_stamp-qm.png" = 'icons/stamp_icons/large_stamp-qm.png', - "large_stamp-law.png" = 'icons/stamp_icons/large_stamp-law.png' + "stamp-clown" = 'icons/stamp_icons/large_stamp-clown.png', + "stamp-deny" = 'icons/stamp_icons/large_stamp-deny.png', + "stamp-ok" = 'icons/stamp_icons/large_stamp-ok.png', + "stamp-hop" = 'icons/stamp_icons/large_stamp-hop.png', + "stamp-cmo" = 'icons/stamp_icons/large_stamp-cmo.png', + "stamp-ce" = 'icons/stamp_icons/large_stamp-ce.png', + "stamp-hos" = 'icons/stamp_icons/large_stamp-hos.png', + "stamp-rd" = 'icons/stamp_icons/large_stamp-rd.png', + "stamp-cap" = 'icons/stamp_icons/large_stamp-cap.png', + "stamp-qm" = 'icons/stamp_icons/large_stamp-qm.png', + "stamp-law" = 'icons/stamp_icons/large_stamp-law.png' ) /datum/asset/simple/IRV @@ -335,10 +493,22 @@ GLOBAL_LIST_EMPTY(asset_datums) "changelog.css" = 'html/changelog.css' ) -/datum/asset/simple/goonchat +/datum/asset/group/goonchat + children = list( + /datum/asset/simple/jquery, + /datum/asset/simple/goonchat, + /datum/asset/spritesheet/goonchat + ) + +/datum/asset/simple/jquery verify = FALSE assets = list( "jquery.min.js" = 'code/modules/goonchat/browserassets/js/jquery.min.js', + ) + +/datum/asset/simple/goonchat + verify = FALSE + assets = list( "json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js', "errorHandler.js" = 'code/modules/goonchat/browserassets/js/errorHandler.js', "browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js', @@ -350,6 +520,24 @@ GLOBAL_LIST_EMPTY(asset_datums) "browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css', ) +/datum/asset/spritesheet/goonchat + name = "chat" + +/datum/asset/spritesheet/goonchat/register() + InsertAll("emoji", 'icons/emoji.dmi') + + // pre-loading all lanugage icons also helps to avoid meta + InsertAll("language", 'icons/misc/language.dmi') + // catch languages which are pulling icons from another file + for(var/path in typesof(/datum/language)) + var/datum/language/L = path + var/icon = initial(L.icon) + if (icon != 'icons/misc/language.dmi') + var/icon_state = initial(L.icon_state) + Insert("language-[icon_state]", icon, icon_state=icon_state) + + ..() + /datum/asset/simple/permissions assets = list( "padlock.png" = 'html/padlock.png' @@ -362,26 +550,19 @@ GLOBAL_LIST_EMPTY(asset_datums) var/datum/language/L = new path () L.get_icon() -/datum/asset/simple/icon_states/emojis - icon = 'icons/emoji.dmi' - generic_icon_names = TRUE +/datum/asset/spritesheet/pipes + name = "pipes" -/datum/asset/simple/icon_states/multiple_icons/pipes - icons = list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi') - prefix = "pipe" - -/datum/asset/simple/icon_states/multiple_icons/pipes/New() - directions = GLOB.alldirs +/datum/asset/spritesheet/pipes/register() + for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi')) + InsertAll("", each, GLOB.alldirs) ..() -/datum/asset/simple/icon_states/multiple_icons/pipes/register() - ..() - var/meter = icon('icons/obj/atmospherics/pipes/simple.dmi', "meterX", SOUTH, frame, movement_states) - if(meter) - register_asset(sanitize_filename("[prefix].south.meterX.png"), fcopy_rsc(meter)) - // Representative icons for each research design -/datum/asset/simple/research_designs/register() +/datum/asset/spritesheet/research_designs + name = "design" + +/datum/asset/spritesheet/research_designs/register() for (var/path in subtypesof(/datum/design)) var/datum/design/D = path @@ -401,7 +582,6 @@ GLOBAL_LIST_EMPTY(asset_datums) if (machine) item = machine var/icon_file = initial(item.icon) - var/all_states = icon_states(icon_file) var/icon/I = icon(icon_file, initial(item.icon_state), SOUTH) // computers (and snowflakes) get their screen and keyboard sprites @@ -409,10 +589,11 @@ GLOBAL_LIST_EMPTY(asset_datums) var/obj/machinery/computer/C = item var/screen = initial(C.icon_screen) var/keyboard = initial(C.icon_keyboard) + var/all_states = icon_states(icon_file) if (screen && (screen in all_states)) I.Blend(icon(icon_file, screen, SOUTH), ICON_OVERLAY) if (keyboard && (keyboard in all_states)) I.Blend(icon(icon_file, keyboard, SOUTH), ICON_OVERLAY) - assets["design_[initial(D.id)].png"] = I + Insert(initial(D.id), I) return ..() diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index d413353b11..11c3e3c899 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -92,7 +92,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if (citadel_client_procs(href_list)) return // CITADEL End - + switch(href_list["_src_"]) if("holder") hsrc = holder @@ -403,9 +403,9 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) var/datum/verbs/menu/menuitem = GLOB.menulist[thing] if (menuitem) menuitem.Load_checked(src) - + hook_vr("client_new",list(src)) // CIT CHANGE - hook for client/New() changes - + Master.UpdateTickRate() ////////////// @@ -484,7 +484,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) if (CONFIG_GET(flag/panic_bunker) && !holder && !GLOB.deadmins[ckey]) log_access("Failed Login: [key] - New account attempting to connect during panic bunker") message_admins("Failed Login: [key] - New account attempting to connect during panic bunker") - to_chat(src, "Sorry but the server is currently not accepting connections from never before seen players.") + to_chat(src, "You must first join the Discord to verify your account before joining this server. Please ping an admin once you've joined and read the rules. https://discord.gg/E6SQuhz") //CIT CHANGE - makes the panic bunker disconnect message point to the discord var/list/connectiontopic_a = params2list(connectiontopic) var/list/panic_addr = CONFIG_GET(string/panic_server_address) if(panic_addr && !connectiontopic_a["redirect"]) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 7558380a36..a95686f581 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -83,12 +83,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) //Mob preview var/icon/preview_icon = null - //Trait list - var/list/positive_traits = list() - var/list/negative_traits = list() - var/list/neutral_traits = list() - var/list/all_traits = list() - var/list/character_traits = list() + //Quirk list + var/list/positive_quirks = list() + var/list/negative_quirks = list() + var/list/neutral_quirks = list() + var/list/all_quirks = list() + var/list/character_quirks = list() //Jobs, uses bitflags var/job_civilian_high = 0 @@ -120,6 +120,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/parallax + var/ambientocclusion = TRUE + var/uplink_spawn_loc = UPLINK_PDA var/list/exp = list() @@ -193,9 +195,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "

    Occupation Choices

    " dat += "Set Occupation Preferences
    " if(CONFIG_GET(flag/roundstart_traits)) - dat += "

    Trait Setup

    " - dat += "Configure Traits
    " - dat += "
    Current traits: [all_traits.len ? all_traits.Join(", ") : "None"]
    " + dat += "

    Quirk Setup

    " + dat += "Configure Quirks
    " + dat += "
    Current quirks: [all_quirks.len ? all_quirks.Join(", ") : "None"]
    " dat += "

    Identity

    " dat += "
    " if(jobban_isbanned(user, "appearance")) @@ -490,6 +492,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "High" dat += "
    " + dat += "Ambient Occlusion: [ambientocclusion ? "Enabled" : "Disabled"]
    " + dat += "
    " dat += "

    Special Role Settings

    " @@ -855,72 +859,72 @@ GLOBAL_LIST_EMPTY(preferences_datums) return job_engsec_low return 0 -/datum/preferences/proc/SetTraits(mob/user) - if(!SStraits) - to_chat(user, "The trait subsystem is still initializing! Try again in a minute.") +/datum/preferences/proc/SetQuirks(mob/user) + if(!SSquirks) + to_chat(user, "The quirk subsystem is still initializing! Try again in a minute.") return var/list/dat = list() - if(!SStraits.traits.len) - dat += "The trait subsystem hasn't finished initializing, please hold..." + if(!SSquirks.quirks.len) + dat += "The quirk subsystem hasn't finished initializing, please hold..." dat += "
    Done

    " else - dat += "
    Choose trait setup

    " - dat += "
    Left-click to add or remove traits. You need one negative trait for every positive trait.
    \ - Traits are applied at roundstart and cannot normally be removed.
    " + dat += "
    Choose quirk setup

    " + dat += "
    Left-click to add or remove quirks. You need negative quirks to have positive ones.
    \ + Quirks are applied at roundstart and cannot normally be removed.
    " dat += "
    Done
    " dat += "
    " - dat += "
    Current traits: [all_traits.len ? all_traits.Join(", ") : "None"]
    " - dat += "
    [all_traits.len] / [MAX_TRAITS] max traits
    \ - Trait balance remaining: [GetTraitBalance()]

    " - for(var/V in SStraits.traits) - var/datum/trait/T = SStraits.traits[V] - var/trait_name = initial(T.name) - var/has_trait - var/trait_cost = initial(T.value) * -1 + dat += "
    Current quirks: [all_quirks.len ? all_quirks.Join(", ") : "None"]
    " + dat += "
    [positive_quirks.len] / [MAX_QUIRKS] max positive quirks
    \ + Quirk balance remaining: [GetQuirkBalance()]

    " + for(var/V in SSquirks.quirks) + var/datum/quirk/T = SSquirks.quirks[V] + var/quirk_name = initial(T.name) + var/has_quirk + var/quirk_cost = initial(T.value) * -1 var/lock_reason = "This trait is unavailable." - var/trait_conflict = FALSE - for(var/_V in all_traits) - if(_V == trait_name) - has_trait = TRUE - if(initial(T.mood_trait) && CONFIG_GET(flag/disable_human_mood)) + var/quirk_conflict = FALSE + for(var/_V in all_quirks) + if(_V == quirk_name) + has_quirk = TRUE + if(initial(T.mood_quirk) && CONFIG_GET(flag/disable_human_mood)) lock_reason = "Mood is disabled." - trait_conflict = TRUE - if(has_trait) - if(trait_conflict) - all_traits -= trait_name - has_trait = FALSE + quirk_conflict = TRUE + if(has_quirk) + if(quirk_conflict) + all_quirks -= quirk_name + has_quirk = FALSE else - trait_cost *= -1 //invert it back, since we'd be regaining this amount - if(trait_cost > 0) - trait_cost = "+[trait_cost]" + quirk_cost *= -1 //invert it back, since we'd be regaining this amount + if(quirk_cost > 0) + quirk_cost = "+[quirk_cost]" var/font_color = "#AAAAFF" if(initial(T.value) != 0) font_color = initial(T.value) > 0 ? "#AAFFAA" : "#FFAAAA" - if(trait_conflict) - dat += "[trait_name] - [initial(T.desc)] \ + if(quirk_conflict) + dat += "[quirk_name] - [initial(T.desc)] \ LOCKED: [lock_reason]
    " else - if(has_trait) - dat += "[trait_name] - [initial(T.desc)] \ - [has_trait ? "Lose" : "Take"] ([trait_cost] pts.)
    " + if(has_quirk) + dat += "[quirk_name] - [initial(T.desc)] \ + [has_quirk ? "Lose" : "Take"] ([quirk_cost] pts.)
    " else - dat += "[trait_name] - [initial(T.desc)] \ - [has_trait ? "Lose" : "Take"] ([trait_cost] pts.)
    " + dat += "[quirk_name] - [initial(T.desc)] \ + [has_quirk ? "Lose" : "Take"] ([quirk_cost] pts.)
    " dat += "
    Reset Traits
    " user << browse(null, "window=preferences") - var/datum/browser/popup = new(user, "mob_occupation", "
    Trait Preferences
    ", 900, 600) //no reason not to reuse the occupation window, as it's cleaner that way + var/datum/browser/popup = new(user, "mob_occupation", "
    Quirk Preferences
    ", 900, 600) //no reason not to reuse the occupation window, as it's cleaner that way popup.set_window_options("can_close=0") popup.set_content(dat.Join()) popup.open(0) return -/datum/preferences/proc/GetTraitBalance() +/datum/preferences/proc/GetQuirkBalance() var/bal = 0 - for(var/V in all_traits) - var/datum/trait/T = SStraits.traits[V] + for(var/V in all_quirks) + var/datum/quirk/T = SSquirks.quirks[V] bal -= initial(T.value) return bal @@ -977,55 +981,49 @@ GLOBAL_LIST_EMPTY(preferences_datums) user << browse(null, "window=mob_occupation") ShowChoices(user) if("update") - var/trait = href_list["trait"] - if(!SStraits.traits[trait]) + var/quirk = href_list["trait"] + if(!SSquirks.quirks[quirk]) return - var/value = SStraits.trait_points[trait] + var/value = SSquirks.quirk_points[quirk] if(value == 0) - if(trait in neutral_traits) - neutral_traits -= trait - all_traits -= trait + if(quirk in neutral_quirks) + neutral_quirks -= quirk + all_quirks -= quirk else - if(all_traits.len >= MAX_TRAITS) - to_chat(user, "You can't have more than [MAX_TRAITS] traits!") - return - neutral_traits += trait - all_traits += trait + neutral_quirks += quirk + all_quirks += quirk else - var/balance = GetTraitBalance() - if(trait in positive_traits) - positive_traits -= trait - all_traits -= trait - else if(trait in negative_traits) + var/balance = GetQuirkBalance() + if(quirk in positive_quirks) + positive_quirks -= quirk + all_quirks -= quirk + else if(quirk in negative_quirks) if(balance + value < 0) to_chat(user, "Refunding this would cause you to go below your balance!") return - negative_traits -= trait - all_traits -= trait + negative_quirks -= quirk + all_quirks -= quirk else if(value > 0) - if(all_traits.len >= MAX_TRAITS) - to_chat(user, "You can't have more than [MAX_TRAITS] traits!") + if(positive_quirks.len >= MAX_QUIRKS) + to_chat(user, "You can't have more than [MAX_QUIRKS] positive quirks!") return if(balance - value < 0) - to_chat(user, "You don't have enough balance to gain this trait!") + to_chat(user, "You don't have enough balance to gain this quirk!") return - positive_traits += trait - all_traits += trait + positive_quirks += quirk + all_quirks += quirk else - if(all_traits.len >= MAX_TRAITS) - to_chat(user, "You can't have more than [MAX_TRAITS] traits!") - return - negative_traits += trait - all_traits += trait - SetTraits(user) + negative_quirks += quirk + all_quirks += quirk + SetQuirks(user) if("reset") - all_traits = list() - positive_traits = list() - negative_traits = list() - neutral_traits = list() - SetTraits(user) + all_quirks = list() + positive_quirks = list() + negative_quirks = list() + neutral_quirks = list() + SetQuirks(user) else - SetTraits(user) + SetQuirks(user) return TRUE switch(href_list["task"]) @@ -1535,6 +1533,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) cit_toggles ^= DIGESTION_NOISES //END CITADEL EDIT + if("ambientocclusion") + ambientocclusion = !ambientocclusion + if(parent && parent.screen && parent.screen.len) + var/obj/screen/plane_master/game_world/PM = locate(/obj/screen/plane_master/game_world) in parent.screen + PM.filters -= AMBIENT_OCCLUSION + if(ambientocclusion) + PM.filters += AMBIENT_OCCLUSION + if("save") save_preferences() save_character() @@ -1642,4 +1648,4 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(icon_updates) character.update_body() character.update_hair() - character.update_body_parts() \ No newline at end of file + character.update_body_parts() diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index d2efc477c6..f17ddf8b7c 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -130,6 +130,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["uses_glasses_colour"]>> uses_glasses_colour S["clientfps"] >> clientfps S["parallax"] >> parallax + S["ambientocclusion"] >> ambientocclusion S["menuoptions"] >> menuoptions S["enable_tips"] >> enable_tips S["tip_delay"] >> tip_delay @@ -160,6 +161,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) clientfps = sanitize_integer(clientfps, 0, 1000, 0) parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null) + ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion)) ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form)) ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit)) ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION) @@ -210,6 +212,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["uses_glasses_colour"], uses_glasses_colour) WRITE_FILE(S["clientfps"], clientfps) WRITE_FILE(S["parallax"], parallax) + WRITE_FILE(S["ambientocclusion"], ambientocclusion) WRITE_FILE(S["menuoptions"], menuoptions) WRITE_FILE(S["enable_tips"], enable_tips) WRITE_FILE(S["tip_delay"], tip_delay) @@ -310,11 +313,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["job_engsec_med"] >> job_engsec_med S["job_engsec_low"] >> job_engsec_low - //Traits - S["all_traits"] >> all_traits - S["positive_traits"] >> positive_traits - S["negative_traits"] >> negative_traits - S["neutral_traits"] >> neutral_traits + //Quirks + S["all_quirks"] >> all_quirks + S["positive_quirks"] >> positive_quirks + S["negative_quirks"] >> negative_quirks + S["neutral_quirks"] >> neutral_quirks //Citadel code S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"] @@ -421,10 +424,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med)) job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) - all_traits = SANITIZE_LIST(all_traits) - positive_traits = SANITIZE_LIST(positive_traits) - negative_traits = SANITIZE_LIST(negative_traits) - neutral_traits = SANITIZE_LIST(neutral_traits) + all_quirks = SANITIZE_LIST(all_quirks) + positive_quirks = SANITIZE_LIST(positive_quirks) + negative_quirks = SANITIZE_LIST(negative_quirks) + neutral_quirks = SANITIZE_LIST(neutral_quirks) cit_character_pref_load(S) @@ -491,11 +494,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["job_engsec_med"] , job_engsec_med) WRITE_FILE(S["job_engsec_low"] , job_engsec_low) - //Traits - WRITE_FILE(S["all_traits"] , all_traits) - WRITE_FILE(S["positive_traits"] , positive_traits) - WRITE_FILE(S["negative_traits"] , negative_traits) - WRITE_FILE(S["neutral_traits"] , neutral_traits) + //Quirks + WRITE_FILE(S["all_quirks"] , all_quirks) + WRITE_FILE(S["positive_quirks"] , positive_quirks) + WRITE_FILE(S["negative_quirks"] , negative_quirks) + WRITE_FILE(S["neutral_quirks"] , neutral_quirks) cit_character_pref_save(S) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index b15109bcb1..9ab929ba20 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -81,12 +81,14 @@ /obj/item/clothing/equipped(mob/user, slot) ..() - + if (!istype(user)) + return if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item? - for(var/variable in user_vars_to_edit) - if(variable in user.vars) - user_vars_remembered[variable] = user.vars[variable] - user.vars[variable] = user_vars_to_edit[variable] + if (LAZYLEN(user_vars_to_edit)) + for(var/variable in user_vars_to_edit) + if(variable in user.vars) + LAZYSET(user_vars_remembered, variable, user.vars[variable]) + user.vv_edit_var(variable, user_vars_to_edit[variable]) /obj/item/clothing/examine(mob/user) ..() @@ -285,4 +287,4 @@ BLIND // can't see anything Shreds.desc = "The sad remains of what used to be [name]." deconstruct(FALSE) else - ..() \ No newline at end of file + ..() diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index eaeedee36c..effe54aa51 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -365,6 +365,7 @@ scan_reagents = 1 flags_1 = NODROP_1 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + resistance_flags = LAVA_PROOF | FIRE_PROOF /obj/item/clothing/glasses/godeye/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, src) && W != src && W.loc == user) diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index 439197f285..347bc809a3 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -93,7 +93,7 @@ MA.alpha = 180 MA.maptext = "[strength]k" MA.color = "#64C864" - MA.layer = AREA_LAYER + MA.layer = FLY_LAYER pic.appearance = MA flick_overlay(pic, list(user.client), 8) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 2e9b7f83f2..4bf68c3bd0 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -158,12 +158,20 @@ strip_delay = 100 dog_fashion = null +/obj/item/clothing/head/helmet/roman/fake + desc = "An ancient helmet made of plastic and leather." + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + /obj/item/clothing/head/helmet/roman/legionaire name = "roman legionaire helmet" desc = "An ancient helmet made of bronze and leather. Has a red crest on top of it." icon_state = "roman_c" item_state = "roman_c" +/obj/item/clothing/head/helmet/roman/legionaire/fake + desc = "An ancient helmet made of plastic and leather. Has a red crest on top of it." + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + /obj/item/clothing/head/helmet/gladiator name = "gladiator helmet" desc = "Ave, Imperator, morituri te salutant." diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 74d8a43347..2c03997a4a 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -321,4 +321,27 @@ name = "headress of Nemes" desc = "Lavish space tomb not included." icon_state = "nemes_headdress" - icon_state = "nemes_headdress" \ No newline at end of file + icon_state = "nemes_headdress" + +/obj/item/clothing/head/frenchberet + name = "french beret" + desc = "A quality beret, infused with the aroma of chain-smoking, wine-swilling Parisians. You feel less inclined to engage military conflict, for some reason." + icon_state = "beretblack" + +/obj/item/clothing/head/frenchberet/speechModification(M) + if(copytext(M, 1, 2) != "*") + M = " [M]" + var/list/french_words = strings("french_replacement.json", "french") + + for(var/key in french_words) + var/value = french_words[key] + if(islist(value)) + value = pick(value) + + M = replacetextEx(M, " [uppertext(key)]", " [uppertext(value)]") + M = replacetextEx(M, " [capitalize(key)]", " [capitalize(value)]") + M = replacetextEx(M, " [key]", " [value]") + + if(prob(3)) + M += pick(" Honh honh honh!"," Honh!"," Zut Alors!") + return trim(M) \ No newline at end of file diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 53bd5f32a4..96b8517e92 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -47,7 +47,7 @@ /obj/item/clothing/mask/fakemoustache/italian/speechModification(M) if(copytext(M, 1, 2) != "*") M = " [M]" - var/list/italian_words = strings("word_replacement.json", "italian") + var/list/italian_words = strings("italian_replacement.json", "italian") for(var/key in italian_words) var/value = italian_words[key] diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 68d7073612..f5b4a31290 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -126,7 +126,7 @@ if(user.transferItemToLoc(I, src)) jetpack = I to_chat(user, "You successfully install the jetpack into [src].") - + return else if(istype(I, /obj/item/screwdriver)) if(!jetpack) to_chat(user, "[src] has no jetpack installed.") @@ -139,6 +139,8 @@ jetpack.forceMove(drop_location()) jetpack = null to_chat(user, "You successfully remove the jetpack from [src].") + return + return ..() /obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot) @@ -237,6 +239,9 @@ brightness_on = 7 allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator) +/obj/item/clothing/head/helmet/space/hardsuit/mining/Initialize() + . = ..() + AddComponent(/datum/component/armor_plate) /obj/item/clothing/suit/space/hardsuit/mining icon_state = "hardsuit-mining" @@ -250,6 +255,10 @@ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS +/obj/item/clothing/suit/space/hardsuit/mining/Initialize() + . = ..() + AddComponent(/datum/component/armor_plate) + //Syndicate hardsuit /obj/item/clothing/head/helmet/space/hardsuit/syndi name = "blood-red hardsuit helmet" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 37d48b484e..af6d2b6c5e 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -165,186 +165,6 @@ . = ..() allowed = GLOB.detective_vest_allowed -//Reactive armor -/obj/item/clothing/suit/armor/reactive - name = "reactive armor" - desc = "Doesn't seem to do much for some reason." - var/active = 0 - var/reactivearmor_cooldown_duration = 0 //cooldown specific to reactive armor - var/reactivearmor_cooldown = 0 - icon_state = "reactiveoff" - item_state = "reactiveoff" - blood_overlay_type = "armor" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) - actions_types = list(/datum/action/item_action/toggle) - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - hit_reaction_chance = 50 - - -/obj/item/clothing/suit/armor/reactive/attack_self(mob/user) - src.active = !( src.active ) - if (src.active) - to_chat(user, "[src] is now active.") - src.icon_state = "reactive" - src.item_state = "reactive" - else - to_chat(user, "[src] is now inactive.") - src.icon_state = "reactiveoff" - src.item_state = "reactiveoff" - src.add_fingerprint(user) - return - -/obj/item/clothing/suit/armor/reactive/emp_act(severity) - active = 0 - src.icon_state = "reactiveoff" - src.item_state = "reactiveoff" - reactivearmor_cooldown = world.time + 200 - ..() - -//When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!) -/obj/item/clothing/suit/armor/reactive/teleport - name = "reactive teleport armor" - desc = "Someone separated our Research Director from his own head!" - var/tele_range = 6 - var/rad_amount= 15 - reactivearmor_cooldown_duration = 100 - -/obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(!active) - return 0 - if(prob(hit_reaction_chance)) - var/mob/living/carbon/human/H = owner - if(world.time < reactivearmor_cooldown) - owner.visible_message("The reactive teleport system is still recharging! It fails to teleport [H]!") - return - owner.visible_message("The reactive teleport system flings [H] clear of [attack_text], shutting itself off in the process!") - var/list/turfs = new/list() - for(var/turf/T in orange(tele_range, H)) - if(T.density) - continue - if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.yThe reactive incendiary armor on [owner] activates, but fails to send out flames as it is still recharging its flame jets!") - return - owner.visible_message("[src] blocks [attack_text], sending out jets of flame!") - for(var/mob/living/carbon/C in range(6, owner)) - if(C != owner) - C.fire_stacks += 8 - C.IgniteMob() - owner.fire_stacks = -20 - reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration - return 1 - return 0 - - -/obj/item/clothing/suit/armor/reactive/stealth - name = "reactive stealth armor" - desc = "An experimental suit of armor that renders the wearer invisible on detection of imminent harm, and creates a decoy that runs away from the owner. You can't fight what you can't see." - -/obj/item/clothing/suit/armor/reactive/stealth/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(!active) - return 0 - if(prob(hit_reaction_chance)) - if(world.time < reactivearmor_cooldown) - owner.visible_message("The reactive stealth system on [owner] activates, but is still recharging its holographic emitters!") - return - var/mob/living/simple_animal/hostile/illusion/escape/E = new(owner.loc) - E.Copy_Parent(owner, 50) - E.GiveTarget(owner) //so it starts running right away - E.Goto(owner, E.move_to_delay, E.minimum_distance) - owner.alpha = 0 - owner.visible_message("[owner] is hit by [attack_text] in the chest!") //We pretend to be hit, since blocking it would stop the message otherwise - spawn(40) - owner.alpha = initial(owner.alpha) - reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration - return 1 - -/obj/item/clothing/suit/armor/reactive/tesla - name = "reactive tesla armor" - desc = "An experimental suit of armor with sensitive detectors hooked up to a huge capacitor grid, with emitters strutting out of it. Zap." - siemens_coefficient = -1 - var/tesla_power = 25000 - var/tesla_range = 20 - var/tesla_boom = FALSE - var/tesla_stun = FALSE - -/obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(!active) - return 0 - if(prob(hit_reaction_chance)) - if(world.time < reactivearmor_cooldown) - var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread - sparks.set_up(1, 1, src) - sparks.start() - owner.visible_message("The tesla capacitors on [owner]'s reactive tesla armor are still recharging! The armor merely emits some sparks.") - return - owner.visible_message("[src] blocks [attack_text], sending out arcs of lightning!") - tesla_zap(owner,tesla_range,tesla_power,tesla_boom, tesla_stun) - reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration - return 1 - -/obj/item/clothing/suit/armor/reactive/table - name = "reactive table armor" - desc = "If you can't beat the memes, embrace them." - var/tele_range = 10 - -/obj/item/clothing/suit/armor/reactive/table/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(!active) - return 0 - if(prob(hit_reaction_chance)) - var/mob/living/carbon/human/H = owner - if(world.time < reactivearmor_cooldown) - owner.visible_message("The reactive table armor's fabricators are still on cooldown!") - return - owner.visible_message("The reactive teleport system flings [H] clear of [attack_text] and slams them into a fabricated table!") - owner.visible_message("[H] GOES ON THE TABLE!!!") - owner.Knockdown(40) - var/list/turfs = new/list() - for(var/turf/T in orange(tele_range, H)) - if(T.density) - continue - if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.y[src] is now active.") + icon_state = "reactive" + item_state = "reactive" + else + to_chat(user, "[src] is now inactive.") + icon_state = "reactiveoff" + item_state = "reactiveoff" + add_fingerprint(user) + return + +/obj/item/clothing/suit/armor/reactive/emp_act(severity) + active = 0 + icon_state = "reactiveoff" + item_state = "reactiveoff" + reactivearmor_cooldown = world.time + 200 + ..() + +//When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!) +/obj/item/clothing/suit/armor/reactive/teleport + name = "reactive teleport armor" + desc = "Someone separated our Research Director from his own head!" + var/tele_range = 6 + var/rad_amount= 15 + reactivearmor_cooldown_duration = 100 + +/obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(!active) + return 0 + if(prob(hit_reaction_chance)) + var/mob/living/carbon/human/H = owner + if(world.time < reactivearmor_cooldown) + owner.visible_message("The reactive teleport system is still recharging! It fails to teleport [H]!") + return + owner.visible_message("The reactive teleport system flings [H] clear of [attack_text], shutting itself off in the process!") + var/list/turfs = new/list() + for(var/turf/T in orange(tele_range, H)) + if(T.density) + continue + if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.yThe reactive incendiary armor on [owner] activates, but fails to send out flames as it is still recharging its flame jets!") + return + owner.visible_message("[src] blocks [attack_text], sending out jets of flame!") + for(var/mob/living/carbon/C in range(6, owner)) + if(C != owner) + C.fire_stacks += 8 + C.IgniteMob() + owner.fire_stacks = -20 + reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration + return 1 + return 0 + +//Stealth + +/obj/item/clothing/suit/armor/reactive/stealth + name = "reactive stealth armor" + desc = "An experimental suit of armor that renders the wearer invisible on detection of imminent harm, and creates a decoy that runs away from the owner. You can't fight what you can't see." + +/obj/item/clothing/suit/armor/reactive/stealth/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(!active) + return 0 + if(prob(hit_reaction_chance)) + if(world.time < reactivearmor_cooldown) + owner.visible_message("The reactive stealth system on [owner] activates, but is still recharging its holographic emitters!") + return + var/mob/living/simple_animal/hostile/illusion/escape/E = new(owner.loc) + E.Copy_Parent(owner, 50) + E.GiveTarget(owner) //so it starts running right away + E.Goto(owner, E.move_to_delay, E.minimum_distance) + owner.alpha = 0 + owner.visible_message("[owner] is hit by [attack_text] in the chest!") //We pretend to be hit, since blocking it would stop the message otherwise + spawn(40) + owner.alpha = initial(owner.alpha) + reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration + return 1 + +//Tesla + +/obj/item/clothing/suit/armor/reactive/tesla + name = "reactive tesla armor" + desc = "An experimental suit of armor with sensitive detectors hooked up to a huge capacitor grid, with emitters strutting out of it. Zap." + siemens_coefficient = -1 + var/tesla_power = 25000 + var/tesla_range = 20 + var/tesla_boom = FALSE + var/tesla_stun = FALSE + +/obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(!active) + return 0 + if(prob(hit_reaction_chance)) + if(world.time < reactivearmor_cooldown) + var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread + sparks.set_up(1, 1, src) + sparks.start() + owner.visible_message("The tesla capacitors on [owner]'s reactive tesla armor are still recharging! The armor merely emits some sparks.") + return + owner.visible_message("[src] blocks [attack_text], sending out arcs of lightning!") + tesla_zap(owner,tesla_range,tesla_power,tesla_boom, tesla_stun) + reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration + return 1 + + +//Repulse + +/obj/item/clothing/suit/armor/reactive/repulse + name = "reactive repulse armor" + desc = "An experimental suit of armor that violently throws back attackers." + +/obj/item/clothing/suit/armor/reactive/repulse/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(!active) + return 0 + if(prob(hit_reaction_chance)) + if(world.time < reactivearmor_cooldown) + owner.visible_message("The repulse generator is still recharging!") + return 0 + owner.visible_message("[src] blocks [attack_text], converting the attack into a wave of force!") + var/turf/T = get_turf(owner) + var/list/thrown_items = list() + for(var/atom/movable/A in range(T, 7)) + if(A == owner || A.anchored || thrown_items[A]) + continue + var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src))) + A.throw_at(throwtarget,10,1) + thrown_items[A] = A + + reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration + return 1 + +/obj/item/clothing/suit/armor/reactive/table + name = "reactive table armor" + desc = "If you can't beat the memes, embrace them." + var/tele_range = 10 + +/obj/item/clothing/suit/armor/reactive/table/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(!active) + return 0 + if(prob(hit_reaction_chance)) + var/mob/living/carbon/human/H = owner + if(world.time < reactivearmor_cooldown) + owner.visible_message("The reactive table armor's fabricators are still on cooldown!") + return + owner.visible_message("The reactive teleport system flings [H] clear of [attack_text] and slams them into a fabricated table!") + owner.visible_message("[H] GOES ON THE TABLE!!!") + owner.Knockdown(40) + var/list/turfs = new/list() + for(var/turf/T in orange(tele_range, H)) + if(T.density) + continue + if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.y + diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 4f740f4e61..701167c853 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -70,6 +70,7 @@ begin_month = DECEMBER end_day = 2 end_month = JANUARY + drone_hat = /obj/item/clothing/head/festive /datum/holiday/new_year/getStationPrefix() return pick("Party","New","Hangover","Resolution") @@ -78,6 +79,7 @@ name = "Groundhog Day" begin_day = 2 begin_month = FEBRUARY + drone_hat = /obj/item/clothing/head/helmet/space/chronos /datum/holiday/valentines name = VALENTINES @@ -92,6 +94,7 @@ name = "Birthday of Space Station 13" begin_day = 16 begin_month = FEBRUARY + drone_hat = /obj/item/clothing/head/festive /datum/holiday/birthday/greet() var/game_age = text2num(time2text(world.timeofday, "YY")) - 3 @@ -202,6 +205,7 @@ name = "UFO Day" begin_day = 2 begin_month = JULY + drone_hat = /obj/item/clothing/mask/facehugger/dead /datum/holiday/UFO/getStationPrefix() //Is such a thing even possible? return pick("Ayy","Truth","Tsoukalos","Mulder") //Yes it is! @@ -272,11 +276,13 @@ name = "Smiling Day" begin_day = 7 begin_month = OCTOBER + drone_hat = /obj/item/clothing/head/papersack/smiley /datum/holiday/boss name = "Boss' Day" begin_day = 16 begin_month = OCTOBER + drone_hat = /obj/item/clothing/head/that /datum/holiday/halloween name = HALLOWEEN @@ -305,6 +311,7 @@ name = "Flowers Day" begin_day = 19 begin_month = NOVEMBER + drone_hat = /obj/item/reagent_containers/food/snacks/grown/moonflower /datum/holiday/hello name = "Saying-'Hello' Day" @@ -312,7 +319,7 @@ begin_month = NOVEMBER /datum/holiday/hello/greet() - return "[pick(list("Aloha", "Bonjour", "Hello", "Hi", "Greetings", "Salutations", "Bienvenidos", "Hola", "Howdy"))]! " + ..() + return "[pick(list("Aloha", "Bonjour", "Hello", "Hi", "Greetings", "Salutations", "Bienvenidos", "Hola", "Howdy", "Ni hao", "Guten Tag", "Konnichiwa", "G'day cunt"))]! " + ..() /datum/holiday/human_rights name = "Human-Rights Day" @@ -323,6 +330,7 @@ name = "Monkey Day" begin_day = 14 begin_month = DECEMBER + drone_hat = /obj/item/clothing/mask/gas/monkeymask /datum/holiday/thanksgiving name = "Thanksgiving in the United States" diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 624394f878..6da117da88 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -262,8 +262,7 @@ if(!check_cost(D.materials, amount)) return FALSE - var/obj/item/stack/product = new D.build_path(loc) - product.amount = amount + new D.build_path(drop_location(), amount) for(var/R in D.make_reagents) beaker.reagents.add_reagent(R, D.make_reagents[R]*amount) else diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index dd1d1777d8..f0c7bba885 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -85,14 +85,15 @@ interact(user) return else if(istype(I, /obj/item/disk/plantgene)) - if(disk) - to_chat(user, "A data disk is already loaded into the machine!") - else - if(!user.transferItemToLoc(I, src)) - return - disk = I - to_chat(user, "You add [I] to the machine.") - interact(user) + if (operation) + to_chat(user, "Please complete current operation.") + return + eject_disk() + if(!user.transferItemToLoc(I, src)) + return + disk = I + to_chat(user, "You add [I] to the machine.") + interact(user) else ..() @@ -266,18 +267,13 @@ to_chat(usr, "You add [I] to the machine.") update_icon() else if(href_list["eject_disk"] && !operation) - if (disk) - disk.forceMove(drop_location()) - disk.verb_pickup() - disk = null - update_genes() - else - var/obj/item/I = usr.get_active_held_item() - if(istype(I, /obj/item/disk/plantgene)) - if(!usr.transferItemToLoc(I, src)) - return - disk = I - to_chat(usr, "You add [I] to the machine.") + var/obj/item/I = usr.get_active_held_item() + eject_disk() + if(istype(I, /obj/item/disk/plantgene)) + if(!usr.transferItemToLoc(I, src)) + return + disk = I + to_chat(usr, "You add [I] to the machine.") else if(href_list["op"] == "insert" && disk && disk.gene && seed) if(!operation) // Wait for confirmation operation = "insert" @@ -365,6 +361,16 @@ update_genes() update_icon() +/obj/machinery/plantgenes/proc/eject_disk() + if (disk && !operation) + if(Adjacent(usr) && !issilicon(usr)) + if (!usr.put_in_hands(disk)) + disk.forceMove(drop_location()) + else + disk.forceMove(drop_location()) + disk = null + update_genes() + /obj/machinery/plantgenes/proc/update_genes() core_genes = list() reagent_genes = list() diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 630c072edb..8e55f8a15d 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -36,19 +36,8 @@ continue grassAmt += 1 + round(G.seed.potency * tile_coefficient) qdel(G) - var/obj/item/stack/tile/GT = new stacktype(user.loc) - while(grassAmt > GT.max_amount) - GT.amount = GT.max_amount - grassAmt -= GT.max_amount - GT = new stacktype(user.loc) - GT.amount = grassAmt - for(var/obj/item/stack/tile/T in user.loc) - if((T.type == stacktype) && (T.amount < T.max_amount)) - GT.merge(T) - if(GT.amount <= 0) - break + new stacktype(user.drop_location(), grassAmt) qdel(src) - return // Carpet /obj/item/seeds/grass/carpet diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 9eaa8747b9..55c0da91f2 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -22,7 +22,7 @@ var/blood_type = null var/list/features = null var/factions = null - var/list/traits = null + var/list/quirks = null var/contains_sample = 0 /obj/item/seeds/replicapod/Initialize() @@ -42,7 +42,7 @@ blood_type = B.data["blood_type"] features = B.data["features"] factions = B.data["factions"] - factions = B.data["traits"] + factions = B.data["quirks"] contains_sample = TRUE visible_message("The [src] is injected with a fresh blood sample.") else @@ -114,7 +114,7 @@ podman.faction |= factions if(!features["mcolor"]) features["mcolor"] = "#59CE00" - for(var/V in traits) + for(var/V in quirks) new V(podman) podman.hardset_dna(null,null,podman.real_name,blood_type, new /datum/species/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman podman.set_cloned_appearance() diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm index 5f7dd24ad9..6937857be0 100644 --- a/code/modules/integrated_electronics/subtypes/converters.dm +++ b/code/modules/integrated_electronics/subtypes/converters.dm @@ -142,21 +142,18 @@ /obj/item/integrated_circuit/converter/concatenator name = "concatenator" - desc = "This joins many strings together to get one big string." + desc = "This can join up to 8 strings together to get one big string." complexity = 4 - inputs = list( - "A" = IC_PINTYPE_STRING, - "B" = IC_PINTYPE_STRING, - "C" = IC_PINTYPE_STRING, - "D" = IC_PINTYPE_STRING, - "E" = IC_PINTYPE_STRING, - "F" = IC_PINTYPE_STRING, - "G" = IC_PINTYPE_STRING, - "H" = IC_PINTYPE_STRING - ) + inputs = list() outputs = list("result" = IC_PINTYPE_STRING) activators = list("concatenate" = IC_PINTYPE_PULSE_IN, "on concatenated" = IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + var/number_of_pins = 8 + +/obj/item/integrated_circuit/converter/concatenator/Initialize() + for(var/i = 1 to number_of_pins) + inputs["input [i]"] = IC_PINTYPE_STRING + . = ..() /obj/item/integrated_circuit/converter/concatenator/do_work() var/result = null @@ -169,6 +166,18 @@ push_data() activate_pin(2) +/obj/item/integrated_circuit/converter/concatenator/small + name = "small concatenator" + desc = "This can join up to 4 strings together to get one big string." + complexity = 2 + number_of_pins = 4 + +/obj/item/integrated_circuit/converter/concatenator/large + name = "large concatenator" + desc = "This can join up to 16 strings together to get one very big string." + complexity = 6 + number_of_pins = 16 + /obj/item/integrated_circuit/converter/separator name = "separator" desc = "This splits as single string into two at the relative split point." @@ -203,6 +212,32 @@ activate_pin(2) +/obj/item/integrated_circuit/converter/indexer + name = "indexer" + desc = "This circuit takes a string and an index value, then returns the character found at in the string at the given index." + extended_desc = "Make sure the index is not longer or shorter than the string length. If you don't, the circuit will return empty." + icon_state = "split" + complexity = 4 + inputs = list( + "string to index" = IC_PINTYPE_STRING, + "index" = IC_PINTYPE_NUMBER, + ) + outputs = list( + "found character" = IC_PINTYPE_STRING + ) + activators = list("index" = IC_PINTYPE_PULSE_IN, "on indexed" = IC_PINTYPE_PULSE_OUT) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/converter/indexer/do_work() + var/strin = get_pin_data(IC_INPUT, 1) + var/ind = get_pin_data(IC_INPUT, 2) + if(ind > 0 && ind <= length(strin)) + set_pin_data(IC_OUTPUT, 1, strin[ind]) + else + set_pin_data(IC_OUTPUT, 1, "") + push_data() + activate_pin(2) + /obj/item/integrated_circuit/converter/findstring name = "find text" desc = "This gives position of sample in the string. Or returns 0." @@ -216,14 +251,38 @@ outputs = list( "position" = IC_PINTYPE_NUMBER ) - activators = list("search" = IC_PINTYPE_PULSE_IN, "after search" = IC_PINTYPE_PULSE_OUT) + activators = list("search" = IC_PINTYPE_PULSE_IN, "after search" = IC_PINTYPE_PULSE_OUT, "found" = IC_PINTYPE_PULSE_OUT, "not found" = IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH /obj/item/integrated_circuit/converter/findstring/do_work() + var/position = findtext(get_pin_data(IC_INPUT, 1),get_pin_data(IC_INPUT, 2)) - set_pin_data(IC_OUTPUT, 1, findtext(get_pin_data(IC_INPUT, 1),get_pin_data(IC_INPUT, 2)) ) + set_pin_data(IC_OUTPUT, 1, position) + push_data() + + activate_pin(2) + if(position) + activate_pin(3) + else + activate_pin(4) + +/obj/item/integrated_circuit/converter/stringlength + name = "get length" + desc = "This circuit will return the number of characters in a string." + complexity = 1 + inputs = list( + "string" = IC_PINTYPE_STRING + ) + outputs = list( + "length" = IC_PINTYPE_NUMBER + ) + activators = list("get length" = IC_PINTYPE_PULSE_IN, "on acquisition" = IC_PINTYPE_PULSE_OUT) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/converter/stringlength/do_work() + set_pin_data(IC_OUTPUT, 1, length(get_pin_data(IC_INPUT, 1))) push_data() activate_pin(2) @@ -232,7 +291,8 @@ name = "string exploder" desc = "This splits a single string into a list of strings." extended_desc = "This circuit splits a given string into a list of strings based on the string and given delimiter. \ - For example, 'eat this burger' will be converted to list('eat','this','burger')." + For example, 'eat this burger' will be converted to list('eat','this','burger'). Leave the delimiter null to get a list \ + of every individual character." icon_state = "split" complexity = 4 inputs = list( @@ -248,7 +308,10 @@ /obj/item/integrated_circuit/converter/exploders/do_work() var/strin = get_pin_data(IC_INPUT, 1) var/delimiter = get_pin_data(IC_INPUT, 2) - set_pin_data(IC_OUTPUT, 1, splittext(strin, delimiter)) + if(delimiter == null) + set_pin_data(IC_OUTPUT, 1, string2charlist(strin)) + else + set_pin_data(IC_OUTPUT, 1, splittext(strin, delimiter)) push_data() activate_pin(2) diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm index 3aad52e596..b4679ae479 100644 --- a/code/modules/jobs/job_exp.dm +++ b/code/modules/jobs/job_exp.dm @@ -226,9 +226,14 @@ GLOBAL_PROTECT(exp_to_update) if(!rolefound) play_records["Unknown"] += minutes else - play_records[EXP_TYPE_GHOST] += minutes - if(announce_changes) - to_chat(src,"You got: [minutes] Ghost EXP!") + if(holder && !holder.deadmined) + play_records[EXP_TYPE_ADMIN] += minutes + if(announce_changes) + to_chat(src,"You got: [minutes] Admin EXP!") + else + play_records[EXP_TYPE_GHOST] += minutes + if(announce_changes) + to_chat(src,"You got: [minutes] Ghost EXP!") else if(isobserver(mob)) play_records[EXP_TYPE_GHOST] += minutes if(announce_changes) diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm index 3c36247c6d..e0202db132 100644 --- a/code/modules/jobs/job_types/civilian.dm +++ b/code/modules/jobs/job_types/civilian.dm @@ -91,7 +91,7 @@ Mime uniform = /obj/item/clothing/under/rank/mime mask = /obj/item/clothing/mask/gas/mime gloves = /obj/item/clothing/gloves/color/white - head = /obj/item/clothing/head/beret + head = /obj/item/clothing/head/frenchberet suit = /obj/item/clothing/suit/suspenders backpack_contents = list(/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing=1) diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm index 5f2e9963e7..8b9cc09dff 100644 --- a/code/modules/language/language.dm +++ b/code/modules/language/language.dm @@ -35,7 +35,8 @@ return TRUE /datum/language/proc/get_icon() - return "[icon2html(icon, world, icon_state)]" + var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/goonchat) + return sheet.icon_tag("language-[icon_state]") /datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4, syllable_divisor=2) if(!syllables || !syllables.len) diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index 0bfb0b5f6d..36eb9d5e1b 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -25,6 +25,14 @@ armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) resistance_flags = FIRE_PROOF +/obj/item/clothing/suit/hooded/explorer/Initialize() + . = ..() + AddComponent(/datum/component/armor_plate) + +/obj/item/clothing/head/hooded/explorer/Initialize() + . = ..() + AddComponent(/datum/component/armor_plate) + /obj/item/clothing/mask/gas/explorer name = "explorer gas mask" desc = "A military-grade gas mask that can be connected to an air supply." diff --git a/code/modules/mining/equipment/goliath_hide.dm b/code/modules/mining/equipment/goliath_hide.dm index b266b92584..85feaecf73 100644 --- a/code/modules/mining/equipment/goliath_hide.dm +++ b/code/modules/mining/equipment/goliath_hide.dm @@ -9,38 +9,4 @@ novariants = FALSE flags_1 = NOBLUDGEON_1 w_class = WEIGHT_CLASS_NORMAL - layer = MOB_LAYER - var/static/list/goliath_platable_armor_typecache = typecacheof(list( - /obj/item/clothing/head/helmet/space/hardsuit/mining, - /obj/item/clothing/suit/space/hardsuit/mining, - /obj/item/clothing/head/hooded/explorer, - /obj/item/clothing/suit/hooded/explorer)) - -/obj/item/stack/sheet/animalhide/goliath_hide/afterattack(atom/target, mob/user, proximity_flag) - if(!proximity_flag) - return - if(is_type_in_typecache(target, goliath_platable_armor_typecache)) - var/obj/item/clothing/C = target - if(C.armor.melee < 60) - C.armor = C.armor.setRating(melee = min(C.armor.melee + 10, 60)) - to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") - use(1) - else - to_chat(user, "You can't improve [C] any further!") - else if(istype(target, /obj/mecha/working/ripley)) - var/obj/mecha/working/ripley/D = target - if(D.hides < 3) - D.hides++ - D.armor = D.armor.setRating(\ - melee = min(D.armor.melee + 10, 70),\ - bullet = min(D.armor.bullet + 5, 50),\ - laser = min(D.armor.laser + 5, 50)) - to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") - D.update_icon() - if(D.hides == 3) - D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - its pilot must be an experienced monster hunter." - else - D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates." - use(1) - else - to_chat(user, "You can't improve [D] any further!") + layer = MOB_LAYER \ No newline at end of file diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index b7b3d91e54..d4735d1c75 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -303,13 +303,12 @@ desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num var/amount = round(min(desired,50,smelt_amount)) materials.use_amount(alloy.materials, amount) - var/output = new alloy.build_path(src) - if(istype(output, /obj/item/stack/sheet)) - var/obj/item/stack/sheet/produced_alloy = output - produced_alloy.amount = amount - unload_mineral(produced_alloy) + var/output + if(ispath(alloy.build_path, /obj/item/stack/sheet)) + output = new alloy.build_path(src, amount) else - unload_mineral(output) + output = new alloy.build_path(src) + unload_mineral(output) else to_chat(usr, "Required access not found.") return TRUE diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index e658f69395..f566a8f4a9 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -44,8 +44,7 @@ if(!(text2path(href_list["release"]) in machine.stack_list)) return //someone tried to spawn materials by spoofing hrefs var/obj/item/stack/sheet/inp = machine.stack_list[text2path(href_list["release"])] - var/obj/item/stack/sheet/out = new inp.type() - out.amount = inp.amount + var/obj/item/stack/sheet/out = new inp.type(null, inp.amount) inp.amount = 0 machine.unload_mineral(out) @@ -81,14 +80,12 @@ /obj/machinery/mineral/stacking_machine/proc/process_sheet(obj/item/stack/sheet/inp) if(!(inp.type in stack_list)) //It's the first of this sheet added - var/obj/item/stack/sheet/s = new inp.type(src,0) - s.amount = 0 + var/obj/item/stack/sheet/s = new inp.type(src, 0) stack_list[inp.type] = s var/obj/item/stack/sheet/storage = stack_list[inp.type] storage.amount += inp.amount //Stack the sheets qdel(inp) //Let the old sheet garbage collect while(storage.amount > stack_amt) //Get rid of excessive stackage - var/obj/item/stack/sheet/out = new inp.type() - out.amount = stack_amt + var/obj/item/stack/sheet/out = new inp.type(null, stack_amt) unload_mineral(out) storage.amount -= stack_amt diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 01ac36c57a..c6cc8a70ac 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -400,7 +400,7 @@ SSticker.mode.make_antag_chance(humanc) if(humanc && CONFIG_GET(flag/roundstart_traits)) - SStraits.AssignTraits(humanc, humanc.client, TRUE) + SSquirks.AssignQuirks(humanc, humanc.client, TRUE) log_manifest(character.mind.key,character.mind,character,latejoin = TRUE) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 8bfe33b3ea..e11a4fc886 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -592,6 +592,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/list/possessible = list() for(var/mob/living/L in GLOB.alive_mob_list) + if(istype(L,/mob/living/carbon/human/dummy) || !get_turf(L)) //Haha no. + continue if(!(L in GLOB.player_list) && !L.mind) possessible += L diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index a7b28dd658..48951e4cd3 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -326,7 +326,10 @@ I.plane = initial(I.plane) I.appearance_flags &= ~NO_CLIENT_COLOR if(!no_move && !(I.flags_1 & DROPDEL_1)) //item may be moved/qdel'd immedietely, don't bother moving it - I.forceMove(newloc) + if (isnull(newloc)) + I.moveToNullspace() + else + I.forceMove(newloc) I.dropped(src) return TRUE diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 68c6ed5c83..05a14ef3b1 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -193,10 +193,10 @@ blood_data["real_name"] = real_name blood_data["features"] = dna.features blood_data["factions"] = faction - blood_data["traits"] = list() - for(var/V in roundstart_traits) - var/datum/trait/T = V - blood_data["traits"] += T.type + blood_data["quirks"] = list() + for(var/V in roundstart_quirks) + var/datum/quirk/T = V + blood_data["quirks"] += T.type return blood_data //get the id of the substance this mob use as blood. diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 018f04ab8f..beb183e842 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -19,6 +19,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) //Inefficient pooling/caching way. GLOBAL_LIST_EMPTY(human_dummy_list) +GLOBAL_LIST_EMPTY(dummy_mob_list) /proc/generate_or_wait_for_human_dummy(slotkey) if(!slotkey) @@ -31,6 +32,7 @@ GLOBAL_LIST_EMPTY(human_dummy_list) if(QDELETED(D)) D = new GLOB.human_dummy_list[slotkey] = D + GLOB.dummy_mob_list += D D.in_use = TRUE return D diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 050a4f6d09..6cbbd69b4b 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -733,8 +733,8 @@ if(0 to NUTRITION_LEVEL_STARVING) to_chat(src, "You're starving!") - if(roundstart_traits.len) - to_chat(src, "You have these traits: [get_trait_string()].") + if(roundstart_quirks.len) + to_chat(src, "You have these quirks: [get_trait_string()].") else if(wear_suit) wear_suit.add_fingerprint(M) diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index 83d943ccbf..8a8c99bf32 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -13,7 +13,8 @@ message = T.TongueSpeech(message) if(wear_mask) message = wear_mask.speechModification(message) - + if(head) + message = head.speechModification(message) return message /mob/living/carbon/can_speak_vocal(message) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index bf06cd1ebb..e4aee188e0 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -407,16 +407,14 @@ */ //Recursive function to find everything a mob is holding. Really shitty proc tbh. /mob/living/get_contents() - . = list() - . |= list(src) - for(var/obj/o in .) - var/list/newlist = list() - o.SendSignal(COMSIG_TRY_STORAGE_RETURN_INVENTORY, newlist) - . |= newlist - for(var/obj/item/clothing/under/U in .) - . |= U.contents - for(var/obj/item/folder/F in .) - . |= F.contents + var/list/ret = list() + ret |= contents //add our contents + for(var/i in ret.Copy()) //iterate storage objects + var/atom/A = i + A.SendSignal(COMSIG_TRY_STORAGE_RETURN_INVENTORY, ret) + for(var/obj/item/folder/F in ret.Copy()) //very snowflakey-ly iterate folders + ret |= F.contents + return ret // Living mobs use can_inject() to make sure that the mob is not syringe-proof in general. /mob/living/proc/can_inject() @@ -494,6 +492,11 @@ ExtinguishMob() fire_stacks = 0 update_canmove() + GET_COMPONENT(mood, /datum/component/mood) + if (mood) + QDEL_LIST(mood.mood_events) + mood.sanity = SANITY_GREAT + mood.update_mood() //proc called by revive(), to check if we can actually ressuscitate the mob (we don't want to revive him and have him instantly die again) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 2b2e0de0b3..b12133c5a1 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -317,8 +317,7 @@ return shock_damage /mob/living/emp_act(severity) - var/list/L = src.get_contents() - for(var/obj/O in L) + for(var/obj/O in contents) O.emp_act(severity) ..() diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 6dfaa565fa..94b1e64f39 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -34,7 +34,7 @@ var/list/status_traits = list() - var/list/roundstart_traits = list() + var/list/roundstart_quirks = list() var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them. diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index faef19529e..662100eb7f 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -831,7 +831,7 @@ set_module = /obj/item/robot_module/janitor /mob/living/silicon/robot/modules/syndicate - icon_state = "syndie_bloodhound" + icon_state = "synd_sec" faction = list(ROLE_SYNDICATE) bubble_icon = "syndibot" req_access = list(ACCESS_SYNDICATE) @@ -859,7 +859,7 @@ return /mob/living/silicon/robot/modules/syndicate/medical - icon_state = "syndi-medi" + icon_state = "synd_medical" playstyle_string = "You are a Syndicate medical cyborg!
    \ You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \ Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \ diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index bdcde185d7..9926bc35fc 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -1,7 +1,7 @@ /obj/item/robot_module name = "Default" icon = 'icons/obj/module.dmi' - icon_state = "std_module" + icon_state = "std_mod" w_class = WEIGHT_CLASS_GIGANTIC item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index f0cc8285e8..f47f936db7 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -164,12 +164,7 @@ update_controls() /mob/living/simple_animal/bot/floorbot/proc/empty_tiles() - var/atom/Tsec = drop_location() - - while(specialtiles > initial(tiletype.max_amount)) - new tiletype(Tsec,initial(tiletype.max_amount)) - specialtiles -= initial(tiletype.max_amount) - new tiletype(Tsec,specialtiles) + new tiletype(drop_location(), specialtiles) specialtiles = 0 tiletype = null @@ -378,8 +373,7 @@ if(prob(50)) drop_part(robot_arm, Tsec) - var/obj/item/stack/tile/plasteel/T = new (Tsec) - T.amount = 1 + new /obj/item/stack/tile/plasteel(Tsec, 1) do_sparks(3, TRUE, src) ..() diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index de7874351a..65b78bf844 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -2,7 +2,7 @@ name = "\improper honkbot" desc = "A little robot. It looks happy with its bike horn." icon = 'icons/mob/aibots.dmi' - icon_state = "honkbot" + icon_state = "honkbot1" density = FALSE anchored = FALSE health = 25 diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm index 6dc76bb6a7..214ced3613 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -27,6 +27,7 @@ attacktext = "pummels" attack_sound = 'sound/weapons/punch1.ogg' dextrous = TRUE + held_items = list(null, null) possible_a_intents = list(INTENT_HELP, INTENT_GRAB, INTENT_DISARM, INTENT_HARM) faction = list("jungle") robust_searching = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm index 4c9c916085..4917d3b74d 100644 --- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm +++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm @@ -9,7 +9,7 @@ icon_dead = "Fugu_dead" icon_gib = "syndicate_gib" mob_biotypes = list(MOB_ORGANIC, MOB_BEAST) - mouse_opacity = MOUSE_OPACITY_OPAQUE + mouse_opacity = MOUSE_OPACITY_ICON move_to_delay = 5 friendly = "floats near" speak_emote = list("puffs") diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 106381bade..0a0f27f123 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -146,12 +146,12 @@ else status_traits[trait] |= list(source) -/mob/living/proc/add_trait_datum(trait, spawn_effects) //separate proc due to the way these ones are handled - if(has_trait(trait)) +/mob/living/proc/add_quirk(quirk, spawn_effects) //separate proc due to the way these ones are handled + if(has_trait(quirk)) return - if(!SStraits || !SStraits.traits[trait]) + if(!SSquirks || !SSquirks.quirks[quirk]) return - var/datum/trait/T = SStraits.traits[trait] + var/datum/quirk/T = SSquirks.quirks[quirk] new T (src, spawn_effects) return TRUE @@ -180,8 +180,8 @@ if(!LAZYLEN(status_traits[trait])) status_traits -= trait -/mob/living/proc/remove_trait_datum(trait) - var/datum/trait/T = roundstart_traits[trait] +/mob/living/proc/remove_quirk(quirk) + var/datum/quirk/T = roundstart_quirks[quirk] if(T) qdel(T) return TRUE @@ -201,8 +201,8 @@ else if(LAZYLEN(status_traits[trait])) return TRUE -/mob/living/proc/has_trait_datum(trait) - return roundstart_traits[trait] +/mob/living/proc/has_quirk(quirk) + return roundstart_quirks[quirk] /mob/living/proc/remove_all_traits() status_traits = list() diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 9ad832debe..2718392b69 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -70,7 +70,7 @@ message = src.say_quote(message, get_spans()) var/rendered = "DEAD: [name][alt_name] [message]" - + log_message("DEAD: [message]", INDIVIDUAL_SAY_LOG) deadchat_broadcast(rendered, follow_target = src, speaker_key = K) /mob/proc/check_emote(message) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index b9c21e1090..dbb26b03e0 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -66,7 +66,7 @@ ..() to_chat(user, "Alt-click to fold it.") - var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper) + var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/simple/paper) assets.send(user) if(in_range(user, src) || isobserver(user)) @@ -300,7 +300,10 @@ if(!in_range(src, user)) return - stamps += "" + var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/simple/paper) + if (isnull(stamps)) + stamps = sheet.css_tag() + stamps += sheet.icon_tag(P.icon_state) var/mutable_appearance/stampoverlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_[P.icon_state]") stampoverlay.pixel_x = rand(-2, 2) stampoverlay.pixel_y = rand(-3, 2) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 7cea950ccc..7a6e313cd0 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -111,13 +111,8 @@ /obj/machinery/power/port_gen/pacman/DropFuel() if(sheets) - var/fail_safe = FALSE - while(sheets > 0 && fail_safe < 100) - fail_safe += 1 - var/obj/item/stack/sheet/S = new sheet_path(loc) - var/amount = min(sheets, S.max_amount) - S.amount = amount - sheets -= amount + new sheet_path(drop_location(), sheets) + sheets = 0 /obj/machinery/power/port_gen/pacman/UseFuel() var/needed_sheets = 1 / (time_per_sheet * consumption / power_output) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index f4c11009d1..d7e0bc66bc 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -191,12 +191,12 @@ // Give back the glass type we were supplied with /obj/item/solar_assembly/proc/give_glass(device_broken) + var/atom/Tsec = drop_location() if(device_broken) - new /obj/item/shard(loc) - new /obj/item/shard(loc) + new /obj/item/shard(Tsec) + new /obj/item/shard(Tsec) else if(glass_type) - var/obj/item/stack/sheet/S = new glass_type(loc) - S.amount = 2 + new glass_type(Tsec, 2) glass_type = null diff --git a/code/modules/projectiles/boxes_magazines/external/shotgun.dm b/code/modules/projectiles/boxes_magazines/external/shotgun.dm index dc8d0175ba..bb04446129 100644 --- a/code/modules/projectiles/boxes_magazines/external/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/external/shotgun.dm @@ -1,8 +1,8 @@ /obj/item/ammo_box/magazine/m12g - name = "shotgun magazine (12g taser slugs)" + name = "shotgun magazine (12g buckshot slugs)" desc = "A drum magazine." - icon_state = "m12gs" - ammo_type = /obj/item/ammo_casing/shotgun/stunslug + icon_state = "m12gb" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot caliber = "shotgun" max_ammo = 8 @@ -10,14 +10,14 @@ ..() icon_state = "[initial(icon_state)]-[CEILING(ammo_count(0)/8, 1)*8]" -/obj/item/ammo_box/magazine/m12g/buckshot - name = "shotgun magazine (12g buckshot slugs)" - icon_state = "m12gb" - ammo_type = /obj/item/ammo_casing/shotgun/buckshot +/obj/item/ammo_box/magazine/m12g/stun + name = "shotgun magazine (12g taser slugs)" + icon_state = "m12gs" + ammo_type = /obj/item/ammo_casing/shotgun/stunslug /obj/item/ammo_box/magazine/m12g/slug name = "shotgun magazine (12g slugs)" - icon_state = "m12gb" + icon_state = "m12gb" //this may need an unique sprite ammo_type = /obj/item/ammo_casing/shotgun /obj/item/ammo_box/magazine/m12g/dragon diff --git a/code/modules/projectiles/guns/ballistic/laser_gatling.dm b/code/modules/projectiles/guns/ballistic/laser_gatling.dm index cc719f98ee..af44f998e1 100644 --- a/code/modules/projectiles/guns/ballistic/laser_gatling.dm +++ b/code/modules/projectiles/guns/ballistic/laser_gatling.dm @@ -40,7 +40,6 @@ to_chat(user, "You need a free hand to hold the gun!") return update_icon() - gun.forceMove(user) user.update_inv_back() else to_chat(user, "You are already holding the gun!") diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index ce2e11bec7..ee657a1d68 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -436,7 +436,7 @@ /obj/item/projectile/beam/beam_rifle name = "particle beam" - icon = "" + icon = null hitsound = 'sound/effects/explosion3.ogg' damage = 0 //Handled manually. damage_type = BURN diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index e5ac8126dd..adce5dad57 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -4,7 +4,7 @@ /obj/item/projectile/curse_hand name = "curse hand" - icon_state = "cursehand" + icon_state = "cursehand0" hitsound = 'sound/effects/curse4.ogg' layer = LARGE_MOB_LAYER damage_type = BURN @@ -19,10 +19,7 @@ /obj/item/projectile/curse_hand/Initialize(mapload) . = ..() handedness = prob(50) - update_icon() - -/obj/item/projectile/curse_hand/update_icon() - icon_state = "[icon_state][handedness]" + icon_state = "cursehand[handedness]" /obj/item/projectile/curse_hand/fire(setAngle) if(starting) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 2db6058852..20db99fca1 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -433,7 +433,8 @@ obj/machinery/chem_dispenser/proc/work_animation() "orangejuice", "limejuice", "tomatojuice", - "lemonjuice" + "lemonjuice", + "menthol" ) emagged_reagents = list( "thirteenloko", @@ -465,7 +466,8 @@ obj/machinery/chem_dispenser/proc/work_animation() "hcider", "creme_de_menthe", "creme_de_cacao", - "triple_sec" + "triple_sec", + "sake" ) emagged_reagents = list( "ethanol", @@ -499,3 +501,17 @@ obj/machinery/chem_dispenser/proc/work_animation() "ammonia", "ash", "diethylamine") + +/obj/machinery/chem_dispenser/fullupgrade //fully upgraded stock parts + +/obj/machinery/chem_dispenser/fullupgrade/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/circuitboard/machine/chem_dispenser(null) + component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) + component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) + component_parts += new /obj/item/stock_parts/capacitor/quadratic(null) + component_parts += new /obj/item/stock_parts/manipulator/femto(null) + component_parts += new /obj/item/stack/sheet/glass(null) + component_parts += new /obj/item/stock_parts/cell/bluespace(null) + RefreshParts() diff --git a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm new file mode 100644 index 0000000000..4c57eb3524 --- /dev/null +++ b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm @@ -0,0 +1,85 @@ +/obj/machinery/chem_dispenser/chem_synthesizer //formerly SCP-294 made by mrty, but now only for testing purposes + name = "\improper debug chemical synthesizer" + desc = "If you see this, yell at adminbus." + icon = 'icons/obj/chemical.dmi' + icon_state = "dispenser" + amount = 10 + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + working_state = null + nopower_state = null + flags_1 = NODECONSTRUCT_1 + var/static/list/shortcuts = list( + "meth" = "methamphetamine", + "tricord" = "tricordrazine" + ) + var/mutable_appearance/top_overlay + +/obj/machinery/chem_dispenser/chem_synthesizer/Initialize() + . = ..() + GLOB.poi_list += src + top_overlay = mutable_appearance(icon, "disp_beaker", layer = ABOVE_ALL_MOB_LAYER) + update_icon() + +/obj/machinery/chem_dispenser/chem_synthesizer/update_icon() + cut_overlays() + add_overlay(top_overlay) + +/obj/machinery/chem_dispenser/chem_synthesizer/Destroy() + . = ..() + GLOB.poi_list -= src + QDEL_NULL(top_overlay) + +/obj/machinery/chem_dispenser/chem_synthesizer/display_beaker() + return + +/obj/machinery/chem_dispenser/chem_synthesizer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "chem_synthesizer", name, 390, 315, master_ui, state) + ui.open() + +/obj/machinery/chem_dispenser/chem_synthesizer/ui_act(action, params) + if(..()) + return + update_icon() + switch(action) + if("ejectBeaker") + if(beaker) + beaker.forceMove(drop_location()) + if(Adjacent(usr) && !issilicon(usr)) + usr.put_in_hands(beaker) + beaker = null + . = TRUE + if("input") + var/input_reagent = replacetext(lowertext(input("Enter the name of any liquid", "Input") as text), " ", "") //95% of the time, the reagent id is a lowercase/no spaces version of the name + if(shortcuts[input_reagent]) + input_reagent = shortcuts[input_reagent] + else + input_reagent = find_reagent(input_reagent) + if(!input_reagent || !GLOB.chemical_reagents_list[input_reagent]) + say("OUT OF RANGE") + return + else + if(!beaker) + return + else if(!beaker.reagents && !QDELETED(beaker)) + beaker.create_reagents(beaker.volume) + beaker.reagents.add_reagent(input_reagent, amount) + if("makecup") + if(beaker) + return + beaker = new /obj/item/reagent_containers/glass/beaker/bluespace(src) + visible_message("[src] dispenses a bluespace beaker.") + +/obj/machinery/chem_dispenser/chem_synthesizer/proc/find_reagent(input) + . = FALSE + if(GLOB.chemical_reagents_list[input]) //prefer IDs! + var/datum/reagent/R = GLOB.chemical_reagents_list[input] + if(R.can_synth_debug) + return input + else + for(var/X in GLOB.chemical_reagents_list) + var/datum/reagent/R = GLOB.chemical_reagents_list[X] + if(R.can_synth_debug && input == replacetext(lowertext(R.name), " ", "")) + return X diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 7369fd6042..f61644db0c 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -20,7 +20,8 @@ var/current_cycle = 0 var/volume = 0 var/color = "#000000" // rgb: 0, 0, 0 - var/can_synth = TRUE + var/can_synth = TRUE // can this reagent be synthesized? (for example: odysseus syringe gun) + var/can_synth_debug = TRUE // can this reagent be synthesized by the debug chem synthesizer? var/metabolization_rate = REAGENTS_METABOLISM //how fast the reagent is metabolized by the mob var/overrides_metab = 0 var/overdose_threshold = 0 diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 4be808f873..5230ea26f6 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -1546,4 +1546,70 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "It'll either knock the drunkenness out of you or knock you out cold. Both, probably." /datum/reagent/consumable/ethanol/crevice_spike/on_mob_add(mob/living/L) //damage only applies when drink first enters system and won't again until drink metabolizes out - L.adjustBruteLoss(3 * min(5,volume)) //minimum 3 brute damage on ingestion to limit non-drink means of injury - a full 5 unit gulp of the drink trucks you for the full 15 \ No newline at end of file + L.adjustBruteLoss(3 * min(5,volume)) //minimum 3 brute damage on ingestion to limit non-drink means of injury - a full 5 unit gulp of the drink trucks you for the full 15 + +/datum/reagent/consumable/ethanol/sake + name = "Sake" + id = "sake" + description = "A sweet rice wine of questionable legality and extreme potency." + color = "#DDDDDD" + boozepwr = 70 + taste_description = "sweet rice wine" + glass_icon_state = "sakecup" + glass_name = "cup of sake" + glass_desc = "A traditional cup of sake." + +/datum/reagent/consumable/ethanol/alexander + name = "Alexander" + id = "alexander" + description = "A creamy, indulgent delight that is stronger than it seems." + color = "#F5E9D3" + boozepwr = 80 + taste_description = "bitter, creamy cacao" + glass_icon_state = "alexander" + glass_name = "Alexander" + glass_desc = "A creamy, indulgent delight that is stronger than it seems." + +/datum/reagent/consumable/ethanol/sidecar + name = "Sidecar" + id = "sidecar" + description = "The one ride you’ll gladly give up the wheel for." + color = "#FFC55B" + boozepwr = 80 + taste_description = "delicious freedom" + glass_icon_state = "sidecar" + glass_name = "Sidecar" + glass_desc = "The one ride you’ll gladly give up the wheel for." + +/datum/reagent/consumable/ethanol/between_the_sheets + name = "Between the Sheets" + id = "between_the_sheets" + description = "A provocatively named classic." + color = "#F4C35A" + boozepwr = 80 + taste_description = "seduction" + glass_icon_state = "between_the_sheets" + glass_name = "Between the Sheets" + glass_desc = "A provocatively named classic." + +/datum/reagent/consumable/ethanol/kamikaze + name = "Kamikaze" + id = "kamikaze" + description = "Divinely windy." + color = "#EEF191" + boozepwr = 60 + taste_description = "divine windiness" + glass_icon_state = "kamikaze" + glass_name = "Kamikaze" + glass_desc = "Divinely windy." + +/datum/reagent/consumable/ethanol/mojito + name = "Mojito" + id = "mojito" + description = "A drink that looks as refreshing as it tastes." + color = "#DFFAD9" + boozepwr = 30 + taste_description = "refreshing mint" + glass_icon_state = "mojito" + glass_name = "Mojito" + glass_desc = "A drink that looks as refreshing as it tastes." diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 673b6e7059..5d5fdf2183 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -721,3 +721,13 @@ description = "Milk for cool kids." color = "#7D4E29" taste_description = "chocolate milk" + +/datum/reagent/consumable/menthol + name = "Menthol" + id = "menthol" + description = "Tastes naturally minty, and imparts a very mild numbing sensation." + color = "#80AF9C" + taste_description = "mint" + glass_icon_state = "glass_green" + glass_name = "glass of menthol" + glass_desc = "Tastes naturally minty, and imparts a very mild numbing sensation." diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 3720d717b1..377ddc47fd 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -57,15 +57,6 @@ ..() . = 1 -/datum/reagent/drug/menthol - name = "Menthol" - id = "menthol" - description = "Tastes naturally minty, and imparts a very mild numbing sensation." - taste_description = "mint" - reagent_state = LIQUID - color = "#80AF9C" - trippy = FALSE - /datum/reagent/drug/crank name = "Crank" id = "crank" diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 6a57ff0c18..81d55830d2 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -171,8 +171,7 @@ else if(istype(O, /obj/item/stack/sheet/hairlesshide)) var/obj/item/stack/sheet/hairlesshide/HH = O - var/obj/item/stack/sheet/wetleather/WL = new(get_turf(HH)) - WL.amount = HH.amount + new /obj/item/stack/sheet/wetleather(get_turf(HH), HH.amount) qdel(HH) /* diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 2baddfbf32..381153748f 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -728,7 +728,7 @@ /datum/reagent/toxin/rotatium/on_mob_life(mob/living/M) if(M.hud_used) if(current_cycle >= 20 && current_cycle%20 == 0) - var/list/screens = list(M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"]) + var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"]) var/rotation = min(round(current_cycle/20), 89) // By this point the player is probably puking and quitting anyway for(var/whole_screen in screens) animate(whole_screen, transform = matrix(rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING, loop = -1) @@ -737,7 +737,7 @@ /datum/reagent/toxin/rotatium/on_mob_delete(mob/living/M) if(M && M.hud_used) - var/list/screens = list(M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"]) + var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"]) for(var/whole_screen in screens) animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING) ..() @@ -755,7 +755,7 @@ /datum/reagent/toxin/skewium/on_mob_life(mob/living/M) if(M.hud_used) if(current_cycle >= 5 && current_cycle % 3 == 0) - var/list/screens = list(M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"]) + var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"]) var/matrix/skew = matrix() var/intensity = 8 skew.set_skew(rand(-intensity,intensity), rand(-intensity,intensity)) @@ -772,7 +772,7 @@ /datum/reagent/toxin/skewium/on_mob_delete(mob/living/M) if(M && M.hud_used) - var/list/screens = list(M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"]) + var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"]) for(var/whole_screen in screens) animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING) ..() diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 1268b2be87..997d957a4e 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -51,8 +51,9 @@ other types of metals and chemistry for reagents). return ..() /datum/design/proc/icon_html(client/user) - send_asset(user, "design_[id].png", FALSE) - return "" + var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/research_designs) + sheet.send(user) + return sheet.icon_tag(id) //////////////////////////////////////// //Disks for transporting design datums// diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index d1bcb952aa..28609e921d 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -126,42 +126,47 @@ /datum/design/apc_board name = "APC Module" id = "power control" - build_type = AUTOLATHE + build_type = AUTOLATHE | PROTOLATHE materials = list(MAT_METAL = 100, MAT_GLASS = 100) build_path = /obj/item/electronics/apc category = list("initial", "Electronics") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING /datum/design/airlock_board name = "Airlock Electronics" id = "airlock_board" - build_type = AUTOLATHE + build_type = AUTOLATHE | PROTOLATHE materials = list(MAT_METAL = 50, MAT_GLASS = 50) build_path = /obj/item/electronics/airlock category = list("initial", "Electronics") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING /datum/design/firelock_board name = "Firelock Circuitry" id = "firelock_board" - build_type = AUTOLATHE + build_type = AUTOLATHE | PROTOLATHE materials = list(MAT_METAL = 50, MAT_GLASS = 50) build_path = /obj/item/electronics/firelock category = list("initial", "Electronics") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING /datum/design/airalarm_electronics name = "Air Alarm Electronics" id = "airalarm_electronics" - build_type = AUTOLATHE + build_type = AUTOLATHE | PROTOLATHE materials = list(MAT_METAL = 50, MAT_GLASS = 50) build_path = /obj/item/electronics/airalarm category = list("initial", "Electronics") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING /datum/design/firealarm_electronics name = "Fire Alarm Electronics" id = "firealarm_electronics" - build_type = AUTOLATHE + build_type = AUTOLATHE | PROTOLATHE materials = list(MAT_METAL = 50, MAT_GLASS = 50) build_path = /obj/item/electronics/firealarm category = list("initial", "Electronics") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING /datum/design/camera name = "Camera" diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 8f79bb9a6d..fd3eefbde1 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -354,3 +354,17 @@ build_path = /obj/item/weldingtool/experimental category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +///////////////////////////////////////// +////////////Armour////////////// +///////////////////////////////////////// + +/datum/design/reactive_armour + name = "Reactive Armour Shell" + desc = "An experimental suit of armour capable of utilizing an implanted anomaly core to protect the user." + id = "reactive_armour" + build_type = PROTOLATHE + materials = list(MAT_METAL = 10000, MAT_DIAMOND = 5000, MAT_URANIUM = 8000, MAT_SILVER = 4500, MAT_GOLD = 5000) + build_path = /obj/item/reactive_armour_shell + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING \ No newline at end of file diff --git a/code/modules/research/designs/smelting_designs.dm b/code/modules/research/designs/smelting_designs.dm index 821e6cee38..79a9748b08 100644 --- a/code/modules/research/designs/smelting_designs.dm +++ b/code/modules/research/designs/smelting_designs.dm @@ -21,15 +21,23 @@ name = "Plasma + Glass alloy" id = "plasmaglass" build_type = SMELTER - materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) + materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) build_path = /obj/item/stack/sheet/plasmaglass category = list("initial") +/datum/design/plasmarglass_alloy + name = "Plasma + Metal + Glass alloy" + id = "plasmareinforcedglass" + build_type = SMELTER + materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_METAL = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) + build_path = /obj/item/stack/sheet/plasmarglass + category = list("initial") + /datum/design/titaniumglass_alloy name = "Titanium + Glass alloy" id = "titaniumglass" build_type = SMELTER - materials = list(MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) + materials = list(MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) build_path = /obj/item/stack/sheet/titaniumglass category = list("initial") @@ -37,7 +45,7 @@ name = "Plasma + Titanium + Glass alloy" id = "plastitaniumglass" build_type = SMELTER - materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT, MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) + materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) build_path = /obj/item/stack/sheet/plastitaniumglass category = list("initial") diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 6c85a16498..db08c9b950 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -217,6 +217,8 @@ doesn't have toxins access. /obj/machinery/computer/rdconsole/proc/ui_header() var/list/l = list() + var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/research_designs) + l += "[sheet.css_tag()][RDSCREEN_NOBREAK]" l += "
    [stored_research.organization] Research and Development Network" l += "Available points: [round(stored_research.research_points)] (+[round(stored_research.last_bitcoins * 60)] / minute)" l += "Security protocols: [obj_flags & EMAGGED ? "Disabled" : "Enabled"]" diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index e8ba52495b..c29c8b7732 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -93,7 +93,7 @@ description = "A refresher course on modern engineering technology." prereq_ids = list("base") design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin", - "atmosalerts", "atmos_control", "recycler", "autolathe", "high_micro_laser", "nano_mani", "mesons", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod", "apc_control", "cell_charger") + "atmosalerts", "atmos_control", "recycler", "autolathe", "high_micro_laser", "nano_mani", "mesons", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod", "apc_control", "cell_charger", "power control", "airlock_board", "firelock_board", "airalarm_electronics", "firealarm_electronics") research_cost = 7500 export_price = 5000 @@ -106,6 +106,15 @@ research_cost = 2500 export_price = 5000 +/datum/techweb_node/anomaly + id = "anomaly_research" + display_name = "Anomaly Research" + description = "Unlock the potential of the mysterious anomalies that appear on station." + prereq_ids = list("adv_engi", "practical_bluespace") + design_ids = list("reactive_armour") + research_cost = 2500 + export_price = 5000 + /datum/techweb_node/high_efficiency id = "high_efficiency" display_name = "High Efficiency Parts" @@ -153,7 +162,6 @@ research_cost = 5000 export_price = 5000 - /datum/techweb_node/bluespace_power id = "bluespace_power" display_name = "Bluespace Power Technology" diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index ddbfdb8471..1c8e9ac350 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -448,8 +448,7 @@ datum/status_effect/stabilized/blue/on_remove() else if(istype(O, /obj/item/stack/sheet/hairlesshide)) to_chat(owner, "[linked_extract] kept your hands wet! It wets [O]!") var/obj/item/stack/sheet/hairlesshide/HH = O - var/obj/item/stack/sheet/wetleather/WL = new(get_turf(HH)) - WL.amount = HH.amount + new /obj/item/stack/sheet/wetleather(get_turf(HH), HH.amount) qdel(HH) ..() diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index 68aff64ee9..18b4e81398 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -66,10 +66,8 @@ Charged extracts: colour = "metal" /obj/item/slimecross/charged/metal/do_effect(mob/user) - var/obj/item/stack/sheet/metal/M = new(get_turf(user)) - M.amount = 25 - var/obj/item/stack/sheet/plasteel/P = new(get_turf(user)) - P.amount = 10 + new /obj/item/stack/sheet/metal(get_turf(user), 25) + new /obj/item/stack/sheet/plasteel(get_turf(user), 10) user.visible_message("[src] grows into a plethora of metals!") ..() @@ -85,8 +83,7 @@ Charged extracts: colour = "dark purple" /obj/item/slimecross/charged/darkpurple/do_effect(mob/user) - var/obj/item/stack/sheet/mineral/plasma/M = new(get_turf(user)) - M.amount = 10 + new /obj/item/stack/sheet/mineral/plasma(get_turf(user), 10) user.visible_message("[src] produces a large amount of plasma!") ..() @@ -113,8 +110,7 @@ Charged extracts: colour = "bluespace" /obj/item/slimecross/charged/bluespace/do_effect(mob/user) - var/obj/item/stack/sheet/bluespace_crystal/M = new(get_turf(user)) - M.amount = 10 + new /obj/item/stack/sheet/bluespace_crystal(get_turf(user), 10) user.visible_message("[src] produces several sheets of polycrystal!") ..() @@ -138,8 +134,7 @@ Charged extracts: colour = "pyrite" /obj/item/slimecross/charged/pyrite/do_effect(mob/user) - var/obj/item/stack/sheet/mineral/bananium/M = new(get_turf(user)) - M.amount = 10 + new /obj/item/stack/sheet/mineral/bananium(get_turf(user), 10) user.visible_message("[src] solidifies with a horrifying banana stench!") ..() diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm index 2503219e83..95f87ede0a 100644 --- a/code/modules/research/xenobiology/crossbreeding/industrial.dm +++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm @@ -75,12 +75,7 @@ Industrial extracts: /obj/item/slimecross/industrial/metal colour = "metal" plasmarequired = 3 - itempath = /obj/item/stack/sheet/metal - -/obj/item/slimecross/industrial/metal/do_after_spawn(obj/item/spawned) - var/obj/item/stack/sheet/metal/M = spawned - if(istype(M)) - M.amount = 10 + itempath = /obj/item/stack/sheet/metal/ten /obj/item/slimecross/industrial/yellow colour = "yellow" diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index ee02bd524f..89e513fd60 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -144,7 +144,6 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th var/smoke_spread = 0 //1 - harmless, 2 - harmful var/smoke_amt = 0 //cropped at 10 - var/critfailchance = 0 var/centcom_cancast = 1 //Whether or not the spell should be allowed on z2 action_icon = 'icons/mob/actions/actions_spells.dmi' @@ -153,7 +152,6 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th base_action = /datum/action/spell_action/spell /obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell - if(player_lock) if(!user.mind || !(src in user.mind.spell_list) && !(src in user.mob_spell_list)) to_chat(user, "You shouldn't have this spell! Something's wrong.") @@ -168,15 +166,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th return 0 if(!skipcharge) - switch(charge_type) - if("recharge") - if(charge_counter < charge_max) - to_chat(user, still_recharging_msg) - return 0 - if("charges") - if(!charge_counter) - to_chat(user, "[name] has no charges left.") - return 0 + if(!charge_check(user)) + return 0 if(user.stat && !stat_allowed) to_chat(user, "Not when you're incapacitated.") @@ -236,6 +227,20 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th action.UpdateButtonIcon() return 1 +/obj/effect/proc_holder/spell/proc/charge_check(mob/user, silent = FALSE) + switch(charge_type) + if("recharge") + if(charge_counter < charge_max) + if(!silent) + to_chat(user, still_recharging_msg) + return FALSE + if("charges") + if(!charge_counter) + if(!silent) + to_chat(user, "[name] has no charges left.") + return FALSE + return TRUE + /obj/effect/proc_holder/spell/proc/invocation(mob/user = usr) //spelling the spell out and setting it on recharge/reducing charges amount switch(invocation_type) if("shout") @@ -297,10 +302,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th recharging = TRUE if(sound) playMagSound() - if(prob(critfailchance)) - critfail(targets) - else - cast(targets,user=user) + cast(targets,user=user) after_cast(targets) if(action) action.UpdateButtonIcon() @@ -349,9 +351,6 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th /obj/effect/proc_holder/spell/proc/cast(list/targets,mob/user = usr) return -/obj/effect/proc_holder/spell/proc/critfail(list/targets) - return - /obj/effect/proc_holder/spell/proc/revert_cast(mob/user = usr) //resets recharge or readds a charge switch(charge_type) if("recharge") @@ -500,25 +499,20 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th /obj/effect/proc_holder/spell/proc/can_cast(mob/user = usr) if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list)) - return 0 + return FALSE - switch(charge_type) - if("recharge") - if(charge_counter < charge_max) - return 0 - if("charges") - if(!charge_counter) - return 0 + if(!charge_check(user,TRUE)) + return FALSE if(user.stat && !stat_allowed) - return 0 + return FALSE if(!ishuman(user)) if(clothes_req || human_req) - return 0 + return FALSE if(nonabstract_req && (isbrain(user) || ispAI(user))) - return 0 - return 1 + return FALSE + return TRUE /obj/effect/proc_holder/spell/self //Targets only the caster. Good for buffs and heals, but probably not wise for fireballs (although they usually fireball themselves anyway, honke) range = -1 //Duh diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index 2def02b4c0..bf402b7a6a 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -13,10 +13,7 @@ throwforce = 0 throw_range = 0 throw_speed = 0 - -/obj/item/melee/touch_attack/Initialize() - attached_spell = loc - . = ..() + var/charges = 1 /obj/item/melee/touch_attack/attack(mob/target, mob/living/carbon/user) if(!iscarbon(user)) //Look ma, no hands @@ -29,13 +26,13 @@ /obj/item/melee/touch_attack/afterattack(atom/target, mob/user, proximity) user.say(catchphrase) playsound(get_turf(user), on_use_sound,50,1) - if(attached_spell) - attached_spell.attached_hand = null - qdel(src) + charges-- + if(charges <= 0) + qdel(src) /obj/item/melee/touch_attack/Destroy() if(attached_spell) - attached_spell.attached_hand = null + attached_spell.on_hand_destroy(src) return ..() /obj/item/melee/touch_attack/disintegrate diff --git a/code/modules/spells/spell_types/touch_attacks.dm b/code/modules/spells/spell_types/touch_attacks.dm index 2000d8daea..0ffe02cec2 100644 --- a/code/modules/spells/spell_types/touch_attacks.dm +++ b/code/modules/spells/spell_types/touch_attacks.dm @@ -1,37 +1,46 @@ /obj/effect/proc_holder/spell/targeted/touch - var/hand_path = "/obj/item/melee/touch_attack" + var/hand_path = /obj/item/melee/touch_attack var/obj/item/melee/touch_attack/attached_hand = null invocation_type = "none" //you scream on connecting, not summoning include_user = 1 range = -1 -/obj/effect/proc_holder/spell/targeted/touch/Click(mob/user = usr) - if(attached_hand) - qdel(attached_hand) +/obj/effect/proc_holder/spell/targeted/touch/proc/remove_hand(recharge = FALSE) + QDEL_NULL(attached_hand) + if(recharge) charge_counter = charge_max - attached_hand = null - to_chat(user, "You draw the power out of your hand.") - return FALSE - ..() + +/obj/effect/proc_holder/spell/targeted/touch/proc/on_hand_destroy(obj/item/melee/touch_attack/hand) + if(hand != attached_hand) + CRASH("Incorrect touch spell hand.") + //Start recharging. + attached_hand = null + recharging = TRUE + action.UpdateButtonIcon() /obj/effect/proc_holder/spell/targeted/touch/cast(list/targets,mob/user = usr) + if(!QDELETED(attached_hand)) + remove_hand(TRUE) + to_chat(user, "You draw the power out of your hand.") + return + for(var/mob/living/carbon/C in targets) if(!attached_hand) - if(!ChargeHand(C)) - return FALSE - while(attached_hand) - charge_counter = 0 - stoplag(1) + if(ChargeHand(C)) + recharging = FALSE + return -/obj/effect/proc_holder/spell/targeted/touch/can_cast(mob/user = usr) - return ..() && attached_hand +/obj/effect/proc_holder/spell/targeted/touch/charge_check(mob/user,silent = FALSE) + if(!QDELETED(attached_hand)) //Charge doesn't matter when putting the hand away. + return TRUE + else + return ..() /obj/effect/proc_holder/spell/targeted/touch/proc/ChargeHand(mob/living/carbon/user) attached_hand = new hand_path(src) + attached_hand.attached_spell = src if(!user.put_in_hands(attached_hand)) - qdel(attached_hand) - charge_counter = charge_max - attached_hand = null + remove_hand(TRUE) to_chat(user, "Your hands are full!") return FALSE to_chat(user, "You channel the power of the spell to your hand.") @@ -41,7 +50,7 @@ /obj/effect/proc_holder/spell/targeted/touch/disintegrate name = "Disintegrate" desc = "This spell charges your hand with vile energy that can be used to violently explode victims." - hand_path = "/obj/item/melee/touch_attack/disintegrate" + hand_path = /obj/item/melee/touch_attack/disintegrate school = "evocation" charge_max = 600 @@ -53,7 +62,7 @@ /obj/effect/proc_holder/spell/targeted/touch/flesh_to_stone name = "Flesh to Stone" desc = "This spell charges your hand with the power to turn victims into inert statues for a long period of time." - hand_path = "/obj/item/melee/touch_attack/fleshtostone" + hand_path = /obj/item/melee/touch_attack/fleshtostone school = "transmutation" charge_max = 600 diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index 5110b98e8e..ab7dc91739 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -42,6 +42,8 @@ Notes: /datum/tooltip/New(client/C) if (C) owner = C + var/datum/asset/stuff = get_asset_datum(/datum/asset/simple/jquery) + stuff.send(owner) owner << browse(file2text('code/modules/tooltip/tooltip.html'), "window=[control]") ..() diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 92ce23c6c4..6a8ccefd19 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -453,7 +453,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/ammo/shotgun/buck name = "12g Buckshot Drum" desc = "An additional 8-round buckshot magazine for use with the Bulldog shotgun. Front towards enemy." - item = /obj/item/ammo_box/magazine/m12g/buckshot + item = /obj/item/ammo_box/magazine/m12g /datum/uplink_item/ammo/shotgun/slug name = "12g Slug Drum" @@ -466,7 +466,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) name = "12g Stun Slug Drum" desc = "An alternative 8-round stun slug magazine for use with the Bulldog shotgun. \ Saying that they're completely non-lethal would be lying." - item = /obj/item/ammo_box/magazine/m12g + item = /obj/item/ammo_box/magazine/m12g/stun include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/shotgun/dragon diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 889b159762..c0cfe661d7 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -114,11 +114,11 @@ /obj/item/clothing/mask/muzzle = 2) premium = list(/obj/item/clothing/suit/pirate/captain = 2, /obj/item/clothing/head/pirate/captain = 2, - /obj/item/clothing/head/helmet/roman = 1, - /obj/item/clothing/head/helmet/roman/legionaire = 1, + /obj/item/clothing/head/helmet/roman/fake = 1, + /obj/item/clothing/head/helmet/roman/legionaire/fake = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, - /obj/item/shield/riot/roman = 1, + /obj/item/shield/riot/roman/fake = 1, /obj/item/skub = 1) refill_canister = /obj/item/vending_refill/autodrobe diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index eddb01171b..59b41d4cef 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -19,6 +19,7 @@ /obj/item/reagent_containers/food/drinks/bottle/orangejuice = 4, /obj/item/reagent_containers/food/drinks/bottle/tomatojuice = 4, /obj/item/reagent_containers/food/drinks/bottle/limejuice = 4, + /obj/item/reagent_containers/food/drinks/bottle/menthol = 4, /obj/item/reagent_containers/food/drinks/bottle/cream = 4, /obj/item/reagent_containers/food/drinks/soda_cans/tonic = 8, /obj/item/reagent_containers/food/drinks/soda_cans/cola = 8, @@ -37,5 +38,5 @@ /obj/item/vending_refill/boozeomat machine_name = "Booze-O-Mat" icon_state = "refill_booze" - charges = list(58, 4, 0)//of 174 standard, 12 contraband - init_charges = list(58, 4, 0) + charges = list(59, 4, 0)//of 178 standard, 12 contraband + init_charges = list(59, 4, 0) diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm index a990ee901f..0e2b31037f 100644 --- a/code/modules/vending/engivend.dm +++ b/code/modules/vending/engivend.dm @@ -13,7 +13,10 @@ /obj/item/stock_parts/cell/high = 10, /obj/item/electronics/airlock = 10, /obj/item/electronics/apc = 10, - /obj/item/electronics/airalarm = 10) + /obj/item/electronics/airalarm = 10, + /obj/item/electronics/firealarm = 10, + /obj/item/electronics/firelock = 10 + ) contraband = list(/obj/item/stock_parts/cell/potato = 3) premium = list(/obj/item/storage/belt/utility = 3, /obj/item/storage/box/smart_metal_foam = 1) diff --git a/config/admins.txt b/config/admins.txt index ca77fd3f4a..807b4d89d5 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -7,3 +7,133 @@ # NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn # # NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # ############################################################################################### +<<<<<<< HEAD +======= +Optimumtact = Host +NewSta = Game Master +Expletives = Game Master +kingofkosmos = Game Master +MrStonedOne = Lazy Master +microscopics = Game Master +Gun Hog = Game Master +KorPhaeron = Game Master +razharas = Game Master +Lordpidey = Game Master +Niknakflak = Game Master +rolan7 = Game Master +quarxink = Game Master +adrix89 = Game Master +tle = Game Master +xsi = Game Master +scaredofshadows = Game Master +neofite = Game Master +trubblebass = Game Master +mport2004 = Game Master +deuryn = Game Master +agouri = Game Master +errorage = Game Master +superxpdude = Game Master +petethegoat = Game Master +nodrak = Game Master +carnwennan = Game Master +ikarrus = Game Master +cheridan = Game Master +giacomand = Game Master +rockdtben = Game Master +sieve = Game Master +aranclanos = Game Master +intigracy = Game Master +dumpdavidson = Game Master +kazeespada = Game Master +malkevin = Game Master +incoming = Game Master +demas = Game Master +fleure = Game Master +ricotez = Game Master +misterperson = Game Master +crimsonvision = Game Master +iamgoofball = Game Master +zelacks = Game Master +androidsfv = Game Master +miggles = Game Master +jordie0608 = Game Master +s0ldi3rkr4s0 = Game Master +ergovisavi = Game Master +vistapowa = Game Master +miauw62 = Game Master +rumia29 = Game Master +bobylein = Game Master +sirbayer = Game Master +hornygranny = Game Master +yota = Game Master +firecage = Game Master +donkieyo = Game Master +argoneus = Game Master +paprka = Game Master +cookingboy3 = Game Master +limeliz = Game Master +steelpoint = Game Master +phil235 = Game Master +CorruptComputer = Game Master +xxnoob = Game Master +tkdrg = Game Master +Cuboos = Game Master +thunder12345 = Game Master +wjohnston = Game Master +mandurrh = Game Master +thurgatar = Game Master +xerux = Game Master +dannno = Game Master +lo6a4evskiy = Game Master +vekter = Game Master +Ahammer18 = Game Master +ACCount12 = Game Master +fayrik = Game Master +shadowlight213 = Game Master +drovidicorv = Game Master +Dunc = Game Master +MMMiracles = Game Master +bear1ake = Game Master +CoreOverload = Game Master +Jalleo = Game Master +ChangelingRain = Game Master +FoxPMcCloud = Game Master +Xhuis = Game Master +Astralenigma = Game Master +Tokiko1 = Game Master +SuperSayu = Game Master +Lzimann = Game Master +As334 = Game Master +neersighted = Game Master +Swankcookie = Game Master +Ressler = Game Master +Folix = Game Master +Bawhoppennn = Game Master +Anturke = Host +Lumipharon = Game Master +bgobandit = Game Master +coiax = Game Master +RandomMarine = Game Master +PKPenguin321 = Game Master +TechnoAlchemist = Game Master +Aloraydrel = Game Master +Quiltyquilty = Game Master +SnipeDragon = Game Master +Fjeld = Game Master +kevinz000 = Game Master +Tacolizard = Game Master +TrustyGun = Game Master +Cyberboss = Game Master +PJB3005 = Game Master +Sweaterkittens = Game Master +Feemjmeem = Game Master +JStheguy = Game Master +excessiveuseofcobby = Game Master +Plizzard = Game Master +octareenroon91 = Game Master +Serpentarium = Game Master +Averagejoe82 = Game Master +The Dreamweaver = Game Master +88Naoki = Game Master +Naksuasdf = Game Master +>>>>>>> 3653239... Merge pull request #37785 from 81Denton/circboard_spawners diff --git a/config/game_options.txt b/config/game_options.txt index 5f080a7f0f..6ecec1fc9e 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -536,7 +536,8 @@ ALLOW_MISCREANTS ## Determines if players are allowed to print integrated circuits, uncomment to allow. #IC_PRINTING -## Uncomment to allow roundstart trait selection in the character setup menu. +## Uncomment to allow roundstart quirk selection in the character setup menu. +## This used to be named traits, hence the config name, but it handles quirks, not the other kind of trait! ROUNDSTART_TRAITS ## Uncomment to disable human moods. diff --git a/html/changelogs/AutoChangeLog-pr-6660.yml b/html/changelogs/AutoChangeLog-pr-6660.yml new file mode 100644 index 0000000000..e657c8d5ab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6660.yml @@ -0,0 +1,5 @@ +author: "GrayRachnid" +delete-after: True +changes: + - rscadd: "Adds private rooms to the ninja holding center" + - rscadd: "Along with a few things to make it more tolerable, but fear not. There is now a suicide chamber for those who want the easy way out." diff --git a/html/changelogs/AutoChangeLog-pr-6663.yml b/html/changelogs/AutoChangeLog-pr-6663.yml new file mode 100644 index 0000000000..97e977b062 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6663.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - tweak: "Character traits are now called character quirks. Functionality remains unaffected." diff --git a/html/changelogs/AutoChangeLog-pr-6731.yml b/html/changelogs/AutoChangeLog-pr-6731.yml new file mode 100644 index 0000000000..255a2ba3ad --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6731.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "You may now take unlimited neutral and negative quirks" diff --git a/html/changelogs/AutoChangeLog-pr-6744.yml b/html/changelogs/AutoChangeLog-pr-6744.yml new file mode 100644 index 0000000000..761f59fb39 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6744.yml @@ -0,0 +1,4 @@ +author: "Dax Dupont" +delete-after: True +changes: + - bugfix: "Fixes missing curator hud icon." diff --git a/html/changelogs/AutoChangeLog-pr-6745.yml b/html/changelogs/AutoChangeLog-pr-6745.yml new file mode 100644 index 0000000000..2f3648f00a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6745.yml @@ -0,0 +1,4 @@ +author: "Denton" +delete-after: True +changes: + - rscadd: "APC/air alarm/airlock/fire alarm/firelock electronics are now available once Industrial Engineering is researched.." diff --git a/html/changelogs/AutoChangeLog-pr-6746.yml b/html/changelogs/AutoChangeLog-pr-6746.yml new file mode 100644 index 0000000000..80c93a7305 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6746.yml @@ -0,0 +1,5 @@ +author: "Denton" +delete-after: True +changes: + - tweak: "Engi-Vend machines now contain fire alarm and firelock electronics!" + - code_imp: "Loose tech storage circuit boards have been replaced with spawners." diff --git a/html/changelogs/AutoChangeLog-pr-6754.yml b/html/changelogs/AutoChangeLog-pr-6754.yml new file mode 100644 index 0000000000..52f34a1ed3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6754.yml @@ -0,0 +1,4 @@ +author: "Dax Dupont" +delete-after: True +changes: + - balance: "Cult items will no longer be a long ride on the vomit coaster if picked up by a non cultist." diff --git a/html/changelogs/AutoChangeLog-pr-6756.yml b/html/changelogs/AutoChangeLog-pr-6756.yml new file mode 100644 index 0000000000..180e4f9875 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6756.yml @@ -0,0 +1,5 @@ +author: "Dax Dupont" +delete-after: True +changes: + - balance: "Cult space bases are kill again." + - balance: "Cult floors now pass gas." diff --git a/icons/mob/custom_w.dmi b/icons/mob/custom_w.dmi index 6b17cc3acb..7c7499ee42 100644 Binary files a/icons/mob/custom_w.dmi and b/icons/mob/custom_w.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index d694c0243a..8fa3cefbb7 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/lavaland/64x64megafauna.dmi b/icons/mob/lavaland/64x64megafauna.dmi index 64304fdcd1..1794c789de 100644 Binary files a/icons/mob/lavaland/64x64megafauna.dmi and b/icons/mob/lavaland/64x64megafauna.dmi differ diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi index dac70998f5..f8394dd235 100644 Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index f35ef2c1a5..23541a8e40 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 3635744b6f..c6f6798076 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi index de5fce96a5..419b14f526 100644 Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi index 64fac1c3eb..c40dfaaa22 100644 Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index b3774b26ab..a053eab792 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index e94228f701..b4431daf83 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/smooth_structures/clockwork_window.dmi b/icons/obj/smooth_structures/clockwork_window.dmi index 90309ac3d5..10d5bcf631 100644 Binary files a/icons/obj/smooth_structures/clockwork_window.dmi and b/icons/obj/smooth_structures/clockwork_window.dmi differ diff --git a/icons/obj/smooth_structures/sandbags.dmi b/icons/obj/smooth_structures/sandbags.dmi index 2e8c2e3352..8ac099555a 100644 Binary files a/icons/obj/smooth_structures/sandbags.dmi and b/icons/obj/smooth_structures/sandbags.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index a1471e6418..f66480f3aa 100644 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index a8a71e891d..4e78e0444b 100644 Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ diff --git a/modular_citadel/code/datums/traits/neutral.dm b/modular_citadel/code/datums/traits/neutral.dm index 2bb9c3a356..264dbfef0a 100644 --- a/modular_citadel/code/datums/traits/neutral.dm +++ b/modular_citadel/code/datums/traits/neutral.dm @@ -1,24 +1,24 @@ // Citadel-specific Neutral Traits -/datum/trait/libido +/datum/quirk/libido name = "Nymphomania" desc = "You're always feeling a bit in heat. Also, you get aroused faster than usual." value = 0 gain_text = "You are feeling extra wild." lose_text = "You don't feel that burning sensation anymore." -/datum/trait/libido/add() - var/mob/living/M = trait_holder +/datum/quirk/libido/add() + var/mob/living/M = quirk_holder M.min_arousal = 16 M.arousal_rate = 3 -/datum/trait/libido/remove() - var/mob/living/M = trait_holder +/datum/quirk/libido/remove() + var/mob/living/M = quirk_holder M.min_arousal = initial(M.min_arousal) M.arousal_rate = initial(M.arousal_rate) -/datum/trait/libido/on_process() - var/mob/living/M = trait_holder +/datum/quirk/libido/on_process() + var/mob/living/M = quirk_holder if(M.canbearoused == FALSE) - to_chat(trait_holder, "Having high libido is useless when you can't feel arousal at all!") + to_chat(quirk_holder, "Having high libido is useless when you can't feel arousal at all!") qdel(src) diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 62924c7305..24f454fd1f 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -271,10 +271,16 @@ datum/gear/darksabresheath category = slot_in_backpack path = /obj/item/clothing/neck/cloak/polychromic/polyce ckeywhitelist = list("worksbythesea", "blakeryan") - + /datum/gear/ssk name = "Stun Sword Kit" category = slot_in_backpack path = /obj/item/ssword_kit ckeywhitelist = list("phillip458") +/datum/gear/techcoat + name = "Techomancers Labcoat" + category = slot_in_backpack + path = /obj/item/clothing/suit/toggle/labcoat/mad/techcoat + ckeywhitelist = list("wilchen") + diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index 481a105749..6c4647f0a2 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -343,3 +343,11 @@ desc = "A piece of paper folded into neat little hat." icon_state = "paperhat" item_state = "paperhat" + +/obj/item/clothing/suit/toggle/labcoat/mad/techcoat + name = "Techomancers Labcoat" + desc = "An oddly special looking coat." + icon = 'icons/obj/custom.dmi' + icon_state = "rdcoat" + icon_override = 'icons/mob/custom_w.dmi' + item_state = "rdcoat" diff --git a/rust_g.dll b/rust_g.dll index 4e1df5afbd..44e38ef0dd 100644 Binary files a/rust_g.dll and b/rust_g.dll differ diff --git a/strings/french_replacement.json b/strings/french_replacement.json new file mode 100644 index 0000000000..4c89d98812 --- /dev/null +++ b/strings/french_replacement.json @@ -0,0 +1,91 @@ +{ + + "french": { + "yes": "oui", + "no": "non", + "I'm": "j'", + "am": "suis", + "a": "un", + "and": "et", + "the": "l'", + "I": "j'", + "for": "pour", + "with": "avec", + "of": "de", + + + "assistant": "ravageur", + "assistants": "ravageurs", + "baby": [ + "enfant", + "petit baguette" + ], + "bad": "mal", + "bye": [ + "bon voyage", + "adieu", + "au revoir" + ], + "cake": "gateau", + "captain": "capitaine", + "changeling": "changeur", + "cheese": [ + "brie", + "roquefort", + "camembert" + ], + "cigarette": "clope", + "cook": "cuisinier", + "dad": "papa", + "enemy": "silly english dog", + "friend": "ami", + "good": "bon", + "greytide": "les gitans", + "greytider": "les gitans", + "greytiders": "les gitans", + "hardsuit": "burkini", + "hello": [ + "'allo", + "bonjour", + "salut" + ], + "maint": "les banlieues", + "meat": [ + "coq au vin", + "boeuf" + ], + "mom": "maman", + "my": "mon", + "nuke": [ + "grand bombe", + "la baguette ultime" + ], + "op": "boche", + "operative": "boche", + "operatives": "boches", + "ops": "boches", + "urity": "urite", + "security": "securite", + "shit": "merde", + "shitcurity": [ + "gendarmerie", + "les keufs" + ], + "shitsec": [ + "gendarmerie", + "les keufs" + ], + "spaghetti": "macaroni", + "spicy": "epice", + "thanks": "merci", + "tomato": "tomate", + "traitor": "collaborateur", + "want": "envie", + "what's": "quel est", + "who's": "qui est", + "why": "porquois", + "wine": "vin", + "wizard": "sorcier" + } + +} \ No newline at end of file diff --git a/strings/word_replacement.json b/strings/italian_replacement.json similarity index 99% rename from strings/word_replacement.json rename to strings/italian_replacement.json index 9565ebe94a..42bef05a22 100644 --- a/strings/word_replacement.json +++ b/strings/italian_replacement.json @@ -1,4 +1,5 @@ { + "italian": { "I'm": "I'm-a", "am": "am-a", @@ -62,5 +63,7 @@ "whose": "whose-a", "why": "for-a what reason", "wine": "vino" - } -} + } + + +} \ No newline at end of file diff --git a/strings/names/wizardfirst.txt b/strings/names/wizardfirst.txt index 8c9e1e35fe..f1e9a10a58 100644 --- a/strings/names/wizardfirst.txt +++ b/strings/names/wizardfirst.txt @@ -24,6 +24,7 @@ Prospero Radagast Raistlin Rasputin +Rincewind Saruman Tenser Terefi diff --git a/strings/names/wizardsecond.txt b/strings/names/wizardsecond.txt index 4233ad5430..dd191cfa2b 100644 --- a/strings/names/wizardsecond.txt +++ b/strings/names/wizardsecond.txt @@ -34,6 +34,7 @@ the Unstoppable the Weeping the White the Wise +the Wizzard Unseen Weatherwax Yagg \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 93fb08da2f..d356f887a4 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -261,7 +261,7 @@ #include "code\controllers\subsystem\processing\obj.dm" #include "code\controllers\subsystem\processing\processing.dm" #include "code\controllers\subsystem\processing\projectiles.dm" -#include "code\controllers\subsystem\processing\traits.dm" +#include "code\controllers\subsystem\processing\quirks.dm" #include "code\controllers\subsystem\processing\wet_floors.dm" #include "code\datums\action.dm" #include "code\datums\ai_laws.dm" @@ -316,6 +316,7 @@ #include "code\datums\components\_component.dm" #include "code\datums\components\anti_magic.dm" #include "code\datums\components\archaeology.dm" +#include "code\datums\components\armor_plate.dm" #include "code\datums\components\beauty.dm" #include "code\datums\components\butchering.dm" #include "code\datums\components\caltrop.dm" @@ -444,7 +445,7 @@ #include "code\datums\status_effects\gas.dm" #include "code\datums\status_effects\neutral.dm" #include "code\datums\status_effects\status_effect.dm" -#include "code\datums\traits\_trait.dm" +#include "code\datums\traits\_quirk.dm" #include "code\datums\traits\good.dm" #include "code\datums\traits\negative.dm" #include "code\datums\traits\neutral.dm" @@ -1432,6 +1433,7 @@ #include "code\modules\clothing\suits\jobs.dm" #include "code\modules\clothing\suits\labcoat.dm" #include "code\modules\clothing\suits\miscellaneous.dm" +#include "code\modules\clothing\suits\reactive_armour.dm" #include "code\modules\clothing\suits\toggles.dm" #include "code\modules\clothing\suits\utility.dm" #include "code\modules\clothing\suits\vg_suits.dm" @@ -2331,6 +2333,7 @@ #include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm" #include "code\modules\reagents\chemistry\machinery\chem_heater.dm" #include "code\modules\reagents\chemistry\machinery\chem_master.dm" +#include "code\modules\reagents\chemistry\machinery\chem_synthesizer.dm" #include "code\modules\reagents\chemistry\machinery\pandemic.dm" #include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" #include "code\modules\reagents\chemistry\machinery\smoke_machine.dm" diff --git a/tgui/src/interfaces/chem_synthesizer.ract b/tgui/src/interfaces/chem_synthesizer.ract new file mode 100644 index 0000000000..f57bd4ba71 --- /dev/null +++ b/tgui/src/interfaces/chem_synthesizer.ract @@ -0,0 +1,21 @@ + + + Eject + Input + Create Beaker + + + + + {{#if data.isBeakerLoaded}} + {{Math.round(adata.beakerCurrentVolume)}}/{{data.beakerMaxVolume}} Units + {{#each adata.beakerContents}} + {{Math.fixed(volume, 2)}} units of {{name}}
    + {{else}} + Recipient Empty + {{/each}} + {{else}} + No Recipient + {{/if}} +
    +
    diff --git a/tgui/src/interfaces/rpd.ract b/tgui/src/interfaces/rpd.ract index ba24bd75f0..318b56533f 100644 --- a/tgui/src/interfaces/rpd.ract +++ b/tgui/src/interfaces/rpd.ract @@ -1,11 +1,22 @@ - - + -{{#if data.mode >= 0}} - -{{/if}} -{{#if data.mode == -2 || data.mode == 0}} - + + {{#each data.preview_rows}} + + {{#each previews}} + + {{/each}} + + {{/each}} + +{{#if data.category == 0}} + + {{#each data.paint_colors}} + {{@key}} + {{/each}} + {{/if}} diff --git a/tools/travis/build_dependencies.sh b/tools/travis/build_dependencies.sh index 8f5c8de10a..60a23d9723 100755 --- a/tools/travis/build_dependencies.sh +++ b/tools/travis/build_dependencies.sh @@ -6,9 +6,12 @@ if [ "$BUILD_TOOLS" = false ]; then curl https://sh.rustup.rs -sSf | sh -s -- -y --default-host i686-unknown-linux-gnu source ~/.profile - git clone --branch $RUST_G_VERSION https://github.com/tgstation/rust-g - + mkdir rust-g cd rust-g + git init + git remote add origin https://github.com/tgstation/rust-g + git fetch --depth 1 origin $RUST_G_VERSION + git checkout FETCH_HEAD cargo build --release mkdir -p ~/.byond/bin