diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index f5fd004225f..c9e69fb8c99 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -744,7 +744,7 @@ "op" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 1; icon_state = "fakewindows2"},/area/wizard_station) "oq" = (/obj/structure/bookcase,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "or" = (/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/wizard_station) -"os" = (/obj/structure/cult/talisman{desc = "A altar dedicated to the Wizard's Federation"},/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) +"os" = (/obj/structure/cult/talisman{desc = "A altar dedicated to the Wizard's Federation"},/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "ot" = (/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "ou" = (/obj/effect/decal/cleanable/blood/splatter,/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "ov" = (/obj/machinery/door/poddoor/preopen,/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plating/airless,/area/wizard_station) diff --git a/_maps/map_files/MetaStation/z3.dmm b/_maps/map_files/MetaStation/z3.dmm index 8a0d6d29433..0ed21f65a37 100644 --- a/_maps/map_files/MetaStation/z3.dmm +++ b/_maps/map_files/MetaStation/z3.dmm @@ -389,7 +389,7 @@ "hy" = (/obj/machinery/smartfridge{use_power = 0},/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/space) "hz" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor,/area/space) "hA" = (/obj/effect/decal/cleanable/egg_smudge,/obj/effect/decal/cleanable/flour,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor,/area/space) -"hB" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/obj/item/weapon/kitchenknife,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) +"hB" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/obj/item/weapon/kitchen/knife,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) "hC" = (/obj/machinery/constructable_frame/machine_frame,/obj/item/weapon/circuitboard/chem_dispenser,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) "hD" = (/obj/structure/stool/bed/chair/office/light,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor,/area/space) "hE" = (/obj/machinery/constructable_frame/machine_frame,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) diff --git a/_maps/map_files/MetaStation/z5.dmm b/_maps/map_files/MetaStation/z5.dmm index a4f6fd1d8ab..cba5800eedc 100644 --- a/_maps/map_files/MetaStation/z5.dmm +++ b/_maps/map_files/MetaStation/z5.dmm @@ -228,7 +228,7 @@ "et" = (/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned) "eu" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned) "ev" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"ew" = (/obj/structure/table,/obj/item/trash/plate,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) +"ew" = (/obj/structure/table,/obj/item/trash/plate,/obj/item/weapon/kitchen/fork,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) "ex" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) "ey" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) "ez" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm index 144eb8c3a48..e0684b3534e 100644 --- a/_maps/map_files/MiniStation/MiniStation.dmm +++ b/_maps/map_files/MiniStation/MiniStation.dmm @@ -1029,7 +1029,7 @@ "tO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/camera/autoname{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "tP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/crew_quarters/bar) "tQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"tR" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"tR" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/kitchen/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "tS" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "tT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "tU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) diff --git a/_maps/map_files/MiniStation/z2.dmm b/_maps/map_files/MiniStation/z2.dmm index 059bd30b2cf..d58f8b4881a 100644 --- a/_maps/map_files/MiniStation/z2.dmm +++ b/_maps/map_files/MiniStation/z2.dmm @@ -409,9 +409,9 @@ "md" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) "me" = (/obj/effect/decal/cleanable/molten_item,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "mf" = (/turf/unsimulated/wall/fakeglass,/area/wizard_station) -"mg" = (/obj/structure/rack,/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) +"mg" = (/obj/structure/rack,/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) "mh" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) -"mi" = (/obj/structure/rack,/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station) +"mi" = (/obj/structure/rack,/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station) "mj" = (/obj/machinery/computer/security/telescreen{pixel_y = -32},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) "mk" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) "ml" = (/turf/unsimulated/wall/fakedoor{name = "Thunderdome Admin"},/area/tdome/tdomeadmin) diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index d18f6746f97..7f92eb9be0d 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -2483,7 +2483,7 @@ "aVM" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "aVN" = (/obj/structure/table/reinforced,/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aVO" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aVP" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aVP" = (/obj/structure/table,/obj/item/weapon/kitchen/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aVQ" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/wall/r_wall,/area/atmos) "aVR" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 9},/turf/simulated/floor/plating,/area/atmos) "aVS" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 6},/turf/simulated/floor/plasteel,/area/atmos) @@ -6462,7 +6462,7 @@ "cuA" = (/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = 32; pixel_y = -24; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/science{dir = 4; icon_state = "direction_sci"; pixel_x = 32; pixel_y = -32; tag = "icon-direction_sci (EAST)"},/obj/structure/sign/directions/engineering{pixel_x = 32; pixel_y = -40},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "cuB" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sign/directions/engineering{pixel_x = -32; pixel_y = -40},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = -32; pixel_y = -24; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_x = -32; pixel_y = -32; tag = "icon-direction_evac (EAST)"},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "cuD" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera{c_tag = "Custodial Closet"},/obj/structure/stool/bed/chair/janicart,/turf/simulated/floor/plasteel,/area/janitor) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/generic/z5.dmm b/_maps/map_files/generic/z5.dmm index 948b538f570..bfde3be2fef 100644 --- a/_maps/map_files/generic/z5.dmm +++ b/_maps/map_files/generic/z5.dmm @@ -228,7 +228,7 @@ "eu" = (/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned) "ev" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned) "ew" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"ex" = (/obj/structure/table,/obj/item/trash/plate,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) +"ex" = (/obj/structure/table,/obj/item/trash/plate,/obj/item/weapon/kitchen/fork,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) "ey" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) "ez" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) "eA" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp) @@ -708,7 +708,7 @@ "nH" = (/obj/structure/disposaloutlet{dir = 1; eject_range = 1},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/mine/production) "nI" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_z5"; name = "south of asteroid"; turf_type = /turf/space; width = 18},/turf/space,/area/space) "nJ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/brute{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/mine/living_quarters) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 3c707b3da2e..77f195b9c79 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -45,7 +45,7 @@ Pipelines + Other Objects -> Pipe network return /obj/machinery/atmospherics/proc/safe_input(var/title, var/text, var/default_set) - var/new_value = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",default_set) as num + var/new_value = input(usr,text,title,default_set) as num if(usr.canUseTopic(src)) return new_value return default_set diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 24771a56241..ba6c6e60bfd 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -89,14 +89,24 @@ Passive gate is similar to the regular pump except: return 1 -/obj/machinery/atmospherics/binary/passive_gate/interact(mob/user as mob) - var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure: - [round(target_pressure,0.1)]kPa | Change - "} +/obj/machinery/atmospherics/binary/passive_gate/ui_interact(mob/user, ui_key = "main") + if(stat & (BROKEN|NOPOWER)) + return - user << browse("[src.name] control[dat]", "window=atmo_pump") - onclose(user, "atmo_pump") + var/data = list() + + data["on"] = on + data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently. + data["max_pressure"] = MAX_OUTPUT_PRESSURE + + var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key) + if (!ui) + ui = new /datum/nanoui(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 120) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + else + ui.push_data(data) /obj/machinery/atmospherics/binary/passive_gate/initialize() ..() @@ -145,7 +155,7 @@ Passive gate is similar to the regular pump except: user << "Access denied." return usr.set_machine(src) - interact(user) + ui_interact(user) return /obj/machinery/atmospherics/binary/passive_gate/Topic(href,href_list) @@ -154,7 +164,11 @@ Passive gate is similar to the regular pump except: on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos") if(href_list["set_press"]) - target_pressure = max(0, min(4500, safe_input("Pressure control", "Enter new output pressure (0-4500kPa)", target_pressure))) + switch(href_list["set_press"]) + if ("max") + target_pressure = MAX_OUTPUT_PRESSURE + if ("set") + target_pressure = max(0, min(MAX_OUTPUT_PRESSURE, safe_input("Pressure control", "Enter new output pressure (0-[MAX_OUTPUT_PRESSURE] kPa)", target_pressure))) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos") usr.set_machine(src) src.update_icon() diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index d9547e0a1c3..e1069c9f1ae 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -97,14 +97,24 @@ Thus, the two variables affect pump operation are set in New(): return 1 -/obj/machinery/atmospherics/binary/pump/interact(mob/user as mob) - var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure: - [round(target_pressure,0.1)]kPa | Change - "} +/obj/machinery/atmospherics/binary/pump/ui_interact(mob/user, ui_key = "main") + if(stat & (BROKEN|NOPOWER)) + return - user << browse("[src.name] control[dat]", "window=atmo_pump") - onclose(user, "atmo_pump") + var/data = list() + + data["on"] = on + data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently. + data["max_pressure"] = MAX_OUTPUT_PRESSURE + + var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key) + if (!ui) + ui = new /datum/nanoui(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 120) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + else + ui.push_data(data) /obj/machinery/atmospherics/binary/pump/initialize() ..() @@ -152,7 +162,7 @@ Thus, the two variables affect pump operation are set in New(): user << "Access denied." return usr.set_machine(src) - interact(user) + ui_interact(user) return /obj/machinery/atmospherics/binary/pump/Topic(href,href_list) @@ -161,7 +171,11 @@ Thus, the two variables affect pump operation are set in New(): on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos") if(href_list["set_press"]) - target_pressure = max(0, min(4500, safe_input("Pressure control", "Enter new output pressure (0-4500kPa)", target_pressure))) + switch(href_list["set_press"]) + if ("max") + target_pressure = MAX_OUTPUT_PRESSURE + if ("set") + target_pressure = max(0, min(MAX_OUTPUT_PRESSURE, safe_input("Pressure control", "Enter new output pressure (0-[MAX_OUTPUT_PRESSURE] kPa)", target_pressure))) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos") usr.set_machine(src) src.update_icon() diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index 380e1c16bfe..9d66f6c88bd 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -20,7 +20,7 @@ Thus, the two variables affect pump operation are set in New(): can_unwrench = 1 var/on = 0 - var/transfer_rate = 200 + var/transfer_rate = MAX_TRANSFER_RATE var/frequency = 0 var/id = null @@ -93,16 +93,24 @@ Thus, the two variables affect pump operation are set in New(): return 1 -/obj/machinery/atmospherics/binary/volume_pump/interact(mob/user as mob) - var/dat = {"Power: [on?"On":"Off"]
- Desirable output flow: - [round(transfer_rate,1)]l/s | Change - "} +/obj/machinery/atmospherics/binary/volume_pump/ui_interact(mob/user, ui_key = "main") + if(stat & (BROKEN|NOPOWER)) + return - user << browse("[src.name] control[dat]", "window=atmo_pump") - onclose(user, "atmo_pump") + var/data = list() + data["on"] = on + data["transfer_rate"] = round(transfer_rate*100) //Nano UI can't handle rounded non-integers, apparently. + data["max_rate"] = MAX_TRANSFER_RATE + var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key) + if (!ui) + ui = new /datum/nanoui(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 120) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + else + ui.push_data(data) /obj/machinery/atmospherics/binary/volume_pump/initialize() ..() @@ -149,7 +157,7 @@ Thus, the two variables affect pump operation are set in New(): user << "Access denied." return usr.set_machine(src) - interact(user) + ui_interact(user) return /obj/machinery/atmospherics/binary/volume_pump/Topic(href,href_list) @@ -158,7 +166,11 @@ Thus, the two variables affect pump operation are set in New(): on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos") if(href_list["set_transfer_rate"]) - transfer_rate = max(0, min(200, safe_input("Pressure control", "Enter new output pressure (0-4500kPa)", transfer_rate))) + switch(href_list["set_transfer_rate"]) + if ("max") + transfer_rate = MAX_TRANSFER_RATE + if ("set") + transfer_rate = max(0, min(MAX_TRANSFER_RATE, safe_input("Pressure control", "Enter new transfer rate (0-[MAX_TRANSFER_RATE] L/s)", transfer_rate))) investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", "atmos") usr.set_machine(src) src.update_icon() diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 839d3ecde24..985904f3bcd 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -1,6 +1,13 @@ +#define FILTER_NOTHING -1 +#define FILTER_PLASMA 0 +#define FILTER_OXYGEN 1 +#define FILTER_NITROGEN 2 +#define FILTER_CARBONDIOXIDE 3 +#define FILTER_NITROUSOXIDE 4 + /obj/machinery/atmospherics/trinary/filter icon_state = "filter_off" - density = 1 + density = 0 name = "gas filter" @@ -92,7 +99,7 @@ Filter types: filtered_out.temperature = removed.temperature switch(filter_type) - if(0) //removing plasma + if(FILTER_PLASMA) filtered_out.toxins = removed.toxins removed.toxins = 0 @@ -102,19 +109,19 @@ Filter types: removed.trace_gases -= trace_gas filtered_out.trace_gases += trace_gas - if(1) //removing O2 + if(FILTER_OXYGEN) filtered_out.oxygen = removed.oxygen removed.oxygen = 0 - if(2) //removing N2 + if(FILTER_NITROGEN) filtered_out.nitrogen = removed.nitrogen removed.nitrogen = 0 - if(3) //removing CO2 + if(FILTER_CARBONDIOXIDE) filtered_out.carbon_dioxide = removed.carbon_dioxide removed.carbon_dioxide = 0 - if(4)//removing N2O + if(FILTER_NITROUSOXIDE) if(removed.trace_gases.len>0) for(var/datum/gas/trace_gas in removed.trace_gases) if(istype(trace_gas, /datum/gas/sleeping_agent)) @@ -148,50 +155,27 @@ Filter types: user << "Access denied." return - var/dat - var/current_filter_type - switch(filter_type) - if(0) - current_filter_type = "Plasma" - if(1) - current_filter_type = "Oxygen" - if(2) - current_filter_type = "Nitrogen" - if(3) - current_filter_type = "Carbon Dioxide" - if(4) - current_filter_type = "Nitrous Oxide" - if(-1) - current_filter_type = "Nothing" - else - current_filter_type = "ERROR - Report this bug to the admin, please!" + ui_interact(user) - dat += {" - Power: [on?"On":"Off"]
- Filtering: [current_filter_type]

-

Set Filter Type:

- Plasma
- Oxygen
- Nitrogen
- Carbon Dioxide
- Nitrous Oxide
- Nothing
-
Desirable output pressure: - [src.target_pressure]kPa | Change - "} -/* - user << browse("[src.name] control[dat]","window=atmo_filter") - onclose(user, "atmo_filter") +/obj/machinery/atmospherics/trinary/filter/ui_interact(mob/user, ui_key = "main") + if(stat & (BROKEN|NOPOWER)) return - if (src.temp) - dat = text("[]

Clear Screen", src.temp, src) - //else - // src.on != src.on -*/ - user << browse("[src.name] control[dat]", "window=atmo_filter") - onclose(user, "atmo_filter") - return + var/data = list() + + data["on"] = on + data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently. + data["max_pressure"] = MAX_OUTPUT_PRESSURE + data["filter_type"] = filter_type + + var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key) + if (!ui) + ui = new /datum/nanoui(user, src, ui_key, "atmos_filter.tmpl", name, 400, 320) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + else + ui.push_data(data) /obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) if(..()) @@ -200,12 +184,31 @@ Filter types: src.add_fingerprint(usr) if(href_list["filterset"]) src.filter_type = text2num(href_list["filterset"]) + var/filtering_name = "nothing" + switch(filter_type) + if(FILTER_PLASMA) + filtering_name = "plasma" + if(FILTER_OXYGEN) + filtering_name = "oxygen" + if(FILTER_NITROGEN) + filtering_name = "nitrogen" + if(FILTER_CARBONDIOXIDE) + filtering_name = "carbon dioxide" + if(FILTER_NITROUSOXIDE) + filtering_name = "nitrous oxide" + investigate_log("was set to filter [filtering_name] by [key_name(usr)]", "atmos") if (href_list["temp"]) src.temp = null if(href_list["set_press"]) - target_pressure = max(0, min(4500, safe_input("Pressure control", "Enter new output pressure (0-4500kPa)", target_pressure))) + switch(href_list["set_press"]) + if ("max") + target_pressure = MAX_OUTPUT_PRESSURE + if ("set") + target_pressure = max(0, min(MAX_OUTPUT_PRESSURE, safe_input("Pressure control", "Enter new output pressure (0-[MAX_OUTPUT_PRESSURE] kPa)", target_pressure))) + investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos") if(href_list["power"]) on=!on + investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos") src.update_icon() src.updateUsrDialog() /* @@ -213,6 +216,4 @@ Filter types: if ((M.client && M.machine == src)) src.attack_hand(M) */ - return - - + return \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index c70dce74cf9..8726dac92da 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -1,6 +1,6 @@ /obj/machinery/atmospherics/trinary/mixer icon_state = "mixer_off" - density = 1 + density = 0 name = "gas mixer" @@ -101,48 +101,56 @@ /obj/machinery/atmospherics/trinary/mixer/attack_hand(user as mob) if(..()) return - src.add_fingerprint(usr) + if(!src.allowed(user)) user << "Access denied." return - usr.set_machine(src) - var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure: - [target_pressure]kPa | Change -
- Node 1 Concentration: - - - - - [node1_concentration]([node1_concentration*100]%) - + - + -
- Node 2 Concentration: - - - - - [node2_concentration]([node2_concentration*100]%) - + - + - "} - user << browse("[src.name] control[dat]", "window=atmo_mixer") - onclose(user, "atmo_mixer") - return + ui_interact(user) + +/obj/machinery/atmospherics/trinary/mixer/ui_interact(mob/user, ui_key = "main") + if(stat & (BROKEN|NOPOWER)) + return + + var/data = list() + + data["on"] = on + data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently. + data["max_pressure"] = MAX_OUTPUT_PRESSURE + data["node1_concentration"] = round(node1_concentration*100) + data["node2_concentration"] = round(node2_concentration*100) + + var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key) + if (!ui) + ui = new /datum/nanoui(user, src, ui_key, "atmos_mixer.tmpl", name, 400, 320) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + else + ui.push_data(data) /obj/machinery/atmospherics/trinary/mixer/Topic(href,href_list) if(..()) return if(href_list["power"]) on = !on + investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos") if(href_list["set_press"]) - target_pressure = max(0, min(4500, safe_input("Pressure control", "Enter new output pressure (0-4500kPa)", target_pressure))) + switch(href_list["set_press"]) + if ("max") + target_pressure = MAX_OUTPUT_PRESSURE + if ("set") + target_pressure = max(0, min(MAX_OUTPUT_PRESSURE, safe_input("Pressure control", "Enter new output pressure (0-[MAX_OUTPUT_PRESSURE] kPa)", target_pressure))) + investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos") if(href_list["node1_c"]) var/value = text2num(href_list["node1_c"]) src.node1_concentration = max(0, min(1, src.node1_concentration + value)) src.node2_concentration = max(0, min(1, src.node2_concentration - value)) + investigate_log("was set to [node1_concentration] % on node 1 by [key_name(usr)]", "atmos") if(href_list["node2_c"]) var/value = text2num(href_list["node2_c"]) src.node2_concentration = max(0, min(1, src.node2_concentration + value)) src.node1_concentration = max(0, min(1, src.node1_concentration - value)) + investigate_log("was set to [node2_concentration] % on node 2 by [key_name(usr)]", "atmos") src.update_icon() src.updateUsrDialog() return diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index ac619b10b20..d43fd334d1a 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -106,5 +106,9 @@ #define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE #define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :( #define LOW_PRESSURE_DAMAGE 2 //The amounb of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). + +#define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this -#define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this \ No newline at end of file +// Atmos pipe limits +#define MAX_OUTPUT_PRESSURE 4500 // (kPa) What pressure pumps and powered equipment max out at. +#define MAX_TRANSFER_RATE 200 // (L/s) Maximum speed powered equipment can work at. \ No newline at end of file diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 37f6bbdd1ac..83e876c6dc9 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -689,7 +689,7 @@ The _flatIcons list is a cache for generated icon files. while(TRUE) if(curIndex<=process.len) current = process[curIndex] - if(!current) + if(!current) curIndex++ //Try the next layer continue currentLayer = current:layer @@ -867,3 +867,32 @@ The _flatIcons list is a cache for generated icon files. return final_average +//Interface for using DrawBox() to draw 1 pixel on a coordinate. +//Returns the same icon specifed in the argument, but with the pixel drawn +/proc/DrawPixel(var/icon/I,var/colour,var/drawX,var/drawY) + if(!I) + return 0 + + var/Iwidth = I.Width() + var/Iheight = I.Height() + + if(drawX > Iwidth || drawX <= 0) + return 0 + if(drawY > Iheight || drawY <= 0) + return 0 + + I.DrawBox(colour,drawX, drawY) + return I + + +//Interface for easy drawing of one pixel on an atom. +/atom/proc/DrawPixelOn(var/colour, var/drawX, var/drawY) + var/icon/I = new(icon) + var/icon/J = DrawPixel(I, colour, drawX, drawY) + if(J) //Only set the icon if it succeeded, the icon without the pixel is 1000x better than a black square. + icon = J + return J + return 0 + + + diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index fecd159e8d9..d1ea5365d4d 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -139,6 +139,7 @@ var/gang_B_name = null gang_A_name = pick(gang_name_pool) gang_name_pool -= gang_A_name gang_B_name = pick(gang_name_pool) + gang_name_pool -= gang_B_name if(gang == "A") return gang_A_name diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index d866f3186fe..49bbcb8d075 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -362,44 +362,44 @@ Turf and target are seperate in case you want to teleport some distance from a t //Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame() -//Last modified by Carn + /mob/proc/rename_self(var/role, var/allow_numbers=0) - spawn(0) - var/oldname = real_name + var/oldname = real_name + var/newname + var/loop = 1 + var/safety = 0 - var/time_passed = world.time - var/newname + while(loop && safety < 5) + if(client && client.prefs.custom_names[role] && !safety) + newname = client.prefs.custom_names[role] + else + switch(role) + if("clown") + newname = pick(clown_names) + if("mime") + newname = pick(mime_names) + if("ai") + newname = pick(ai_names) + else + return - for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name. - newname = input(src,"You are a [role]. Would you like to change your name to something else?", "Name change",oldname) as text - if((world.time-time_passed)>300) - return //took too long - newname = reject_bad_name(newname,allow_numbers) //returns null if the name doesn't meet some basic requirements. Tidies up a few other things like bad-characters. - - for(var/mob/living/M in player_list) - if(M == src) - continue - if(!newname || M.real_name == newname) - newname = null - break - if(newname) - break //That's a suitable name! - src << "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken." - - if(!newname) //we'll stick with the oldname then - return - - if(cmptext("ai",role)) - if(isAI(src)) - oldname = null//don't bother with the records update crap - - if(cmptext("cyborg",role)) - if(isrobot(src)) - var/mob/living/silicon/robot/A = src - A.custom_name = newname + for(var/mob/living/M in player_list) + if(M == src) + continue + if(!newname || M.real_name == newname) + newname = null + loop++ // name is already taken so we roll again + break + loop-- + safety++ + if(isAI(src)) + oldname = null//don't bother with the records update crap + if(newname) fully_replace_character_name(oldname,newname) - + if(isrobot(src)) + var/mob/living/silicon/robot/A = src + A.custom_name = newname //Picks a string of symbols to display as the law number for hacked or ion laws @@ -1250,9 +1250,8 @@ var/global/list/common_tools = list( //Because is_sharp is used for food or something. var/list/sharp_things_2 = list(\ - /obj/item/weapon/kitchenknife,\ - /obj/item/weapon/scalpel,\ - /obj/item/weapon/kitchen/utensil/knife) + /obj/item/weapon/kitchen/knife,\ + /obj/item/weapon/scalpel) if(is_type_in_list(W,sharp_things_1)) return 1 @@ -1274,7 +1273,7 @@ var/global/list/common_tools = list( return 1 if(istype(W, /obj/item/weapon/reagent_containers/syringe)) return 1 - if(istype(W, /obj/item/weapon/kitchen/utensil/fork)) + if(istype(W, /obj/item/weapon/kitchen/fork)) return 1 else return 0 diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index ab101d76c6e..edaa74eab14 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -8,6 +8,7 @@ var/list/first_names_male = file2list("config/names/first_male.txt") var/list/first_names_female = file2list("config/names/first_female.txt") var/list/last_names = file2list("config/names/last.txt") var/list/clown_names = file2list("config/names/clown.txt") +var/list/mime_names = file2list("config/names/mime.txt") var/list/verbs = file2list("config/names/verbs.txt") diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 68b4f2f104d..c7bdb4d7e90 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -19,7 +19,7 @@ I.attack(src, user) /mob/living/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone) - apply_damage(I.force, I.damtype) + apply_damage(I.force, I.damtype, def_zone) if(I.damtype == "brute") if(prob(33) && I.force) var/turf/location = src.loc diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 980cca93832..7f6db7d1388 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -411,7 +411,7 @@ var/list/uplink_items = list() /datum/uplink_item/stealthy_tools/syndigolashes name = "No-Slip Brown Shoes" desc = "These allow you to run on wet floors. They do not work on lubricated surfaces." - item = /obj/item/clothing/shoes/syndigaloshes + item = /obj/item/clothing/shoes/sneakers/syndigaloshes cost = 4 /datum/uplink_item/stealthy_tools/agent_card diff --git a/code/game/gamemodes/abduction/abduction.dm b/code/game/gamemodes/abduction/abduction.dm index 90b2deaa6a3..f3a73b5a032 100644 --- a/code/game/gamemodes/abduction/abduction.dm +++ b/code/game/gamemodes/abduction/abduction.dm @@ -251,19 +251,11 @@ /datum/game_mode/abduction/check_finished() - var/all_dead = 1 for(var/team_number=1,team_number<=teams,team_number++) - var/datum/mind/smind = scientists[team_number] - if(smind.current) - var/mob/living/M = smind.current - if(M.stat != DEAD) - all_dead = 0 var/obj/machinery/abductor/console/con = get_team_console(team_number) var/datum/objective/objective = team_objectives[team_number] if (con.experiment.points > objective.target_amount) return 1 - if(all_dead) - return 1 return ..() /datum/game_mode/abduction/declare_completion() diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 207805d235b..ded9ed324f2 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -15,6 +15,7 @@ var/list/blob_nodes = list() required_enemies = 1 recommended_enemies = 1 + round_ends_with_antag_death = 1 restricted_jobs = list("Cyborg", "AI") var/declared = 0 diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index aec57627778..c0987cabce1 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -1,8 +1,4 @@ /datum/game_mode/blob/check_finished() - if(replacementmode && round_converted == 2) - return replacementmode.check_finished() - if(round_converted) - return ..() if(infected_crew.len > burst)//Some blobs have yet to burst return 0 if(blobwincount <= blobs.len)//Blob took over @@ -14,11 +10,6 @@ SSshuttle.emergency.mode = SHUTTLE_DOCKED SSshuttle.emergency.timer = world.time priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority") - - if(config.midround_antag["blob"]) - round_converted = convert_roundtype() - if(!round_converted) - return 1 return ..() return 1 if(station_was_nuked)//Nuke went off diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 19ac0bf891f..738c4852782 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -16,9 +16,10 @@ var/name = "invalid" var/config_tag = null var/votable = 1 - var/probability = 1 + var/probability = 0 var/station_was_nuked = 0 //see nuclearbomb.dm and malfunction.dm var/explosion_in_progress = 0 //sit back and relax + var/round_ends_with_antag_death = 0 //flags the "one verse the station" antags as such var/list/datum/mind/modePlayer = new var/list/datum/mind/antag_candidates = list() // List of possible starting antags goes here var/list/restricted_jobs = list() // Jobs it doesn't make sense to be. I.E chaplain or AI cultist @@ -29,6 +30,7 @@ var/pre_setup_before_jobs = 0 var/antag_flag = null //preferences flag such as BE_WIZARD that need to be turned on for players to be antag var/datum/mind/sacrifice_target = null + var/mob/living/living_antag_player = null var/list/datum/game_mode/replacementmode = null var/round_converted = 0 //0: round not converted, 1: round going to convert, 2: round converted var/reroll_friendly //During mode conversion only these are in the running @@ -97,16 +99,16 @@ ///convert_roundtype() ///Allows rounds to basically be "rerolled" should the initial premise fall through /datum/game_mode/proc/convert_roundtype() - var/living_crew = 0 + var/list/living_crew = list() for(var/mob/Player in mob_list) if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player)) - living_crew++ - if(living_crew / joined_player_list.len <= config.midround_antag_life_check) //If a lot of the player base died, we start fresh + living_crew += Player + if(living_crew.len / joined_player_list.len <= config.midround_antag_life_check) //If a lot of the player base died, we start fresh message_admins("Convert_roundtype failed due to too many dead people. Limit is [config.midround_antag_life_check * 100]% living crew") return null - var/list/datum/game_mode/runnable_modes = config.get_runnable_midround_modes(living_crew) + var/list/datum/game_mode/runnable_modes = config.get_runnable_midround_modes(living_crew.len) var/list/datum/game_mode/usable_modes = list() for(var/datum/game_mode/G in runnable_modes) if(G.reroll_friendly) @@ -167,8 +169,32 @@ /datum/game_mode/proc/check_finished() //to be called by ticker + if(replacementmode && round_converted == 2) + return replacementmode.check_finished() if(SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || station_was_nuked) return 1 + if(!round_converted && (!config.continuous[config_tag] || (config.continuous[config_tag] && config.midround_antag[config_tag]))) //Non-continuous or continous with replacement antags + if(living_antag_player && living_antag_player.mind && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player)) + return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark. + + for(var/mob/living/Player in living_mob_list) + if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player)) + if(Player.mind.special_role) //Someone's still antaging! + living_antag_player = Player + return 0 + + if(!config.continuous[config_tag]) + return 1 + + else + round_converted = convert_roundtype() + if(!round_converted) + if(round_ends_with_antag_death) + return 1 + else + config.midround_antag[config_tag] = 0 + return 0 + return 0 diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index 4b5fed604e8..a5481346f30 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -26,7 +26,7 @@ recommended_enemies = 2 enemy_minimum_age = 14 var/finished = 0 - var/goal_scalar = 0.6 //Goal = Total territories x goal_scalar + var/goal_scalar = 0.5 //Goal = Total territories x goal_scalar /////////////////////////// //Announces the game type// @@ -94,7 +94,7 @@ /datum/game_mode/proc/forge_gang_objectives(var/datum/mind/boss_mind) var/datum/objective/rival_obj = new rival_obj.owner = boss_mind - rival_obj.explanation_text = "Claim more than 60% the station before the [(boss_mind in A_bosses) ? gang_name("B") : gang_name("A")] Gang does." + rival_obj.explanation_text = "Claim more than 50% the station before the [(boss_mind in A_bosses) ? gang_name("B") : gang_name("A")] Gang does." boss_mind.objectives += rival_obj @@ -138,7 +138,7 @@ else gangtool.register_device(mob) mob << "The Gangtool in your [where] will allow you to use your influence to purchase items and prevent the station from evacuating before you can take over. Use it to recall the emergency shuttle from anywhere on the station." - mob << "You can also promote your gang members to lieutenant by giving them an unregistered gangtool. Lieutenants cannot be deconverted and are able to use recruitment pens and gangtools." + mob << "You can also promote your gang members to lieutenant by giving them an unregistered gangtool. Lieutenants cannot be deconverted and are able to use recruitment pens and gangtools." . += 1 var/where2 = mob.equip_in_one_of_slots(T, slots) @@ -152,7 +152,7 @@ if (!where3) mob << "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start." else - mob << "The territory spraycan in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get." + mob << "The territory spraycan in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. Distribute these to your gangsters to grow your influence faster." . += 1 mob.update_icons() @@ -194,8 +194,8 @@ carbon_mob.flash_eyes(1, 1) gangster_mind.current.Stun(5) gangster_mind.current << "You are now a member of the [gang=="A" ? gang_name("A") : gang_name("B")] Gang!" - gangster_mind.current << "Help your bosses take over the station by claiming territory with the special spraycans they provide. Simply spray on any unclaimed area of the station." - gangster_mind.current << "You can identify your bosses by their brown \"G\" icon." + gangster_mind.current << "Help your bosses take over the station by claiming territory with special spraycans only they can provide. Simply spray on any unclaimed area of the station." + gangster_mind.current << "You can identify your bosses by their red \[G\] icon." gangster_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the [gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"]!" gangster_mind.special_role = "[gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"]" update_gang_icons_added(gangster_mind,gang) @@ -285,7 +285,7 @@ if(!finished) world << "The station was [station_was_nuked ? "destroyed!" : "evacuated before either gang could claim it!"]" else - world << "The [finished=="A" ? gang_name("A") : gang_name("B")] Gang has taken over the station!" + world << "The [finished=="A" ? gang_name("A") : gang_name("B")] Gang has claimed over [round(100*goal_scalar,1)]% of the station and has assumed control!" ..() return 1 @@ -343,11 +343,12 @@ /datum/gang_points var/A = 30 var/B = 30 - var/next_point_time = 0 + var/next_point_interval = 1800 + var/next_point_time /datum/gang_points/proc/start() - next_point_time = world.time + 3000 - spawn(3000) + next_point_time = world.time + next_point_interval + spawn(next_point_interval) income() /datum/gang_points/proc/income() @@ -375,7 +376,7 @@ //Calculate and report influence growth ticker.mode.message_gangtools(ticker.mode.A_tools,"[gang_name("A")] Gang Status Report:") - var/A_new = min(100,A + 15 + min(ticker.mode.A_territory.len, 15) + round(max(ticker.mode.A_territory.len - 15, 0) * 0.5,1)) + var/A_new = min(100,A + 15 + ticker.mode.A_territory.len) var/A_message = "" if(A_new != A) A_message += "Your gang has gained [A_new - A] Influence for holding on to [ticker.mode.A_territory.len] territories." @@ -385,7 +386,7 @@ ticker.mode.message_gangtools(ticker.mode.A_tools,A_message,0) ticker.mode.message_gangtools(ticker.mode.B_tools,"[gang_name("B")] Gang Status Report:") - var/B_new = min(100,B + 15 + min(ticker.mode.B_territory.len, 15) + round(max(ticker.mode.B_territory.len - 15, 0) * 0.5,1)) + var/B_new = min(100,B + 15 + ticker.mode.B_territory.len) var/B_message = "" if(B_new != B) B_message += "Your gang has gained [B_new - B] Influence for holding on to [ticker.mode.B_territory.len] territories." diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 7271875daee..1531ac36613 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -10,7 +10,7 @@ recommended_enemies = 1 pre_setup_before_jobs = 1 enemy_minimum_age = 30 //Same as AI minimum age - + round_ends_with_antag_death = 1 var/AI_win_timeleft = 5400 //started at 5400, in case I change this for testing round end. var/malf_mode_declared = 0 @@ -170,10 +170,6 @@ /datum/game_mode/malfunction/check_finished() - if(replacementmode && round_converted == 2) - return replacementmode.check_finished() - if(round_converted == 1) //No reason to waste resources - return ..() //Check for evacuation/nuke if (station_captured && !to_nuke_or_not_to_nuke) return 1 if (is_malf_ai_dead() || !check_ai_loc()) @@ -186,10 +182,6 @@ malf_mode_declared = 0 if(get_security_level() == "delta") set_security_level("red") - if(config.midround_antag["malfunction"]) - round_converted = convert_roundtype() - if(!round_converted) - return 1 return ..() else return 1 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 87f62b30a0a..025c55c3532 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -218,11 +218,15 @@ if(config.continuous["revolution"]) if(finished != 0) SSshuttle.emergencyNoEscape = 0 + if(SSshuttle.emergency.mode == SHUTTLE_STRANDED) + SSshuttle.emergency.mode = SHUTTLE_DOCKED + SSshuttle.emergency.timer = world.time + priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority") return ..() if(finished != 0) return 1 else - return 0 + return ..() /////////////////////////////////////////////////// //Deals with converting players to the revolution// diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 372ee45ff10..902a17c4a14 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -157,28 +157,6 @@ Made by Xhuis new_thrall_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind return 1 - - -/* - GAME FINISH CHECKS -*/ - - -/datum/game_mode/shadowling/check_finished() - var/shadows_alive = 0 //and then shadowling was kill - for(var/datum/mind/shadow in shadows) //but what if shadowling was not kill? - if(!istype(shadow.current,/mob/living/carbon/human) && !istype(shadow.current,/mob/living/simple_animal/ascendant_shadowling)) - continue - if(shadow.current.stat == DEAD) - continue - shadows_alive++ - if(shadows_alive) - return ..() - else - shadowling_dead = 1 //but shadowling was kill :( - return 1 - - /datum/game_mode/shadowling/proc/check_shadow_victory() var/success = 0 //Did they win? if(shadow_objectives.Find("enthrall")) diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index d0d350d86d7..6f19d7cdd0d 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -60,7 +60,7 @@ else if(mages_made >= max_mages) finished = 1 - return 1 + return ..() else make_more_mages() return ..() diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index b086e9a1d5d..4503908cccc 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -1,7 +1,7 @@ //In this file: Summon Magic/Summon Guns/Summon Events /proc/rightandwrong(var/summon_type, var/mob/user, var/survivor_probability) //0 = Summon Guns, 1 = Summon Magic - var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","speargun") + var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","speargun","arg") var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying", "necromantic","staffdoor", "special") var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos") @@ -55,6 +55,8 @@ new /obj/item/weapon/gun/projectile/shotgun(get_turf(H)) if("combatshotgun") new /obj/item/weapon/gun/projectile/shotgun/combat(get_turf(H)) + if("arg") + new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H)) if("mateba") new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(H)) if("boltaction") @@ -85,6 +87,7 @@ if("car") var/obj/item/weapon/gun/projectile/automatic/m90/gat = new(get_turf(H)) gat.pin = new /obj/item/device/firing_pin + else switch (randomizemagic) if("fireball") diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 2df1b4cd4ca..7f8ade33d02 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -169,6 +169,8 @@ var/mob/living/simple_animal/shade/A = locate() in C if(A) var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer") + if(!T || !T.loc) + return switch(construct_class) if("Juggernaut") makeNewConstruct(/mob/living/simple_animal/construct/armored, A, U) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index ddce2321c47..1d2d5d5a98f 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -10,6 +10,7 @@ recommended_enemies = 1 pre_setup_before_jobs = 1 enemy_minimum_age = 14 + round_ends_with_antag_death = 1 var/use_huds = 0 var/finished = 0 @@ -171,37 +172,16 @@ /datum/game_mode/wizard/check_finished() - if(replacementmode && round_converted == 2) - return replacementmode.check_finished() - - if(round_converted == 1 || !wizards) //No reason to waste resources - return ..() //Check for evacuation/nuke - for(var/datum/mind/wizard in wizards) if(!wizard.current) continue if(wizard.current.stat != DEAD) return ..() - for(var/datum/mind/traitor in traitors) - if(!traitor.current) - continue - if(traitor.current.stat != DEAD) - return ..() - - if(!config.continuous["wizard"]) - return 1 - if(SSevent.wizardmode) //If summon events was active, turn it off SSevent.toggleWizardmode() SSevent.resetFrequency() - if(config.midround_antag["wizard"]) - round_converted = convert_roundtype() - if(!round_converted) - finished = 1 - return 1 - return ..() /datum/game_mode/wizard/declare_completion() diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm index 26225a71971..53d8be8e8ad 100644 --- a/code/game/jobs/job/civilian_chaplain.dm +++ b/code/game/jobs/job/civilian_chaplain.dm @@ -18,131 +18,50 @@ Chaplain access = list(access_morgue, access_chapel_office, access_crematorium) minimal_access = list(access_morgue, access_chapel_office, access_crematorium) - //Pretty bible names - var/global/list/biblenames = list("Bible", "Quran", "Scrapbook", "Burning Bible", "Clown Bible", "Banana Bible", "Creeper Bible", "White Bible", "Holy Light", "The God Delusion", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "Melted Bible", "Necronomicon") - - //Bible iconstates - var/global/list/biblestates = list("bible", "koran", "scrapbook", "burning", "honk1", "honk2", "creeper", "white", "holylight", "atheist", "tome", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon") - - //Bible itemstates - var/global/list/bibleitemstates = list("bible", "koran", "scrapbook", "bible", "bible", "bible", "syringe_kit", "syringe_kit", "syringe_kit", "syringe_kit", "syringe_kit", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon") - -/datum/job/chaplain/proc/setupbiblespecifics(var/obj/item/weapon/storage/book/bible/B, var/mob/living/carbon/human/H) - switch(B.icon_state) - if("honk1","honk2") - new /obj/item/weapon/grown/bananapeel(B) - new /obj/item/weapon/grown/bananapeel(B) - - if(B.icon_state == "honk1") - H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask) - - if("bible") - for(var/area/chapel/main/A in world) - for(var/turf/T in A.contents) - if(T.icon_state == "carpetsymbol") - T.dir = 2 - if("koran") - for(var/area/chapel/main/A in world) - for(var/turf/T in A.contents) - if(T.icon_state == "carpetsymbol") - T.dir = 4 - if("scientology") - for(var/area/chapel/main/A in world) - for(var/turf/T in A.contents) - if(T.icon_state == "carpetsymbol") - T.dir = 8 - if("athiest") - for(var/area/chapel/main/A in world) - for(var/turf/T in A.contents) - if(T.icon_state == "carpetsymbol") - T.dir = 10 - -/datum/job/chaplain/Topic(href, href_list) - if(href_list["seticon"]) - var/iconi = text2num(href_list["seticon"]) - - var/biblename = biblenames[iconi] - var/obj/item/weapon/storage/book/bible/B = locate(href_list["bible"]) - - B.icon_state = biblestates[iconi] - B.item_state = bibleitemstates[iconi] - - //Set biblespecific chapels - setupbiblespecifics(B, usr) - - usr.put_in_hands(B) // Update inhand icon - - if(ticker) - ticker.Bible_icon_state = B.icon_state - ticker.Bible_item_state = B.item_state - ticker.Bible_name = B.name - feedback_set_details("religion_book","[biblename]") - - usr << browse(null, "window=editicon") // Close window - /datum/job/chaplain/equip_items(var/mob/living/carbon/human/H) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes) var/obj/item/weapon/storage/book/bible/B = new /obj/item/weapon/storage/book/bible/booze(H) - spawn(0) - var/religion_name = "Christianity" - var/new_religion = copytext(sanitize(input(H, "You are the Chaplain. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name)),1,MAX_NAME_LEN) + var/new_religion = "Christianity" + if(H.client && H.client.prefs.custom_names["religion"]) + new_religion = H.client.prefs.custom_names["religion"] - if (!new_religion) - new_religion = religion_name + switch(lowertext(new_religion)) + if("christianity") + B.name = pick("The Holy Bible","The Dead Sea Scrolls") + if("satanism") + B.name = "The Unholy Bible" + if("cthulu") + B.name = "The Necronomicon" + if("islam") + B.name = "Quran" + if("scientology") + B.name = pick("The Biography of L. Ron Hubbard","Dianetics") + if("chaos") + B.name = "The Book of Lorgar" + if("imperium") + B.name = "Uplifting Primer" + if("toolboxia") + B.name = "Toolbox Manifesto" + if("homosexuality") + B.name = "Guys Gone Wild" + if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks") + B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition") + H.setBrainLoss(100) // starts off retarded as fuck + if("science") + B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition") + else + B.name = "The Holy Book of [new_religion]" + feedback_set_details("religion_name","[new_religion]") + ticker.Bible_name = B.name - switch(lowertext(new_religion)) - if("christianity") - B.name = pick("The Holy Bible","The Dead Sea Scrolls") - if("satanism") - B.name = "The Unholy Bible" - if("cthulu") - B.name = "The Necronomicon" - if("islam") - B.name = "Quran" - if("scientology") - B.name = pick("The Biography of L. Ron Hubbard","Dianetics") - if("chaos") - B.name = "The Book of Lorgar" - if("imperium") - B.name = "Uplifting Primer" - if("toolboxia") - B.name = "Toolbox Manifesto" - if("homosexuality") - B.name = "Guys Gone Wild" - if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks") - B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition") - H.setBrainLoss(100) // starts off retarded as fuck - if("science") - B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition") - else - B.name = "The Holy Book of [new_religion]" - feedback_set_details("religion_name","[new_religion]") + var/new_deity = "Space Jesus" + if(H.client && H.client.prefs.custom_names["deity"]) + new_deity = H.client.prefs.custom_names["deity"] + B.deity_name = new_deity - spawn(1) - var/deity_name = "Space Jesus" - var/new_deity = copytext(sanitize(input(H, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name)),1,MAX_NAME_LEN) - - if ((length(new_deity) == 0) || (new_deity == "Space Jesus") ) - new_deity = deity_name - B.deity_name = new_deity - - if(ticker) - ticker.Bible_deity_name = B.deity_name - feedback_set_details("religion_deity","[new_deity]") - - //Open bible selection - var/dat = "Pick Bible Style

Pick a bible style

" - - var/i - for(i = 1, i < biblestates.len, i++) - var/icon/bibleicon = icon('icons/obj/storage.dmi', biblestates[i]) - - var/nicename = biblenames[i] - H << browse_rsc(bibleicon, nicename) - dat += {""} - - dat += "
[nicename]
" - - H << browse(dat, "window=editicon;can_close=0;can_minimize=0;size=250x650") \ No newline at end of file + if(ticker) + ticker.Bible_deity_name = B.deity_name + feedback_set_details("religion_deity","[new_deity]") + H.equip_to_slot_or_del(B, slot_in_backpack) \ No newline at end of file diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 0b11e742401..e14e0792a84 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -167,8 +167,7 @@ return 0 /obj/machinery/alarm/attack_hand(mob/user) - . = ..() - if (.) + if (..()) return user.set_machine(src) @@ -188,17 +187,41 @@ if(!shorted) //user << browse(return_text(),"window=air_alarm") //onclose(user, "air_alarm") - var/datum/browser/popup = new(user, "air_alarm", "[alarm_area.name] Air Alarm", 500, 400) + /*var/datum/browser/popup = new(user, "air_alarm", "[alarm_area.name] Air Alarm", 500, 400) popup.set_content(return_text()) popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.open() - refresh_all() + refresh_all()*/ + ui_interact(user) if(panel_open && (!istype(user, /mob/living/silicon/ai))) wires.Interact(user) return +/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main") + if(stat & (BROKEN|NOPOWER)) + return + + var/data = list() + + data["locked"] = locked + data["siliconUser"] = user.has_unlimited_silicon_privilege + data["screen"] = screen + data["dangerous"] = emagged + + populate_status(data) + if (!locked || user.has_unlimited_silicon_privilege) + populate_controls(data) + + var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key) + if (!ui) + ui = new /datum/nanoui(user, src, ui_key, "air_alarm.tmpl", "Air Alarm", 350, 500) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + else + ui.push_data(data) /obj/machinery/alarm/proc/shock(mob/user, prb) if((stat & (NOPOWER))) // unpowered, no shock @@ -247,326 +270,163 @@ return 1 -/obj/machinery/alarm/proc/return_text() - var/dat = "" - dat += "
Swipe ID card to [locked ? "unlock" : "lock"] interface.
" - if(!usr.has_unlimited_silicon_privilege && locked) - dat += "[return_status()]" - else - dat += "[return_safety()][return_status()]
[return_controls()]" - return dat - -/obj/machinery/alarm/proc/return_status() - var/turf/location = src.loc +/obj/machinery/alarm/proc/populate_status(var/list/data) + var/turf/location = get_turf(src) var/datum/gas_mixture/environment = location.return_air() var/total = environment.oxygen + environment.carbon_dioxide + environment.toxins + environment.nitrogen - var/output = "

Air Status:

" - if(total == 0) - output +={"Warning: Cannot obtain air sample for analysis."} - return output + var/list/environment_data = list() + data["atmos_alarm"] = alarm_area.atmosalm + data["fire_alarm"] = (alarm_area.fire != null && alarm_area.fire) + data["danger_level"] = danger_level + if(total) + var/datum/tlv/cur_tlv + var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume - output += {" - -"} - var/datum/tlv/cur_tlv - var/GET_PP = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume + cur_tlv = TLV["pressure"] + var/pressure = environment.return_pressure() + var/pressure_danger = cur_tlv.get_danger_level(pressure) + environment_data += list(list("name" = "Pressure", "value" = pressure, "unit" = "kPa", "danger_level" = pressure_danger)) - cur_tlv = TLV["pressure"] - var/environment_pressure = environment.return_pressure() - var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure) + cur_tlv = TLV["oxygen"] + var/oxygen_danger = cur_tlv.get_danger_level(environment.oxygen*partial_pressure) + environment_data += list(list("name" = "Oxygen", "value" = environment.oxygen / total * 100, "unit" = "%", "danger_level" = oxygen_danger)) - cur_tlv = TLV["oxygen"] - var/oxygen_dangerlevel = cur_tlv.get_danger_level(environment.oxygen*GET_PP) - var/oxygen_percent = round(environment.oxygen / total * 100, 2) + cur_tlv = TLV["carbon dioxide"] + var/carbon_dioxide_danger = cur_tlv.get_danger_level(environment.carbon_dioxide*partial_pressure) + environment_data += list(list("name" = "Carbon dioxide", "value" = environment.carbon_dioxide / total * 100, "unit" = "%", "danger_level" = carbon_dioxide_danger)) - cur_tlv = TLV["carbon dioxide"] - var/co2_dangerlevel = cur_tlv.get_danger_level(environment.carbon_dioxide*GET_PP) - var/co2_percent = round(environment.carbon_dioxide / total * 100, 2) + cur_tlv = TLV["plasma"] + var/plasma_danger = cur_tlv.get_danger_level(environment.toxins*partial_pressure) + environment_data += list(list("name" = "Toxins", "value" = environment.toxins / total * 100, "unit" = "%", "danger_level" = plasma_danger)) - cur_tlv = TLV["plasma"] - var/plasma_dangerlevel = cur_tlv.get_danger_level(environment.toxins*GET_PP) - var/plasma_percent = round(environment.toxins / total * 100, 2) + cur_tlv = TLV["other"] + var/other_moles = 0.0 + for(var/datum/gas/G in environment.trace_gases) + other_moles+=G.moles + var/other_danger = cur_tlv.get_danger_level(other_moles*partial_pressure) + environment_data += list(list("name" = "Other", "value" = other_moles / total * 100, "unit" = "%", "danger_level" = other_danger)) - cur_tlv = TLV["other"] - var/other_moles = 0.0 - for(var/datum/gas/G in environment.trace_gases) - other_moles+=G.moles - var/other_dangerlevel = cur_tlv.get_danger_level(other_moles*GET_PP) - - cur_tlv = TLV["temperature"] - var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.temperature) - - output += {" -Pressure: [environment_pressure]kPa
-Oxygen: [oxygen_percent]%
-Carbon dioxide: [co2_percent]%
-Toxins: [plasma_percent]%
-"} - if (other_dangerlevel==2) - output += {"Notice: High Concentration of Unknown Particles Detected
"} - else if (other_dangerlevel==1) - output += {"Notice: Low Concentration of Unknown Particles Detected
"} - - output += {" -Temperature: [environment.temperature]K
-"} - - var/display_danger_level = max( - pressure_dangerlevel, - oxygen_dangerlevel, - co2_dangerlevel, - plasma_dangerlevel, - other_dangerlevel, - temperature_dangerlevel - ) - - //Overall status - output += {"Local Status: "} - if(display_danger_level == 2) - output += {"DANGER: Internals Required"} - else if(display_danger_level == 1) - output += {"Caution"} - else if (alarm_area.atmosalm) - output += {"Caution: Atmos alert in area"} - else - output += {"Optimal"} - - return output - -/obj/machinery/alarm/proc/return_safety() - var/output = "" - if(src.emagged) - output += "NOTICE: Safety measures nonfunctional. Device may exhibit abnormal behavior.

" - else - output += "Safety measures functioning properly.

" - return output - - -/obj/machinery/alarm/proc/return_controls() - var/output = ""//"[alarm_zone] Air [name]
" + cur_tlv = TLV["temperature"] + var/temperature_danger = cur_tlv.get_danger_level(environment.temperature) + environment_data += list(list("name" = "Temperature", "value" = environment.temperature, "unit" = "K ([round(environment.temperature - T0C, 0.1)]C)", "danger_level" = temperature_danger)) + data["environment_data"] = environment_data +/obj/machinery/alarm/proc/populate_controls(var/list/data) switch(screen) - if (AALARM_SCREEN_MAIN) - if(alarm_area.atmosalm) - output += {"Reset - Atmospheric Alarm
"} - else - output += {"Activate - Atmospheric Alarm
"} + if(AALARM_SCREEN_MAIN) + data["mode"] = mode + if(AALARM_SCREEN_VENT) + data["vents"] = list() + for(var/id_tag in alarm_area.air_vent_names) + var/long_name = alarm_area.air_vent_names[id_tag] + var/list/info = alarm_area.air_vent_info[id_tag] + if(!info) + continue + data["vents"] += list(list( + "id_tag" = id_tag, + "long_name" = sanitize(long_name), + "power" = info["power"], + "checks" = info["checks"], + "excheck" = info["checks"]&1, + "incheck" = info["checks"]&2, + "direction" = info["direction"], + "external" = info["external"] + )) + if(AALARM_SCREEN_SCRUB) + data["scrubbers"] = list() + for(var/id_tag in alarm_area.air_scrub_names) + var/long_name = alarm_area.air_scrub_names[id_tag] + var/list/info = alarm_area.air_scrub_info[id_tag] + if(!info) + continue + data["scrubbers"] += list(list( + "id_tag" = id_tag, + "long_name" = sanitize(long_name), + "power" = info["power"], + "scrubbing" = info["scrubbing"], + "panic" = info["panic"], + "filter_co2" = info["filter_co2"], + "filter_toxins" = info["filter_toxins"], + "filter_n2o" = info["filter_n2o"] + )) + if(AALARM_SCREEN_MODE) + data["mode"] = mode + data["modes"] = list() + data["modes"] += list(list("name" = "Filtering - Scrubs out contaminants", "mode" = AALARM_MODE_SCRUBBING, "selected" = mode == AALARM_MODE_SCRUBBING, "danger" = 0)) + data["modes"] += list(list("name" = "Draught - Siphons out air while replacing", "mode" = AALARM_MODE_VENTING, "selected" = mode == AALARM_MODE_VENTING, "danger" = 0)) + data["modes"] += list(list("name" = "Cycle - Siphons air before replacing", "mode" = AALARM_MODE_REPLACEMENT, "selected" = mode == AALARM_MODE_REPLACEMENT, "danger" = 1)) + data["modes"] += list(list("name" = "Panic - Siphons air out of the room", "mode" = AALARM_MODE_PANIC, "selected" = mode == AALARM_MODE_PANIC, "danger" = 1)) + data["modes"] += list(list("name" = "Off - Shuts off vents and scrubbers", "mode" = AALARM_MODE_OFF, "selected" = mode == AALARM_MODE_OFF, "danger" = 0)) + if (src.emagged) + data["modes"] += list(list("name" = "Flood - Shuts off scrubbers and opens vents", "mode" = AALARM_MODE_FLOOD, "selected" = mode == AALARM_MODE_FLOOD, "danger" = 1)) + if(AALARM_SCREEN_SENSORS) + var/datum/tlv/selected + var/list/thresholds = list() - output += {" -Scrubbers Control
-Vents Control
-Set Environmentals Mode
-Sensor Settings
-
-"} - if (mode==AALARM_MODE_PANIC) - output += "PANIC SYPHON ACTIVE
Turn syphoning off" - else - output += "ACTIVATE PANIC SYPHON IN AREA" - if (AALARM_SCREEN_VENT) - var/sensor_data = "" - if(alarm_area.air_vent_names.len) - for(var/id_tag in alarm_area.air_vent_names) - var/long_name = alarm_area.air_vent_names[id_tag] - var/list/data = alarm_area.air_vent_info[id_tag] - if(!data) - continue; - var/state = "" - - sensor_data += {" -

[long_name]

-[state]
-Operating: -[data["power"]?"on":"off"] -
-Pressure checks: -external -internal -
-External pressure bound: -- -- -- -- -[data["external"]] -+ -+ -+ -+ -reset -
-"} - if (data["direction"] == "siphon") - sensor_data += {" -Direction: -siphoning -
-"} - sensor_data += {"
"} - else - sensor_data = "No vents connected.
" - output = {"<< Main Menu

[sensor_data]"} - if (AALARM_SCREEN_SCRUB) - var/sensor_data = "" - if(alarm_area.air_scrub_names.len) - for(var/id_tag in alarm_area.air_scrub_names) - var/long_name = alarm_area.air_scrub_names[id_tag] - var/list/data = alarm_area.air_scrub_info[id_tag] - if(!data) - continue; - var/state = "" - - sensor_data += {" -[long_name][state]
-Operating: -[data["power"]?"on":"off"]
-Type: -[data["scrubbing"]?"scrubbing":"syphoning"]
-"} - - if(data["scrubbing"]) - sensor_data += {" -Filtering: -Carbon Dioxide -[data["filter_co2"]?"on":"off"]; -Toxins -[data["filter_toxins"]?"on":"off"]; -Nitrous Oxide -[data["filter_n2o"]?"on":"off"] -
-"} - sensor_data += {" -Panic syphon: [data["panic"]?"PANIC SYPHON ACTIVATED":""] -Dea":"red'>A")]ctivate
-
-"} - else - sensor_data = "No scrubbers connected.
" - output = {"<< Main Menu

[sensor_data]"} - - if (AALARM_SCREEN_MODE) - output += {" -<< Main Menu

-Air machinery mode for the area:" - if (AALARM_SCREEN_SENSORS) - output += {" -<< Main Menu


-Alarm thresholds:
-Partial pressure for gases - - - -"} - var/list/gases = list( + var/list/gas_names = list( "oxygen" = "O2", "carbon dioxide" = "CO2", "plasma" = "Toxin", - "other" = "Other", - ) - var/list/thresholds = list("min2", "min1", "max1", "max2") - var/datum/tlv/tlv - for (var/g in gases) - output += {" - -"} - tlv = TLV[g] - for (var/v in thresholds) - output += {" - -"} - output += {" - -"} - tlv = TLV["pressure"] - output += {" - -"} - for (var/v in thresholds) - output += {" - -"} - output += {" - -"} - tlv = TLV["temperature"] - output += {" - -"} - for (var/v in thresholds) - output += {" - -"} - output += {" - -"} - output += {"
min2min1max1max2
[gases[g]] -[tlv.vars[v]>=0?tlv.vars[v]:"OFF"] -
Pressure -[tlv.vars[v]>=0?tlv.vars[v]:"OFF"] -
Temperature -[tlv.vars[v]>=0?tlv.vars[v]:"OFF"] -
"} + "other" = "Other") + for (var/g in gas_names) + thresholds += list(list("name" = gas_names[g], "settings" = list())) + selected = TLV[g] + thresholds[thresholds.len]["settings"] += list(list("env" = g, "val" = "min2", "selected" = selected.min2)) + thresholds[thresholds.len]["settings"] += list(list("env" = g, "val" = "min1", "selected" = selected.min1)) + thresholds[thresholds.len]["settings"] += list(list("env" = g, "val" = "max1", "selected" = selected.max1)) + thresholds[thresholds.len]["settings"] += list(list("env" = g, "val" = "max2", "selected" = selected.max2)) - return output + selected = TLV["pressure"] + thresholds += list(list("name" = "Pressure", "settings" = list())) + thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min2", "selected" = selected.min2)) + thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min1", "selected" = selected.min1)) + thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max1", "selected" = selected.max1)) + thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max2", "selected" = selected.max2)) + + selected = TLV["temperature"] + thresholds += list(list("name" = "Temperature", "settings" = list())) + thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min2", "selected" = selected.min2)) + thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min1", "selected" = selected.min1)) + thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max1", "selected" = selected.max1)) + thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max2", "selected" = selected.max2)) + + + data["thresholds"] = thresholds /obj/machinery/alarm/Topic(href, href_list) if(..()) return usr.set_machine(src) + if (locked && !usr.has_unlimited_silicon_privilege) + return + if ( (get_dist(src, usr) > 1 )) if (!istype(usr, /mob/living/silicon)) usr.unset_machine() usr << browse(null, "window=air_alarm") return - + if(href_list["toggleaccess"]) + if(usr.has_unlimited_silicon_privilege && !wires.IsIndexCut(AALARM_WIRE_IDSCAN)) + locked = !locked if(href_list["command"]) var/device_id = href_list["id_tag"] switch(href_list["command"]) + if("set_external_pressure") + var/input_pressure = input("What pressure you like the system to mantain?", "Pressure Controls") as num|null + if(isnum(input_pressure)) + send_signal(device_id, list(href_list["command"] = input_pressure)) + return 1 + + if("reset_external_pressure") + send_signal(device_id, list(href_list["command"] = ONE_ATMOSPHERE)) + return 1 if( "power", "adjust_external_pressure", - "set_external_pressure", - "checks", "co2_scrub", "tox_scrub", "n2o_scrub", @@ -577,12 +437,18 @@ table tr:first-child th:first-child { border: none;} spawn(3) src.updateUsrDialog() + if ("excheck") + send_signal(device_id, list ("checks" = text2num(href_list["val"])^1)) + + if ("incheck") + send_signal(device_id, list ("checks" = text2num(href_list["val"])^2)) + //if("adjust_threshold") //was a good idea but required very wide window if("set_threshold") var/env = href_list["env"] var/varname = href_list["var"] var/datum/tlv/tlv = TLV[env] - var/newval = input("Enter [varname] for env", "Alarm triggers", tlv.vars[varname]) as num|null + var/newval = input("Enter [varname] for [env]", "Alarm triggers", tlv.vars[varname]) as num|null if (isnull(newval) || ..() || (locked && !(usr.has_unlimited_silicon_privilege))) return diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 3004a7a4389..eea599dd0f0 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -257,32 +257,34 @@ update_flag return src.attack_hand(user) /obj/machinery/portable_atmospherics/canister/attack_hand(var/mob/user as mob) - return src.interact(user) + return src.ui_interact(user) -/obj/machinery/portable_atmospherics/canister/interact(var/mob/user as mob) +/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main") if (src.destroyed) return - user.set_machine(src) - var/holding_text - if(holding) - holding_text = {"
Tank Pressure: [holding.air_contents.return_pressure()] KPa
-Remove Tank
-"} - var/output_text = {"[name][can_label?" relabel":""]
-Pressure: [air_contents.return_pressure()] KPa
-Port Status: [(connected_port)?("Connected"):("Disconnected")] -[holding_text] -
-Release Valve: [valve_open?("Open"):("Closed")]
-Release Pressure: - - - - [release_pressure] + + + +
-
-Close
-"} + var/data = list() + data["name"] = src.name + data["canLabel"] = src.can_label ? 1 : 0 + data["portConnected"] = src.connected_port ? 1 : 0 + data["tankPressure"] = round(src.air_contents.return_pressure() ? src.air_contents.return_pressure() : 0) + data["releasePressure"] = round(src.release_pressure ? src.release_pressure : 0) + data["minReleasePressure"] = round(ONE_ATMOSPHERE/10) + data["maxReleasePressure"] = round(10*ONE_ATMOSPHERE) + data["valveOpen"] = src.valve_open ? 1 : 0 - user << browse("[src][output_text]", "window=canister;size=600x300") - onclose(user, "canister") - return + data["hasHoldingTank"] = src.holding ? 1 : 0 + if (holding) + data["holdingTank"] = list("name" = src.holding.name, "tankPressure" = round(src.holding.air_contents.return_pressure())) + + var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key) + if (!ui) + ui = new /datum/nanoui(user, src, ui_key, "canister.tmpl", "Canister", 480, 400) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + else + ui.push_data(data) /obj/machinery/portable_atmospherics/canister/Topic(href, href_list) diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 48be900d0a9..2be45dacd4c 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -180,9 +180,7 @@ user << "You connect the monitor." if(!laws.inherent.len) //If laws isn't set to null but nobody supplied a board, the AI would normally be created lawless. We don't want that. laws = null - var/mob/living/silicon/ai/A = new /mob/living/silicon/ai (loc, laws, brain) - if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created - A.rename_self("ai", 1) + new /mob/living/silicon/ai (loc, laws, brain) feedback_inc("cyborg_ais_created",1) qdel(src) diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm deleted file mode 100644 index 064361f2614..00000000000 --- a/code/game/machinery/telecomms/broadcaster.dm +++ /dev/null @@ -1,572 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/* - The broadcaster sends processed messages to all radio devices in the game. They - do not have to be headsets; intercoms and station-bounced radios suffice. - - They receive their message from a server after the message has been logged. -*/ - -var/list/recentmessages = list() // global list of recent messages broadcasted : used to circumvent massive radio spam -var/message_delay = 0 // To make sure restarting the recentmessages list is kept in sync - -/obj/machinery/telecomms/broadcaster - name = "subspace broadcaster" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "broadcaster" - desc = "A dish-shaped machine used to broadcast processed subspace signals." - density = 1 - anchored = 1 - use_power = 1 - idle_power_usage = 25 - machinetype = 5 - /*heatgen = 0 - delay = 7*/ - circuitboard = "/obj/item/weapon/circuitboard/telecomms/broadcaster" - -/obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) - // Don't broadcast rejected signals - if(signal.data["reject"]) - return - - if(signal.data["message"]) - - - // Prevents massive radio spam - signal.data["done"] = 1 // mark the signal as being broadcasted - // Search for the original signal and mark it as done as well - var/datum/signal/original = signal.data["original"] - if(original) - original.data["done"] = 1 - original.data["compression"] = signal.data["compression"] - original.data["level"] = signal.data["level"] - - var/signal_message = "[signal.frequency]:[signal.data["message"]]:[signal.data["realname"]]" - if(signal_message in recentmessages) - return - recentmessages.Add(signal_message) - - if(signal.data["slow"] > 0) - sleep(signal.data["slow"]) // simulate the network lag if necessary - - signal.data["level"] |= listening_level - - /** #### - Normal Broadcast - #### **/ - - if(signal.data["type"] == 0) - - /* ###### Broadcast a message using signal.data ###### */ - Broadcast_Message(signal.data["mob"], - signal.data["vmask"], signal.data["radio"], - signal.data["message"], signal.data["name"], signal.data["job"], signal.data["realname"], - 0, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"], - signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) - - - /** #### - Simple Broadcast - #### **/ - - if(signal.data["type"] == 1) - - /* ###### Broadcast a message using signal.data ###### */ - Broadcast_SimpleMessage(signal.data["name"], signal.frequency, - signal.data["message"],null, null, - signal.data["compression"], listening_level) - - - /** #### - Artificial Broadcast - #### **/ - // (Imitates a mob) - - if(signal.data["type"] == 2) - - /* ###### Broadcast a message using signal.data ###### */ - // Parameter "data" as 4: AI can't track this person/mob - Broadcast_Message(signal.data["mob"], - signal.data["vmask"], - signal.data["radio"], signal.data["message"], - signal.data["name"], signal.data["job"], - signal.data["realname"], 4, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"], - signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) - - if(!message_delay) - message_delay = 1 - spawn(10) - message_delay = 0 - recentmessages = list() - - /* --- Do a snazzy animation! --- */ - flick("broadcaster_send", src) - -/obj/machinery/telecomms/broadcaster/Destroy() - // In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore. - if(message_delay) - message_delay = 0 - ..() - - -/* - Basically just an empty shell for receiving and broadcasting radio messages. Not - very flexible, but it gets the job done. -*/ - -/obj/machinery/telecomms/allinone - name = "telecommunications mainframe" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "comm_server" - desc = "A compact machine used for portable subspace telecommuniations processing." - density = 1 - anchored = 1 - use_power = 0 - idle_power_usage = 0 - machinetype = 6 - //heatgen = 0 - var/intercept = 0 // if nonzero, broadcasts all messages to syndicate channel - -/obj/machinery/telecomms/allinone/receive_signal(datum/signal/signal) - - if(!on) // has to be on to receive messages - return - - if(is_freq_listening(signal)) // detect subspace signals - - signal.data["done"] = 1 // mark the signal as being broadcasted - signal.data["compression"] = 0 - - // Search for the original signal and mark it as done as well - var/datum/signal/original = signal.data["original"] - if(original) - original.data["done"] = 1 - - if(signal.data["slow"] > 0) - sleep(signal.data["slow"]) // simulate the network lag if necessary - - /* ###### Broadcast a message using signal.data ###### */ - if(signal.frequency == SYND_FREQ) // if syndicate broadcast, just - Broadcast_Message(signal.data["mob"], - signal.data["vmask"], - signal.data["radio"], signal.data["message"], - signal.data["name"], signal.data["job"], - signal.data["realname"],, signal.data["compression"], list(0, z), signal.frequency, signal.data["spans"], - signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) - - -/** - - Here is the big, bad function that broadcasts a message given the appropriate - parameters. - - @param M: - Reference to the mob/speaker, stored in signal.data["mob"] - - @param vmask: - Boolean value if the mob is "hiding" its identity via voice mask, stored in - signal.data["vmask"] - - @param vmessage: - If specified, will display this as the message; such as "chimpering" - for monkeys if the mob is not understood. Stored in signal.data["vmessage"]. - - @param radio: - Reference to the radio broadcasting the message, stored in signal.data["radio"] - - @param message: - The actual string message to display to mobs who understood mob M. Stored in - signal.data["message"] - - @param name: - The name to display when a mob receives the message. signal.data["name"] - - @param job: - The name job to display for the AI when it receives the message. signal.data["job"] - - @param realname: - The "real" name associated with the mob. signal.data["realname"] - - @param vname: - If specified, will use this name when mob M is not understood. signal.data["vname"] - - @param data: - If specified: - 1 -- Will only broadcast to intercoms - 2 -- Will only broadcast to intercoms and station-bounced radios - 3 -- Broadcast to syndicate frequency - 4 -- AI can't track down this person. Useful for imitation broadcasts where you can't find the actual mob - - @param compression: - If 0, the signal is audible - If nonzero, the signal may be partially inaudible or just complete gibberish. - - @param level: - The list of Z levels that the sending radio is broadcasting to. Having 0 in the list broadcasts on all levels - - @param freq - The frequency of the signal - -**/ - - -/proc/Broadcast_Message(var/atom/movable/AM, - var/vmask, var/obj/item/device/radio/radio, - var/message, var/name, var/job, var/realname, - var/data, var/compression, var/list/level, var/freq, var/list/spans, - var/verb_say, var/verb_ask, var/verb_exclaim, var/verb_yell) - - message = copytext(message, 1, MAX_BROADCAST_LEN) - - if(!message) - return - - var/list/radios = list() - - var/atom/movable/virtualspeaker/virt = PoolOrNew(/atom/movable/virtualspeaker,null) - virt.name = name - virt.job = job - virt.languages = AM.languages - virt.source = AM - virt.faketrack = data == 4 ? 1 : 0 - virt.radio = radio - virt.verb_say = verb_say - virt.verb_ask = verb_ask - virt.verb_exclaim = verb_exclaim - virt.verb_yell = verb_yell - - if(compression > 0) - message = Gibberish(message, compression + 40) - - // --- Broadcast only to intercom devices --- - - if(data == 1) - for(var/obj/item/device/radio/intercom/R in all_radios["[freq]"]) - if(R.receive_range(freq, level) > -1) - radios += R - - // --- Broadcast only to intercoms and station-bounced radios --- - - else if(data == 2) - - for(var/obj/item/device/radio/R in all_radios["[freq]"]) - if(istype(R, /obj/item/device/radio/headset)) - continue - - if(R.receive_range(freq, level) > -1) - radios += R - - // --- Broadcast to ALL radio devices --- - - else - for(var/obj/item/device/radio/R in all_radios["[freq]"]) - if(R.receive_range(freq, level) > -1) - radios += R - - var/freqtext = num2text(freq) - for(var/obj/item/device/radio/R in all_radios["[SYND_FREQ]"]) //syndicate radios use magic that allows them to hear everything. this was already the case, now it just doesn't need the allinone anymore. solves annoying bugs that aren't worth solving. - if(R.receive_range(SYND_FREQ, list(R.z)) > -1 && freqtext in radiochannelsreverse) - radios |= R - - // Get a list of mobs who can hear from the radios we collected. - var/list/receive = get_mobs_in_radio_ranges(radios) //this includes all hearers. - - for(var/mob/R in receive) //Filter receiver list. - if (R.client && R.client.holder && !(R.client.prefs.chat_toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. - receive -= R - - for(var/mob/M in player_list) - if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTRADIO)) - receive |= M - - var/rendered = virt.compose_message(virt, virt.languages, message, freq, spans) //Always call this on the virtualspeaker to advoid issues. - for(var/atom/movable/hearer in receive) - hearer.Hear(rendered, virt, AM.languages, message, freq, spans) - - if(length(receive)) - // --- This following recording is intended for research and feedback in the use of department radio channels --- - - var/blackbox_msg = "[AM] [AM.say_quote(message, spans)]" - if(istype(blackbox)) - switch(freq) - if(1459) - blackbox.msg_common += blackbox_msg - if(1351) - blackbox.msg_science += blackbox_msg - if(1353) - blackbox.msg_command += blackbox_msg - if(1355) - blackbox.msg_medical += blackbox_msg - if(1357) - blackbox.msg_engineering += blackbox_msg - if(1359) - blackbox.msg_security += blackbox_msg - if(1441) - blackbox.msg_deathsquad += blackbox_msg - if(1213) - blackbox.msg_syndicate += blackbox_msg - if(1349) - blackbox.msg_service += blackbox_msg - if(1347) - blackbox.msg_cargo += blackbox_msg - else - blackbox.messages += blackbox_msg - - spawn(50) - PlaceInPool(virt) - -/proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level) - - /* ###### Prepare the radio connection ###### */ - - if(!M) - var/mob/living/carbon/human/H = new - M = H - - var/datum/radio_frequency/connection = radio_controller.return_frequency(frequency) - - var/display_freq = connection.frequency - - var/list/receive = list() - - - // --- Broadcast only to intercom devices --- - - if(data == 1) - for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"]) - var/turf/position = get_turf(R) - if(position && position.z == level) - receive |= R.send_hear(display_freq, level) - - - // --- Broadcast only to intercoms and station-bounced radios --- - - else if(data == 2) - for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) - - if(istype(R, /obj/item/device/radio/headset)) - continue - var/turf/position = get_turf(R) - if(position && position.z == level) - receive |= R.send_hear(display_freq) - - - // --- Broadcast to syndicate radio! --- - - else if(data == 3) - var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(SYND_FREQ) - - for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"]) - var/turf/position = get_turf(R) - if(position && position.z == level) - receive |= R.send_hear(SYND_FREQ) - - - // --- Broadcast to ALL radio devices --- - - else - for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) - var/turf/position = get_turf(R) - if(position && position.z == level) - receive |= R.send_hear(display_freq) - - - /* ###### Organize the receivers into categories for displaying the message ###### */ - - // Understood the message: - var/list/heard_normal = list() // normal message - - // Did not understand the message: - var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!") - var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!") - - for (var/mob/R in receive) - - /* --- Loop through the receivers and categorize them --- */ - - if (R.client && !(R.client.prefs.chat_toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. - continue - - - // --- Check for compression --- - if(compression > 0) - - heard_gibberish += R - continue - - // --- Can understand the speech --- - - if (R.languages & M.languages) - - heard_normal += R - - // --- Can't understand the speech --- - - else - // - Just display a garbled message - - - heard_garbled += R - - - /* ###### Begin formatting and sending the message ###### */ - if (length(heard_normal) || length(heard_garbled) || length(heard_gibberish)) - - /* --- Some miscellaneous variables to format the string output --- */ - var/part_a = "" // goes in the actual output - var/freq_text // the name of the channel - - // --- Set the name of the channel --- - switch(display_freq) - - if(SYND_FREQ) - freq_text = "#unkn" - if(COMM_FREQ) - freq_text = "Command" - if(SCI_FREQ) - freq_text = "Science" - if(MED_FREQ) - freq_text = "Medical" - if(ENG_FREQ) - freq_text = "Engineering" - if(SEC_FREQ) - freq_text = "Security" - if(SERV_FREQ) - freq_text = "Service" - if(SUPP_FREQ) - freq_text = "Supply" - if(AIPRIV_FREQ) - freq_text = "AI Private" - //There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO - - - // --- If the frequency has not been assigned a name, just use the frequency as the name --- - - if(!freq_text) - freq_text = format_frequency(display_freq) - - // --- Some more pre-message formatting --- - - var/part_b_extra = "" - if(data == 3) // intercepted radio message - part_b_extra = " (Intercepted)" - - // Create a radio headset for the sole purpose of using its icon - var/obj/item/device/radio/headset/radio = new - - var/part_b = " \icon[radio]\[[freq_text]\][part_b_extra] " - var/part_c = "" - - if (display_freq==SYND_FREQ) - part_a = "" - else if (display_freq==COMM_FREQ) - part_a = "" - else if (display_freq==SCI_FREQ) - part_a = "" - else if (display_freq==MED_FREQ) - part_a = "" - else if (display_freq==ENG_FREQ) - part_a = "" - else if (display_freq==SEC_FREQ) - part_a = "" - else if (display_freq==SERV_FREQ) - part_a = "" - else if (display_freq==SUPP_FREQ) - part_a = "" - else if (display_freq==CENTCOM_FREQ) - part_a = "" - else if (display_freq==AIPRIV_FREQ) - part_a = "" - - // --- This following recording is intended for research and feedback in the use of department radio channels --- - - var/part_blackbox_b = " \[[freq_text]\] " - var/blackbox_msg = "[part_a][source][part_blackbox_b]\"[text]\"[part_c]" - //var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]" - - //BR.messages_admin += blackbox_admin_msg - if(istype(blackbox)) - switch(display_freq) - if(1459) - blackbox.msg_common += blackbox_msg - if(1351) - blackbox.msg_science += blackbox_msg - if(1353) - blackbox.msg_command += blackbox_msg - if(1355) - blackbox.msg_medical += blackbox_msg - if(1357) - blackbox.msg_engineering += blackbox_msg - if(1359) - blackbox.msg_security += blackbox_msg - if(1441) - blackbox.msg_deathsquad += blackbox_msg - if(1213) - blackbox.msg_syndicate += blackbox_msg - if(1349) - blackbox.msg_service += blackbox_msg - if(1347) - blackbox.msg_cargo += blackbox_msg - else - blackbox.messages += blackbox_msg - - //End of research and feedback code. - - /* ###### Send the message ###### */ - - /* --- Process all the mobs that heard the voice normally (understood) --- */ - - if (length(heard_normal)) - var/rendered = "[part_a][source][part_b]\"[text]\"[part_c]" - - for (var/mob/R in heard_normal) - R.show_message(rendered, 2) - - /* --- Process all the mobs that heard a garbled voice (did not understand) --- */ - // Displays garbled message (ie "f*c* **u, **i*er!") - - if (length(heard_garbled)) - var/quotedmsg = "\"[stars(text)]\"" - var/rendered = "[part_a][source][part_b][quotedmsg][part_c]" - - for (var/mob/R in heard_garbled) - R.show_message(rendered, 2) - - - /* --- Complete gibberish. Usually happens when there's a compressed message --- */ - - if (length(heard_gibberish)) - var/quotedmsg = "\"[Gibberish(text, compression + 50)]\"" - var/rendered = "[part_a][Gibberish(source, compression + 50)][part_b][quotedmsg][part_c]" - - for (var/mob/R in heard_gibberish) - R.show_message(rendered, 2) - -//Use this to test if an obj can communicate with a Telecommunications Network - -/atom/proc/test_telecomms() - var/datum/signal/signal = src.telecomms_process() - var/turf/position = get_turf(src) - return (position.z in signal.data["level"] && signal.data["done"]) - -/atom/proc/telecomms_process() - - // First, we want to generate a new radio signal - var/datum/signal/signal = new - signal.transmission_method = 2 // 2 would be a subspace transmission. - var/turf/pos = get_turf(src) - - // --- Finally, tag the actual signal with the appropriate values --- - signal.data = list( - "slow" = 0, // how much to sleep() before broadcasting - simulates net lag - "message" = "TEST", - "compression" = rand(45, 50), // If the signal is compressed, compress our message too. - "traffic" = 0, // dictates the total traffic sum that the signal went through - "type" = 4, // determines what type of radio input it is: test broadcast - "reject" = 0, - "done" = 0, - "level" = pos.z // The level it is being broadcasted at. - ) - signal.frequency = 1459// Common channel - - //#### Sending the signal to all subspace receivers ####// - for(var/obj/machinery/telecomms/receiver/R in telecomms_list) - R.receive_signal(signal) - - sleep(rand(10,25)) - - return signal - diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index b6ab78b9fc1..cc877492b58 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -104,7 +104,7 @@ // --- Centcom radio, yo. --- - else if(data == 4) + else if(data == 5) for(var/obj/item/device/radio/R in all_radios["[freq]"]) if(!R.centcom) @@ -219,7 +219,7 @@ // --- Centcom radio, yo. --- - else if(data == 4) + else if(data == 5) for(var/obj/item/device/radio/R in all_radios["[RADIO_CHAT]"]) if(R.centcom) diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm deleted file mode 100644 index 8798f07c20c..00000000000 --- a/code/game/machinery/telecomms/logbrowser.dm +++ /dev/null @@ -1,232 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/obj/machinery/computer/telecomms/server - name = "telecommunications server monitoring console" - icon_state = "comm_logs" - - var/screen = 0 // the screen number: - var/list/servers = list() // the servers located by the computer - var/obj/machinery/telecomms/server/SelectedServer - - var/network = "NULL" // the network to probe - var/temp = "" // temporary feedback messages - - var/universal_translate = 0 // set to 1 if it can translate nonhuman speech - - req_access = list(access_tcomsat) - circuit = "/obj/item/weapon/circuitboard/comm_server" - -/obj/machinery/computer/telecomms/server/attack_hand(mob/user as mob) - if(..()) - return - user.set_machine(src) - var/dat = "Telecommunication Server Monitor
Telecommunications Server Monitor
" - - switch(screen) - - - // --- Main Menu --- - - if(0) - dat += "
[temp]
" - dat += "
Current Network: [network]
" - if(servers.len) - dat += "
Detected Telecommunication Servers:
    " - for(var/obj/machinery/telecomms/T in servers) - dat += "
  • \ref[T] [T.name] ([T.id])
  • " - dat += "
" - dat += "
\[Flush Buffer\]" - - else - dat += "
No servers detected. Scan for servers: \[Scan\]" - - - // --- Viewing Server --- - - if(1) - dat += "
[temp]
" - dat += "
\[Main Menu\] \[Refresh\]
" - dat += "
Current Network: [network]" - dat += "
Selected Server: [SelectedServer.id]" - - if(SelectedServer.totaltraffic >= 1024) - dat += "
Total recorded traffic: [round(SelectedServer.totaltraffic / 1024)] Terrabytes

" - else - dat += "
Total recorded traffic: [SelectedServer.totaltraffic] Gigabytes

" - - dat += "Stored Logs:
    " - - var/i = 0 - for(var/datum/comm_log_entry/C in SelectedServer.log_entries) - i++ - - - // If the log is a speech file - if(C.input_type == "Speech File") - - dat += "
  1. [C.name] \[X\]
    " - - // -- Determine race of orator -- - - var/race // The actual race of the mob - var/language = "Human" // MMIs, pAIs, Cyborgs and humans all speak Human - var/mobtype = C.parameters["mobtype"] - - var/list/humans = typesof(/mob/living/carbon/human, /mob/living/carbon/brain) - var/list/monkeys = typesof(/mob/living/carbon/monkey) - var/list/silicons = typesof(/mob/living/silicon) - var/list/slimes = typesof(/mob/living/simple_animal/slime) - var/list/animals = typesof(/mob/living/simple_animal) - - if(mobtype in humans) - race = "Human" - language = race - - else if(mobtype in slimes) // NT knows a lot about slimes, but not aliens. Can identify slimes - race = "Slime" - language = race - - else if(mobtype in monkeys) - race = "Monkey" - language = race - - else if(mobtype in silicons || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job - race = "Artificial Life" - language = race - - else if(istype(mobtype, /obj)) - race = "Machinery" - language = race - - else if(mobtype in animals) - race = "Domestic Animal" - language = race - - else - race = "Unidentifiable" - language = race - - // -- If the orator is a human, or universal translate is active, OR mob has universal speech on -- - - if(language == "Human" || universal_translate || C.parameters["uspeech"]) - dat += "Data type: [C.input_type]
    " - dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
    " - dat += "Class: [race]
    " - dat += "Contents: \"[C.parameters["message"]]\"
    " - - - // -- Orator is not human and universal translate not active -- - - else - dat += "Data type: Audio File
    " - dat += "Source: Unidentifiable
    " - dat += "Class: [race]
    " - dat += "Contents: Unintelligble
    " - - dat += "

  2. " - - else if(C.input_type == "Execution Error") - - dat += "
  3. [C.name] \[X\]
    " - dat += "Output: \"[C.parameters["message"]]\"
    " - dat += "

  4. " - - - dat += "
" - - - - user << browse(dat, "window=comm_monitor;size=575x400") - onclose(user, "server_control") - - temp = "" - return - - -/obj/machinery/computer/telecomms/server/Topic(href, href_list) - if(..()) - return - - - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["viewserver"]) - screen = 1 - for(var/obj/machinery/telecomms/T in servers) - if(T.id == href_list["viewserver"]) - SelectedServer = T - break - - if(href_list["operation"]) - switch(href_list["operation"]) - - if("release") - servers = list() - screen = 0 - - if("mainmenu") - screen = 0 - - if("scan") - if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/server/T in range(25, src)) - if(T.network == network) - servers.Add(T) - - if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" - else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" - - screen = 0 - - if(href_list["delete"]) - - if(!src.allowed(usr) && !emagged) - usr << "ACCESS DENIED." - return - - if(SelectedServer) - - var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(href_list["delete"])] - - temp = "- DELETED ENTRY: [D.name] -" - - SelectedServer.log_entries.Remove(D) - del(D) - - else - temp = "- FAILED: NO SELECTED MACHINE -" - - if(href_list["network"]) - - var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - - if(newnet && ((usr in range(1, src) || issilicon(usr)))) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" - - else - - network = newnet - screen = 0 - servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - - updateUsrDialog() - return - -/obj/machinery/computer/telecomms/server/attackby() - ..() - src.updateUsrDialog() - return - -/obj/machinery/computer/telecomms/server/emag_act(mob/user as mob) - if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - emagged = 1 - user << "You you disable the security protocols." \ No newline at end of file diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm deleted file mode 100644 index 42d752ee079..00000000000 --- a/code/game/machinery/telecomms/presets.dm +++ /dev/null @@ -1,187 +0,0 @@ -// ### Preset machines ### - -//Relay - -/obj/machinery/telecomms/relay/preset - network = "tcommsat" - -/obj/machinery/telecomms/relay/preset/station - id = "Station Relay" - listening_level = 1 - autolinkers = list("s_relay") - -/obj/machinery/telecomms/relay/preset/telecomms - id = "Telecomms Relay" - autolinkers = list("relay") - -/obj/machinery/telecomms/relay/preset/mining - id = "Mining Relay" - autolinkers = list("m_relay") - -/obj/machinery/telecomms/relay/preset/ruskie - id = "Ruskie Relay" - hide = 1 - toggled = 0 - autolinkers = list("r_relay") - -//HUB - -/obj/machinery/telecomms/hub/preset - id = "Hub" - network = "tcommsat" - autolinkers = list("hub", "relay", "s_relay", "m_relay", "r_relay", "science", "medical", - "supply", "service", "common", "command", "engineering", "security", - "receiverA", "receiverB", "broadcasterA", "broadcasterB") - -//Receivers - -//--PRESET LEFT--// - -/obj/machinery/telecomms/receiver/preset_left - id = "Receiver A" - network = "tcommsat" - autolinkers = list("receiverA") // link to relay - freq_listening = list(1351, 1355, 1347, 1349) // science, medical, supply, service - - -//--PRESET RIGHT--// - -/obj/machinery/telecomms/receiver/preset_right - id = "Receiver B" - network = "tcommsat" - autolinkers = list("receiverB") // link to relay - freq_listening = list(1353, 1357, 1359) //command, engineering, security - - //Common and other radio frequencies for people to freely use - New() - for(var/i = 1441, i < 1489, i += 2) - freq_listening |= i - ..() - - -//Buses - -/obj/machinery/telecomms/bus/preset_one - id = "Bus 1" - network = "tcommsat" - freq_listening = list(1351, 1355) - autolinkers = list("processor1", "science", "medical") - -/obj/machinery/telecomms/bus/preset_two - id = "Bus 2" - network = "tcommsat" - freq_listening = list(1347,1349) - autolinkers = list("processor2", "supply", "service") - -/obj/machinery/telecomms/bus/preset_three - id = "Bus 3" - network = "tcommsat" - freq_listening = list(1359, 1353) - autolinkers = list("processor3", "security", "command") - -/obj/machinery/telecomms/bus/preset_four - id = "Bus 4" - network = "tcommsat" - freq_listening = list(1357) - autolinkers = list("processor4", "engineering", "common") - -/obj/machinery/telecomms/bus/preset_four/New() - for(var/i = 1441, i < 1489, i += 2) - freq_listening |= i - ..() - -//Processors - -/obj/machinery/telecomms/processor/preset_one - id = "Processor 1" - network = "tcommsat" - autolinkers = list("processor1") // processors are sort of isolated; they don't need backward links - -/obj/machinery/telecomms/processor/preset_two - id = "Processor 2" - network = "tcommsat" - autolinkers = list("processor2") - -/obj/machinery/telecomms/processor/preset_three - id = "Processor 3" - network = "tcommsat" - autolinkers = list("processor3") - -/obj/machinery/telecomms/processor/preset_four - id = "Processor 4" - network = "tcommsat" - autolinkers = list("processor4") - -//Servers - -/obj/machinery/telecomms/server/presets - network = "tcommsat" - -/obj/machinery/telecomms/server/presets/New() - ..() - name = id - - -/obj/machinery/telecomms/server/presets/science - id = "Science Server" - freq_listening = list(1351) - autolinkers = list("science") - -/obj/machinery/telecomms/server/presets/medical - id = "Medical Server" - freq_listening = list(1355) - autolinkers = list("medical") - -/obj/machinery/telecomms/server/presets/supply - id = "Supply Server" - freq_listening = list(1347) - autolinkers = list("supply") - -/obj/machinery/telecomms/server/presets/service - id = "Service Server" - freq_listening = list(1349) - autolinkers = list("service") - -/obj/machinery/telecomms/server/presets/common - id = "Common Server" - freq_listening = list() - autolinkers = list("common") - - //Common and other radio frequencies for people to freely use - // 1441 to 1489 -/obj/machinery/telecomms/server/presets/common/New() - for(var/i = 1441, i < 1489, i += 2) - freq_listening |= i - ..() - -/obj/machinery/telecomms/server/presets/command - id = "Command Server" - freq_listening = list(1353) - autolinkers = list("command") - -/obj/machinery/telecomms/server/presets/engineering - id = "Engineering Server" - freq_listening = list(1357) - autolinkers = list("engineering") - -/obj/machinery/telecomms/server/presets/security - id = "Security Server" - freq_listening = list(1359) - autolinkers = list("security") - - -//Broadcasters - -//--PRESET LEFT--// - -/obj/machinery/telecomms/broadcaster/preset_left - id = "Broadcaster A" - network = "tcommsat" - autolinkers = list("broadcasterA") - -//--PRESET RIGHT--// - -/obj/machinery/telecomms/broadcaster/preset_right - id = "Broadcaster B" - network = "tcommsat" - autolinkers = list("broadcasterB") diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm deleted file mode 100644 index 4623e39a7a1..00000000000 --- a/code/game/machinery/telecomms/telemonitor.dm +++ /dev/null @@ -1,136 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - - -/* - Telecomms monitor tracks the overall trafficing of a telecommunications network - and displays a heirarchy of linked machines. -*/ - - -/obj/machinery/computer/telecomms/monitor - name = "telecommunications monitoring console" - icon_state = "comm_monitor" - - var/screen = 0 // the screen number: - var/list/machinelist = list() // the machines located by the computer - var/obj/machinery/telecomms/SelectedMachine - - var/network = "NULL" // the network to probe - - var/temp = "" // temporary feedback messages - circuit = "/obj/item/weapon/circuitboard/comm_monitor" - -/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user as mob) - if(..()) - return - user.set_machine(src) - var/dat = "Telecommunications Monitor
Telecommunications Monitor
" - - switch(screen) - - - // --- Main Menu --- - - if(0) - dat += "
[temp]

" - dat += "
Current Network: [network]
" - if(machinelist.len) - dat += "
Detected Network Entities:
    " - for(var/obj/machinery/telecomms/T in machinelist) - dat += "
  • \ref[T] [T.name] ([T.id])
  • " - dat += "
" - dat += "
\[Flush Buffer\]" - else - dat += "\[Probe Network\]" - - - // --- Viewing Machine --- - - if(1) - dat += "
[temp]
" - dat += "
\[Main Menu\]
" - dat += "
Current Network: [network]
" - dat += "Selected Network Entity: [SelectedMachine.name] ([SelectedMachine.id])
" - dat += "Linked Entities:
    " - for(var/obj/machinery/telecomms/T in SelectedMachine.links) - if(!T.hide) - dat += "
  1. \ref[T.id] [T.name] ([T.id])
  2. " - dat += "
" - - - - user << browse(dat, "window=comm_monitor;size=575x400") - onclose(user, "server_control") - - temp = "" - return - - -/obj/machinery/computer/telecomms/monitor/Topic(href, href_list) - if(..()) - return - - - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["viewmachine"]) - screen = 1 - for(var/obj/machinery/telecomms/T in machinelist) - if(T.id == href_list["viewmachine"]) - SelectedMachine = T - break - - if(href_list["operation"]) - switch(href_list["operation"]) - - if("release") - machinelist = list() - screen = 0 - - if("mainmenu") - screen = 0 - - if("probe") - if(machinelist.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/T in range(25, src)) - if(T.network == network) - machinelist.Add(T) - - if(!machinelist.len) - temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" - else - temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" - - screen = 0 - - - if(href_list["network"]) - - var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - if(newnet && ((usr in range(1, src) || issilicon(usr)))) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" - - else - network = newnet - screen = 0 - machinelist = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - - updateUsrDialog() - return - -/obj/machinery/computer/telecomms/monitor/attackby() - ..() - src.updateUsrDialog() - return - -/obj/machinery/computer/telecomms/monitor/emag_act(mob/user as mob) - if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - emagged = 1 - user << "You you disable the security protocols." \ No newline at end of file diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm deleted file mode 100644 index 11cf378195a..00000000000 --- a/code/game/machinery/telecomms/traffic_control.dm +++ /dev/null @@ -1,290 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - - - - - -/obj/machinery/computer/telecomms/traffic - name = "telecommunications traffic control console" - icon_state = "computer_generic" - - var/screen = 0 // the screen number: - var/list/servers = list() // the servers located by the computer - var/mob/editingcode - var/mob/lasteditor - var/list/viewingcode = list() - var/obj/machinery/telecomms/server/SelectedServer - - var/network = "NULL" // the network to probe - var/temp = "" // temporary feedback messages - - var/storedcode = "" // code stored - var/obj/item/weapon/card/id/auth = null - var/list/access_log = list() - var/process = 0 - circuit = "/obj/item/weapon/circuitboard/comm_traffic" - - req_access = list(access_tcomsat) - -/obj/machinery/computer/telecomms/traffic/proc/stop_editing() - if(editingcode) - if(editingcode.client) - winshow(editingcode, "Telecomms IDE", 0) // hide the window! - editingcode.unset_machine() - editingcode = null - -/obj/machinery/computer/telecomms/traffic/process() - - if(stat & (NOPOWER|BROKEN)) - stop_editing() - return - - if(editingcode && editingcode.machine != src) - stop_editing() - return - - if(!editingcode) - if(length(viewingcode) > 0) - editingcode = pick(viewingcode) - viewingcode.Remove(editingcode) - return - - process = !process - if(!process) - return - - // loop if there's someone manning the keyboard - if(!editingcode.client) - stop_editing() - return - - // For the typer, the input is enabled. Buffer the typed text - storedcode = "[winget(editingcode, "tcscode", "text")]" - winset(editingcode, "tcscode", "is-disabled=false") - - // If the player's not manning the keyboard anymore, adjust everything - if(!in_range(editingcode, src) && !issilicon(editingcode) || editingcode.machine != src) - winshow(editingcode, "Telecomms IDE", 0) // hide the window! - editingcode = null - return - - // For other people viewing the typer type code, the input is disabled and they can only view the code - // (this is put in place so that there's not any magical shenanigans with 50 people inputting different code all at once) - - if(length(viewingcode)) - // This piece of code is very important - it escapes quotation marks so string aren't cut off by the input element - var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") - showcode = replacetext(storedcode, "\"", "\\\"") - - for(var/mob/M in viewingcode) - - if( (M.machine == src && in_range(M, src) ) || issilicon(M)) - winset(M, "tcscode", "is-disabled=true") - winset(M, "tcscode", "text=\"[showcode]\"") - else - viewingcode.Remove(M) - winshow(M, "Telecomms IDE", 0) // hide the windows - - -/obj/machinery/computer/telecomms/traffic/attack_hand(mob/user as mob) - if(..()) - return - user.set_machine(src) - var/dat = "Telecommunication Traffic Control
Telecommunications Traffic Control
" - dat += "
[(auth ? "AUTHED" : "NOT AUTHED")]: [(!auth ? "Insert ID" : auth)]
" - dat += "View System Log
" - - if(issilicon(user) || auth) - - switch(screen) - - - // --- Main Menu --- - - if(0) - dat += "
[temp]
" - dat += "
Current Network: [network]
" - if(servers.len) - dat += "
Detected Telecommunication Servers:
    " - for(var/obj/machinery/telecomms/T in servers) - dat += "
  • \ref[T] [T.name] ([T.id])
  • " - dat += "
" - dat += "
\[Flush Buffer\]" - - else - dat += "
No servers detected. Scan for servers: \[Scan\]" - - - // --- Viewing Server --- - - if(1) - if(SelectedServer) - dat += "
[temp]
" - dat += "
\[Main Menu\] \[Refresh\]
" - dat += "
Current Network: [network]" - dat += "
Selected Server: [SelectedServer.id]

" - dat += "
\[Edit Code\]" - dat += "
Signal Execution: " - if(SelectedServer.autoruncode) - dat += "ALWAYS" - else - dat += "NEVER" - else - screen = 0 - return - - - user << browse(dat, "window=traffic_control;size=575x400") - onclose(user, "server_control") - - temp = "" - return - -/obj/machinery/computer/telecomms/traffic/proc/create_log(var/entry, var/mob/user) - var/id = null - if(issilicon(user)) - id = "System Administrator" - else - if(auth) - id = "[auth.registered_name] ([auth.assignment])" - else - ERROR("There is a null auth while the user isn't a silicon! ([user.name], [user.type])") - return - access_log += "\[[get_timestamp()]\] [id] [entry]" - -/obj/machinery/computer/telecomms/traffic/proc/print_logs() - . = "

Traffic Control Telecomms System Log


" - for(var/entry in access_log) - . += entry + "
" - return . - -/obj/machinery/computer/telecomms/traffic/Topic(href, href_list) - if(..()) - return - - - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["auth"]) - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(!auth) - var/obj/item/weapon/card/id/I = C.get_active_hand() - if(istype(I)) - if(check_access(I)) - C.drop_item() - I.loc = src - auth = I - create_log("has logged in.", usr) - else - create_log("has logged out.", usr) - auth.loc = src.loc - C.put_in_hands(auth) - auth = null - updateUsrDialog() - return - - if(href_list["print"]) - usr << browse(print_logs(), "window=traffic_logs") - return - - if(!auth && !issilicon(usr) && !emagged) - usr << "ACCESS DENIED." - return - - if(href_list["viewserver"]) - screen = 1 - for(var/obj/machinery/telecomms/T in servers) - if(T.id == href_list["viewserver"]) - SelectedServer = T - create_log("selected server [T.name]", usr) - break - - - if(href_list["operation"]) - create_log("has performed action: [href_list["operation"]].", usr) - switch(href_list["operation"]) - - if("release") - servers = list() - screen = 0 - - if("mainmenu") - screen = 0 - - if("scan") - if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/server/T in range(25, src)) - if(T.network == network) - servers.Add(T) - - if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" - else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" - - screen = 0 - - if("editcode") - if(editingcode == usr) return - if(usr in viewingcode) return - - if(!editingcode) - lasteditor = usr - editingcode = usr - winshow(editingcode, "Telecomms IDE", 1) // show the IDE - winset(editingcode, "tcscode", "is-disabled=false") - winset(editingcode, "tcscode", "text=\"\"") - var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") - showcode = replacetext(storedcode, "\"", "\\\"") - winset(editingcode, "tcscode", "text=\"[showcode]\"") - - else - viewingcode.Add(usr) - winshow(usr, "Telecomms IDE", 1) // show the IDE - winset(usr, "tcscode", "is-disabled=true") - winset(editingcode, "tcscode", "text=\"\"") - var/showcode = replacetext(storedcode, "\"", "\\\"") - winset(usr, "tcscode", "text=\"[showcode]\"") - - if("togglerun") - SelectedServer.autoruncode = !(SelectedServer.autoruncode) - - if(href_list["network"]) - - var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - - if(newnet && canAccess(usr)) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" - - else - - network = newnet - screen = 0 - servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - create_log("has set the network to [network].", usr) - - updateUsrDialog() - return - -/obj/machinery/computer/telecomms/traffic/attackby() - ..() - src.updateUsrDialog() - return - -/obj/machinery/computer/telecomms/traffic/emag_act(mob/user as mob) - if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - emagged = 1 - user << "You you disable the security protocols." - -/obj/machinery/computer/telecomms/traffic/proc/canAccess(var/mob/user) - if(issilicon(user) || in_range(user, src)) - return 1 - return 0 \ No newline at end of file diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 405abb48ddc..75f81e40bb8 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -234,14 +234,6 @@ return if(component_parts && istype(W, /obj/item/weapon/crowbar)) - var/list/all_products = product_records + hidden_records + coin_records - for(var/datum/data/vending_product/machine_content in all_products) - while(machine_content.amount !=0) - for(var/obj/item/weapon/vending_refill/VR in component_parts) - VR.charges++ - machine_content.amount-- - if(!machine_content.amount) - break default_deconstruction_crowbar(W) if(istype(W, /obj/item/weapon/screwdriver) && anchored) @@ -282,6 +274,25 @@ else ..() + +/obj/machinery/vending/default_deconstruction_crowbar(var/obj/item/O) + var/list/all_products = product_records + hidden_records + coin_records + for(var/datum/data/vending_product/machine_content in all_products) + while(machine_content.amount !=0) + var/safety = 0 //to avoid infinite loop + for(var/obj/item/weapon/vending_refill/VR in component_parts) + safety++ + if(VR.charges < initial(VR.charges)) + VR.charges++ + machine_content.amount-- + if(!machine_content.amount) + break + else + safety-- + if(safety <= 0) + break + ..() + /obj/machinery/vending/emag_act(user as mob) if(!emagged) emagged = 1 @@ -594,6 +605,7 @@ contraband = list() premium = list() +IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY CANISTER CHARGES in vending_items.dm */ /* @@ -669,7 +681,7 @@ products = list(/obj/item/weapon/reagent_containers/food/snacks/tofu = 24, /obj/item/weapon/reagent_containers/food/drinks/ice = 12, /obj/item/weapon/reagent_containers/food/snacks/candy_corn = 6) - contraband = list(/obj/item/weapon/kitchen/utensil/knife = 6) + contraband = list(/obj/item/weapon/kitchen/knife = 6) /obj/machinery/vending/cola @@ -707,7 +719,7 @@ products = list(/obj/item/weapon/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo = 2, /obj/item/weapon/gun/projectile/automatic/pistol/m1911 = 2,/obj/item/weapon/gun/projectile/automatic/proto = 2, /obj/item/weapon/gun/projectile/shotgun/combat = 2,/obj/item/weapon/gun/projectile/automatic/gyropistol = 1, - /obj/item/weapon/gun/projectile/shotgun = 2) + /obj/item/weapon/gun/projectile/shotgun = 2,/obj/item/weapon/gun/projectile/automatic/ar = 2) premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2,/obj/item/ammo_box/magazine/m50 = 4,/obj/item/ammo_box/magazine/m45 = 2,/obj/item/ammo_box/magazine/m75 = 2) contraband = list(/obj/item/clothing/under/patriotsuit = 1,/obj/item/weapon/bedsheet/patriot = 3) @@ -861,8 +873,8 @@ desc = "A kitchen and restaurant equipment vendor" product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." icon_state = "dinnerware" - products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/kitchen/rollingpin = 2,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/apron/chef = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5,/obj/item/weapon/reagent_containers/glass/bowl = 20) - contraband = list(/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/kitchenknife/butcher = 2) + products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/fork = 6,/obj/item/weapon/kitchen/knife = 3,/obj/item/weapon/kitchen/rollingpin = 2,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/apron/chef = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5,/obj/item/weapon/reagent_containers/glass/bowl = 20) + contraband = list(/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/kitchen/knife/butcher = 2) /obj/machinery/vending/sovietsoda name = "\improper BODA" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index dc0c3825375..167d325c099 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -190,7 +190,7 @@ /obj/item/attack_alien(mob/user as mob) var/mob/living/carbon/alien/A = user - if(!A.has_fine_manipulation || w_class >= 4) + if(!A.has_fine_manipulation) if(src in A.contents) // To stop Aliens having items stuck in their pockets A.unEquip(src) user << "Your claws aren't capable of such fine manipulation!" @@ -403,6 +403,9 @@ /obj/item/acid_act(var/acidpwr, var/toxpwr, var/acid_volume) . = 1 + if(unacidable) + return + for(var/V in armor) if(armor[V] > 0) .-- //it survives the acid... diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 2013d180b59..958edb93f01 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -158,5 +158,5 @@ desc = "A suspicious-looking spraycan modified to use special paint used by gangsters to mark territory." icon_state = "spraycan_gang_cap" gang = 1 - uses = 15 + uses = 20 instant = -1 diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index f69e9025637..f5ec0d9db5d 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -38,6 +38,11 @@ sleep(6) // Make space carp var/mob/living/simple_animal/hostile/carp/C = new /mob/living/simple_animal/hostile/carp(get_turf(src)) - // Make carp non-hostile to user, yes this means - C.faction |= "\ref[owner]" + // Make carp non-hostile to user, and their allies + if(owner) + var/list/factions = owner.faction + for(var/F in factions) + if(F == "neutral") + factions -= F + C.faction = factions qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 978b09390b0..169baa3a259 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -372,7 +372,7 @@ signal.frequency = freqnum // Quick frequency set Broadcast_Message(M, voicemask, src, message, voice, jobname, real_name, - 4, signal.data["compression"], list(position.z, 0), freq, spans, + 5, signal.data["compression"], list(position.z, 0), freq, spans, verb_say, verb_ask, verb_exclaim, verb_yell) return diff --git a/code/game/objects/items/devices/recaller.dm b/code/game/objects/items/devices/recaller.dm index ed4750d62fa..1fdf9794b96 100644 --- a/code/game/objects/items/devices/recaller.dm +++ b/code/game/objects/items/devices/recaller.dm @@ -12,7 +12,7 @@ var/gang //Which gang uses this? var/boss = 1 //If it has the power to promote gang members var/recalling = 0 - var/promotion_cost = 20 + var/promotions = 0 /obj/item/device/gangtool/New() //Initialize supply point income if it hasn't already been started if(!ticker.mode.gang_points) @@ -46,38 +46,45 @@ dat += "Time until Influence grows: [(points >= 100) ? ("--:--") : (time2text(ticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]
" dat += "Purchase Items:
" + dat += "(10 Influence) " if(points >= 10) - dat += "(10 Influence) Territory Spraycan
" + dat += "Territory Spraycan
" else - dat += "(10 Influence) Territory Spraycan
" + dat += "Territory Spraycan
" + dat += "(10 Influence) " + if(points >= 10) + dat += "Switchblade
" + else + dat += "Switchblade
" + + dat += "(25 Influence) " if(points >= 25) - dat += "(25 Influence) 10mm Pistol
" + dat += "10mm Pistol
" else - dat += "(25 Influence) 10mm Pistol
" + dat += "10mm Pistol
" + dat += "(10 Influence) " if(points >= 10) - dat += "(10 Influence) 10mm Ammo
" + dat += "10mm Ammo
" else - dat += "(10 Influence) 10mm Ammo
" - - if(points >= 10) - dat += "(10 Influence) Switchblade
" - else - dat += "(10 Influence) Switchblade
" + dat += "10mm Ammo
" + dat += "(50 Influence) " if(points >= 50) - dat += "(50 Influence) Recruitment Pen
" + dat += "Recruitment Pen
" else - dat += "(50 Influence) Recruitment Pen
" + dat += "Recruitment Pen
" if(boss) - if(promotion_cost > 100) - dat += "(Maximum Reached) Promote a Gangster
" - else if(points >= promotion_cost) - dat += "([promotion_cost] Influence) Promote a Gangster
" + if(promotions >= 3) + dat += "(Out of stock) Promote a Gangster
" else - dat += "([promotion_cost] Influence) Promote a Gangster
" + dat += "([(promotions*20)+10] Influence, [3-promotions] left) " + if(points >= (promotions*20)+10) + dat += "Promote a Gangster
" + else + dat += "Promote a Gangster
" dat += "
" dat += "Refresh
" @@ -100,6 +107,10 @@ if(points >= 10) item_type = /obj/item/toy/crayon/spraycan/gang points = 10 + if("switchblade") + if(points >= 10) + item_type = /obj/item/weapon/switchblade + points = 10 if("pistol") if(points >= 25) item_type = /obj/item/weapon/gun/projectile/automatic/pistol @@ -108,19 +119,15 @@ if(points >= 10) item_type = /obj/item/ammo_box/magazine/m10mm points = 10 - if("switchblade") - if(points >= 10) - item_type = /obj/item/weapon/switchblade - points = 10 if("pen") if(points >= 50) item_type = /obj/item/weapon/pen/gang points = 50 if("gangtool") - if(points >= promotion_cost) + if((promotions < 3) && (points >= (promotions*20)+10)) item_type = /obj/item/device/gangtool/lt - points = promotion_cost - promotion_cost += 30 + points = (promotions*20)+10 + promotions++ if(item_type) if(gang == "A") @@ -167,8 +174,10 @@ if(promoted) ticker.mode.message_gangtools(((gang=="A")? ticker.mode.A_tools : ticker.mode.B_tools), "[user] has been promoted to Lieutenant.") user << "You have been promoted to Lieutenant!" + ticker.mode.forge_gang_objectives(user.mind) + ticker.mode.greet_gang(user.mind,0) user << "The Gangtool you registered will allow you to use your gang's influence to purchase items and prevent the station from evacuating before your gang can take over. Use it to recall the emergency shuttle from anywhere on the station." - user << "You may also now use recruitment pens to grow your gang membership. Use them on unsuspecting crew members to recruit them." + user << "You may also now use recruitment pens to grow your gang membership. Use them on unsuspecting crew members to recruit them." if(!gang) usr << "ACCESS DENIED: Unauthorized user." diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 55c1be2ac5a..a6898f61098 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -59,8 +59,8 @@ return 1 /obj/item/borg/upgrade/restart - name = "cyborg emergency restart module" - desc = "Used to force a restart of a disabled-but-repaired cyborg, bringing it back online." + name = "cyborg emergency reboot module" + desc = "Used to force a reboot of a disabled-but-repaired cyborg, bringing it back online." icon_state = "cyborg_upgrade1" diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 1795cb3a607..e875c6605d5 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -109,25 +109,21 @@ var/global/list/datum/stack_recipe/xeno_recipes = list ( \ //Step one - dehairing. /obj/item/stack/sheet/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if( istype(W, /obj/item/weapon/kitchenknife) || \ - istype(W, /obj/item/weapon/kitchen/utensil/knife) || \ - istype(W, /obj/item/weapon/twohanded/fireaxe) || \ - istype(W, /obj/item/weapon/hatchet) ) - - //visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message) - usr.visible_message("\the [usr] 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)) - usr << "You cut the hair from this [src.singular_name]." + if(is_sharp(W)) + 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)) + user << "You cut the hair from this [src.singular_name]." //Try locating an exisitng stack on the tile and add to there if possible - for(var/obj/item/stack/sheet/hairlesshide/HS in usr.loc) + for(var/obj/item/stack/sheet/hairlesshide/HS in user.loc) if(HS.amount < 50) HS.amount++ - src.use(1) + use(1) break //If it gets to here it means it did not find a suitable stack on the tile. - var/obj/item/stack/sheet/hairlesshide/HS = new(usr.loc) + var/obj/item/stack/sheet/hairlesshide/HS = new(user.loc) HS.amount = 1 - src.use(1) + use(1) else ..() diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index 246a5083565..ae1e0ae3c2b 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -148,13 +148,13 @@ desc = "An aura of time-bluespace energy." icon = 'icons/effects/effects.dmi' icon_state = "chronofield" - density = 1 + density = 0 anchored = 1 unacidable = 1 blend_mode = BLEND_MULTIPLY var/mob/living/captured = null var/obj/item/weapon/gun/energy/chrono_gun/gun = null - var/tickstokill = 30 + var/tickstokill = 15 var/image/mob_underlay = null var/preloaded = 0 var/RPpos = null @@ -210,12 +210,8 @@ qdel(src) else captured.Paralyse(4) - if(captured.reagents) - captured.reagents.del_reagent("synaptizine") //you pesky thing you - if(captured.loc != src) //If they manage to escape, immediately kill them, this is so that even if there IS a way to get out, they won't use it + if(captured.loc != src) captured.loc = src - tickstokill = 0 - return .() update_icon() if(gun) if(gun.field_check(src)) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index a44dc2c14e0..6cfb57894b3 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -359,13 +359,16 @@ defib.cooldowncheck(user) return if(user.zone_sel && user.zone_sel.selecting == "chest") + var/mob/dead/observer/ghost = H.get_ghost() + if(ghost) + ghost << "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)" + ghost << 'sound/effects/genetics.ogg' user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest...") busy = 1 update_icon() if(do_after(user, 30)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) - var/mob/dead/observer/ghost = H.get_ghost() var/tplus = world.time - H.timeofdeath var/tlimit = 6000 //past this much time the patient is unrecoverable (in deciseconds) var/tloss = 3000 //brain damage starts setting in on the patient after some time left rotting @@ -390,6 +393,7 @@ for(var/obj/item/organ/limb/O in H.organs) total_brute += O.brute_dam total_burn += O.burn_dam + ghost = H.get_ghost() if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations)) //If the body has been fixed so that they would not be in crit when defibbed, give them oxyloss to put them back into crit if (H.health > halfwaycritdeath) @@ -420,9 +424,6 @@ user.visible_message("[defib] buzzes: Resuscitation failed - Severe tissue damage detected.") else user.visible_message("[defib] buzzes: Resuscitation failed - No soul in patient body. Further attempts may be successful.") - if(ghost) - ghost << "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)" - ghost << sound('sound/effects/genetics.ogg') playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) defib.deductcharge(revivecost) update_icon() diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 5f52dd4a870..c6d2703e54f 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -1,22 +1,18 @@ /* Kitchen tools * Contains: - * Utensils - * Spoons - * Forks - * Knives + * Fork * Kitchen knives * Butcher's cleaver * Rolling Pins - * Trays */ /obj/item/weapon/kitchen icon = 'icons/obj/kitchen.dmi' -/* - * Utensils - */ -/obj/item/weapon/kitchen/utensil +/obj/item/weapon/kitchen/fork + name = "fork" + desc = "Pointy." + icon_state = "fork" force = 5.0 w_class = 1.0 throwforce = 0 @@ -26,126 +22,68 @@ origin_tech = "materials=1" attack_verb = list("attacked", "stabbed", "poked") hitsound = 'sound/weapons/bladeslice.ogg' + var/datum/reagent/forkload //used to eat omelette -/obj/item/weapon/kitchen/utensil/New() - if (prob(60)) - src.pixel_y = rand(0, 4) - return - -/* - * Spoons - */ - /obj/item/weapon/kitchen/utensil/spoon - name = "spoon" - desc = "SPOON!" - icon_state = "spoon" - attack_verb = list("attacked", "poked") - -/* - * Forks - */ -/obj/item/weapon/kitchen/utensil/fork - name = "fork" - desc = "Pointy." - icon_state = "fork" - -/obj/item/weapon/kitchen/utensil/fork/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) +/obj/item/weapon/kitchen/fork/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!istype(M)) return ..() - if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head") - return ..() - - if (src.icon_state == "forkloaded") //This is a poor way of handling it, but a proper rewrite of the fork to allow for a more varied foodening can happen when I'm in the mood. --NEO - if(M == user) - M.visible_message("[user] eats a delicious forkful of omelette!") - M.reagents.add_reagent("nutriment", 1) - else - M.visible_message("[user] feeds [M] a delicious forkful of omelette!") - M.reagents.add_reagent("nutriment", 1) - src.icon_state = "fork" - return - else + if(user.zone_sel.selecting == "mouth") + if(forkload) + if(M == user) + M.visible_message("[user] eats a delicious forkful of omelette!") + M.reagents.add_reagent(forkload.id, 1) + else + M.visible_message("[user] feeds [M] a delicious forkful of omelette!") + M.reagents.add_reagent(forkload.id, 1) + icon_state = "fork" + forkload = null + return + else if(user.zone_sel.selecting == "eyes") if(user.disabilities & CLUMSY && prob(50)) M = user return eyestab(M,user) + else + return ..() -/* - * Knives - */ -/obj/item/weapon/kitchen/utensil/knife - name = "knife" - desc = "Can cut through any food." - icon_state = "knife" - force = 10.0 - throwforce = 10.0 -/obj/item/weapon/kitchen/utensil/knife/suicide_act(mob/user) - user.visible_message(pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \ - "[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \ - "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")) - return (BRUTELOSS) - -/obj/item/weapon/kitchen/utensil/knife/attack(target, mob/living/carbon/human/user) - if(istype(user) && user.disabilities & CLUMSY && prob(50)) - user << "You accidentally cut yourself with \the [src]." - user.take_organ_damage(20) - return - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - return ..() - -/* - * Kitchen knives - */ -/obj/item/weapon/kitchenknife +/obj/item/weapon/kitchen/knife name = "kitchen knife" - icon = 'icons/obj/kitchen.dmi' icon_state = "knife" desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come." flags = CONDUCT force = 10.0 - w_class = 3.0 + w_class = 2.0 throwforce = 10.0 + hitsound = 'sound/weapons/bladeslice.ogg' throw_speed = 3 throw_range = 6 m_amt = 12000 origin_tech = "materials=1" attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") -/obj/item/weapon/kitchenknife/suicide_act(mob/user) +/obj/item/weapon/kitchen/knife/suicide_act(mob/user) user.visible_message(pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \ "[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \ "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")) return (BRUTELOSS) -/obj/item/weapon/kitchenknife/ritual +/obj/item/weapon/kitchen/knife/ritual name = "ritual knife" desc = "The unearthly energies that once powered this blade are now dormant." icon = 'icons/obj/wizard.dmi' icon_state = "render" + w_class = 3.0 -/* - * Bucher's cleaver - */ -/obj/item/weapon/kitchenknife/butcher +/obj/item/weapon/kitchen/knife/butcher name = "butcher's cleaver" - icon = 'icons/obj/kitchen.dmi' icon_state = "butch" desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products." flags = CONDUCT force = 15.0 - w_class = 3.0 throwforce = 8.0 - throw_speed = 3 - throw_range = 6 - m_amt = 12000 - origin_tech = "materials=1" - hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - -/* - * Rolling Pins - */ + w_class = 3.0 /obj/item/weapon/kitchen/rollingpin name = "rolling pin" @@ -158,4 +96,4 @@ w_class = 3.0 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") -/* Trays moved to /obj/item/weapon/storage/bag */ +/* Trays moved to /obj/item/weapon/storage/bag */ diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 15543721ac9..778252c04f1 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -44,7 +44,7 @@ /obj/item/weapon/storage/backpack/holding/handle_item_insertion(obj/item/W, prevent_warning = 0, mob/user) if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail) var/safety = alert(user, "You feel this may not be the best idea.", "Put in [name]?", "Proceed", "Abort") - if(safety == "Abort" || !in_range(src, user) || !src || !W) + if(safety == "Abort" || !in_range(src, user) || !src || !W || user.incapacitated()) return investigate_log("has become a singularity. Caused by [user.key]","singulo") user << "The Bluespace interfaces of the two devices catastrophically malfunction!" diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm index 3be61c6ae42..9a71db5ab8d 100644 --- a/code/game/objects/items/weapons/storage/book.dm +++ b/code/game/objects/items/weapons/storage/book.dm @@ -35,8 +35,85 @@ new /obj/item/stack/spacecash(src) new /obj/item/stack/spacecash(src) -/obj/item/weapon/storage/book/bible/attack_self(mob/user) - return +//Pretty bible names +var/global/list/biblenames = list("Bible", "Quran", "Scrapbook", "Burning Bible", "Clown Bible", "Banana Bible", "Creeper Bible", "White Bible", "Holy Light", "The God Delusion", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "Melted Bible", "Necronomicon") + +//Bible iconstates +var/global/list/biblestates = list("bible", "koran", "scrapbook", "burning", "honk1", "honk2", "creeper", "white", "holylight", "atheist", "tome", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon") + +//Bible itemstates +var/global/list/bibleitemstates = list("bible", "koran", "scrapbook", "bible", "bible", "bible", "syringe_kit", "syringe_kit", "syringe_kit", "syringe_kit", "syringe_kit", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon") + + + +/obj/item/weapon/storage/book/bible/attack_self(mob/living/carbon/human/H) + if(!istype(H)) + return + if(ticker && !ticker.Bible_icon_state && H.job == "Chaplain") + //Open bible selection + var/dat = "Pick Bible Style

Pick a bible style

" + + var/i + for(i = 1, i < biblestates.len, i++) + var/icon/bibleicon = icon('icons/obj/storage.dmi', biblestates[i]) + + var/nicename = biblenames[i] + H << browse_rsc(bibleicon, nicename) + dat += {""} + + dat += "
[nicename]
" + + H << browse(dat, "window=editicon;can_close=0;can_minimize=0;size=250x650") + +/obj/item/weapon/storage/book/bible/proc/setupbiblespecifics(var/obj/item/weapon/storage/book/bible/B, var/mob/living/carbon/human/H) + switch(B.icon_state) + if("honk1","honk2") + new /obj/item/weapon/grown/bananapeel(B) + new /obj/item/weapon/grown/bananapeel(B) + + if(B.icon_state == "honk1") + H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask) + + if("bible") + for(var/area/chapel/main/A in world) + for(var/turf/T in A.contents) + if(T.icon_state == "carpetsymbol") + T.dir = 2 + if("koran") + for(var/area/chapel/main/A in world) + for(var/turf/T in A.contents) + if(T.icon_state == "carpetsymbol") + T.dir = 4 + if("scientology") + for(var/area/chapel/main/A in world) + for(var/turf/T in A.contents) + if(T.icon_state == "carpetsymbol") + T.dir = 8 + if("athiest") + for(var/area/chapel/main/A in world) + for(var/turf/T in A.contents) + if(T.icon_state == "carpetsymbol") + T.dir = 10 + +/obj/item/weapon/storage/book/bible/Topic(href, href_list) + if(href_list["seticon"]) + var/iconi = text2num(href_list["seticon"]) + + var/biblename = biblenames[iconi] + var/obj/item/weapon/storage/book/bible/B = locate(href_list["src"]) + + B.icon_state = biblestates[iconi] + B.item_state = bibleitemstates[iconi] + + //Set biblespecific chapels + setupbiblespecifics(B, usr) + + if(ticker) + ticker.Bible_icon_state = B.icon_state + ticker.Bible_item_state = B.item_state + feedback_set_details("religion_book","[biblename]") + + usr << browse(null, "window=editicon") // Close window /obj/item/weapon/storage/book/bible/proc/bless(mob/living/carbon/M as mob) if(ishuman(M)) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index f9b6eecd4cc..7e8b26009e9 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -8,7 +8,7 @@ new /obj/item/clothing/mask/gas/voice(src) new /obj/item/weapon/card/id/syndicate(src) new /obj/item/weapon/card/id/syndicate(src) - new /obj/item/clothing/shoes/syndigaloshes(src) + new /obj/item/clothing/shoes/sneakers/syndigaloshes(src) new /obj/item/device/camera_bug(src) return @@ -49,7 +49,7 @@ new /obj/item/weapon/melee/energy/sword/saber(src) new /obj/item/clothing/glasses/thermal/syndi(src) new /obj/item/weapon/card/emag(src) - new /obj/item/clothing/shoes/syndigaloshes(src) + new /obj/item/clothing/shoes/sneakers/syndigaloshes(src) return if("implant") diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 63d46028ba5..76ce25a17ba 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -1,3 +1,6 @@ +#define TANK_MAX_RELEASE_PRESSURE (3*ONE_ATMOSPHERE) +#define TANK_DEFAULT_RELEASE_PRESSURE (ONE_ATMOSPHERE*O2STANDARD) + /obj/item/weapon/tank name = "tank" icon = 'icons/obj/tank.dmi' @@ -90,24 +93,54 @@ /obj/item/weapon/tank/attack_self(mob/user as mob) if (!(src.air_contents)) return - user.set_machine(src) + + ui_interact(user) + +/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main") + var/mob/living/carbon/location = null + + if(istype(loc, /mob/living/carbon)) + location = loc + else if(istype(loc.loc, /mob/living/carbon)) + location = loc.loc var/using_internal - if(istype(loc,/mob/living/carbon)) - var/mob/living/carbon/location = loc + if(istype(location)) if(location.internal==src) using_internal = 1 - var/message = {" -Tank
-Tank Pressure: [air_contents.return_pressure()]
-
-Mask Release Pressure: - - [distribute_pressure] + +
-Mask Release Valve: [using_internal?("Open"):("Closed")] -"} - user << browse(message, "window=tank;size=600x300") - onclose(user, "tank") - return + // this is the data which will be sent to the ui + var/data = list() + data["tankPressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) + data["releasePressure"] = round(distribute_pressure ? distribute_pressure : 0) + data["defaultReleasePressure"] = round(TANK_DEFAULT_RELEASE_PRESSURE) + data["maxReleasePressure"] = round(TANK_MAX_RELEASE_PRESSURE) + data["valveOpen"] = using_internal ? 1 : 0 + + data["maskConnected"] = 0 + + if(istype(location)) + var/mask_check = 0 + + if(location.internal == src) // if tank is current internal + mask_check = 1 + else if(src in location) // or if tank is in the mobs possession + if(!location.internal) // and they do not have any active internals + mask_check = 1 + + if(mask_check) + if(location.wear_mask && (location.wear_mask.flags & MASKINTERNALS)) + data["maskConnected"] = 1 + + var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key) + if (!ui) + ui = new /datum/nanoui(user, src, ui_key, "tanks.tmpl", "Tank", 500, 300) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + else + ui.push_data(data) + /obj/item/weapon/tank/Topic(href, href_list) ..() @@ -116,8 +149,13 @@ if (src.loc == usr) usr.set_machine(src) if (href_list["dist_p"]) - var/cp = text2num(href_list["dist_p"]) - src.distribute_pressure += cp + if (href_list["dist_p"] == "reset") + src.distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE + else if (href_list["dist_p"] == "max") + src.distribute_pressure = TANK_MAX_RELEASE_PRESSURE + else + var/cp = text2num(href_list["dist_p"]) + src.distribute_pressure += cp src.distribute_pressure = min(max(round(src.distribute_pressure), 0), 3*ONE_ATMOSPHERE) if (href_list["stat"]) if(istype(loc,/mob/living/carbon)) diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm index 7edc9dba09b..c6ec42d40bd 100644 --- a/code/game/objects/items/weapons/vending_items.dm +++ b/code/game/objects/items/weapons/vending_items.dm @@ -56,7 +56,7 @@ /obj/item/weapon/vending_refill/autodrobe machine_name = "AutoDrobe" icon_state = "refill_costume" - charges = 26// of 77 + charges = 29// of 87 /obj/item/weapon/vending_refill/clothing machine_name = "ClothesMate" diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm new file mode 100644 index 00000000000..495c7b9c394 --- /dev/null +++ b/code/game/objects/structures/artstuff.dm @@ -0,0 +1,127 @@ + +/////////// +// EASEL // +/////////// + +/obj/structure/easel + name = "easel" + desc = "only for the finest of art!" + icon = 'icons/obj/artstuff.dmi' + icon_state = "easel" + density = 1 + var/obj/item/weapon/canvas/painting = null + + +//Adding canvases +/obj/structure/easel/attackby(var/obj/item/I, var/mob/user, params) + if(istype(I, /obj/item/weapon/canvas)) + var/obj/item/weapon/canvas/C = I + user.unEquip(C) + painting = C + C.loc = get_turf(src) + C.layer = layer+0.1 + user.visible_message("[user] puts \the [C] on \the [src].","You place \the [C] on \the [src].") + return + + ..() + + +//Stick to the easel like glue +/obj/structure/easel/Move() + var/turf/T = get_turf(src) + ..() + if(painting && painting.loc == T) //Only move if it's near us. + painting.loc = get_turf(src) + else + painting = null + + +////////////// +// CANVASES // +////////////// + +#define AMT_OF_CANVASES 4 //Keep this up to date or shit will break. + +//To safe memory on making /icons we cache the blanks.. +var/global/list/globalBlankCanvases[AMT_OF_CANVASES] + +/obj/item/weapon/canvas + name = "canvas" + desc = "draw out your soul on this canvas!" + icon = 'icons/obj/artstuff.dmi' + icon_state = "11x11" + var/whichGlobalBackup = 1 //List index + +/obj/item/weapon/canvas/nineteenXnineteen + icon_state = "19x19" + whichGlobalBackup = 2 + +/obj/item/weapon/canvas/twentythreeXnineteen + icon_state = "23x19" + whichGlobalBackup = 3 + +/obj/item/weapon/canvas/twentythreeXtwentythree + icon_state = "23x23" + whichGlobalBackup = 4 + + +//Find the right size blank canvas +/obj/item/weapon/canvas/proc/getGlobalBackup() + . = null + if(globalBlankCanvases[whichGlobalBackup]) + . = globalBlankCanvases[whichGlobalBackup] + else + var/icon/I = icon(initial(icon),initial(icon_state)) + globalBlankCanvases[whichGlobalBackup] = I + . = I + + + +//One pixel increments +/obj/item/weapon/canvas/attackby(var/obj/item/I, var/mob/user, params) + //Click info + var/list/click_params = params2list(params) + var/pixX = text2num(click_params["icon-x"]) + var/pixY = text2num(click_params["icon-y"]) + + //Should always be true, otherwise you didn't click the object, but let's check because SS13~ + if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) + return + + //Cleaning one pixel with a soap or rag + if(istype(I, /obj/item/weapon/soap) || istype(I, /obj/item/weapon/reagent_containers/glass/rag)) + //Pixel info created only when needed + var/icon/masterpiece = icon(icon,icon_state) + var/thePix = masterpiece.GetPixel(pixX,pixY) + var/icon/Ico = getGlobalBackup() + if(!Ico) + qdel(masterpiece) + return + + var/theOriginalPix = Ico.GetPixel(pixX,pixY) + if(thePix != theOriginalPix) //colour changed + DrawPixelOn(theOriginalPix,pixX,pixY) + qdel(masterpiece) + return + + //Drawing one pixel with a crayon + if(istype(I, /obj/item/toy/crayon)) + var/obj/item/toy/crayon/C = I + DrawPixelOn(C.colour, pixX, pixY) + return + + ..() + +//Clean the whole canvas +/obj/item/weapon/canvas/attack_self(var/mob/user) + if(!user) + return + var/icon/blank = getGlobalBackup() + if(blank) + //it's basically a giant etch-a-sketch + icon = blank + user.visible_message("[user] cleans the canvas.","You clean the canvas.") + + + +#undef AMT_OF_CANVASES diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index dc82a42143a..1154a8591e1 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -305,8 +305,6 @@ usr << browse(dat, "window=players;size=600x480") /datum/admins/proc/check_antagonists() - var/list/supported_continuous_modes = list("revolution", "gang", "wizard", "malfunction", "blob") - var/list/supported_midround_antag_modes = list("wizard", "malfunction", "blob") if (ticker && ticker.current_state >= GAME_STATE_PLAYING) var/dat = "Round Status

Round Status

" dat += "Current Game Mode: [ticker.mode.name]
" @@ -324,11 +322,8 @@ else dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
" dat += "Continuous Round Status
" - if(!ticker.mode.config_tag in supported_continuous_modes) - dat += "Continue if antagonists die" - else - dat += "[config.continuous[ticker.mode.config_tag] ? "Continue if antagonists die" : "End on antagonist death"]" - if(config.continuous[ticker.mode.config_tag] && ticker.mode.config_tag in supported_midround_antag_modes) + dat += "[config.continuous[ticker.mode.config_tag] ? "Continue if antagonists die" : "End on antagonist death"]" + if(config.continuous[ticker.mode.config_tag]) dat += ", [config.midround_antag[ticker.mode.config_tag] ? "creating replacement antagonists" : "not creating new antagonists"]
" else dat += "
" @@ -386,7 +381,7 @@ dat += "" if(ticker.mode.A_bosses.len || ticker.mode.A_gang.len) - dat += "
" + dat += "
[gang_name("A")] Gang: [(ticker.mode.gang_points ? "[ticker.mode.gang_points.A] Influence, " : "")][round((ticker.mode.A_territory.len/start_state.num_territories)*100, 0.1)]% Control
" for(var/datum/mind/N in ticker.mode.A_bosses) var/mob/M = N.current if(!M) @@ -402,7 +397,7 @@ dat += "
[gang_name("A")] Gang: [(ticker.mode.gang_points ? "[ticker.mode.gang_points.A] Influence, " : "")][round((ticker.mode.A_territory.len/start_state.num_territories)*100, 1)]% Control
" if(ticker.mode.B_bosses.len || ticker.mode.B_gang.len) - dat += "
" + dat += "
[gang_name("B")] Gang: [(ticker.mode.gang_points ? "[ticker.mode.gang_points.B] Influence, " : "")][round((ticker.mode.B_territory.len/start_state.num_territories)*100, 0.1)]% Control
" for(var/datum/mind/N in ticker.mode.B_bosses) var/mob/M = N.current if(!M) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index e97ee1077e4..b77f5bd6afe 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -690,7 +690,7 @@ var/global/list/g_fancy_list_of_types = null M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/destroyer(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand) M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store) @@ -712,9 +712,9 @@ var/global/list/g_fancy_list_of_types = null M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head) M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/rollingpin(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_r_store) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_s_store) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_s_store) if ("tournament janitor") M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform) @@ -807,7 +807,7 @@ var/global/list/g_fancy_list_of_types = null M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_store) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store) var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M) @@ -1276,4 +1276,4 @@ var/global/list/g_fancy_list_of_types = null W.assignment = "Centcom Official" W.registered_name = M.real_name W.update_label() - M.equip_to_slot_or_del(W, slot_wear_id) \ No newline at end of file + M.equip_to_slot_or_del(W, slot_wear_id) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index bd3044071c4..201dde00b62 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -62,6 +62,7 @@ datum/preferences var/eye_color = "000" //Eye color var/datum/species/pref_species = new /datum/species/human() //Mutant race var/mutant_color = "FFF" //Mutant race skin color + var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity") //Mob preview var/icon/preview_icon_front = null @@ -94,6 +95,10 @@ datum/preferences /datum/preferences/New(client/C) blood_type = random_blood_type() ooccolor = normal_ooc_colour + custom_names["ai"] = pick(ai_names) + custom_names["cyborg"] = pick(ai_names) + custom_names["clown"] = pick(clown_names) + custom_names["mime"] = pick(mime_names) if(istype(C)) if(!IsGuestKey(C.key)) load_path(C.ckey) @@ -158,10 +163,18 @@ datum/preferences dat += "[real_name]
" dat += "Gender:[gender == MALE ? "Male" : "Female"]
" - dat += "Age:[age]" + dat += "Age:[age]
" + + dat += "Special Names:
" + dat += "Clown: [custom_names["clown"]] " + dat += "Mime:[custom_names["mime"]]
" + dat += "AI: [custom_names["ai"]] " + dat += "Cyborg: [custom_names["cyborg"]]
" + dat += "Chaplain religion: [custom_names["religion"]] " + dat += "Chaplain deity: [custom_names["deity"]]
" - dat += "" if(pref_species.use_skintones) - dat += "
[gang_name("B")] Gang: [(ticker.mode.gang_points ? "[ticker.mode.gang_points.B] Influence, " : "")][round((ticker.mode.B_territory.len/start_state.num_territories)*100, 1)]% Control
" + dat += "" dat += "
" @@ -182,11 +195,11 @@ datum/preferences dat += "Underwear:
[underwear]
" dat += "Undershirt:
[undershirt]
" dat += "Socks:
[socks]
" - dat += "Backpack:
[backbaglist[backbag]]
" + dat += "Backpack:
[backbaglist[backbag]]
" + dat += "" dat += "

Skin Tone

" @@ -304,7 +317,7 @@ datum/preferences dat += "" //user << browse(dat, "window=preferences;size=560x560") - var/datum/browser/popup = new(user, "preferences", "
Character Setup
", 640, 680) + var/datum/browser/popup = new(user, "preferences", "
Character Setup
", 640, 750) popup.set_content(dat) popup.open(0) @@ -752,6 +765,50 @@ datum/preferences var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist if(new_backbag) backbag = backbaglist.Find(new_backbag) + + if("clown_name") + var/new_clown_name = reject_bad_name( input(user, "Choose your character's clown name:", "Character Preference") as text|null ) + if(new_clown_name) + custom_names["clown"] = new_clown_name + else + user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ." + + if("mime_name") + var/new_mime_name = reject_bad_name( input(user, "Choose your character's mime name:", "Character Preference") as text|null ) + if(new_mime_name) + custom_names["mime"] = new_mime_name + else + user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ." + + if("ai_name") + var/new_ai_name = reject_bad_name( input(user, "Choose your character's AI name:", "Character Preference") as text|null, 1 ) + if(new_ai_name) + custom_names["ai"] = new_ai_name + else + user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, 0-9, -, ' and ." + + if("cyborg_name") + var/new_cyborg_name = reject_bad_name( input(user, "Choose your character's cyborg name:", "Character Preference") as text|null, 1 ) + if(new_cyborg_name) + custom_names["cyborg"] = new_cyborg_name + else + user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, 0-9, -, ' and ." + + if("religion_name") + var/new_religion_name = reject_bad_name( input(user, "Choose your character's mime name:", "Character Preference") as text|null ) + if(new_religion_name) + custom_names["religion"] = new_religion_name + else + user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ." + + if("deity_name") + var/new_deity_name = reject_bad_name( input(user, "Choose your character's mime name:", "Character Preference") as text|null ) + if(new_deity_name) + custom_names["deity"] = new_deity_name + else + user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ." + + else switch(href_list["preference"]) if("publicity") diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 604bbd57069..f2da84ddd52 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -187,6 +187,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["socks"] >> socks S["backbag"] >> backbag S["mutant_color"] >> mutant_color + S["clown_name"] >> custom_names["clown"] + S["mime_name"] >> custom_names["mime"] + S["ai_name"] >> custom_names["ai"] + S["cyborg_name"] >> custom_names["cyborg"] + S["religion_name"] >> custom_names["religion"] + S["deity_name"] >> custom_names["deity"] //Jobs S["userandomjob"] >> userandomjob @@ -274,6 +280,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["backbag"] << backbag S["species"] << pref_species.name S["mutant_color"] << mutant_color + S["clown_name"] << custom_names["clown"] + S["mime_name"] << custom_names["mime"] + S["ai_name"] << custom_names["ai"] + S["cyborg_name"] << custom_names["cyborg"] + S["religion_name"] << custom_names["religion"] + S["deity_name"] << custom_names["deity"] //Jobs S["userandomjob"] << userandomjob diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index cd9c96ae388..3675ba81ded 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -1,7 +1,7 @@ /obj/item/clothing/shoes/proc/step_action() //this was made to rewrite clown shoes squeaking -/obj/item/clothing/shoes/syndigaloshes - desc = "A pair of brown shoes. They seem to have extra grip." +/obj/item/clothing/shoes/sneakers/syndigaloshes + desc = "A pair of brown shoes." name = "brown shoes" icon_state = "brown" item_state = "brown" diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index c59e0ef4c62..04679faa2c5 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -25,6 +25,7 @@ action_button_name = "Toggle Chronosuit" slowdown = 2 armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90) + var/list/chronosafe_items = list(/obj/item/weapon/chrono_eraser, /obj/item/weapon/gun/energy/chrono_gun) var/obj/item/clothing/head/helmet/space/chronos/helmet = null var/obj/effect/chronos_cam/camera = null var/activating = 0 @@ -74,6 +75,13 @@ var/turf/to_turf = from_turf var/atom/movable/overlay/phaseanim = new(from_turf) var/obj/holder = new(camera) + + var/list/nonsafe_slots = list(slot_belt, slot_back, slot_l_hand, slot_r_hand) + for(var/slot in nonsafe_slots) + var/obj/item/slot_item = user.get_item_by_slot(slot) + if(slot_item && !(slot_item.type in chronosafe_items) && user.unEquip(slot_item)) + user << "Your [slot_item.name] got left behind." + phaseanim.name = "phasing [user.name]" phaseanim.icon = 'icons/mob/mob.dmi' phaseanim.icon_state = "chronostuck" diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index b9ecf892582..512d464f7cb 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -60,7 +60,7 @@ gas_transfer_coefficient = 0.90 permeability_coefficient = 0.50 body_parts_covered = CHEST|GROIN|ARMS - allowed = list(/obj/item/weapon/kitchenknife) + allowed = list(/obj/item/weapon/kitchen) togglename = "sleeves" //Cook @@ -71,7 +71,7 @@ item_state = "apronchef" blood_overlay_type = "armor" body_parts_covered = CHEST|GROIN - allowed = list(/obj/item/weapon/kitchenknife) + allowed = list(/obj/item/weapon/kitchen) //Detective /obj/item/clothing/suit/det_suit diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index e4ec5e8fd5a..b3f8c13c50c 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -344,7 +344,8 @@ qdel(src) /obj/effect/spacevine/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if (!W || !user || !W.type) return + if (!W || !user || !W.type) + return user.changeNext_move(CLICK_CD_MELEE) var/override = 0 @@ -356,33 +357,22 @@ ..() return - switch(W.type) - if(/obj/item/weapon/circular_saw) qdel(src) - if(/obj/item/weapon/kitchen/utensil/knife) qdel(src) - if(/obj/item/weapon/scalpel) qdel(src) - if(/obj/item/weapon/twohanded/fireaxe) qdel(src) - if(/obj/item/weapon/hatchet) qdel(src) - if(/obj/item/weapon/melee/energy) qdel(src) - if(/obj/item/weapon/scythe) - for(var/obj/effect/spacevine/B in orange(src,1)) - if(prob(80)) - qdel(B) + if(istype(W, /obj/item/weapon/scythe)) + for(var/obj/effect/spacevine/B in orange(src,1)) + if(prob(80)) + qdel(B) + qdel(src) + + else if(is_sharp(W)) + qdel(src) + + else if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(WT.remove_fuel(0, user)) qdel(src) - - //less effective weapons - if(/obj/item/weapon/wirecutters) - if(prob(25)) qdel(src) - if(/obj/item/weapon/shard) - if(prob(25)) qdel(src) - - else //weapons with subtypes - if(istype(W, /obj/item/weapon/melee/energy/sword)) qdel(src) - else if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(WT.remove_fuel(0, user)) qdel(src) - else - user_unbuckle_mob(user,user) - return + else + user_unbuckle_mob(user,user) + return //Plant-b-gone damage is handled in its entry in chemistry-reagents.dm ..() diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 1327d56fac9..6ca06a27ee7 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -345,7 +345,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow, /obj/item/weapon/melee/energy/sword/saber,\ /obj/item/weapon/storage/box/syndicate, /obj/item/weapon/storage/box/emps,\ /obj/item/weapon/cartridge/syndicate, /obj/item/clothing/under/chameleon,\ - /obj/item/clothing/shoes/syndigaloshes, /obj/item/weapon/card/id/syndicate,\ + /obj/item/clothing/shoes/sneakers/syndigaloshes, /obj/item/weapon/card/id/syndicate,\ /obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\ /obj/item/device/chameleon, /obj/item/weapon/card/emag,\ /obj/item/weapon/storage/toolbox/syndicate, /obj/item/weapon/aiModule,\ diff --git a/code/modules/food&drinks/food/snacks_egg.dm b/code/modules/food&drinks/food/snacks_egg.dm index 608064ed01b..08e3076e190 100644 --- a/code/modules/food&drinks/food/snacks_egg.dm +++ b/code/modules/food&drinks/food/snacks_egg.dm @@ -98,18 +98,20 @@ w_class = 3 /obj/item/weapon/reagent_containers/food/snacks/omelette/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W,/obj/item/weapon/kitchen/utensil/fork)) - if(W.icon_state == "forkloaded") + if(istype(W,/obj/item/weapon/kitchen/fork)) + var/obj/item/weapon/kitchen/fork/F = W + if(F.forkload) user << "You already have omelette on your fork!" - return - W.icon_state = "forkloaded" - user.visible_message( \ - "[user] takes a piece of omelette with their fork!", \ - "You take a piece of omelette with your fork." \ - ) - reagents.remove_reagent("nutriment", 1) - if(reagents.total_volume <= 0) - qdel(src) + else + F.icon_state = "forkloaded" + user.visible_message("[user] takes a piece of omelette with their fork!", \ + "You take a piece of omelette with your fork.") + + var/datum/reagent/R = pick(reagents.reagent_list) + reagents.remove_reagent(R.id, 1) + F.forkload = R + if(reagents.total_volume <= 0) + qdel(src) return ..() diff --git a/code/modules/food&drinks/recipes/drinks_recipes.dm b/code/modules/food&drinks/recipes/drinks_recipes.dm index 6af179bf2f1..36b21ba2d4b 100644 --- a/code/modules/food&drinks/recipes/drinks_recipes.dm +++ b/code/modules/food&drinks/recipes/drinks_recipes.dm @@ -206,7 +206,8 @@ name = "Hooch" id = "hooch" result = "hooch" - required_reagents = list ("sugar" = 1, "ethanol" = 2, "fuel" = 1) + required_reagents = list ("ethanol" = 2, "fuel" = 1) + required_catalysts = list("enzyme" = 1) result_amount = 3 /datum/chemical_reaction/irish_coffee diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 361fe6843b0..3ae3ad8741f 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -824,7 +824,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob, p break else //If the player has ghosted from his corpse before blood was drawn, his ckey is no longer attached to the mob, so we need to match up the cloned player through the mind key for(var/mob/M in player_list) - if(ckey(M.mind.key) == ckey(mind.key) && M.ckey && M.client && M.stat == 2 && !M.suiciding) + if(mind && M.mind && ckey(M.mind.key) == ckey(mind.key) && M.ckey && M.client && M.stat == 2 && !M.suiciding) if(istype(M, /mob/dead/observer)) var/mob/dead/observer/O = M if(!O.can_reenter_corpse) diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 1b0fc3f450d..b22c6d40087 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -250,7 +250,7 @@ scanner.computer.inventory.Add(src) user << "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'" - else if(istype(I, /obj/item/weapon/kitchenknife) || istype(I, /obj/item/weapon/wirecutters)) + else if(istype(I, /obj/item/weapon/kitchen/knife) || istype(I, /obj/item/weapon/wirecutters)) user << "You begin to carve out [title]..." if(do_after(user, 30)) user << "You carve out the pages from [title]! You didn't want to read it anyway." diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index e03f3c5464d..2c7083a8206 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -63,17 +63,7 @@ var/list/ai_list = list() var/apc_override = 0 //hack for letting the AI use its APC even when visionless /mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0) - var/list/possibleNames = ai_names - - var/pickedName = null - while(!pickedName) - pickedName = pick(ai_names) - for (var/mob/living/silicon/ai/A in mob_list) - if (A.real_name == pickedName && possibleNames.len > 1) //fixing the theoretically possible infinite loop - possibleNames -= pickedName - pickedName = null - - real_name = pickedName + rename_self("ai", 1) name = real_name anchored = 1 canmove = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 750e20450f8..3eced450fed 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -25,7 +25,6 @@ name = "giant spider" desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." icon_state = "guard" - var/butcher_state = 8 // Icon state for dead spider icons icon_living = "guard" icon_dead = "guard_dead" speak_emote = list("chitters") @@ -95,18 +94,11 @@ stop_automated_movement = 0 walk(src,0) -// Chops off each leg with a 50/50 chance of harvesting one, until finally calling -// default harvest action -/mob/living/simple_animal/hostile/poison/giant_spider/harvest(mob/living/user, sharpness = 1) - if(butcher_state > 0) - butcher_state-- - icon_state = icon_dead + "[butcher_state]" - - if(prob(50)) - new /obj/item/weapon/reagent_containers/food/snacks/spiderleg(src.loc) - return - else - return ..() +/mob/living/simple_animal/hostile/poison/giant_spider/harvest(mob/living/user) + var/leg_amount = rand(4,8) + for(var/i=0, iYou begin to butcher [src]..." + playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1) + if(do_mob(user, src, 80/sharpness)) + harvest(user) return ..() @@ -461,13 +464,9 @@ new childtype(loc) // Harvest an animal's delicious byproducts -/mob/living/simple_animal/proc/harvest(mob/living/user, sharpness = 1) - user << "You begin to butcher [src]..." - playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1) - if(do_mob(user, src, 80/sharpness)) - visible_message("[user] butchers [src].") - gib() - return +/mob/living/simple_animal/proc/harvest(mob/living/user) + visible_message("[user] butchers [src].") + gib() /mob/living/simple_animal/stripPanelUnequip(obj/item/what, mob/who, where, child_override) if(!child_override) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index c9d1843bf78..3b8a4401cbd 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -308,9 +308,6 @@ var/mob/living/silicon/robot/O = new /mob/living/silicon/robot( loc ) - if (config.rename_cyborg) - O.rename_self("cyborg", 1) - // cyborgs produced by Robotize get an automatic power cell O.cell = new(O) O.cell.maxcharge = 7500 @@ -330,6 +327,9 @@ O.update_pipe_vision() + if (config.rename_cyborg) + O.rename_self("cyborg", 1) + O.loc = loc O.job = "Cyborg" O.notify_ai(1) diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm index 07a6a4570dc..09b8a4796be 100644 --- a/code/modules/nano/nanomanager.dm +++ b/code/modules/nano/nanomanager.dm @@ -141,7 +141,8 @@ return 0 // wasn't open processing_uis.Remove(ui) - ui.user.open_uis.Remove(ui) + if(ui.user) // Sanity check in case a user has been deleted (say a blown up borg watching the alarm interface) + ui.user.open_uis.Remove(ui) var/list/uis = open_uis[src_object_key][ui.ui_key] return uis.Remove(ui) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 68bf7c270b0..9875876172b 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -125,30 +125,7 @@ ex_act(1) /obj/item/weapon/stock_parts/cell/proc/get_electrocute_damage() - switch (charge) -/* if (9000 to INFINITY) - return min(rand(90,150),rand(90,150)) - if (2500 to 9000-1) - return min(rand(70,145),rand(70,145)) - if (1750 to 2500-1) - return min(rand(35,110),rand(35,110)) - if (1500 to 1750-1) - return min(rand(30,100),rand(30,100)) - if (750 to 1500-1) - return min(rand(25,90),rand(25,90)) - if (250 to 750-1) - return min(rand(20,80),rand(20,80)) - if (100 to 250-1) - return min(rand(20,65),rand(20,65))*/ - if (1000000 to INFINITY) - return min(rand(50,160),rand(50,160)) - if (200000 to 1000000-1) - return min(rand(25,80),rand(25,80)) - if (100000 to 200000-1)//Ave powernet - return min(rand(20,60),rand(20,60)) - if (50000 to 100000-1) - return min(rand(15,40),rand(15,40)) - if (1000 to 50000-1) - return min(rand(10,20),rand(10,20)) - else - return 0 + if(charge >= 1000) + return Clamp(round(charge/10000), 10, 90) + rand(-5,5) + else + return 0 \ No newline at end of file diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 36936dfdc80..da4cfbc7225 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -426,35 +426,10 @@ newavail = 0 /datum/powernet/proc/get_electrocute_damage() - switch(avail)/* - if (1300000 to INFINITY) - return min(rand(70,150),rand(70,150)) - if (750000 to 1300000) - return min(rand(50,115),rand(50,115)) - if (100000 to 750000-1) - return min(rand(35,101),rand(35,101)) - if (75000 to 100000-1) - return min(rand(30,95),rand(30,95)) - if (50000 to 75000-1) - return min(rand(25,80),rand(25,80)) - if (25000 to 50000-1) - return min(rand(20,70),rand(20,70)) - if (10000 to 25000-1) - return min(rand(20,65),rand(20,65)) - if (1000 to 10000-1) - return min(rand(10,20),rand(10,20))*/ - if (1000000 to INFINITY) - return min(rand(50,160),rand(50,160)) - if (200000 to 1000000) - return min(rand(25,80),rand(25,80)) - if (100000 to 200000)//Ave powernet - return min(rand(20,60),rand(20,60)) - if (50000 to 100000) - return min(rand(15,40),rand(15,40)) - if (1000 to 50000) - return min(rand(10,20),rand(10,20)) - else - return 0 + if(avail >= 1000) + return Clamp(round(avail/10000), 10, 90) + rand(-5,5) + else + return 0 //////////////////////////////////////////////// // Misc. diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 010b3686cc6..fdec6f437b9 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -177,23 +177,19 @@ burst_size = 3 fire_delay = 2 pin = /obj/item/device/firing_pin/implant/pindicate - /obj/item/weapon/gun/projectile/automatic/m90/unrestricted pin = /obj/item/device/firing_pin - /obj/item/weapon/gun/projectile/automatic/m90/New() ..() underbarrel = new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(src) update_icon() return - /obj/item/weapon/gun/projectile/automatic/m90/afterattack(var/atom/target, var/mob/living/user, flag, params) if(select == 2) underbarrel.afterattack(target, user, flag, params) else ..() return - /obj/item/weapon/gun/projectile/automatic/m90/attackby(var/obj/item/A, mob/user, params) if(istype(A, /obj/item/ammo_casing)) if(istype(A, underbarrel.magazine.ammo_type)) @@ -201,7 +197,6 @@ underbarrel.attackby(A, user, params) else ..() - /obj/item/weapon/gun/projectile/automatic/m90/update_icon() ..() overlays.Cut() @@ -214,7 +209,6 @@ overlays += "[initial(icon_state)]gren" icon_state = "[initial(icon_state)][magazine ? "" : "-e"]" return - /obj/item/weapon/gun/projectile/automatic/m90/burst_select() var/mob/living/carbon/human/user = usr switch(select) @@ -246,4 +240,17 @@ fire_sound = 'sound/weapons/Gunshot_smg.ogg' can_suppress = 0 burst_size = 4 + fire_delay = 1 + +/obj/item/weapon/gun/projectile/automatic/ar + name = "ARG" + desc = "A robust assault rile used by Nanotrasen fighting forces." + icon_state = "arg" + item_state = "arg" + slot_flags = 0 + origin_tech = "combat=5;materials=1" + mag_type = /obj/item/ammo_box/magazine/m556 + fire_sound = 'sound/weapons/Gunshot_smg.ogg' + can_suppress = 0 + burst_size = 3 fire_delay = 1 \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm deleted file mode 100644 index 06a63b7c8cd..00000000000 --- a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm +++ /dev/null @@ -1,373 +0,0 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 - -#define REM REAGENTS_EFFECT_MULTIPLIER - -datum/reagent/nicotine - name = "Nicotine" - id = "nicotine" - description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - overdose_threshold = 35 - addiction_threshold = 30 - -datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - var/smoke_message = pick("You can just feel your lungs dying!", "You feel relaxed.", "You feel calmed.", "You feel the lung cancer forming.", "You feel the money you wasted.", "You feel like a space cowboy.", "You feel rugged.") - if(prob(5)) - M << "[smoke_message]" - M.AdjustStunned(-1) - M.adjustStaminaLoss(-1*REM) - ..() - return - -datum/reagent/nicotine/overdose_process(var/mob/living/M as mob) - if(prob(20)) - M << "You feel like you've smoked too much." - M.adjustToxLoss(1*REM) - M.adjustOxyLoss(1*REM) - ..() - return - -datum/reagent/crank - name = "Crank" - id = "crank" - description = "Reduces stun times by about 200%. If overdosed or addicted it will deal significant Toxin, Brute and Brain damage." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - overdose_threshold = 20 - addiction_threshold = 10 - -datum/reagent/crank/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.") - if(prob(5)) - M << "[high_message]" - M.AdjustParalysis(-2) - M.AdjustStunned(-2) - M.AdjustWeakened(-2) - ..() - return -datum/reagent/crank/overdose_process(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,10)*REM) - M.adjustToxLoss(rand(1,10)*REM) - M.adjustBruteLoss(rand(1,10)*REM) - ..() - return - -datum/reagent/crank/addiction_act_stage1(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,10)*REM) - ..() - return -datum/reagent/crank/addiction_act_stage2(var/mob/living/M as mob) - M.adjustToxLoss(rand(1,10)*REM) - ..() - return -datum/reagent/crank/addiction_act_stage3(var/mob/living/M as mob) - M.adjustBruteLoss(rand(1,10)*REM) - ..() - return -datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,10)*REM) - M.adjustToxLoss(rand(1,10)*REM) - M.adjustBruteLoss(rand(1,10)*REM) - ..() - return -/datum/chemical_reaction/crank - name = "Crank" - id = "crank" - result = "crank" - required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "fuel" = 1) - result_amount = 5 - mix_message = "The mixture violently reacts, leaving behind a few crystalline shards." - required_temp = 390 - -/datum/reagent/krokodil - name = "Krokodil" - id = "krokodil" - description = "Cools and calms you down. If overdosed it will deal significant Brain and Toxin damage. If addicted it will begin to deal fatal amounts of Brute damage as the subject's skin falls off." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - overdose_threshold = 20 - addiction_threshold = 15 - - -/datum/reagent/krokodil/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.") - if(prob(5)) - M << "[high_message]" - ..() - return - -/datum/reagent/krokodil/overdose_process(var/mob/living/M as mob) - if(prob(10)) - M.adjustBrainLoss(rand(1,5)*REM) - M.adjustToxLoss(rand(1,5)*REM) - ..() - return - - -/datum/reagent/krokodil/addiction_act_stage1(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,5)*REM) - M.adjustToxLoss(rand(1,5)*REM) - ..() - return -/datum/reagent/krokodil/addiction_act_stage2(var/mob/living/M as mob) - if(prob(25)) - M << "Your skin feels loose..." - ..() - return -/datum/reagent/krokodil/addiction_act_stage3(var/mob/living/M as mob) - if(prob(25)) - M << "Your skin starts to peel away..." - M.adjustBruteLoss(3*REM) - ..() - return - -/datum/reagent/krokodil/addiction_act_stage4(var/mob/living/carbon/human/M as mob) - if(!istype(M.dna.species, /datum/species/cosmetic_zombie)) - M << "Your skin falls off easily!" - M.adjustBruteLoss(rand(50,80)*REM) // holy shit your skin just FELL THE FUCK OFF - hardset_dna(M, null, null, null, null, /datum/species/cosmetic_zombie) - else - M.adjustBruteLoss(5*REM) - ..() - return -/datum/chemical_reaction/krokodil - name = "Krokodil" - id = "krokodil" - result = "krokodil" - required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1) - result_amount = 6 - mix_message = "The mixture dries into a pale blue powder." - required_temp = 380 - -/datum/reagent/methamphetamine - name = "Methamphetamine" - id = "methamphetamine" - description = "Reduces stun times by about 300%, speeds the user up, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - overdose_threshold = 20 - addiction_threshold = 10 - metabolization_rate = 0.6 - -/datum/reagent/methamphetamine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.") - if(prob(5)) - M << "[high_message]" - M.AdjustParalysis(-3) - M.AdjustStunned(-3) - M.AdjustWeakened(-3) - M.adjustStaminaLoss(-3) - M.status_flags |= GOTTAGOREALLYFAST - M.Jitter(3) - M.adjustBrainLoss(0.5) - if(prob(5)) - M.emote(pick("twitch", "shiver")) - ..() - return - -/datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob) - if(M.canmove && !istype(M.loc, /atom/movable)) - for(var/i = 0, i < 4, i++) - step(M, pick(cardinal)) - if(prob(20)) - M.emote("laugh") - if(prob(33)) - M.visible_message("[M]'s hands flip out and flail everywhere!") - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - ..() - if(prob(20)) - M.adjustToxLoss(5) - M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) - return - -/datum/reagent/methamphetamine/addiction_act_stage1(var/mob/living/M as mob) - M.Jitter(5) - if(prob(20)) - M.emote(pick("twitch","drool","moan")) - ..() - return -/datum/reagent/methamphetamine/addiction_act_stage2(var/mob/living/M as mob) - M.Jitter(10) - M.Dizzy(10) - if(prob(30)) - M.emote(pick("twitch","drool","moan")) - ..() - return -/datum/reagent/methamphetamine/addiction_act_stage3(var/mob/living/M as mob) - if(M.canmove && !istype(M.loc, /atom/movable)) - for(var/i = 0, i < 4, i++) - step(M, pick(cardinal)) - M.Jitter(15) - M.Dizzy(15) - if(prob(40)) - M.emote(pick("twitch","drool","moan")) - ..() - return -/datum/reagent/methamphetamine/addiction_act_stage4(var/mob/living/carbon/human/M as mob) - if(M.canmove && !istype(M.loc, /atom/movable)) - for(var/i = 0, i < 8, i++) - step(M, pick(cardinal)) - M.Jitter(20) - M.Dizzy(20) - M.adjustToxLoss(5) - if(prob(50)) - M.emote(pick("twitch","drool","moan")) - ..() - return - -/datum/chemical_reaction/methamphetamine - name = "methamphetamine" - id = "methamphetamine" - result = "methamphetamine" - required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) - result_amount = 4 - required_temp = 374 - -/datum/chemical_reaction/saltpetre - name = "saltpetre" - id = "saltpetre" - result = "saltpetre" - required_reagents = list("potassium" = 1, "nitrogen" = 1, "oxygen" = 3) - result_amount = 3 - -/datum/reagent/saltpetre - name = "Saltpetre" - id = "saltpetre" - description = "Volatile." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - -/datum/reagent/bath_salts - name = "Bath Salts" - id = "bath_salts" - description = "Makes you nearly impervious to stuns and grants a stamina regeneration buff, but you will be a nearly uncontrollable tramp-bearded raving lunatic." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - overdose_threshold = 20 - addiction_threshold = 10 - - -/datum/reagent/bath_salts/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") - if(prob(5)) - M << "[high_message]" - M.AdjustParalysis(-5) - M.AdjustStunned(-5) - M.AdjustWeakened(-5) - M.adjustStaminaLoss(-10) - M.adjustBrainLoss(1) - M.adjustToxLoss(0.1) - M.hallucination += 10 - if(M.canmove && !istype(M.loc, /atom/movable)) - step(M, pick(cardinal)) - step(M, pick(cardinal)) - ..() - return - -/datum/chemical_reaction/bath_salts - name = "bath_salts" - id = "bath_salts" - result = "bath_salts" - required_reagents = list("????" = 1, "saltpetre" = 1, "nutriment" = 1, "cleaner" = 1, "enzyme" = 1, "tea" = 1, "mercury" = 1) - result_amount = 7 - required_temp = 374 - -/datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob) - M.hallucination += 10 - if(M.canmove && !istype(M.loc, /atom/movable)) - for(var/i = 0, i < 8, i++) - step(M, pick(cardinal)) - if(prob(20)) - M.emote(pick("twitch","drool","moan")) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - ..() - return - -/datum/reagent/bath_salts/addiction_act_stage1(var/mob/living/M as mob) - M.hallucination += 10 - if(M.canmove && !istype(M.loc, /atom/movable)) - for(var/i = 0, i < 8, i++) - step(M, pick(cardinal)) - M.Jitter(5) - M.adjustBrainLoss(10) - if(prob(20)) - M.emote(pick("twitch","drool","moan")) - ..() - return -/datum/reagent/bath_salts/addiction_act_stage2(var/mob/living/M as mob) - M.hallucination += 20 - if(M.canmove && !istype(M.loc, /atom/movable)) - for(var/i = 0, i < 8, i++) - step(M, pick(cardinal)) - M.Jitter(10) - M.Dizzy(10) - M.adjustBrainLoss(10) - if(prob(30)) - M.emote(pick("twitch","drool","moan")) - ..() - return -/datum/reagent/bath_salts/addiction_act_stage3(var/mob/living/M as mob) - M.hallucination += 30 - if(M.canmove && !istype(M.loc, /atom/movable)) - for(var/i = 0, i < 12, i++) - step(M, pick(cardinal)) - M.Jitter(15) - M.Dizzy(15) - M.adjustBrainLoss(10) - if(prob(40)) - M.emote(pick("twitch","drool","moan")) - ..() - return -/datum/reagent/bath_salts/addiction_act_stage4(var/mob/living/carbon/human/M as mob) - M.hallucination += 40 - if(M.canmove && !istype(M.loc, /atom/movable)) - for(var/i = 0, i < 16, i++) - step(M, pick(cardinal)) - M.Jitter(50) - M.Dizzy(50) - M.adjustToxLoss(5) - M.adjustBrainLoss(10) - if(prob(50)) - M.emote(pick("twitch","drool","moan")) - ..() - return - -/datum/chemical_reaction/aranesp - name = "aranesp" - id = "aranesp" - result = "aranesp" - required_reagents = list("epinephrine" = 1, "atropine" = 1, "morphine" = 1) - result_amount = 3 - -/datum/reagent/aranesp - name = "Aranesp" - id = "aranesp" - description = "Amps you up and gets you going, fixes all stamina damage you might have but can cause toxin and oxygen damage.." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - -/datum/reagent/aranesp/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") - if(prob(5)) - M << "[high_message]" - M.adjustStaminaLoss(-35) - M.adjustToxLoss(1) - if(prob(50)) - M.losebreath++ - M.adjustOxyLoss(20) - ..() - return diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm deleted file mode 100644 index 2659fed7197..00000000000 --- a/code/modules/reagents/Chemistry-Goon-Medicine.dm +++ /dev/null @@ -1,831 +0,0 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 - -#define REM REAGENTS_EFFECT_MULTIPLIER - -datum/reagent/silver_sulfadiazine - name = "Silver Sulfadiazine" - id = "silver_sulfadiazine" - description = "On touch, quickly heals burn damage. Basic anti-burn healing drug. On ingestion, deals minor toxin damage." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 2 - -datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) - if(iscarbon(M)) - if(method == TOUCH) - M.adjustFireLoss(-volume) - if(show_message) - M << "You feel your burns healing!" - M.emote("scream") - if(method == INGEST) - M.adjustToxLoss(0.5*volume) - if(show_message) - M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" - ..() - return - -datum/reagent/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustFireLoss(-2*REM) - ..() - return - -datum/reagent/styptic_powder - name = "Styptic Powder" - id = "styptic_powder" - description = "On touch, quickly heals brute damage. Basic anti-brute healing drug. On ingestion, deals minor toxin damage." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 2 - -datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) - if(iscarbon(M)) - if(method == TOUCH) - M.adjustBruteLoss(-volume) - if(show_message) - M << "You feel your wounds knitting back together!" - M.emote("scream") - if(method == INGEST) - M.adjustToxLoss(0.5*volume) - if(show_message) - M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" - ..() - return - -datum/reagent/styptic_powder/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(55)) - M.adjustBruteLoss(-8*REM) - ..() - return - -datum/reagent/salglu_solution - name = "Saline-Glucose Solution" - id = "salglu_solution" - description = "Has a 33% chance per metabolism cycle to heal brute and burn damage." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(33)) - M.adjustBruteLoss(-1*REM) - M.adjustFireLoss(-1*REM) - ..() - return - -datum/reagent/synthflesh - name = "Synthflesh" - id = "synthflesh" - description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume,var/show_message = 1) - if(!M) M = holder.my_atom - if(iscarbon(M)) - if(method == TOUCH) - M.adjustBruteLoss(-1.5*volume) - M.adjustFireLoss(-1.5*volume) - if(show_message) - M << "You feel your burns healing and your flesh knitting together!" - ..() - return - -datum/reagent/charcoal - name = "Charcoal" - id = "charcoal" - description = "Heals toxin damage, and will also slowly remove any other chemicals." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(-3*REM) - for(var/datum/reagent/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.id,1) - ..() - return - -/datum/chemical_reaction/charcoal - name = "Charcoal" - id = "charcoal" - result = "charcoal" - required_reagents = list("ash" = 1, "sodiumchloride" = 1) - result_amount = 2 - mix_message = "The mixture yields a fine black powder." - required_temp = 380 - -/datum/chemical_reaction/silver_sulfadiazine - name = "Silver Sulfadiazine" - id = "silver_sulfadiazine" - result = "silver_sulfadiazine" - required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1) - result_amount = 5 - -/datum/chemical_reaction/salglu_solution - name = "Saline-Glucose Solution" - id = "salglu_solution" - result = "salglu_solution" - required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1) - result_amount = 3 - -/datum/chemical_reaction/synthflesh - name = "Synthflesh" - id = "synthflesh" - result = "synthflesh" - required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1) - result_amount = 3 - -/datum/chemical_reaction/styptic_powder - name = "Styptic Powder" - id = "styptic_powder" - result = "styptic_powder" - required_reagents = list("aluminium" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1) - result_amount = 4 - mix_message = "The solution yields an astringent powder." - -datum/reagent/omnizine - name = "Omnizine" - id = "omnizine" - description = "Heals 1 of each damage type a cycle. If overdosed it will deal significant amounts of each damage type." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.2 - overdose_threshold = 30 - -datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(-1*REM) - M.adjustOxyLoss(-1*REM) - M.adjustBruteLoss(-1*REM) - M.adjustFireLoss(-1*REM) - ..() - return - -datum/reagent/omnizine/overdose_process(var/mob/living/M as mob) - M.adjustToxLoss(3*REM) - M.adjustOxyLoss(3*REM) - M.adjustBruteLoss(3*REM) - M.adjustFireLoss(3*REM) - ..() - return - -datum/reagent/calomel - name = "Calomel" - id = "calomel" - description = "Quickly purges the body of all chemicals. If your health is above 20, toxin damage is dealt. When you hit 20 health or lower, the damage will cease." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/calomel/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - for(var/datum/reagent/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.id,5) - if(M.health > 20) - M.adjustToxLoss(5*REM) - ..() - return - -/datum/chemical_reaction/calomel - name = "Calomel" - id = "calomel" - result = "calomel" - required_reagents = list("mercury" = 1, "chlorine" = 1) - result_amount = 2 - required_temp = 374 - -datum/reagent/potass_iodide - name = "Potassium Iodide" - id = "potass_iodide" - description = "Reduces low radiation damage very effectively." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/potass_iodide/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.radiation > 0) - if(prob(80)) - M.radiation-- - if(M.radiation < 0) - M.radiation = 0 - ..() - return - -/datum/chemical_reaction/potass_iodide - name = "Potassium Iodide" - id = "potass_iodide" - result = "potass_iodide" - required_reagents = list("potassium" = 1, "iodine" = 1) - result_amount = 2 - -datum/reagent/pen_acid - name = "Pentetic Acid" - id = "pen_acid" - description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body. Has a chance of dealing brute damage." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/pen_acid/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.radiation > 0) - M.radiation -= 7 - M.adjustToxLoss(-4*REM) - if(prob(33)) - M.adjustBruteLoss(1*REM) - if(M.radiation < 0) - M.radiation = 0 - for(var/datum/reagent/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.id,4) - ..() - return - -/datum/chemical_reaction/pen_acid - name = "Pentetic Acid" - id = "pen_acid" - result = "pen_acid" - required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1) - result_amount = 6 - -datum/reagent/sal_acid - name = "Salicyclic Acid" - id = "sal_acid" - description = "If you have less than 50 brute damage, there is a 50% chance to heal one unit. If overdosed it will have a 50% chance to deal 2 brute damage if the patient has less than 50 brute damage already." - reagent_state = LIQUID - color = "#C8A5DC" - overdose_threshold = 25 - -datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.getBruteLoss() < 50) - if(prob(50)) - M.adjustBruteLoss(-1*REM) - ..() - return - -datum/reagent/sal_acid/overdose_process(var/mob/living/M as mob) - if(M.getBruteLoss() < 50) - if(prob(50)) - M.adjustBruteLoss(2*REM) - ..() - return - -/datum/chemical_reaction/sal_acid - name = "Salicyclic Acid" - id = "sal_acid" - result = "sal_acid" - required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1) - result_amount = 5 - -datum/reagent/salbutamol - name = "Salbutamol" - id = "salbutamol" - description = "Quickly heals oxygen damage while slowing down suffocation. Great for stabilizing critical patients!" - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.2 - -datum/reagent/salbutamol/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustOxyLoss(-6*REM) - if(M.losebreath >= 4) - M.losebreath -= 4 - ..() - return - -/datum/chemical_reaction/salbutamol - name = "Salbutamol" - id = "salbutamol" - result = "salbutamol" - required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminium" = 1, "bromine" = 1, "ammonia" = 1) - result_amount = 5 - -datum/reagent/perfluorodecalin - name = "Perfluorodecalin" - id = "perfluorodecalin" - description = "Heals suffocation damage so quickly that you could have a spacewalk, but it mutes your voice. Has a 33% chance of healing brute and burn damage per cycle as well." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.2 - -datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob) - if(!M) M = holder.my_atom - M.adjustOxyLoss(-25*REM) - M.silent = max(M.silent, 5) - if(prob(33)) - M.adjustBruteLoss(-1*REM) - M.adjustFireLoss(-1*REM) - ..() - return - -/datum/chemical_reaction/perfluorodecalin - name = "Perfluorodecalin" - id = "perfluorodecalin" - result = "perfluorodecalin" - required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1) - result_amount = 3 - required_temp = 370 - mix_message = "The mixture rapidly turns into a dense pink liquid." - -datum/reagent/ephedrine - name = "Ephedrine" - id = "ephedrine" - description = "Reduces stun times, increases run speed. If overdosed it will deal toxin and oxyloss damage." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.3 - overdose_threshold = 45 - addiction_threshold = 30 - -datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.status_flags |= IGNORESLOWDOWN - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - M.adjustStaminaLoss(-1*REM) - ..() - return - -datum/reagent/ephedrine/overdose_process(var/mob/living/M as mob) - if(prob(33)) - M.adjustToxLoss(1*REM) - M.losebreath++ - ..() - return - -datum/reagent/ephedrine/addiction_act_stage1(var/mob/living/M as mob) - if(prob(33)) - M.adjustToxLoss(2*REM) - M.losebreath += 2 - ..() - return -datum/reagent/ephedrine/addiction_act_stage2(var/mob/living/M as mob) - if(prob(33)) - M.adjustToxLoss(3*REM) - M.losebreath += 3 - ..() - return -datum/reagent/ephedrine/addiction_act_stage3(var/mob/living/M as mob) - if(prob(33)) - M.adjustToxLoss(4*REM) - M.losebreath += 4 - ..() - return -datum/reagent/ephedrine/addiction_act_stage4(var/mob/living/M as mob) - if(prob(33)) - M.adjustToxLoss(5*REM) - M.losebreath += 5 - ..() - return - -/datum/chemical_reaction/ephedrine - name = "Ephedrine" - id = "ephedrine" - result = "ephedrine" - required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1) - result_amount = 4 - mix_message = "The solution fizzes and gives off toxic fumes." - -datum/reagent/diphenhydramine - name = "Diphenhydramine" - id = "diphenhydramine" - description = "Purges body of lethal Histamine and reduces jitteriness while causing minor drowsiness." - reagent_state = LIQUID - color = "#C8A5DC" -datum/reagent/diphenhydramine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.drowsyness += 1 - M.jitteriness -= 1 - M.reagents.remove_reagent("histamine",3) - ..() - return - -/datum/chemical_reaction/diphenhydramine - name = "Diphenhydramine" - id = "diphenhydramine" - result = "diphenhydramine" - required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1) - result_amount = 4 - mix_message = "The mixture dries into a pale blue powder." - -datum/reagent/morphine - name = "Morphine" - id = "morphine" - description = "Will allow you to ignore slowdown from equipment and damage. Will eventually knock you out if you take too much. If overdosed it will cause jitteriness, dizziness, force the victim to drop items in their hands and eventually deal toxin damage." - reagent_state = LIQUID - color = "#C8A5DC" - var/cycle_count = 0 - overdose_threshold = 30 - addiction_threshold = 25 - - -datum/reagent/morphine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.status_flags |= IGNORESLOWDOWN - if(cycle_count >= 36) - M.sleeping += 3 - cycle_count++ - ..() - return - -datum/reagent/morphine/overdose_process(var/mob/living/M as mob) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - M.Dizzy(1) - M.Jitter(1) - ..() - return - -datum/reagent/morphine/addiction_act_stage1(var/mob/living/M as mob) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - M.Dizzy(2) - M.Jitter(2) - ..() - return -datum/reagent/morphine/addiction_act_stage2(var/mob/living/M as mob) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - M.adjustToxLoss(1*REM) - M.Dizzy(3) - M.Jitter(3) - ..() - return -datum/reagent/morphine/addiction_act_stage3(var/mob/living/M as mob) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - M.adjustToxLoss(2*REM) - M.Dizzy(4) - M.Jitter(4) - ..() - return -datum/reagent/morphine/addiction_act_stage4(var/mob/living/M as mob) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - M.adjustToxLoss(3*REM) - M.Dizzy(5) - M.Jitter(5) - ..() - return - -datum/reagent/oculine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - cycle_amount++ - if(M.eye_blind > 0 && cycle_amount > 20) - if(prob(30)) - M.eye_blind = 0 - else if(prob(80)) - M.eye_blind = 0 - M.eye_blurry = 1 - if(M.eye_blurry > 0) - if(prob(80)) - M.eye_blurry = 0 - ..() - return - -/datum/chemical_reaction/oculine - name = "Oculine" - id = "oculine" - result = "oculine" - required_reagents = list("charcoal" = 1, "carbon" = 1, "hydrogen" = 1) - result_amount = 3 - mix_message = "The mixture sputters loudly and becomes a pale pink color." - -datum/reagent/oculine - name = "Oculine" - id = "oculine" - description = "Cures blindness and heals eye damage over time." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.4 - var/cycle_amount = 0 - -datum/reagent/atropine - name = "Atropine" - id = "atropine" - description = "If patients health is below -25 it will heal 3 brute and burn damage per cycle, as well as stop any oxyloss. Good for stabilising critical patients." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.2 - overdose_threshold = 35 - -datum/reagent/atropine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.health > -60) - M.adjustToxLoss(1*REM) - if(M.health < -25) - M.adjustBruteLoss(-3*REM) - M.adjustFireLoss(-3*REM) - if(M.oxyloss > 65) - M.setOxyLoss(65) - if(M.losebreath > 5) - M.losebreath = 5 - if(prob(30)) - M.Dizzy(5) - M.Jitter(5) - ..() - return - -datum/reagent/atropine/overdose_process(var/mob/living/M as mob) - if(prob(50)) - M.adjustToxLoss(2*REM) - M.Dizzy(1) - M.Jitter(1) - ..() - return - -/datum/chemical_reaction/atropine - name = "Atropine" - id = "atropine" - result = "atropine" - required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1) - result_amount = 5 - -datum/reagent/epinephrine - name = "Epinephrine" - id = "epinephrine" - description = "mReduces most of the knockout/stun effects, minor stamina regeneration buff. Attempts to stop you taking too much oxygen damage. If the patient is in low to severe crit, heals toxins, brute, and burn very effectively. Will not heal patients who are almost dead. If overdosed will stun and deal toxin damage" - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.2 - overdose_threshold = 30 - -datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.health < -10 && M.health > -65) - M.adjustToxLoss(-1*REM) - M.adjustBruteLoss(-1*REM) - M.adjustFireLoss(-1*REM) - if(M.oxyloss > 35) - M.setOxyLoss(35) - if(M.losebreath >= 4) - M.losebreath -= 4 - if(M.losebreath < 0) - M.losebreath = 0 - M.adjustStaminaLoss(-1*REM) - if(prob(30)) - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - ..() - return - -datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob) - if(prob(33)) - M.adjustStaminaLoss(5*REM) - M.adjustToxLoss(2*REM) - M.losebreath++ - ..() - return - -/datum/chemical_reaction/epinephrine - name = "Epinephrine" - id = "epinephrine" - result = "epinephrine" - required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1) - result_amount = 6 - -datum/reagent/strange_reagent - name = "Strange Reagent" - id = "strange_reagent" - description = "A miracle drug that can bring a dead body back to life! If the corpse has suffered too much damage, however, no change will occur to the body. If used on a living person it will deal Brute and Burn damage." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/strange_reagent/reaction_mob(var/mob/living/carbon/human/M as mob, var/method=TOUCH, var/volume) - if(M.stat == DEAD) - if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100) - M.visible_message("[M]'s body convulses a bit, and then falls still once more.") - return - var/mob/dead/observer/ghost = M.get_ghost() - M.visible_message("[M]'s body convulses a bit.") - if(!M.suiciding && !ghost && !(NOCLONE in M.mutations)) - M.stat = 1 - M.adjustOxyLoss(-20) - M.adjustToxLoss(-20) - dead_mob_list -= M - living_mob_list |= list(M) - M.emote("gasp") - add_logs(M, M, "revived", object="strange reagent") - ..() - return -datum/reagent/strange_reagent/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(50)) - M.adjustBruteLoss(2*REM) - M.adjustFireLoss(2*REM) - ..() - return - -/datum/chemical_reaction/strange_reagent - name = "Strange Reagent" - id = "strange_reagent" - result = "strange_reagent" - required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1) - result_amount = 3 - -datum/reagent/life - name = "Life" - id = "life" - description = "Can create a life form, however it is not guaranteed to be friendly. May want to have Security on hot standby." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.2 - -/datum/chemical_reaction/life - name = "Life" - id = "life" - result = "life" - required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1) - result_amount = 3 - required_temp = 374 - -/datum/chemical_reaction/life/on_reaction(var/datum/reagents/holder, var/created_volume) - chemical_mob_spawn(holder, 1, "Life") - -proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reaction_name, var/mob_faction = "chemicalsummon") - if(holder && holder.my_atom) - var/blocked = list(/mob/living/simple_animal/hostile, - /mob/living/simple_animal/hostile/pirate, - /mob/living/simple_animal/hostile/pirate/ranged, - /mob/living/simple_animal/hostile/russian, - /mob/living/simple_animal/hostile/russian/ranged, - /mob/living/simple_animal/hostile/syndicate, - /mob/living/simple_animal/hostile/syndicate/melee, - /mob/living/simple_animal/hostile/syndicate/melee/space, - /mob/living/simple_animal/hostile/syndicate/ranged, - /mob/living/simple_animal/hostile/syndicate/ranged/space, - /mob/living/simple_animal/hostile/alien/queen/large, - /mob/living/simple_animal/hostile/retaliate, - /mob/living/simple_animal/hostile/retaliate/clown, - /mob/living/simple_animal/hostile/mushroom, - /mob/living/simple_animal/hostile/asteroid, - /mob/living/simple_animal/hostile/asteroid/basilisk, - /mob/living/simple_animal/hostile/asteroid/goldgrub, - /mob/living/simple_animal/hostile/asteroid/goliath, - /mob/living/simple_animal/hostile/asteroid/hivelord, - /mob/living/simple_animal/hostile/asteroid/hivelordbrood, - /mob/living/simple_animal/hostile/carp/holocarp, - /mob/living/simple_animal/hostile/mining_drone, - /mob/living/simple_animal/hostile/poison, - /mob/living/simple_animal/hostile/blob, - /mob/living/simple_animal/ascendant_shadowling - )//exclusion list for things you don't want the reaction to create. - var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs - var/atom/A = holder.my_atom - var/turf/T = get_turf(A) - var/area/my_area = get_area(T) - var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)" - message += " (VV)" - - var/mob/M = get(A, /mob) - if(M) - message += " - Carried By: [M.real_name] ([M.key]) (PP) (?)" - else - message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" - - message_admins(message, 0, 1) - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/human/H in viewers(get_turf(holder.my_atom), null)) - H.flash_eyes() - for(var/i = 1, i <= amount_to_spawn, i++) - var/chosen = pick(critters) - var/mob/living/simple_animal/hostile/C = new chosen - C.faction |= mob_faction - C.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(C, pick(NORTH,SOUTH,EAST,WEST)) - -/datum/reagent/mannitol/on_mob_life(mob/living/M as mob) - M.adjustBrainLoss(-3) - ..() - return - -/datum/chemical_reaction/mannitol - name = "Mannitol" - id = "mannitol" - result = "mannitol" - required_reagents = list("sugar" = 1, "hydrogen" = 1, "water" = 1) - result_amount = 3 - mix_message = "The solution slightly bubbles, becoming thicker." - -/datum/reagent/mannitol - name = "Mannitol" - id = "mannitol" - description = "Heals brain damage effectively. Use it in cyro tubes alongside Cryoxadone." - color = "#C8A5DC" - -/datum/reagent/mutadone/on_mob_life(var/mob/living/carbon/human/M as mob) - M.jitteriness = 0 - if(istype(M) && M.dna) - M.dna.remove_all_mutations() - ..() - return - -/datum/chemical_reaction/mutadone - name = "Mutadone" - id = "mutadone" - result = "mutadone" - required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1) - result_amount = 3 - - -/datum/reagent/mutadone - name = "Mutadone" - id = "mutadone" - description = "Heals your genetic defects." - color = "#C8A5DC" - -datum/reagent/antihol - name = "Antihol" - id = "antihol" - description = "Helps remove Alcohol from someone's body, as well as eliminating its side effects." - color = "#C8A5DC" - -datum/reagent/antihol/on_mob_life(var/mob/living/M as mob) - M.dizziness = 0 - M.drowsyness = 0 - M.slurring = 0 - M.confused = 0 - M.reagents.remove_reagent("ethanol", 8) - M.adjustToxLoss(-0.2*REM) - ..() - -/datum/chemical_reaction/antihol - name = "antihol" - id = "antihol" - result = "antihol" - required_reagents = list("ethanol" = 1, "charcoal" = 1) - result_amount = 2 - -/datum/chemical_reaction/cryoxadone - name = "Cryoxadone" - id = "cryoxadone" - result = "cryoxadone" - required_reagents = list("stable_plasma" = 1, "acetone" = 1, "mutagen" = 1) - result_amount = 3 - -/datum/reagent/stimulants - name = "Stimulants" - id = "stimulants" - description = "Increases run speed and eliminates stuns, can heal minor damage. If overdosed it will deal toxin damage and stun." - color = "#C8A5DC" - metabolization_rate = 0.4 - overdose_threshold = 60 - -datum/reagent/stimulants/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.status_flags |= IGNORESLOWDOWN - if(M.health < 50 && M.health > 0) - if(prob(50)) - M.adjustOxyLoss(-5*REM) - M.adjustToxLoss(-5*REM) - M.adjustBruteLoss(-5*REM) - M.adjustFireLoss(-5*REM) - M.adjustFireLoss(-3*REM) - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - M.adjustStaminaLoss(-3*REM) - ..() - -datum/reagent/stimulants/overdose_process(var/mob/living/M as mob) - if(prob(33)) - M.adjustStaminaLoss(5*REM) - M.adjustToxLoss(2*REM) - M.losebreath++ - ..() - return - -datum/reagent/insulin - name = "Insulin" - id = "insulin" - description = "Increases sugar depletion rates." - reagent_state = LIQUID - color = "#C8A5DC" -datum/reagent/insulin/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.sleeping) - M.sleeping-- - M.reagents.remove_reagent("sugar", 5) - ..() - return diff --git a/code/modules/reagents/Chemistry-Goon-Other.dm b/code/modules/reagents/Chemistry-Goon-Other.dm deleted file mode 100644 index bda6a4441d8..00000000000 --- a/code/modules/reagents/Chemistry-Goon-Other.dm +++ /dev/null @@ -1,286 +0,0 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 -#define REM REAGENTS_EFFECT_MULTIPLIER - -var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700") - -datum/reagent/oil - name = "Oil" - id = "oil" - description = "Burns in a small smoky fire, mostly used to get Ash." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/stable_plasma - name = "Stable Plasma" - id = "stable_plasma" - description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/iodine - name = "Iodine" - id = "iodine" - description = "A slippery solution." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/fluorine - name = "Fluorine" - id = "fluorine" - description = "A slippery solution." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/carpet - name = "Carpet" - id = "carpet" - description = "A slippery solution." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/reagent/carpet/reaction_turf(var/turf/simulated/T, var/volume) - if(istype(T, /turf/simulated/floor/plating) || istype(T, /turf/simulated/floor/plasteel)) - var/turf/simulated/floor/F = T - F.ChangeTurf(/turf/simulated/floor/fancy/carpet) - ..() - return - -datum/reagent/bromine - name = "Bromine" - id = "bromine" - description = "A slippery solution." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/phenol - name = "Phenol" - id = "phenol" - description = "Used for certain medical recipes." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/ash - name = "Ash" - id = "ash" - description = "Basic ingredient in a couple of recipes." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/acetone - name = "Acetone" - id = "acetone" - description = "Common ingredient in other recipes." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/acetone - name = "acetone" - id = "acetone" - result = "acetone" - required_reagents = list("oil" = 1, "fuel" = 1, "oxygen" = 1) - result_amount = 3 - -/datum/chemical_reaction/carpet - name = "carpet" - id = "carpet" - result = "carpet" - required_reagents = list("space_drugs" = 1, "blood" = 1) - result_amount = 2 - - -/datum/chemical_reaction/oil - name = "Oil" - id = "oil" - result = "oil" - required_reagents = list("fuel" = 1, "carbon" = 1, "hydrogen" = 1) - result_amount = 3 - -/datum/chemical_reaction/phenol - name = "phenol" - id = "phenol" - result = "phenol" - required_reagents = list("water" = 1, "chlorine" = 1, "oil" = 1) - result_amount = 3 - -/datum/chemical_reaction/ash - name = "Ash" - id = "ash" - result = "ash" - required_reagents = list("oil" = 1) - result_amount = 1 - required_temp = 480 - -datum/reagent/colorful_reagent - name = "Colorful Reagent" - id = "colorful_reagent" - description = "A solution." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/colorful_reagent - name = "colorful_reagent" - id = "colorful_reagent" - result = "colorful_reagent" - required_reagents = list("stable_plasma" = 1, "radium" = 1, "space_drugs" = 1, "cryoxadone" = 1, "triple_citrus" = 1) - result_amount = 5 - -datum/reagent/colorful_reagent/on_mob_life(var/mob/living/M as mob) - if(M && isliving(M)) - M.color = pick(random_color_list) - ..() - return - -datum/reagent/colorful_reagent/reaction_mob(var/mob/living/M, var/volume) - if(M && isliving(M)) - M.color = pick(random_color_list) - ..() - return -datum/reagent/colorful_reagent/reaction_obj(var/obj/O, var/volume) - if(O) - O.color = pick(random_color_list) - ..() - return -datum/reagent/colorful_reagent/reaction_turf(var/turf/T, var/volume) - if(T) - T.color = pick(random_color_list) - ..() - return - - -datum/reagent/triple_citrus - name = "Triple Citrus" - id = "triple_citrus" - description = "A solution." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/triple_citrus - name = "triple_citrus" - id = "triple_citrus" - result = "triple_citrus" - required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1) - result_amount = 5 - -datum/reagent/corn_starch - name = "Corn Starch" - id = "corn_starch" - description = "A slippery solution." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/corn_syrup - name = "corn_syrup" - id = "corn_syrup" - result = "corn_syrup" - required_reagents = list("corn_starch" = 1, "sacid" = 1) - result_amount = 5 - required_temp = 374 - -datum/reagent/corn_syrup - name = "Corn Syrup" - id = "corn_syrup" - description = "Decays into sugar." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/corn_syrup/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.reagents.add_reagent("sugar", 3) - M.reagents.remove_reagent("corn_syrup", 1) - ..() - return - -/datum/chemical_reaction/corgium - name = "corgium" - id = "corgium" - result = "corgium" - required_reagents = list("nutriment" = 1, "colorful_reagent" = 1, "strange_reagent" = 1, "blood" = 1) - result_amount = 3 - required_temp = 374 - -datum/reagent/corgium - name = "Corgium" - id = "corgium" - description = "Creates a corgi at the reaction location." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/corgium/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - new /mob/living/simple_animal/pet/corgi(location) - ..() - return - -datum/reagent/hair_dye - name = "Quantum Hair Dye" - id = "hair_dye" - description = "A solution." - reagent_state = LIQUID - color = "#C8A5DC" - var/list/potential_colors = list("0ad","a0f","f73","d14","d14","0b5","0ad","f73","fc2","084","05e","d22","fa0") // fucking hair code - -/datum/chemical_reaction/hair_dye - name = "hair_dye" - id = "hair_dye" - result = "hair_dye" - required_reagents = list("colorful_reagent" = 1, "radium" = 1, "space_drugs" = 1) - result_amount = 5 - -datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume) - if(M && ishuman(M)) - var/mob/living/carbon/human/H = M - H.hair_color = pick(potential_colors) - H.facial_hair_color = pick(potential_colors) - H.update_hair() - ..() - return - -datum/reagent/barbers_aid - name = "Barber's Aid" - id = "barbers_aid" - description = "A solution to hair loss across the world." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/barbers_aid - name = "barbers_aid" - id = "barbers_aid" - result = "barbers_aid" - required_reagents = list("carpet" = 1, "radium" = 1, "space_drugs" = 1) - result_amount = 5 - -datum/reagent/barbers_aid/reaction_mob(var/mob/living/M, var/volume) - if(M && ishuman(M)) - var/mob/living/carbon/human/H = M - var/datum/sprite_accessory/hair/picked_hair = pick(hair_styles_list) - var/datum/sprite_accessory/facial_hair/picked_beard = pick(facial_hair_styles_list) - H.hair_style = picked_hair - H.facial_hair_style = picked_beard - H.update_hair() - ..() - return - -datum/reagent/concentrated_barbers_aid - name = "Concentrated Barber's Aid" - id = "concentrated_barbers_aid" - description = "A concentrated solution to hair loss across the world." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/concentrated_barbers_aid - name = "concentrated_barbers_aid" - id = "concentrated_barbers_aid" - result = "concentrated_barbers_aid" - required_reagents = list("barbers_aid" = 1, "mutagen" = 1) - result_amount = 2 - -datum/reagent/concentrated_barbers_aid/reaction_mob(var/mob/living/M, var/volume) - if(M && ishuman(M)) - var/mob/living/carbon/human/H = M - H.hair_style = "Very Long Hair" - H.facial_hair_style = "Very Long Beard" - H.update_hair() - ..() - return \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm deleted file mode 100644 index 0e3b34e44cb..00000000000 --- a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm +++ /dev/null @@ -1,486 +0,0 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 - -#define REM REAGENTS_EFFECT_MULTIPLIER - -/datum/reagent/stabilizing_agent - name = "Stabilizing Agent" - id = "stabilizing_agent" - description = "Keeps unstable chemicals stable. This does not work on everything." - reagent_state = LIQUID - color = "#FFFFFF" - -/datum/chemical_reaction/stabilizing_agent - name = "stabilizing_agent" - id = "stabilizing_agent" - result = "stabilizing_agent" - required_reagents = list("iron" = 1, "oxygen" = 1, "hydrogen" = 1) - result_amount = 3 - -/datum/reagent/clf3 - name = "Chlorine Trifluoride" - id = "clf3" - description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space." - reagent_state = LIQUID - color = "#FF0000" - metabolization_rate = 4 - -/datum/chemical_reaction/clf3 - name = "Chlorine Trifluoride" - id = "clf3" - result = "clf3" - required_reagents = list("chlorine" = 1, "fluorine" = 3) - result_amount = 4 - required_temp = 424 - -/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjust_fire_stacks(4) - M.adjustFireLoss(0.35*M.fire_stacks) - ..() - return - -/datum/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume) - var/turf/T = get_turf(holder.my_atom) - for(var/turf/turf in range(1,T)) - new /obj/effect/hotspot(turf) - holder.chem_temp = 1000 // hot as shit - return - -/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume) - if(istype(T, /turf/simulated/floor/plating)) - var/turf/simulated/floor/plating/F = T - if(prob(1)) - F.ChangeTurf(/turf/space) - if(istype(T, /turf/simulated/floor/)) - var/turf/simulated/floor/F = T - if(prob(volume/10)) - F.make_plating() - if(istype(F, /turf/simulated/floor/)) - new /obj/effect/hotspot(F) - if(istype(T, /turf/simulated/wall/)) - var/turf/simulated/wall/W = T - if(prob(volume/10)) - W.ChangeTurf(/turf/simulated/floor) - return - -/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(method == TOUCH && isliving(M)) - M.adjust_fire_stacks(5) - M.IgniteMob() - new /obj/effect/hotspot(M.loc) - return - -/datum/reagent/sorium - name = "Sorium" - id = "sorium" - description = "Sends everything flying from the detonation point." - reagent_state = LIQUID - color = "#FFA500" - -/datum/chemical_reaction/sorium - name = "Sorium" - id = "sorium" - result = "sorium" - required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1) - result_amount = 4 - -/datum/chemical_reaction/sorium_vortex - name = "sorium_vortex" - id = "sorium_vortex" - result = null - required_reagents = list("sorium" = 1) - required_temp = 474 - -/datum/chemical_reaction/sorium_vortex/on_reaction(var/datum/reagents/holder, var/created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 1, 5, 6) - -/datum/chemical_reaction/sorium/on_reaction(var/datum/reagents/holder, var/created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - holder.remove_reagent("sorium", created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 1, 5, 6) - -/datum/reagent/liquid_dark_matter - name = "Liquid Dark Matter" - id = "liquid_dark_matter" - description = "Sucks everything into the detonation point." - reagent_state = LIQUID - color = "#800080" - -/datum/chemical_reaction/liquid_dark_matter - name = "Liquid Dark Matter" - id = "liquid_dark_matter" - result = "liquid_dark_matter" - required_reagents = list("stable_plasma" = 1, "radium" = 1, "carbon" = 1) - result_amount = 3 - -/datum/chemical_reaction/ldm_vortex - name = "LDM Vortex" - id = "ldm_vortex" - result = null - required_reagents = list("liquid_dark_matter" = 1) - required_temp = 474 - -/datum/chemical_reaction/ldm_vortex/on_reaction(var/datum/reagents/holder, var/created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 0, 5, 6) - return -/datum/chemical_reaction/liquid_dark_matter/on_reaction(var/datum/reagents/holder, var/created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - holder.remove_reagent("liquid_dark_matter", created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 0, 5, 6) - return - -/proc/goonchem_vortex(var/turf/simulated/T, var/setting_type, var/range, var/pull_times) - for(var/atom/movable/X in orange(range, T)) - if(istype(X, /obj/effect)) - continue //stop pulling smoke and hotspots please - if(istype(X, /atom/movable)) - if((X) && !X.anchored) - if(setting_type) - for(var/i = 0, i < pull_times, i++) - step_away(X,T) - else - for(var/i = 0, i < pull_times, i++) - step_towards(X,T) - -/datum/reagent/blackpowder - name = "Black Powder" - id = "blackpowder" - description = "Explodes. Violently." - reagent_state = LIQUID - color = "#000000" - metabolization_rate = 0.05 - -/datum/chemical_reaction/blackpowder - name = "Black Powder" - id = "blackpowder" - result = "blackpowder" - required_reagents = list("saltpetre" = 1, "charcoal" = 1, "sulfur" = 1) - result_amount = 3 - -/datum/chemical_reaction/blackpowder_explosion - name = "Black Powder Kaboom" - id = "blackpowder_explosion" - result = null - required_reagents = list("blackpowder" = 1) - result_amount = 1 - required_temp = 474 - mix_message = "Sparks start flying around the black powder!" - -/datum/chemical_reaction/blackpowder_explosion/on_reaction(var/datum/reagents/holder, var/created_volume) - sleep(rand(50,100)) - blackpowder_detonate(holder, created_volume) - return - -/datum/reagent/blackpowder/on_ex_act() - blackpowder_detonate(holder, volume) - return - -/proc/blackpowder_detonate(var/datum/reagents/holder, var/created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - var/ex_severe = round(created_volume / 100) - var/ex_heavy = round(created_volume / 42) - var/ex_light = round(created_volume / 21) - var/ex_flash = round(created_volume / 8) - explosion(T,ex_severe,ex_heavy,ex_light,ex_flash, 1) - return -/datum/reagent/flash_powder - name = "Flash Powder" - id = "flash_powder" - description = "Makes a very bright flash." - reagent_state = LIQUID - color = "#FFFF00" - -/datum/chemical_reaction/flash_powder - name = "Flash powder" - id = "flash_powder" - result = "flash_powder" - required_reagents = list("aluminium" = 1, "potassium" = 1, "sulfur" = 1 ) - result_amount = 3 - -/datum/chemical_reaction/flash_powder_flash - name = "Flash powder activation" - id = "flash_powder_flash" - result = null - required_reagents = list("flash_powder" = 1) - required_temp = 374 - -/datum/chemical_reaction/flash_powder_flash/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, location) - s.start() - for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) - if(C.check_eye_prot()) - continue - flick("e_flash", C.flash) - if(get_dist(C, location) < 4) - C.Weaken(5) - continue - C.Stun(5) - -/datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, location) - s.start() - for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) - if(C.check_eye_prot()) - continue - flick("e_flash", C.flash) - if(get_dist(C, location) < 4) - C.Weaken(5) - continue - C.Stun(5) - holder.remove_reagent("flash_powder", created_volume) - -/datum/reagent/smoke_powder - name = "Smoke Powder" - id = "smoke_powder" - description = "Makes a large cloud of smoke that can carry reagents." - reagent_state = LIQUID - color = "#808080" - -/datum/chemical_reaction/smoke_powder - name = "smoke_powder" - id = "smoke_powder" - result = "smoke_powder" - required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1) - result_amount = 3 - - -/datum/chemical_reaction/smoke_powder_smoke - name = "smoke_powder_smoke" - id = "smoke_powder_smoke" - result = null - required_reagents = list("smoke_powder" = 1) - required_temp = 374 - secondary = 1 - mob_react = 1 - -/datum/chemical_reaction/smoke_powder_smoke/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread - S.attach(location) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - if(S) - S.set_up(holder, 10, 0, location) - S.start() - sleep(10) - S.start() - if(holder && holder.my_atom) - holder.clear_reagents() - return - -/datum/chemical_reaction/smoke_powder/on_reaction(var/datum/reagents/holder, var/created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - holder.remove_reagent("smoke_powder", created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread - S.attach(location) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - if(S) - S.set_up(holder, 10, 0, location) - S.start() - sleep(10) - S.start() - if(holder && holder.my_atom) - holder.clear_reagents() - return - -/datum/reagent/sonic_powder - name = "Sonic Powder" - id = "sonic_powder" - description = "Makes a deafening noise." - reagent_state = LIQUID - color = "#0000FF" - -/datum/chemical_reaction/sonic_powder - name = "sonic_powder" - id = "sonic_powder" - result = "sonic_powder" - required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1) - result_amount = 3 - - -/datum/chemical_reaction/sonic_powder_deafen - name = "sonic_powder_deafen" - id = "sonic_powder_deafen" - result = null - required_reagents = list("sonic_powder" = 1) - required_temp = 374 - -/datum/chemical_reaction/sonic_powder_deafen/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - playsound(location, 'sound/effects/bang.ogg', 25, 1) - for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if((H.ears && (H.ears.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) - continue - C.show_message("BANG", 2) - C.Stun(5) - C.Weaken(5) - C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15)) - if(C.ear_damage >= 15) - C << "Your ears start to ring badly!" - else if(C.ear_damage >= 5) - C << "Your ears start to ring!" - -/datum/chemical_reaction/sonic_powder/on_reaction(var/datum/reagents/holder, var/created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - holder.remove_reagent("sonic_powder", created_volume) - var/location = get_turf(holder.my_atom) - playsound(location, 'sound/effects/bang.ogg', 25, 1) - for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if((H.ears && (H.ears.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) - continue - C.show_message("BANG", 2) - C.Stun(5) - C.Weaken(5) - C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15)) - if(C.ear_damage >= 15) - C << "Your ears start to ring badly!" - else if(C.ear_damage >= 5) - C << "Your ears start to ring!" - -/datum/reagent/phlogiston - name = "Phlogiston" - id = "phlogiston" - description = "Catches you on fire and makes you ignite." - reagent_state = LIQUID - color = "#FF9999" - -/datum/chemical_reaction/phlogiston - name = "phlogiston" - id = "phlogiston" - result = "phlogiston" - required_reagents = list("phosphorus" = 1, "sacid" = 1, "stable_plasma" = 1) - result_amount = 3 - -/datum/chemical_reaction/phlogiston/on_reaction(var/datum/reagents/holder, var/created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - var/turf/simulated/T = get_turf(holder.my_atom) - if(istype(T)) - T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, created_volume) - return - -/datum/reagent/phlogiston/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjust_fire_stacks(1) - M.IgniteMob() - M.adjustFireLoss(0.2*M.fire_stacks) - ..() - return - -/datum/reagent/napalm - name = "Napalm" - id = "napalm" - description = "Very flammable." - reagent_state = LIQUID - color = "#FF9999" - -/datum/reagent/napalm/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjust_fire_stacks(1) - ..() - return - -/datum/reagent/napalm/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(method == TOUCH && isliving(M)) - M.adjust_fire_stacks(7) - return - -/datum/chemical_reaction/napalm - name = "Napalm" - id = "napalm" - result = "napalm" - required_reagents = list("sugar" = 1, "fuel" = 1, "ethanol" = 1 ) - result_amount = 3 - -datum/reagent/cryostylane - name = "Cryostylane" - id = "cryostylane" - description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K." - color = "#B2B2FF" // rgb: 139, 166, 233 - -/datum/chemical_reaction/cryostylane - name = "cryostylane" - id = "cryostylane" - result = "cryostylane" - required_reagents = list("water" = 1, "stable_plasma" = 1, "nitrogen" = 1) - result_amount = 3 - -/datum/chemical_reaction/cryostylane/on_reaction(var/datum/reagents/holder, var/created_volume) - holder.chem_temp = 20 // cools the fuck down - return - - -datum/reagent/cryostylane/on_mob_life(var/mob/living/M as mob) //TODO: code freezing into an ice cube - if(M.reagents.has_reagent("oxygen")) - M.reagents.remove_reagent("oxygen", 1) - M.bodytemperature -= 30 - ..() - return - -datum/reagent/cryostylane/on_tick() - if(holder.has_reagent("oxygen")) - holder.remove_reagent("oxygen", 1) - holder.chem_temp -= 10 - holder.handle_reactions() - ..() - return - - -datum/reagent/cryostylane/reaction_turf(var/turf/simulated/T, var/volume) - if(volume >= 5) - for(var/mob/living/simple_animal/slime/M in T) - M.adjustToxLoss(rand(15,30)) - -datum/reagent/pyrosium - name = "Pyrosium" - id = "pyrosium" - description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K." - color = "#B20000" // rgb: 139, 166, 233 - -/datum/chemical_reaction/pyrosium - name = "pyrosium" - id = "pyrosium" - result = "pyrosium" - required_reagents = list("stable_plasma" = 1, "radium" = 1, "phosphorus" = 1) - result_amount = 3 - -/datum/chemical_reaction/pyrosium/on_reaction(var/datum/reagents/holder, var/created_volume) - holder.chem_temp = 20 // also cools the fuck down - return - -datum/reagent/pyrosium/on_mob_life(var/mob/living/M as mob) - if(M.reagents.has_reagent("oxygen")) - M.reagents.remove_reagent("oxygen", 1) - M.bodytemperature += 30 - ..() - return - -datum/reagent/pyrosium/on_tick() - if(holder.has_reagent("oxygen")) - holder.remove_reagent("oxygen", 1) - holder.chem_temp += 10 - holder.handle_reactions() - ..() - return diff --git a/code/modules/reagents/Chemistry-Goon-Readme.dm b/code/modules/reagents/Chemistry-Goon-Readme.dm deleted file mode 100644 index 0731e28ba93..00000000000 --- a/code/modules/reagents/Chemistry-Goon-Readme.dm +++ /dev/null @@ -1,34 +0,0 @@ -/* - Credit goes to Cogwerks, and all the other goonstation coders - for the original idea and implementation of this over at goonstation. - - THE REQUESTED DON'T PORT LIST: IF YOU PORT THESE THE GOONS WILL MURDER US IN OUR SLEEP SO PLEASE DON'T KTHX - Iamgoofball - Any of the Secret Chems - Goon in-joke chems (Eg. Cat Drugs, Hairgrownium) - Liquid Electricity - Rajajajah - - -/datum/reagent/blankgoonchembase - name = "blank goonchem base" - id = "blankgoonchembase" - description = "A blank chem" - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - - -/datum/reagent/blankgoonchembase/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - ..() - return - -/datum/chemical_reaction/blankgoonchembase - name = "blank goonchem base" - id = "blankgoonchembase" - result = "blankgoonchembase" - required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1) - result_amount = 3 - mix_message = "The mixture dries into a pale blue powder." - required_temp = 420 - -*/ \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Goon-Toxins.dm b/code/modules/reagents/Chemistry-Goon-Toxins.dm deleted file mode 100644 index b8ebe016012..00000000000 --- a/code/modules/reagents/Chemistry-Goon-Toxins.dm +++ /dev/null @@ -1,369 +0,0 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 - -#define REM REAGENTS_EFFECT_MULTIPLIER - -datum/reagent/polonium - name = "Polonium" - id = "polonium" - description = "Cause significant Radiation damage over time." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.1 - -datum/reagent/polonium/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.radiation += 8 - ..() - return - - -datum/reagent/histamine - name = "Histamine" - id = "histamine" - description = "A dose-dependent toxin, ranges from annoying to incredibly lethal." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.2 - overdose_threshold = 30 - -datum/reagent/histamine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - switch(pick(1, 2, 3, 4)) - if(1) - M << "You can barely see!" - M.eye_blurry = 3 - if(2) - M.emote("cough") - if(3) - M.emote("sneeze") - if(4) - if(prob(75)) - M << "You scratch at an itch." - M.adjustBruteLoss(2*REM) - ..() - return -datum/reagent/histamine/overdose_process(var/mob/living/M as mob) - M.adjustOxyLoss(pick(1,3)*REM) - M.adjustBruteLoss(pick(1,3)*REM) - M.adjustToxLoss(pick(1,3)*REM) - ..() - return - -datum/reagent/formaldehyde - name = "Formaldehyde" - id = "formaldehyde" - description = "Deals a moderate amount of Toxin damage over time. 10% chance to decay into 10-15 histamine." - reagent_state = LIQUID - color = "#CF3600" - -datum/reagent/formaldehyde/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1*REM) - if(prob(10)) - M.reagents.add_reagent("histamine",pick(5,15)) - M.reagents.remove_reagent("formaldehyde",1) - ..() - return - -/datum/chemical_reaction/formaldehyde - name = "formaldehyde" - id = "Formaldehyde" - result = "formaldehyde" - required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1) - result_amount = 3 - required_temp = 420 - -datum/reagent/venom - name = "Venom" - id = "venom" - description = "Will deal scaling amounts of Toxin and Brute damage over time. 25% chance to decay into 5-10 histamine." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.2 -datum/reagent/venom/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss((0.1*volume)*REM) - M.adjustBruteLoss((0.1*volume)*REM) - if(prob(25)) - M.reagents.add_reagent("histamine",pick(5,10)) - M.reagents.remove_reagent("venom",1) - ..() - return - -datum/reagent/neurotoxin2 - name = "Neurotoxin" - id = "neurotoxin2" - description = "Deals toxin and brain damage up to 60 before it slows down, causing confusion and a knockout after 17 elapsed cycles." - reagent_state = LIQUID - color = "#CF3600" - var/cycle_count = 0 - metabolization_rate = 1 - -datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob) - cycle_count++ - if(M.brainloss + M.toxloss <= 60) - M.adjustBrainLoss(1*REM) - M.adjustToxLoss(1*REM) - if(cycle_count == 17) - M.sleeping += 10 // buffed so it works - ..() - return - -/datum/chemical_reaction/neurotoxin2 - name = "neurotoxin2" - id = "neurotoxin2" - result = "neurotoxin2" - required_reagents = list("space_drugs" = 1) - result_amount = 1 - required_temp = 674 - -datum/reagent/cyanide - name = "Cyanide" - id = "cyanide" - description = "Deals toxin damage, alongside some oxygen loss. 8% chance of stun and some extra toxin damage." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.1 - -datum/reagent/cyanide/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1.5*REM) - if(prob(10)) - M.losebreath += 1 - if(prob(8)) - M << "You feel horrendously weak!" - M.Stun(2) - M.adjustToxLoss(2*REM) - ..() - return - -/datum/chemical_reaction/cyanide - name = "Cyanide" - id = "cyanide" - result = "cyanide" - required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1) - result_amount = 3 - required_temp = 380 - -/datum/reagent/questionmark // food poisoning - name = "Bad Food" - id = "????" - description = "????" - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.2 - -datum/reagent/questionmark/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1*REM) - ..() - return - -datum/reagent/itching_powder - name = "Itching Powder" - id = "itching_powder" - description = "Lots of annoying random effects, chances to do some brute damage from scratching. 6% chance to decay into 1-3 units of histamine." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.3 - -/datum/reagent/itching_powder/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(method == TOUCH) - M.reagents.add_reagent("itching_powder", volume) - return - -datum/reagent/itching_powder/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(27)) - M << "You scratch at your head." - M.adjustBruteLoss(0.2*REM) - if(prob(27)) - M << "You scratch at your leg." - M.adjustBruteLoss(0.2*REM) - if(prob(27)) - M << "You scratch at your arm." - M.adjustBruteLoss(0.2*REM) - if(prob(6)) - M.reagents.add_reagent("histamine",rand(1,3)) - M.reagents.remove_reagent("itching_powder",1) - ..() - return - -/datum/chemical_reaction/itching_powder - name = "Itching Powder" - id = "itching_powder" - result = "itching_powder" - required_reagents = list("fuel" = 1, "ammonia" = 1, "charcoal" = 1) - result_amount = 3 - -/datum/chemical_reaction/facid - name = "Fluorosulfuric acid" - id = "facid" - result = "facid" - required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1) - result_amount = 4 - required_temp = 380 - -datum/reagent/initropidril - name = "Initropidril" - id = "initropidril" - description = "33% chance to hit with a random amount of toxin damage, 5-10% chances to cause stunning, suffocation, or immediate heart failure." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.4 - -datum/reagent/initropidril/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(33)) - M.adjustToxLoss(rand(5,25)) - if(prob(7)) - var/picked_option = rand(1,3) - switch(picked_option) - if(1) - M.Stun(3) - M.Weaken(3) - if(2) - M.losebreath += 10 - M.adjustOxyLoss(rand(5,25)) - if(3) - var/mob/living/carbon/human/H = M - if(!H.heart_attack) - H.visible_message("[H] clutches at their chest as if their heart stopped!", "You clutch at your chest as if your heart stopped!") - H.heart_attack = 1 // rip in pepperoni - else - H.losebreath += 10 - H.adjustOxyLoss(rand(5,25)) - ..() - return - -datum/reagent/pancuronium - name = "Pancuronium" - id = "pancuronium" - description = "Knocks you out after 30 seconds, 7% chance to cause some oxygen loss." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.2 - -datum/reagent/pancuronium/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(current_cycle >= 10) - M.SetParalysis(3) - if(prob(7)) - M.losebreath += rand(3,5) - ..() - return - -datum/reagent/sodium_thiopental - name = "Sodium Thiopental" - id = "sodium_thiopental" - description = "Puts you to sleep after 30 seconds, along with some major stamina loss." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.7 - -datum/reagent/sodium_thiopental/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(current_cycle >= 10) - M.sleeping += 3 - M.adjustStaminaLoss(10) - ..() - return - -datum/reagent/sulfonal - name = "Sulfonal" - id = "sulfonal" - description = "Deals some toxin damage, and puts you to sleep after 66 seconds." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.1 - -/datum/chemical_reaction/sulfonal - name = "sulfonal" - id = "sulfonal" - result = "sulfonal" - required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1) - result_amount = 3 - -datum/reagent/sulfonal/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(current_cycle >= 22) - M.sleeping += 3 - M.adjustToxLoss(1) - ..() - return - -datum/reagent/amanitin - name = "Amanitin" - id = "amanitin" - description = "On the last second that it's in you, it hits you with a stack of toxin damage based on how long it's been in you. The more you use, the longer it takes before anything happens, but the harder it hits when it does." - reagent_state = LIQUID - color = "#CF3600" - -datum/reagent/amanitin/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - ..() - return - -datum/reagent/amanitin/on_mob_delete(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(current_cycle*rand(2,4)) - ..() - -datum/reagent/lipolicide - name = "Lipolicide" - id = "lipolicide" - description = "Deals some toxin damage unless they keep eating food. Will reduce nutrition values." - reagent_state = LIQUID - color = "#CF3600" - -/datum/chemical_reaction/lipolicide - name = "lipolicide" - id = "lipolicide" - result = "lipolicide" - required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1) - result_amount = 3 - -datum/reagent/lipolicide/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!holder.has_reagent("nutriment")) - M.adjustToxLoss(1) - M.nutrition -= 10 * REAGENTS_METABOLISM - M.overeatduration = 0 - if(M.nutrition < 0)//Prevent from going into negatives. - M.nutrition = 0 - ..() - return - -datum/reagent/coniine - name = "Coniine" - id = "coniine" - description = "Does moderate toxin damage and oxygen loss." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.05 - -datum/reagent/coniine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.losebreath += 5 - M.adjustToxLoss(2) - ..() - return - -datum/reagent/curare - name = "Curare" - id = "curare" - description = "Does some oxygen and toxin damage, weakens you after 33 seconds." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.1 - -datum/reagent/curare/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(current_cycle >= 11) - M.Weaken(3) - M.adjustToxLoss(1) - M.adjustOxyLoss(1) - ..() - return \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm index 02c41c45711..e6cf3d2eca2 100644 --- a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm @@ -73,20 +73,6 @@ datum/reagent/blob/lung_destroying_toxin/reaction_mob(var/mob/living/M as mob, v M << "The blob strikes you, and your lungs feel heavy and weak!" // Special Reagents -datum/reagent/blob/acid - name = "Acidic Liquid" - id = "blob_acid" - description = "" - color = "#BD80F4" - -datum/reagent/blob/acid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) - if(method == TOUCH) - if(prob(50)) - M.acid_act(5,1,5) - if(show_message) - M << "The blob's tendrils melt through your equipment!" - M.apply_damage(10, BRUTE) - datum/reagent/blob/radioactive_liquid name = "Radioactive Liquid" id = "radioactive_liquid" @@ -187,7 +173,7 @@ datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=T /proc/reagent_vortex(var/mob/living/M as mob, var/setting_type) var/turf/pull = get_turf(M) - for(var/atom/movable/X in orange(4,pull)) + for(var/atom/movable/X in range(4,pull)) if(istype(X, /atom/movable)) if((X) && !X.anchored) if(setting_type) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm deleted file mode 100644 index d86016f96ab..00000000000 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm +++ /dev/null @@ -1,956 +0,0 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 - -#define REM REAGENTS_EFFECT_MULTIPLIER - -//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent) -//so that it can continue working when the reagent is deleted while the proc is still active. - - -//Various reagents -//Toxin & acid reagents -//Hydroponics stuff - -datum/reagent - var/name = "Reagent" - var/id = "reagent" - var/description = "" - var/datum/reagents/holder = null - var/reagent_state = LIQUID - var/list/data - var/current_cycle = 0 - var/volume = 0 - var/color = "#000000" // rgb: 0, 0, 0 - var/can_synth = 1 - var/metabolization_rate = REAGENTS_METABOLISM - var/overrides_metab = 0 - var/overdose_threshold = 0 - var/addiction_threshold = 0 - var/addiction_stage = 0 - var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick. - -datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references - ..() - holder = null - -datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume, var/show_message = 1) //By default we have a chance to transfer some - if(!istype(M, /mob/living)) - return 0 - var/datum/reagent/self = src - src = null //of the reagent to the mob on TOUCHING it. - - if(!istype(self.holder.my_atom, /obj/effect/effect/chem_smoke)) - // If the chemicals are in a smoke cloud, do not try to let the chemicals "penetrate" into the mob's system (balance station 13) -- Doohl - - if(method == TOUCH) - - var/chance = 1 - var/block = 0 - - for(var/obj/item/clothing/C in M.get_equipped_items()) - if(C.permeability_coefficient < chance) chance = C.permeability_coefficient - if(istype(C, /obj/item/clothing/suit/bio_suit)) - // bio suits are just about completely fool-proof - Doohl - // kind of a hacky way of making bio suits more resistant to chemicals but w/e - if(prob(75)) - block = 1 - - if(istype(C, /obj/item/clothing/head/bio_hood)) - if(prob(75)) - block = 1 - - chance = chance * 100 - - if(prob(chance) && !block) - if(M.reagents) - M.reagents.add_reagent(self.id,self.volume/2) - return 1 - -datum/reagent/proc/reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object - src = null //if it can hold reagents. nope! - //if(O.reagents) - // O.reagents.add_reagent(id,volume/3) - return - -datum/reagent/proc/reaction_turf(var/turf/T, var/volume) - src = null - return - -datum/reagent/proc/on_mob_life(var/mob/living/M as mob) - current_cycle++ - if(!istype(M, /mob/living)) - return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO - holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. - return - -// Called when this reagent is removed while inside a mob -datum/reagent/proc/on_mob_delete(mob/M) - return - -datum/reagent/proc/on_move(var/mob/M) - return - -// Called after add_reagents creates a new reagent. -datum/reagent/proc/on_new(var/data) - return - -// Called when two reagents of the same are mixing. -datum/reagent/proc/on_merge(var/data) - return - -datum/reagent/proc/on_update(var/atom/A) - return - -// Called every time reagent containers process. -datum/reagent/proc/on_tick(var/data) - return - -// Called when the reagent container is hit by an explosion -datum/reagent/proc/on_ex_act(var/severity) - return - -// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects -datum/reagent/proc/overdose_process(var/mob/living/M as mob) - return - -datum/reagent/proc/overdose_start(var/mob/living/M as mob) - return - -datum/reagent/proc/addiction_act_stage1(var/mob/living/M as mob) - if(prob(30)) - M << "You feel like some [name] right about now." - return - -datum/reagent/proc/addiction_act_stage2(var/mob/living/M as mob) - if(prob(30)) - M << "You feel like you need [name]. You just can't get enough." - return - -datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob) - if(prob(30)) - M << "You have an intense craving for [name]." - return - -datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob) - if(prob(30)) - M << "You're not feeling good at all! You really need some [name]." - return - -datum/reagent/blood - data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) - name = "Blood" - id = "blood" - color = "#C80000" // rgb: 200, 0, 0 - -datum/reagent/blood/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - var/datum/reagent/blood/self = src - src = null - if(self.data && self.data["viruses"]) - for(var/datum/disease/D in self.data["viruses"]) - - if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS) - continue - - if(method == TOUCH) - M.ContractDisease(D) - else //injected - M.ForceContractDisease(D) - -datum/reagent/blood/on_new(var/list/data) - if(istype(data)) - SetViruses(src, data) - -datum/reagent/blood/on_merge(var/list/data) - if(src.data && data) - src.data["cloneable"] = 0 //On mix, consider the genetic sampling unviable for pod cloning, or else we won't know who's even getting cloned, etc - if(src.data["viruses"] || data["viruses"]) - - var/list/mix1 = src.data["viruses"] - var/list/mix2 = data["viruses"] - - // Stop issues with the list changing during mixing. - var/list/to_mix = list() - - for(var/datum/disease/advance/AD in mix1) - to_mix += AD - for(var/datum/disease/advance/AD in mix2) - to_mix += AD - - var/datum/disease/advance/AD = Advance_Mix(to_mix) - if(AD) - var/list/preserve = list(AD) - for(var/D in src.data["viruses"]) - if(!istype(D, /datum/disease/advance)) - preserve += D - src.data["viruses"] = preserve - return 1 - -datum/reagent/blood/reaction_turf(var/turf/simulated/T, var/volume)//splash the blood all over the place - if(!istype(T)) return - var/datum/reagent/blood/self = src - src = null - if(!(volume >= 3)) return - //var/datum/disease/D = self.data["virus"] - if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human)) - var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here - if(!blood_prop) //first blood! - blood_prop = new(T) - blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"] - - for(var/datum/disease/D in self.data["viruses"]) - var/datum/disease/newVirus = D.Copy(1) - blood_prop.viruses += newVirus - newVirus.holder = blood_prop - - - else if(istype(self.data["donor"], /mob/living/carbon/monkey)) - var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T - if(!blood_prop) - blood_prop = new(T) - blood_prop.blood_DNA["Non-Human DNA"] = "A+" - for(var/datum/disease/D in self.data["viruses"]) - var/datum/disease/newVirus = D.Copy(1) - blood_prop.viruses += newVirus - newVirus.holder = blood_prop - - else if(istype(self.data["donor"], /mob/living/carbon/alien)) - var/obj/effect/decal/cleanable/xenoblood/blood_prop = locate() in T - if(!blood_prop) - blood_prop = new(T) - blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" - for(var/datum/disease/D in self.data["viruses"]) - var/datum/disease/newVirus = D.Copy(1) - blood_prop.viruses += newVirus - newVirus.holder = blood_prop - return - -datum/reagent/vaccine - //data must contain virus type - name = "Vaccine" - id = "vaccine" - color = "#C81040" // rgb: 200, 16, 64 - -datum/reagent/vaccine/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - var/datum/reagent/vaccine/self = src - src = null - if(islist(self.data) && method == INGEST) - for(var/datum/disease/D in M.viruses) - if(D.GetDiseaseID() in self.data) - D.cure() - M.resistances |= self.data - return - -datum/reagent/vaccine/on_merge(var/list/data) - if(istype(data)) - src.data |= data.Copy() - - -datum/reagent/water - name = "Water" - id = "water" - description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." - color = "#AAAAAA77" // rgb: 170, 170, 170, 77 (alpha) - var/cooling_temperature = 2 - -/* - * Water reaction to turf - */ - -datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume) - if (!istype(T)) return - var/CT = cooling_temperature - src = null - if(volume >= 10) - T.MakeSlippery() - - for(var/mob/living/simple_animal/slime/M in T) - M.apply_water() - - var/hotspot = (locate(/obj/effect/hotspot) in T) - if(hotspot && !istype(T, /turf/space)) - if(T.air) - var/datum/gas_mixture/G = T.air - G.temperature = max(min(G.temperature-(CT*1000),G.temperature/CT),0) - G.react() - qdel(hotspot) - return - -/* - * Water reaction to an object - */ - -datum/reagent/water/reaction_obj(var/obj/O, var/volume) - src = null - // Monkey cube - if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) - var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O - if(!cube.wrapped) - cube.Expand() - - // Dehydrated carp - if(istype(O,/obj/item/toy/carpplushie/dehy_carp)) - var/obj/item/toy/carpplushie/dehy_carp/dehy = O - dehy.Swell() // Makes a carp - - return - -/* - * Water reaction to a mob - */ - -datum/reagent/water/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with water can help put them out! - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - M.adjust_fire_stacks(-(volume / 10)) - if(M.fire_stacks <= 0) - M.ExtinguishMob() - return - -datum/reagent/water/holywater - name = "Holy Water" - id = "holywater" - description = "Water blessed by some deity." - color = "#E0E8EF" // rgb: 224, 232, 239 - -datum/reagent/water/holywater/on_mob_life(var/mob/living/M as mob) - if(!data) data = 1 - data++ - M.jitteriness = max(M.jitteriness-5,0) - if(data >= 30) // 12 units, 54 seconds @ metabolism 0.4 units & tick rate 1.8 sec - if (!M.stuttering) M.stuttering = 1 - M.stuttering += 4 - M.Dizzy(5) - if(iscultist(M) && prob(5)) - M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","Egkau'haom'nai en Chaous","Ho Diak'nos tou Ap'iron","R'ge Na'sie","Diabo us Vo'iscum","Si gn'um Co'nu")) - if(data >= 75 && prob(33)) // 30 units, 135 seconds - if (!M.confused) M.confused = 1 - M.confused += 3 - if(iscultist(M)) - ticker.mode.remove_cultist(M.mind) - holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? - M.jitteriness = 0 - M.stuttering = 0 - M.confused = 0 - holder.remove_reagent(src.id, 0.4) //fixed consumption to prevent balancing going out of whack - return - -datum/reagent/water/holywater/reaction_turf(var/turf/simulated/T, var/volume) - ..() - if(!istype(T)) return - if(volume>=10) - for(var/obj/effect/rune/R in T) - qdel(R) - T.Bless() - -datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke - name = "Unholy Water" - id = "unholywater" - description = "Something that shouldn't exist on this plane of existance." - -datum/reagent/fuel/unholywater/on_mob_life(var/mob/living/M as mob) - M.adjustBrainLoss(3) - if(iscultist(M)) - M.status_flags |= GOTTAGOFAST - M.drowsyness = max(M.drowsyness-5, 0) - M.AdjustParalysis(-2) - M.AdjustStunned(-2) - M.AdjustWeakened(-2) - else - M.adjustToxLoss(2) - M.adjustFireLoss(2) - M.adjustOxyLoss(2) - M.adjustBruteLoss(2) - holder.remove_reagent(src.id, 1) - -datum/reagent/hellwater //if someone has this in their system they've really pissed off an eldrich god - name = "Hell Water" - id = "hell_water" - description = "YOUR FLESH! IT BURNS!" - -datum/reagent/hellwater/on_mob_life(var/mob/living/M as mob) - M.fire_stacks = min(5,M.fire_stacks + 3) - M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire - M.adjustToxLoss(1) - M.adjustFireLoss(1) //Hence the other damages... ain't I a bastard? - M.adjustBrainLoss(5) - holder.remove_reagent(src.id, 1) - -datum/reagent/lube - name = "Space Lube" - id = "lube" - description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity." - color = "#009CA8" // rgb: 0, 156, 168 - -datum/reagent/lube/reaction_turf(var/turf/simulated/T, var/volume) - if (!istype(T)) return - src = null - if(volume >= 1) - T.MakeSlippery(2) - -datum/reagent/slimetoxin - name = "Mutation Toxin" - id = "mutationtoxin" - description = "A corruptive toxin produced by slimes." - color = "#13BC5E" // rgb: 19, 188, 94 - -datum/reagent/unstableslimetoxin - name = "Unstable Mutation Toxin" - id = "unstablemutationtoxin" - description = "An unstable and unpredictable corruptive toxin produced by slimes." - color = "#5EFF3B" //RGB: 94, 255, 59 - metabolization_rate = INFINITY //So it instantly removes all of itself - -datum/reagent/unstableslimetoxin/on_mob_life(var/mob/living/carbon/human/H as mob) - ..() - H << "You crumple in agony as your flesh wildly morphs into new forms!" - H.visible_message("[H] falls to the ground and screams as their skin bubbles and froths!") //'froths' sounds painful when used with SKIN. - H.Weaken(3) - sleep(30) - var/list/blacklisted_species = list(/datum/species/zombie, /datum/species/skeleton, /datum/species/human, /datum/species/golem, /datum/species/golem/adamantine, /datum/species/shadow) - var/list/possible_morphs = typesof(/datum/species/) - blacklisted_species - var/datum/species/mutation = pick(possible_morphs) - if(prob(90) && mutation && H.dna.species != /datum/species/golem && H.dna.species != /datum/species/golem/adamantine) - H << "The pain subsides. You feel... different." - H.dna.species = new mutation() - H.regenerate_icons() - if(mutation == /datum/species/slime) - H.faction |= "slime" - else - H.faction -= "slime" - else - H << "The pain vanishes suddenly. You feel no different." - return 1 - -datum/reagent/aslimetoxin - name = "Advanced Mutation Toxin" - id = "amutationtoxin" - description = "An advanced corruptive toxin produced by slimes." - color = "#13BC5E" // rgb: 19, 188, 94 - -datum/reagent/aslimetoxin/reaction_mob(var/mob/M, var/volume) - src = null - M.ForceContractDisease(new /datum/disease/transformation/slime(0)) - -datum/reagent/space_drugs - name = "Space drugs" - id = "space_drugs" - description = "An illegal chemical compound used as drug." - color = "#60A584" // rgb: 96, 165, 132 - metabolization_rate = 0.5 * REAGENTS_METABOLISM - -datum/reagent/space_drugs/on_mob_life(var/mob/living/M as mob) - M.druggy = max(M.druggy, 15) - if(isturf(M.loc) && !istype(M.loc, /turf/space)) - if(M.canmove) - if(prob(10)) step(M, pick(cardinal)) - if(prob(7)) M.emote(pick("twitch","drool","moan","giggle")) - ..() - return - -datum/reagent/serotrotium - name = "Serotrotium" - id = "serotrotium" - description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." - color = "#202040" // rgb: 20, 20, 40 - metabolization_rate = 0.25 * REAGENTS_METABOLISM - -datum/reagent/serotrotium/on_mob_life(var/mob/living/M as mob) - if(ishuman(M)) - if(prob(7)) M.emote(pick("twitch","drool","moan","gasp")) - ..() - return - -datum/reagent/oxygen - name = "Oxygen" - id = "oxygen" - description = "A colorless, odorless gas." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - -datum/reagent/copper - name = "Copper" - id = "copper" - description = "A highly ductile metal." - reagent_state = SOLID - color = "#6E3B08" // rgb: 110, 59, 8 - -datum/reagent/nitrogen - name = "Nitrogen" - id = "nitrogen" - description = "A colorless, odorless, tasteless gas." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - -datum/reagent/hydrogen - name = "Hydrogen" - id = "hydrogen" - description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - -datum/reagent/potassium - name = "Potassium" - id = "potassium" - description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water." - reagent_state = SOLID - color = "#A0A0A0" // rgb: 160, 160, 160 - -datum/reagent/mercury - name = "Mercury" - id = "mercury" - description = "A chemical element." - color = "#484848" // rgb: 72, 72, 72 - -datum/reagent/mercury/on_mob_life(var/mob/living/M as mob) - if(M.canmove && istype(M.loc, /turf/space)) - step(M, pick(cardinal)) - if(prob(5)) - M.emote(pick("twitch","drool","moan")) - M.adjustBrainLoss(2) - ..() - return - -datum/reagent/sulfur - name = "Sulfur" - id = "sulfur" - description = "A chemical element." - reagent_state = SOLID - color = "#BF8C00" // rgb: 191, 140, 0 - -datum/reagent/carbon - name = "Carbon" - id = "carbon" - description = "A chemical element." - reagent_state = SOLID - color = "#1C1300" // rgb: 30, 20, 0 - -datum/reagent/carbon/reaction_turf(var/turf/T, var/volume) - src = null - if(!istype(T, /turf/space)) - new /obj/effect/decal/cleanable/dirt(T) - -datum/reagent/chlorine - name = "Chlorine" - id = "chlorine" - description = "A chemical element." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - -datum/reagent/chlorine/on_mob_life(var/mob/living/M as mob) - M.take_organ_damage(1*REM, 0) - ..() - return - -datum/reagent/fluorine - name = "Fluorine" - id = "fluorine" - description = "A highly-reactive chemical element." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - -datum/reagent/fluorine/on_mob_life(var/mob/living/M as mob) - M.adjustToxLoss(1*REM) - ..() - return - -datum/reagent/sodium - name = "Sodium" - id = "sodium" - description = "A chemical element." - reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 - -datum/reagent/phosphorus - name = "Phosphorus" - id = "phosphorus" - description = "A chemical element." - reagent_state = SOLID - color = "#832828" // rgb: 131, 40, 40 - -datum/reagent/lithium - name = "Lithium" - id = "lithium" - description = "A chemical element." - reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 - -datum/reagent/lithium/on_mob_life(var/mob/living/M as mob) - if(M.canmove && istype(M.loc, /turf/space)) - step(M, pick(cardinal)) - if(prob(5)) - M.emote(pick("twitch","drool","moan")) - ..() - return - -datum/reagent/glycerol - name = "Glycerol" - id = "glycerol" - description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." - color = "#808080" // rgb: 128, 128, 128 - -datum/reagent/nitroglycerin - name = "Nitroglycerin" - id = "nitroglycerin" - description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." - color = "#808080" // rgb: 128, 128, 128 - -datum/reagent/radium - name = "Radium" - id = "radium" - description = "Radium is an alkaline earth metal. It is extremely radioactive." - reagent_state = SOLID - color = "#C7C7C7" // rgb: 199,199,199 - -datum/reagent/radium/on_mob_life(var/mob/living/M as mob) - M.apply_effect(2*REM/M.metabolism_efficiency,IRRADIATE,0) - ..() - return - -datum/reagent/radium/reaction_turf(var/turf/T, var/volume) - src = null - if(volume >= 3) - if(!istype(T, /turf/space)) - var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T) - reagentdecal.reagents.add_reagent("uranium", volume) - -datum/reagent/thermite - name = "Thermite" - id = "thermite" - description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls." - reagent_state = SOLID - color = "#673910" // rgb: 103, 57, 16 - -datum/reagent/thermite/reaction_turf(var/turf/T, var/volume) - src = null - if(volume >= 1 && istype(T, /turf/simulated/wall)) - var/turf/simulated/wall/Wall = T - if(istype(Wall, /turf/simulated/wall/r_wall)) - Wall.thermite = Wall.thermite+(volume*2.5) - else - Wall.thermite = Wall.thermite+(volume*10) - Wall.overlays = list() - Wall.overlays += image('icons/effects/effects.dmi',"thermite") - return - -datum/reagent/thermite/on_mob_life(var/mob/living/M as mob) - M.adjustFireLoss(1) - ..() - return - -datum/reagent/sterilizine - name = "Sterilizine" - id = "sterilizine" - description = "Sterilizes wounds in preparation for surgery." - color = "#C8A5DC" // rgb: 200, 165, 220 - -datum/reagent/iron - name = "Iron" - id = "iron" - description = "Pure iron is a metal." - reagent_state = SOLID - color = "#C8A5DC" // rgb: 200, 165, 220 - -datum/reagent/gold - name = "Gold" - id = "gold" - description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." - reagent_state = SOLID - color = "#F7C430" // rgb: 247, 196, 48 - -datum/reagent/silver - name = "Silver" - id = "silver" - description = "A soft, white, lustrous transition metal, it has the highest electrical conductivity of any element and the highest thermal conductivity of any metal." - reagent_state = SOLID - color = "#D0D0D0" // rgb: 208, 208, 208 - -datum/reagent/uranium - name ="Uranium" - id = "uranium" - description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive." - reagent_state = SOLID - color = "#B8B8C0" // rgb: 184, 184, 192 - -datum/reagent/uranium/on_mob_life(var/mob/living/M as mob) - M.apply_effect(1/M.metabolism_efficiency,IRRADIATE,0) - ..() - return - - -datum/reagent/uranium/reaction_turf(var/turf/T, var/volume) - src = null - if(volume >= 3) - if(!istype(T, /turf/space)) - var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T) - reagentdecal.reagents.add_reagent("uranium", volume) - -datum/reagent/aluminium - name = "Aluminium" - id = "aluminium" - description = "A silvery white and ductile member of the boron group of chemical elements." - reagent_state = SOLID - color = "#A8A8A8" // rgb: 168, 168, 168 - -datum/reagent/silicon - name = "Silicon" - id = "silicon" - description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon." - reagent_state = SOLID - color = "#A8A8A8" // rgb: 168, 168, 168 - -datum/reagent/fuel - name = "Welding fuel" - id = "fuel" - description = "Required for welders. Flamable." - color = "#660000" // rgb: 102, 0, 0 - -datum/reagent/fuel/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite! - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - M.adjust_fire_stacks(volume / 10) - return - -datum/reagent/fuel/on_mob_life(var/mob/living/M as mob) - M.adjustToxLoss(1) - ..() - return - -datum/reagent/space_cleaner - name = "Space cleaner" - id = "cleaner" - description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" - color = "#A5F0EE" // rgb: 165, 240, 238 - -datum/reagent/space_cleaner/reaction_obj(var/obj/O, var/volume) - if(istype(O,/obj/effect/decal/cleanable)) - qdel(O) - else - if(O) - O.clean_blood() - -datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume) - if(volume >= 1) - T.clean_blood() - for(var/obj/effect/decal/cleanable/C in T) - qdel(C) - - for(var/mob/living/simple_animal/slime/M in T) - M.adjustToxLoss(rand(5,10)) - if(istype(T, /turf/simulated/floor)) - var/turf/simulated/floor/F = T - if(volume >= 1) - F.dirt = 0 - -datum/reagent/space_cleaner/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(H.lip_style) - H.lip_style = null - H.update_body() - if(C.r_hand) - C.r_hand.clean_blood() - if(C.l_hand) - C.l_hand.clean_blood() - if(C.wear_mask) - if(C.wear_mask.clean_blood()) - C.update_inv_wear_mask(0) - if(ishuman(M)) - var/mob/living/carbon/human/H = C - if(H.head) - if(H.head.clean_blood()) - H.update_inv_head(0) - if(H.wear_suit) - if(H.wear_suit.clean_blood()) - H.update_inv_wear_suit(0) - else if(H.w_uniform) - if(H.w_uniform.clean_blood()) - H.update_inv_w_uniform(0) - if(H.shoes) - if(H.shoes.clean_blood()) - H.update_inv_shoes(0) - M.clean_blood() - -datum/reagent/cryptobiolin - name = "Cryptobiolin" - id = "cryptobiolin" - description = "Cryptobiolin causes confusion and dizzyness." - color = "#C8A5DC" // rgb: 200, 165, 220 - metabolization_rate = 1.5 * REAGENTS_METABOLISM - -datum/reagent/cryptobiolin/on_mob_life(var/mob/living/M as mob) - M.Dizzy(1) - if(!M.confused) - M.confused = 1 - M.confused = max(M.confused, 20) - ..() - return - -datum/reagent/impedrezene - name = "Impedrezene" - id = "impedrezene" - description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." - color = "#C8A5DC" // rgb: 200, 165, 220 - -datum/reagent/impedrezene/on_mob_life(var/mob/living/M as mob) - M.jitteriness = max(M.jitteriness-5,0) - if(prob(80)) M.adjustBrainLoss(1*REM) - if(prob(50)) M.drowsyness = max(M.drowsyness, 3) - if(prob(10)) M.emote("drool") - ..() - return - -datum/reagent/nanites - name = "Nanomachines" - id = "nanomachines" - description = "Microscopic construction robots." - color = "#535E66" // rgb: 83, 94, 102 - -datum/reagent/nanites/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - src = null - if( (prob(10) && method==TOUCH) || method==INGEST) - M.ForceContractDisease(new /datum/disease/transformation/robot(0)) - -datum/reagent/xenomicrobes - name = "Xenomicrobes" - id = "xenomicrobes" - description = "Microbes with an entirely alien cellular structure." - color = "#535E66" // rgb: 83, 94, 102 - -datum/reagent/xenomicrobes/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - src = null - if( (prob(10) && method==TOUCH) || method==INGEST) - M.ContractDisease(new /datum/disease/transformation/xeno(0)) - -datum/reagent/fluorosurfactant//foam precursor - name = "Fluorosurfactant" - id = "fluorosurfactant" - description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." - color = "#9E6B38" // rgb: 158, 107, 56 - -datum/reagent/foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. - name = "Foaming agent" - id = "foaming_agent" - description = "A agent that yields metallic foam when mixed with light metal and a strong acid." - reagent_state = SOLID - color = "#664B63" // rgb: 102, 75, 99 - -datum/reagent/ammonia - name = "Ammonia" - id = "ammonia" - description = "A caustic substance commonly used in fertilizer or household cleaners." - reagent_state = GAS - color = "#404030" // rgb: 64, 64, 48 - -datum/reagent/diethylamine - name = "Diethylamine" - id = "diethylamine" - description = "A secondary amine, mildly corrosive." - color = "#604030" // rgb: 96, 64, 48 - - - -/////////////////////////Coloured Crayon Powder//////////////////////////// -//For colouring in /proc/mix_color_from_reagents - - -datum/reagent/crayonpowder - name = "Crayon Powder" - id = "crayon powder" - var/colorname = "none" - description = "A powder made by grinding down crayons, good for colouring chemical reagents." - reagent_state = SOLID - color = "#FFFFFF" // rgb: 207, 54, 0 - -datum/reagent/crayonpowder/New() - description = "\an [colorname] powder made by grinding down crayons, good for colouring chemical reagents." - - -datum/reagent/crayonpowder/red - name = "Red Crayon Powder" - id = "redcrayonpowder" - colorname = "red" - -datum/reagent/crayonpowder/orange - name = "Orange Crayon Powder" - id = "orangecrayonpowder" - colorname = "orange" - color = "#FF9300" // orange - -datum/reagent/crayonpowder/yellow - name = "Yellow Crayon Powder" - id = "yellowcrayonpowder" - colorname = "yellow" - color = "#FFF200" // yellow - -datum/reagent/crayonpowder/green - name = "Green Crayon Powder" - id = "greencrayonpowder" - colorname = "green" - color = "#A8E61D" // green - -datum/reagent/crayonpowder/blue - name = "Blue Crayon Powder" - id = "bluecrayonpowder" - colorname = "blue" - color = "#00B7EF" // blue - -datum/reagent/crayonpowder/purple - name = "Purple Crayon Powder" - id = "purplecrayonpowder" - colorname = "purple" - color = "#DA00FF" // purple - -datum/reagent/crayonpowder/invisible - name = "Invisible Crayon Powder" - id = "invisiblecrayonpowder" - colorname = "invisible" - color = "#FFFFFF00" // white + no alpha - - - - -//////////////////////////////////Hydroponics stuff/////////////////////////////// - -datum/reagent/plantnutriment - name = "Generic nutriment" - id = "plantnutriment" - description = "Some kind of nutriment. You can't really tell what it is. You should probably report it, along with how you obtained it." - color = "#000000" // RBG: 0, 0, 0 - var/tox_prob = 0 - -datum/reagent/plantnutriment/on_mob_life(var/mob/living/M as mob) - if(prob(tox_prob)) - M.adjustToxLoss(1*REM) - ..() - return - -datum/reagent/plantnutriment/eznutriment - name = "E-Z-Nutrient" - id = "eznutriment" - description = "Cheap and extremely common type of plant nutriment." - color = "#376400" // RBG: 50, 100, 0 - tox_prob = 10 - -datum/reagent/plantnutriment/left4zednutriment - name = "Left 4 Zed" - id = "left4zednutriment" - description = "Unstable nutriment that makes plants mutate more often than usual." - color = "#1A1E4D" // RBG: 26, 30, 77 - tox_prob = 25 - -datum/reagent/plantnutriment/robustharvestnutriment - name = "Robust Harvest" - id = "robustharvestnutriment" - description = "Very potent nutriment that prevents plants from mutating." - color = "#9D9D00" // RBG: 157, 157, 0 - tox_prob = 15 - - - -// Undefine the alias for REAGENTS_EFFECT_MULTIPLER -#undef REM diff --git a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm index 732d6c39b48..cf323dd09e8 100644 --- a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm +++ b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm @@ -151,7 +151,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat, /obj/item/weapon/reagent_containers/food/snacks/soup, /obj/item/weapon/reagent_containers/food/snacks/grown, - /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom + /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, ) blocked |= typesof(/obj/item/weapon/reagent_containers/food/snacks/customizable) @@ -185,8 +185,9 @@ /datum/chemical_reaction/slimebork2/on_reaction(var/datum/reagents/holder) feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/list/blocked = list(/obj/item/weapon/reagent_containers/food/drinks) - var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/drinks) - /obj/item/weapon/reagent_containers/food/drinks + var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/drinks) - blocked // BORK BORK BORK playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) diff --git a/code/modules/reagents/grenade_launcher.dm b/code/modules/reagents/grenade_launcher.dm deleted file mode 100644 index f3bd6bbea87..00000000000 --- a/code/modules/reagents/grenade_launcher.dm +++ /dev/null @@ -1,61 +0,0 @@ -/obj/item/weapon/gun/grenadelauncher - name = "grenade launcher" - desc = "a terrible, terrible thing. it's really awful!" - icon = 'icons/obj/guns/projectile.dmi' - icon_state = "riotgun" - item_state = "riotgun" - w_class = 4.0 - throw_speed = 2 - throw_range = 7 - force = 5.0 - var/list/grenades = new/list() - var/max_grenades = 3 - m_amt = 2000 - -/obj/item/weapon/gun/grenadelauncher/examine(mob/user) - ..() - user << "[grenades] / [max_grenades] grenades loaded." - -/obj/item/weapon/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params) - - if((istype(I, /obj/item/weapon/grenade))) - if(grenades.len < max_grenades) - user.drop_item() - I.loc = src - grenades += I - user << "You put the grenade in the grenade launcher." - user << "[grenades.len] / [max_grenades] Grenades." - else - usr << "The grenade launcher cannot hold more grenades!" - -/obj/item/weapon/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) - - if (istype(target, /obj/item/weapon/storage/backpack )) - return - - else if (locate (/obj/structure/table, src.loc)) - return - - else if(target == user) - return - - if(grenades.len) - spawn(0) fire_grenade(target,user) - else - usr << "The grenade launcher is empty!" - -/obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("[] fired a grenade!", user), 1) - user << "You fire the grenade launcher!" - var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! - grenades -= F - F.loc = user.loc - F.throw_at(target, 30, 2) - message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") - log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") - F.active = 1 - F.icon_state = initial(icon_state) + "_active" - playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - spawn(15) - F.prime() diff --git a/code/modules/reagents/syringe_gun.dm b/code/modules/reagents/syringe_gun.dm deleted file mode 100644 index 5c6327abcfa..00000000000 --- a/code/modules/reagents/syringe_gun.dm +++ /dev/null @@ -1,77 +0,0 @@ -/obj/item/weapon/gun/syringe - name = "syringe gun" - desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance." - icon_state = "syringegun" - item_state = "syringegun" - w_class = 3 - throw_speed = 3 - throw_range = 7 - force = 4 - m_amt = 2000 - clumsy_check = 0 - fire_sound = 'sound/items/syringeproj.ogg' - var/list/syringes = list() - var/max_syringes = 1 - -/obj/item/weapon/gun/syringe/New() - ..() - chambered = new /obj/item/ammo_casing/syringegun(src) - -/obj/item/weapon/gun/syringe/proc/newshot() - if(!syringes.len) return - - var/obj/item/weapon/reagent_containers/syringe/S = syringes[1] - - if(!S) return - - chambered.BB = new /obj/item/projectile/bullet/dart/syringe(src) - S.reagents.trans_to(chambered.BB, S.reagents.total_volume) - chambered.BB.name = S.name - syringes.Remove(S) - - qdel(S) - return - -/obj/item/weapon/gun/syringe/process_chamber() - return - -/obj/item/weapon/gun/syringe/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, params) - newshot() - ..() - -/obj/item/weapon/gun/syringe/examine(mob/user) - ..() - user << "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining." - -/obj/item/weapon/gun/syringe/attack_self(mob/living/user as mob) - if(!syringes.len) - user << "[src] is empty." - return 0 - - var/obj/item/weapon/reagent_containers/syringe/S = syringes[syringes.len] - - if(!S) return 0 - S.loc = user.loc - - syringes.Remove(S) - user << "You unload [S] from \the [src]." - - return 1 - -/obj/item/weapon/gun/syringe/attackby(var/obj/item/A as obj, mob/user as mob, params, var/show_msg = 1) - if(istype(A, /obj/item/weapon/reagent_containers/syringe)) - if(syringes.len < max_syringes) - user.drop_item() - user << "You load [A] into \the [src]." - syringes.Add(A) - A.loc = src - return 1 - else - usr << "[src] cannot hold more syringes!" - return 0 - -/obj/item/weapon/gun/syringe/rapidsyringe - name = "rapid syringe gun" - desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes." - icon_state = "rapidsyringegun" - max_syringes = 6 diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index b8e4560a26a..1827184ab1e 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -191,7 +191,7 @@ id = "kitchen_knife" build_type = AUTOLATHE materials = list("$metal" = 12000) - build_path = /obj/item/weapon/kitchenknife + build_path = /obj/item/weapon/kitchen/knife category = list("initial","Misc") /datum/design/scalpel diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 26e29741279..8f14875b616 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -608,7 +608,7 @@ ///////////////////////////////////////// /datum/design/borg_upgrade_reset - name = "Cyborg Upgrade (Reset Module)" + name = "Cyborg Upgrade (Module Reset Board)" id = "borg_upgrade_reset" build_type = MECHFAB build_path = /obj/item/borg/upgrade/reset @@ -617,7 +617,7 @@ category = list("Cyborg Upgrade Modules") /datum/design/borg_upgrade_rename - name = "Cyborg Upgrade (Rename Module)" + name = "Cyborg Upgrade (Rename Board)" id = "borg_upgrade_rename" build_type = MECHFAB build_path = /obj/item/borg/upgrade/rename @@ -626,7 +626,7 @@ category = list("Cyborg Upgrade Modules") /datum/design/borg_upgrade_restart - name = "Cyborg Upgrade (Restart Module)" + name = "Cyborg Upgrade (Emergency Reboot Board)" id = "borg_upgrade_restart" build_type = MECHFAB build_path = /obj/item/borg/upgrade/restart diff --git a/code/modules/surgery/generic_steps.dm b/code/modules/surgery/generic_steps.dm index b31ec1afe24..a4ea6e51ba2 100644 --- a/code/modules/surgery/generic_steps.dm +++ b/code/modules/surgery/generic_steps.dm @@ -1,7 +1,7 @@ //make incision /datum/surgery_step/incise - implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchenknife = 65, /obj/item/weapon/shard = 45) + implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchen/knife = 65, /obj/item/weapon/shard = 45) time = 24 /datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -58,7 +58,7 @@ //saw bone /datum/surgery_step/saw - implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchenknife/butcher = 25) + implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25) time = 64 /datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index 88f2cd2f4d1..532e90e1e9e 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -9,7 +9,7 @@ //cut fat /datum/surgery_step/cut_fat - implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchenknife/butcher = 25) + implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25) time = 64 /datum/surgery_step/cut_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index e0a4dc96c76..52695210d1c 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -6,7 +6,7 @@ //reshape_face /datum/surgery_step/reshape_face - implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchenknife = 50, /obj/item/weapon/wirecutters = 35) + implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchen/knife = 50, /obj/item/weapon/wirecutters = 35) time = 64 /datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/config/admins.txt b/config/admins.txt index 7ee8062dcb0..81c120f06e7 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -8,6 +8,7 @@ # NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # ############################################################################################### MrStonedOne = Host +microscopics = Game Master Gun Hog = Game Master razharas = Game Master Niknakflak = Game Master diff --git a/config/game_options.txt b/config/game_options.txt index ae06f1b3675..cc2a9c13d1d 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -100,20 +100,46 @@ PROBABILITY SANDBOX 0 ## Toggles for continuous modes. ## Modes that aren't continuous will end the instant all antagonists are dead. -## Unlisted modes are not currently supported for noncontinous play +CONTINUOUS TRAITOR +CONTINUOUS TRAITORCHAN +CONTINUOUS DOUBLE_AGENTS +#CONTINUOUS NUCLEAR #CONTINUOUS REVOLUTION +#CONTINUOUS SHADOWLING +#CONTINUOUS GANG +CONTINUOUS CULT +CONTINUOUS CHANGELING CONTINUOUS WIZARD CONTINUOUS MALFUNCTION CONTINUOUS BLOB +#CONTINUOUS RAGINMAGES +#CONTINUOUS MONKEY + +##Note: do not toggle continuous off for these modes, as they have no antagonists and would thus end immediately! + +CONTINUOUS METEOR +CONTINUOUS EXTENDED + ## Toggles for allowing midround antagonists (aka mulligan antagonists). ## In modes that are continuous, if all antagonists should die then a new set of antagonists will be created. -## Only the listed modes are currently supported for this system +MIDROUND_ANTAG TRAITOR +MIDROUND_ANTAG TRAITORCHAN +MIDROUND_ANTAG DOUBLE_AGENTS +#MIDROUND_ANTAG NUCLEAR +#MIDROUND_ANTAG REVOLUTION +#MIDROUND_ANTAG SHADOWLING +#MIDROUND_ANTAG GANG +MIDROUND_ANTAG CULT +MIDROUND_ANTAG CHANGELING MIDROUND_ANTAG WIZARD MIDROUND_ANTAG MALFUNCTION MIDROUND_ANTAG BLOB +#MIDROUND_ANTAG RAGINMAGES +#MIDROUND_ANTAG MONKEY + ## The amount of time it takes for the emergency shuttle to be called, from round start. SHUTTLE_REFUEL_DELAY 12000 diff --git a/config/names/mime.txt b/config/names/mime.txt new file mode 100644 index 00000000000..14845a89b40 --- /dev/null +++ b/config/names/mime.txt @@ -0,0 +1,24 @@ +Mr. Beret +Mime +Mr. Mime +Mr. Mute +Silence +Silencio +Quiet +Silent Sorrow +Silent Knight +Silent Night +Untouchable +Unspeakable +Mute +Marcel Mime +Marcel +Pantomime +Omerta +Lemon Mime +Invisible Man +Transparency +Quiet Riot +Silent Majority +Wall Runner +Oui Oui \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 1b28e0f192c..8ba799e8ebd 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,64 @@ -->
+

29 April 2015

+

AndroidSFV updated:

+
    +
  • Dehydrated carp now are friendly to both the imprinter of the plushie as well as any coded-in allies (I.E. Nuke Ops team), and unfriendly to carp of other origin othan than yourself or your coded-in allies. Dehydrated carp that are not imprinted will still have the same behavior as regular carp.
  • +
+

AnturK updated:

+
    +
  • Advanced cameras now have all functionality of the abductor consoles.
  • +
  • Pinpoint teleportation takes 8 seconds and spawns a flashy silhouette at the target location. Can be used as distraction since it appears even if teleporter is empty.
  • +
  • Abductors are now immune to viruses.
  • +
  • Dissection surgery ignores clothes.
  • +
  • Non-abductors can escape the ship by fiddling with consoles enough.
  • +
  • Three new negative glands.
  • +
  • Bloody glands spray blood everywhere and injure the host.
  • +
  • Bodysnatch glands turn the host into a cocoon that hatches doppelgangers.
  • +
  • Plasma glands cause the host to explode into a cloud of plasma.
  • +
+

GoonOnMoon updated:

+
    +
  • Added a new assault rifle to the game for use by Nanotrasen fighting forces in special events. Also happens to be available in the Liberation Station vending machine and the summon guns spell usable by the wizard and badminnery.
  • +
+

Iamgoofball updated:

+
    +
  • Acid blob has been removed.
  • +
  • Charcoal and Silver Sulf are more powerful now.
  • +
  • Styptic power and Silver Sulf metabolize at the default rate.
  • +
+

Ikarrus updated:

+
    +
  • Spraycans and crayons can now draw Poseur Tags, aka Fake Gang Tags, as grafiti.
  • +
  • Gangs Capture goal reduced to 60%
  • +
  • Influence income changed to provide weaker gangs a bigger boost, while slowing down stronger gangs to promote opportunity for comebacks.
  • +
  • Gangs only earn influence on territories they have held on to since the previous Status Report (the income calculation every 5 minutes). This places more significance on defending your existing territory.
  • +
  • You must be in the territory physically to tag it now. So no more tagging everything from maint.
  • +
  • Gang income delay reduced to 3 minutes intervals.
  • +
  • Gang Capture goal reduced to 50%
  • +
  • Gang spraycan use increased to 20
  • +
  • Gang Boss icon is now a red [G] icon to make it stand out better from regular gang icons
  • +
+

JJRcop updated:

+
    +
  • TED's kill duration has been halved.
  • +
  • Escaping from the TED's field no longer kills you.
  • +
+

RemieRichards updated:

+
    +
  • Adds Easels and canvases for custom drawings.
  • +
  • Place a canvas on an easel and draw on it with crayons, clean one pixel with a rag or soap and activate it in-hand to erase the whole canvas.
  • +
  • Ports VG's Ventcrawling overhaul!
  • +
  • Crawling through vents is no longer instant, you now have to move and navigate manually
  • +
  • While inside pipes and other atmos machinery, you now see pipe vision
  • +
+

phil235 updated:

+
    +
  • Podplants are no longer unharvestable.
  • +
  • Choosing your clown, mime, cyborg and AI name as well as religion and deity is now done in the preferences window. As a chaplain , your bible's icon is now chosen by clicking the bible.
  • +
+

25 April 2015

Boggart updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index a14052090dd..813ddd15b61 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2325,3 +2325,61 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. machines. - tweak: You can no longer overdose on nicotine but you can get addicted (very mild effects). +2015-04-29: + AndroidSFV: + - tweak: Dehydrated carp now are friendly to both the imprinter of the plushie as + well as any coded-in allies (I.E. Nuke Ops team), and unfriendly to carp of + other origin othan than yourself or your coded-in allies. Dehydrated carp that + are not imprinted will still have the same behavior as regular carp. + AnturK: + - rscadd: Advanced cameras now have all functionality of the abductor consoles. + - tweak: Pinpoint teleportation takes 8 seconds and spawns a flashy silhouette at + the target location. Can be used as distraction since it appears even if teleporter + is empty. + - bugfix: Abductors are now immune to viruses. + - bugfix: Dissection surgery ignores clothes. + - bugfix: Non-abductors can escape the ship by fiddling with consoles enough. + - rscadd: Three new negative glands. + - rscadd: Bloody glands spray blood everywhere and injure the host. + - rscadd: Bodysnatch glands turn the host into a cocoon that hatches doppelgangers. + - rscadd: Plasma glands cause the host to explode into a cloud of plasma. + GoonOnMoon: + - rscadd: Added a new assault rifle to the game for use by Nanotrasen fighting forces + in special events. Also happens to be available in the Liberation Station vending + machine and the summon guns spell usable by the wizard and badminnery. + Iamgoofball: + - rscdel: Acid blob has been removed. + - tweak: Charcoal and Silver Sulf are more powerful now. + - tweak: Styptic power and Silver Sulf metabolize at the default rate. + Ikarrus: + - rscadd: Spraycans and crayons can now draw Poseur Tags, aka Fake Gang Tags, as + grafiti. + - tweak: Gangs Capture goal reduced to 60% + - tweak: Influence income changed to provide weaker gangs a bigger boost, while + slowing down stronger gangs to promote opportunity for comebacks. + - tweak: Gangs only earn influence on territories they have held on to since the + previous Status Report (the income calculation every 5 minutes). This places + more significance on defending your existing territory. + - bugfix: You must be in the territory physically to tag it now. So no more tagging + everything from maint. + - tweak: Gang income delay reduced to 3 minutes intervals. + - tweak: Gang Capture goal reduced to 50% + - tweak: Gang spraycan use increased to 20 + - tweak: Gang Boss icon is now a red [G] icon to make it stand out better from regular + gang icons + JJRcop: + - tweak: TED's kill duration has been halved. + - tweak: Escaping from the TED's field no longer kills you. + RemieRichards: + - rscadd: Adds Easels and canvases for custom drawings. + - imageadd: Place a canvas on an easel and draw on it with crayons, clean one pixel + with a rag or soap and activate it in-hand to erase the whole canvas. + - rscadd: Ports VG's Ventcrawling overhaul! + - tweak: Crawling through vents is no longer instant, you now have to move and navigate + manually + - rscadd: While inside pipes and other atmos machinery, you now see pipe vision + phil235: + - bugfix: Podplants are no longer unharvestable. + - tweak: Choosing your clown, mime, cyborg and AI name as well as religion and deity + is now done in the preferences window. As a chaplain , your bible's icon is + now chosen by clicking the bible. diff --git a/html/changelogs/Fayrik-TheNanoing.yml b/html/changelogs/Fayrik-TheNanoing.yml new file mode 100644 index 00000000000..556f54168d2 --- /dev/null +++ b/html/changelogs/Fayrik-TheNanoing.yml @@ -0,0 +1,6 @@ +author: Fayrik + +delete-after: True + +changes: +- rscadd: "Ported NanoUI to most atmospherics equipment." \ No newline at end of file diff --git a/html/changelogs/Ikarrus-gang5.yml b/html/changelogs/Ikarrus-gang5.yml deleted file mode 100644 index 9716bc9d8a5..00000000000 --- a/html/changelogs/Ikarrus-gang5.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: Ikarrus - -delete-after: True - -changes: - - rscadd: "Spraycans and crayons can now draw Poseur Tags, aka Fake Gang Tags, as grafiti." - - tweak: "Gangs Capture goal reduced to 60%" - - tweak: "Influence income changed to provide weaker gangs a bigger boost, while slowing down stronger gangs to promote opportunity for comebacks." - - tweak: "Gangs only earn influence on territories they have held on to since the previous Status Report (the income calculation every 5 minutes). This places more significance on defending your existing territory." - - bugfix: "You must be in the territory physically to tag it now. So no more tagging everything from maint." \ No newline at end of file diff --git a/html/changelogs/RemieRichards-PR-9090.yml b/html/changelogs/RemieRichards-PR-9090.yml deleted file mode 100644 index 7fc9dbe8c21..00000000000 --- a/html/changelogs/RemieRichards-PR-9090.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: RemieRichards -delete-after: True -changes: - - rscadd: "Ports VG's Ventcrawling overhaul!" - - tweak: "Crawling through vents is no longer instant, you now have to move and navigate manually" - - rscadd: "While inside pipes and other atmos machinery, you now see pipe vision" diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 0997a3676f5..0518872ccf8 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 84ed7d9fc07..a8e2032719a 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi index 25337a3ae20..062adfa003d 100644 Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi index 470c1756985..09a3bc50d40 100644 Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ diff --git a/icons/obj/artstuff.dmi b/icons/obj/artstuff.dmi new file mode 100644 index 00000000000..a11d1a81d0e Binary files /dev/null and b/icons/obj/artstuff.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 39b46c7806e..c613bee4949 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/nano/css/shared.css b/nano/css/shared.css index 8f7110ee152..a2fa3507d55 100644 --- a/nano/css/shared.css +++ b/nano/css/shared.css @@ -29,9 +29,18 @@ a, a:link, a:visited, a:active, .link, .linkOn, .linkOff, .selected, .disabled .link { - float: left; - min-width: 40px; - height: 16px; + float: left; + min-width: 15px; + height: 16px; + text-align: center; + color: #ffffff; + text-decoration: none; + background: #40628a; + border: 1px solid #161616; + padding: 0px 4px 4px 4px; + margin: 0 2px 2px 0; + cursor: default; + white-space: nowrap; } a:hover, .linkActive:hover @@ -218,6 +227,10 @@ h4 font-weight: bold; } +.redButton { + background: #ea0000; +} + .highlight { color: #8BA5C4; @@ -228,6 +241,15 @@ h4 color: #272727; } +.noticePlaceholder { + position: relative; + font-size: 12px; + font-style: italic; + font-weight: bold; + padding: 3px 4px 3px 4px; + margin: 4px 0 4px 0; +} + .notice { background: url(uiNoticeBackground.jpg) 0 0 repeat; diff --git a/nano/templates/air_alarm.tmpl b/nano/templates/air_alarm.tmpl new file mode 100644 index 00000000000..f3a64d9efd8 --- /dev/null +++ b/nano/templates/air_alarm.tmpl @@ -0,0 +1,199 @@ + +
    + {{if siliconUser}} +
    + Interface Lock: +
    +
    + {{:~link('Engaged', 'locked', {'toggleaccess' : 1}, locked ? 'selected' : null)}}{{:~link('Disengaged', 'unlocked', {'toggleaccess' : 1}, (locked ? null : 'selected'))}} +
    + {{else}} + {{if locked}} + Swipe an ID card to unlock this interface. + {{else}} + Swipe an ID card to lock this interface. + {{/if}} + {{/if}} +
    +
    +

    Air Status

    +{{if environment_data}} + {{for environment_data}} + {{:name}} + {{if danger_level == 2}} + + {{else danger_level == 1}} + + {{else}} + + {{/if}} + {{:~round(value*100)/100}} + {{:unit}}
    + {{/for}} + Local Status: {{if danger_level == 2}} + DANGER: Internals Required + {{else danger_level == 1}} + Caution + {{else}} + Optimal + {{/if}} +
    + Area Status: {{if atmos_alarm}}Atmosphere alert in area{{else fire_alarm}}Fire alarm in area{{else}}No alerts{{/if}} +{{else}} + Warning: Cannot obtain air sample for analysis. +{{/if}} +{{if dangerous}} +
    NOTICE: Safety measures nonfunctional. Device may exhibit abnormal behavior. +{{/if}} +
    +{{if (!locked || siliconUser)}} + {{if screen != 1}} +
    {{:~link('Main Menu', null, { 'screen' : 1})}}
    + {{/if}} + {{if screen == 1}} +
    + {{if atmos_alarm}} + {{:~link('Reset - Area Atmospheric Alarm', null, { 'atmos_reset' : 1})}} + {{else}} + {{:~link('Activate - Area Atmospheric Alarm', null, { 'atmos_alarm' : 1})}} + {{/if}} +
    +
    +
    + {{:~link('Scrubbers Control', null, { 'screen' : 3})}} +
    +
    + {{:~link('Vents Control', null, { 'screen' : 2})}} +
    +
    + {{:~link('Set Environmental Mode', null, { 'screen' : 4})}} +
    +
    + {{:~link('Sensor Settings', null, { 'screen' : 5})}} +
    +
    + {{if mode==3}} + {{:~link('PANIC SIPHON ACTIVE - Turn siphoning off', null, { 'mode' : 1}, null, 'redButton')}} + {{else}} + {{:~link('ACTIVATE PANIC SIPHON IN AREA', null, { 'mode' : 3}, null, 'yellowButton')}} + {{/if}} + {{else screen == 2}} + {{for vents}} +
    {{:long_name}}
    +
    +
    + Operating: +
    +
    + {{:~link(power ? 'On' : 'Off', null, { 'id_tag' : id_tag, 'command' : 'power', 'val' : power ? 0 : 1}, null, power ? null : 'redButton')}} +
    +
    +
    +
    + Mode: +
    +
    + {{:direction == "siphon" ? 'Siphoning' : 'Pressurizing'}} +
    +
    +
    +
    + Pressure Checks: +
    +
    + {{:~link('External', null, { 'id_tag' : id_tag, 'command' : 'excheck', 'val' : checks}, null, excheck ? 'selected' : null)}} + {{:~link('Internal', null, { 'id_tag' : id_tag, 'command' : 'incheck', 'val' : checks}, null, incheck ? 'selected' : null)}} +
    +
    +
    +
    + External Pressure Bound: +
    +
    + {{:~link(~round(external*100)/100, null, { 'id_tag' : id_tag, 'command' : 'set_external_pressure'})}} + {{:~link('Reset', null, { 'id_tag' : id_tag, 'command' : 'reset_external_pressure'})}} +
    +
    +
    + {{/for}} + {{if !vents.length}} + No vents connected. + {{/if}} + {{else screen == 3}} + {{for scrubbers}} +
    {{:long_name}}
    +
    +
    + Operating: +
    +
    + {{:~link(power ? 'On' : 'Off', null, { 'id_tag' : id_tag, 'command' : 'power', 'val' : power ? 0 : 1}, null, power ? null : 'redButton')}} +
    +
    +
    +
    + Mode: +
    +
    + {{:~link(scrubbing ? 'Scrubbing' : 'Siphoning', null, { 'id_tag' : id_tag, 'command' : 'scrubbing', 'val' : scrubbing ? 0 : 1}, null, scrubbing ? null : 'redButton')}} +
    +
    +
    +
    + Filters: +
    +
    + {{:~link("Carbon Dioxide", null, { 'id_tag' : id_tag, 'command' : "co2_scrub", 'val' : filter_co2 ? 0 : 1}, null, filter_co2 ? 'selected' : null)}}
    + {{:~link("Plasma", null, { 'id_tag' : id_tag, 'command' : "tox_scrub", 'val' : filter_toxins ? 0 : 1}, null, filter_toxins ? 'selected' : null)}}
    + {{:~link("Nitrous Oxide", null, { 'id_tag' : id_tag, 'command' : "n2o_scrub", 'val' : filter_n2o ? 0 : 1}, null, filter_n2o ? 'selected' : null)}}
    +
    +
    +
    + {{/for}} + {{if !scrubbers.length}} + No scrubbers connected. + {{/if}} + {{else screen == 4}} +

    Environmental Modes

    + {{for modes}} +
    + {{:~link(name, null, { 'mode' : mode }, null, selected ? (danger ? 'redButton' : 'selected') : (danger ? 'bad' : null))}} +
    + {{/for}} + {{else screen == 5}} +

    Alarm Threshold

    + Partial pressure for gases. + + + + + {{for thresholds}} + + + {{for settings}} + + {{/for}} + + {{/for}} +
    min2min1max1max2
    {{:name}} + {{:~link(selected >= 0 ? ~round(selected*100)/100 : "Off", null, { 'command' : 'set_threshold', 'env' : env, 'var' : val })}} +
    + {{/if}} +{{/if}} \ No newline at end of file diff --git a/nano/templates/atmos_filter.tmpl b/nano/templates/atmos_filter.tmpl new file mode 100644 index 00000000000..24ee5c8c75f --- /dev/null +++ b/nano/templates/atmos_filter.tmpl @@ -0,0 +1,51 @@ +
    +
    + Power: +
    +
    + {{:~link(on? 'On' : 'Off', null, {'power' : 1})}} +
    +
    +
    +
    + Output pressure: +
    +
    +
    + {{:~link('MAX', null, {'set_press' : 'max'}, null)}} + {{:~link('SET', null, {'set_press' : 'set'}, null)}} +
     {{:(pressure_set/100)}} kPa 
    +
    +
    +
    +

    Filter Type

    +
    +
    + {{:~link('Plasma', null, {'filterset' : 0}, (filter_type == 0)? 'selected' : null)}} +
    +
    +
    +
    + {{:~link('Oxygen', null, {'filterset' : 1}, (filter_type == 1)? 'selected' : null)}} +
    +
    +
    +
    + {{:~link('Nitrogen', null, {'filterset' : 2}, (filter_type == 2)? 'selected' : null)}} +
    +
    +
    +
    + {{:~link('Carbon Dioxide', null, {'filterset' : 3}, (filter_type == 3)? 'selected' : null)}} +
    +
    +
    +
    + {{:~link('Nitrous Oxide', null, {'filterset' : 4}, (filter_type == 4)? 'selected' : null)}} +
    +
    +
    +
    + {{:~link('Nothing', null, {'filterset' : -1}, (filter_type == -1)? 'selected' : null)}} +
    +
    \ No newline at end of file diff --git a/nano/templates/atmos_gas_pump.tmpl b/nano/templates/atmos_gas_pump.tmpl new file mode 100644 index 00000000000..833bc7046cb --- /dev/null +++ b/nano/templates/atmos_gas_pump.tmpl @@ -0,0 +1,36 @@ +
    +
    + Power: +
    +
    + {{:~link(on? 'On' : 'Off', null, {'power' : 1})}} +
    +
    + +{{if max_rate}} +
    +
    + Transfer rate: +
    +
    +
    + {{:~link('MAX', null, {'set_transfer_rate' : 'max'}, null)}} + {{:~link('SET', null, {'set_transfer_rate' : 'set'}, null)}} +
     {{:(transfer_rate/100)}} L/s 
    +
    +
    +
    +{{else}} +
    +
    + Output pressure: +
    +
    +
    + {{:~link('MAX', null, {'set_press' : 'max'}, null)}} + {{:~link('SET', null, {'set_press' : 'set'}, null)}} +
     {{:(pressure_set/100)}} kPa 
    +
    +
    +
    +{{/if}} \ No newline at end of file diff --git a/nano/templates/atmos_mixer.tmpl b/nano/templates/atmos_mixer.tmpl new file mode 100644 index 00000000000..efc98565b90 --- /dev/null +++ b/nano/templates/atmos_mixer.tmpl @@ -0,0 +1,51 @@ +
    +
    + Power: +
    +
    + {{:~link(on? 'On' : 'Off', null, {'power' : 1})}} +
    +
    + +
    +
    + Output pressure: +
    +
    +
    + {{:~link('MAX', null, {'set_press' : 'max'}, null)}} + {{:~link('SET', null, {'set_press' : 'set'}, null)}} +
     {{:(pressure_set/100)}} kPa 
    +
    +
    +
    + +
    +
    + Node 1 Concentration: +
    +
    +
    + {{:~link('-', null, {'node1_c' : '-0.1'}, null)}} + {{:~link('-', null, {'node1_c' : '-0.01'}, null)}} +
     {{:node1_concentration}} % 
    + {{:~link('+', null, {'node1_c' : '0.01'}, null)}} + {{:~link('+', null, {'node1_c' : '0.1'}, null)}} +
    +
    +
    + +
    +
    + Node 2 Concentration: +
    +
    +
    + {{:~link('-', null, {'node2_c' : '-0.1'}, null)}} + {{:~link('-', null, {'node2_c' : '-0.01'}, null)}} +
     {{:node2_concentration}} % 
    + {{:~link('+', null, {'node2_c' : '0.01'}, null)}} + {{:~link('+', null, {'node2_c' : '0.1'}, null)}} +
    +
    +
    \ No newline at end of file diff --git a/nano/templates/canister.tmpl b/nano/templates/canister.tmpl new file mode 100644 index 00000000000..1f67d608e5b --- /dev/null +++ b/nano/templates/canister.tmpl @@ -0,0 +1,83 @@ +

    Tank Status

    +
    +
    + Tank Label: +
    +
    +
    {{:name}}
    {{:~link('Relabel', 'pencil', {'relabel' : 1}, canLabel ? null : 'disabled')}} +
    +
    + +
    +
    + Tank Pressure: +
    +
    + {{:tankPressure}} kPa +
    +
    + +
    +
    + Port Status: +
    +
    + {{:portConnected ? 'Connected' : 'Disconnected'}} +
    +
    + +

    Holding Tank Status

    +{{if hasHoldingTank}} +
    +
    + Tank Label: +
    +
    +
    {{:holdingTank.name}}
    {{:~link('Eject', 'eject', {'remove_tank' : 1})}} +
    +
    + +
    +
    + Tank Pressure: +
    +
    + {{:holdingTank.tankPressure}} kPa +
    +
    +{{else}} +
    No holding tank inserted.
    +
     
    +{{/if}} + + +

    Release Valve Status

    +
    +
    + Release Pressure: +
    +
    + {{:~displayBar(releasePressure, minReleasePressure, maxReleasePressure)}} +
    + {{:~link('-', null, {'pressure_adj' : -1000}, (releasePressure > minReleasePressure) ? null : 'disabled')}} + {{:~link('-', null, {'pressure_adj' : -100}, (releasePressure > minReleasePressure) ? null : 'disabled')}} + {{:~link('-', null, {'pressure_adj' : -10}, (releasePressure > minReleasePressure) ? null : 'disabled')}} + {{:~link('-', null, {'pressure_adj' : -1}, (releasePressure > minReleasePressure) ? null : 'disabled')}} +
     {{:releasePressure}} kPa 
    + {{:~link('+', null, {'pressure_adj' : 1}, (releasePressure < maxReleasePressure) ? null : 'disabled')}} + {{:~link('+', null, {'pressure_adj' : 10}, (releasePressure < maxReleasePressure) ? null : 'disabled')}} + {{:~link('+', null, {'pressure_adj' : 100}, (releasePressure < maxReleasePressure) ? null : 'disabled')}} + {{:~link('+', null, {'pressure_adj' : 1000}, (releasePressure < maxReleasePressure) ? null : 'disabled')}} +
    +
    +
    + +
    +
    + Release Valve: +
    +
    + {{:~link('Open', 'unlocked', {'toggle' : 1}, valveOpen ? 'selected' : null)}}{{:~link('Close', 'locked', {'toggle' : 1}, valveOpen ? null : 'selected')}} +
    +
    + diff --git a/nano/templates/tanks.tmpl b/nano/templates/tanks.tmpl new file mode 100644 index 00000000000..6aa259fd145 --- /dev/null +++ b/nano/templates/tanks.tmpl @@ -0,0 +1,47 @@ +{{if maskConnected}} +
    This tank is connected to a mask.
    +{{else}} +
    This tank is NOT connected to a mask.
    +{{/if}} + +
    +
    + Tank Pressure: +
    +
    + {{:~displayBar(tankPressure, 0, 1013, (tankPressure > 200) ? 'good' : ((tankPressure > 100) ? 'average' : 'bad'))}} +
    + {{:tankPressure}} kPa +
    +
    +
    + +
     
    + +
    +
    + Mask Release Pressure: +
    +
    + {{:~displayBar(releasePressure, 0, maxReleasePressure, (releasePressure >= 23) ? null : ((releasePressure >= 17) ? 'average' : 'bad'))}} +
    + {{:~link('-', null, {'dist_p' : -5}, (releasePressure > 0) ? null : 'disabled')}} + {{:~link('-', null, {'dist_p' : -1}, (releasePressure > 0) ? null : 'disabled')}} +
     {{:releasePressure}} kPa 
    + {{:~link('+', null, {'dist_p' : 1}, (releasePressure < maxReleasePressure) ? null : 'disabled')}} + {{:~link('+', null, {'dist_p' : 5}, (releasePressure < maxReleasePressure) ? null : 'disabled')}} + {{:~link('Max', null, {'dist_p' : 'max'}, (releasePressure < maxReleasePressure) ? null : 'disabled')}} + {{:~link('Reset', null, {'dist_p' : 'reset'}, (releasePressure != defaultReleasePressure) ? null : 'disabled')}} +
    +
    +
    + +
    +
    + Mask Release Valve: +
    +
    + {{:~link('Open', 'unlocked', {'stat' : 1}, (!maskConnected) ? 'disabled' : (valveOpen ? 'selected' : null))}}{{:~link('Close', 'locked', {'stat' : 1}, valveOpen ? null : 'selected')}} +
    +
    + diff --git a/tgstation.dme b/tgstation.dme index 5ff1207a086..33764a17413 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -694,6 +694,7 @@ #include "code\game\objects\items\weapons\tanks\tank_types.dm" #include "code\game\objects\items\weapons\tanks\tanks.dm" #include "code\game\objects\items\weapons\tanks\watertank.dm" +#include "code\game\objects\structures\artstuff.dm" #include "code\game\objects\structures\barsigns.dm" #include "code\game\objects\structures\bedsheet_bin.dm" #include "code\game\objects\structures\displaycase.dm"