diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index b5564f3f6b0..45ffedc345c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -37,9 +37,9 @@ actual development. * Document and explain your pull requests thoroughly. Detail what each commit changes, and why it changes it. We do not want to have to read all of you commit names to figure out what your pull request is about. - * Any pull request that is not solely composed of fixes or non gameplay-affecting - refactors must have a changelog. Inline changelogs are supported through the format - described [here](https://github.com/ParadiseSS13/Paradise/pull/3291#issuecomment-172950466) + * Any pull request must have a changelog, this is to allow us to know when a PR is deployed + on the live server. Inline changelogs are supported through the format described + [here](https://github.com/ParadiseSS13/Paradise/pull/3291#issuecomment-172950466) and should be used rather than manually edited .yml file changelogs. * Pull requests should not have any merge commits except in the case of fixing merge conflicts for an existing pull request. New pull requests should not have any merge diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000000..7e822d1b031 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,23 @@ +**What does this PR do:** +Include a small to medium description of what your PR changes. Feel free to give it a little flourish if you want to show off a new feature more completely. + +**Images of sprite/map changes (IF APPLICABLE):** +If you did not make a map or sprite edit, you may leave this section blank. You may include a gif of your feature if you want + +**Changelog:** +*Remove this line, and appropriate fields from the changelog* +:cl: name here +add: Added new things +del: Removed old things +tweak: tweaked a few things +balance: rebalanced something +fix: fixed a few things +wip: added a few works in progress +soundadd: added a new sound thingy +sounddel: removed an old sound thingy +imageadd: added some icons and images +imagedel: deleted some icons and images +spellcheck: fixed a few typos +experiment: added an experimental thingy +/:cl: + diff --git a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm index 922543e9673..f1bb7ce2a98 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm @@ -1,7 +1,7 @@ "a" = (/turf/space,/area/space) -"b" = (/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/ruin/powered) +"b" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/ruin/powered) "c" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/ruin/powered) -"d" = (/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/ruin/powered) +"d" = (/turf/space,/turf/simulated/shuttle/wall{dir = 2; icon_state = "diagonalWall3"},/area/ruin/powered) "e" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/space,/area/ruin/powered) "f" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/simulated/floor/plating,/area/ruin/powered) "g" = (/obj/structure/table/wood,/obj/item/clothing/under/shorts/black,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered) @@ -24,22 +24,22 @@ "x" = (/obj/machinery/door_control{name = "Strange Ship Door Control"; pixel_x = 6; pixel_y = 0; id = "strange ship"},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/ruin/powered) "y" = (/obj/machinery/light,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered) "z" = (/mob/living/simple_animal/bot/medbot,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered) -"A" = (/turf/simulated/shuttle/wall{dir = 2; icon_state = "diagonalWall3"},/area/ruin/powered) +"A" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/ruin/powered) "B" = (/obj/structure/chair,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered) -"C" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/ruin/powered) +"C" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/ruin/powered) "D" = (/obj/machinery/light,/obj/structure/bed,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered) (1,1,1) = {" -aabcccccdaaaa +aabcccccAaaaa aefghijkcaaaa -aeflhhhhccccd +aeflhhhhccccA bccccmhhcmhjc cnophhhhqhhrc shhthhhhuhvwc xhypzhhhqhhnc -Accccmhhcmhjc +dccccmhhcmhjc aefBhhhhccccC aefnnDhjcaaaa -aaAcccccCaaaa +aadcccccCaaaa "} diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index bb351ad3d9b..e2bb79fee47 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -7633,6 +7633,7 @@ "cQO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/genetics) "cQP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos) "cQQ" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/plasteel,/area/atmos) +"cQR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external{aiControlDisabled = 0; frequency = 1379; hackProof = 0; icon_state = "door_locked"; id_tag = "atmospherics_south_inner"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering) "cQS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage) "cQT" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/atmos/distribution) "cQU" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plating,/area/storage/secure) @@ -8229,6 +8230,7 @@ "dcn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/engine/engineering) "dco" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/ne) "dcp" = (/obj/machinery/porta_turret{dir = 1},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior) +"dcq" = (/obj/machinery/door/airlock/external{aiControlDisabled = 0; frequency = 1379; hackProof = 0; icon_state = "door_locked"; id_tag = "atmospherics_south_outer"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering) "dcs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/engine/engineering) "dct" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel,/area/atmos) "dcv" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plasteel,/area/atmos) @@ -8626,8 +8628,6 @@ "dmt" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating,/area/maintenance/asmaint) "dmu" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/maintenance/asmaint2) "dmv" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "atmospherics_south_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "atmospherics_south_sensor"; pixel_x = -8; pixel_y = -30},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "atmospherics_south"; pixel_x = 0; pixel_y = -25; req_access_txt = null; tag_airpump = "atmospherics_south_pump"; tag_chamber_sensor = "atmospherics_south_sensor"; tag_exterior_door = "atmospherics_south_outer"; tag_interior_door = "atmospherics_south_inner"},/turf/simulated/floor/plating,/area/engine/engineering) -"dmw" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external{aiControlDisabled = 1; frequency = 1379; hackProof = 1; icon_state = "door_locked"; id_tag = "atmospherics_south_inner"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering) -"dmx" = (/obj/machinery/door/airlock/external{aiControlDisabled = 1; frequency = 1379; hackProof = 1; icon_state = "door_locked"; id_tag = "atmospherics_south_outer"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering) "dmy" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine) "dmz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 0; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/vacuum{pixel_y = -30},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine) "dmA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/igniter{icon_state = "igniter0"; id = "gasturbine"; on = 0},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine) @@ -9111,7 +9111,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOaabafOafOaabaabaabalwalwcSUcSUcUpdibaaacTDcTEaaaaaaaabdledlfdlgaabaaaaaacUlcTFaaadibcUqcSUcSUdaGcSUcQZdkOdlvdkOcQZdkTdlwdkTcQZdkVdlxdkVcQZaabdhKaaaalwaaadjddgSdgSdgSdlldlmdlndlydlndlmdkPdlpcsLdlAdlrdfMddHcYidlscBPcBQcBQcBQdlKaabaabaaabZZdlBdlCcuQbGGdlDdlJdbgcuQdlPbGGcuQdlzbGGbGGdlLbGGbGHbGHbGHbZZbZZbGHdjQdlSdlRdlUdjQaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaabaaaaaaaabaabalwcSUcSUcTtdibaaacTxafOaaadlEaabdlFdlGdlHaabaabdjqafOcTxaaadibcTtcSUcSUdaGcSUcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZaabdhKaaaayiaaadjdaaaaaaaaadlIdlmdlVdlXdlWdlmcsLdlMcsLcsLdlNdlOcXrdmcdlQcBPaaaaaaaaaaaaaaaaabaaabZZdlZdmbdlLbGGdgybGGbGGdlLdjobGGcuQcuQcuQcuQcuQbGGbGHaabaaaaaaaaaaabdlTdlTdmddlTdlTaabaabdhcaabaabdjTaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcSUcSCcUodibaaacTxafOaaaaaaaabaabaabaabaabaaaaaaafOcTxaaadibcUncTmcSUdmecSUcSUcSUcSUdmfdhhdhhdhhdhhdhhdhhdhhdhhdhhdhhdmgaabaabaabdjEaaaaaaaaadlYdlmdlndmhdlndlmdmadmidfMdfMdmldmrdmmcBPcBPcBPaaaaaaaaaaaaaaaaabaaabZZdlBdmncuQdbgbGGbGGdmpcuQdmqbGGbGGbGGbGGbGGbGGbGGbGHaabaaaaaaaaaaabaaadlTdmsdlTaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaabcSUcTtdibdmjaaacTDcTEaaaaaaaaaaabaaaaaaaaaaaaaaacUlcTFaaadibdibcTtcSUdmkdmwdmvdaGdmxdmgaabaabaabaabaabaabaabdmoaabaabaabaabaabaabdjEaabaabaabdlYdlmdmydmAdmzdmEaabdmacBPcBQdmtcBQcBPcBPaaaaabaaaaaaaaaaaaaaaaabaabbZZbZZbZZbGHbGHbGHbGGcuQbGHdmubGHbGHdbgbPAcLhbKlcMsbGHaabaaaaaaaaaaabaaadlTdmGdlTaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaabcSUcTtdibdmjaaacTDcTEaaaaaaaaaaabaaaaaaaaaaaaaaacUlcTFaaadibdibcTtcSUdmkcQRdmvdaGdcqdmgaabaabaabaabaabaabaabdmoaabaabaabaabaabaabdjEaabaabaabdlYdlmdmydmAdmzdmEaabdmacBPcBQdmtcBQcBPcBPaaaaabaaaaaaaaaaaaaaaaabaabbZZbZZbZZbGHbGHbGHbGGcuQbGHdmubGHbGHdbgbPAcLhbKlcMsbGHaabaaaaaaaaaaabaaadlTdmGdlTaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcSUcUDdbudiPaabcTxafOdjqaaaaaadjqaaaaaaaaaaaadjqafOcTxaaadiRdbQcUEcSUdmLcSUcSUcSUcSUcSUcSUaaaaaaaabaaaaaaaaadmoaaaaaadmBdmBdmBdmBdmCaaaaaaaabdlYdmDdlmdmOdlmdlmaaaaabaaaaaadmFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaabGHdmbdmMbGHdmNaabbGHbGHbZZbZZcMsbGHaaaaabaaaaaaaaaaabaaaaaadmRaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUcUFcUIcUHaaacTxafOafOdcfafOafOdcfafOafOdcfafOafOcTxaaacUJcUIcUKcSUdmPdmQdnjdnldnkdnmdmVdmWdmWdmXdmWdmWdmWdmYdmWdmWdmZdnadnbdnodmCaaaaaaaabdndaHQdlmdnedlmdnfaabaabaaaaaadngaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaabpaaaaaabGHdnqdnnbGHdnpaabaaaaabaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaadnraaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnscSUcSUcULaaacUMcSFcSFcUOcSFcSFcUOcSFcSFcUOcSFcSFcUQaaacULcSUcSUcSUdmPdnBdnAdnEdnCdnHdfoaaaaaaaabaaaaaaaaadmodmBdmBdmBbfmbJNdnvdmCaaaaaaaabaabaHQdnxdnIdnxaHQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaaaaaabZZdnJbZZbZZaabdhcaaaaabaaaaaaaabaaaamWamWalwayiaabaabaabaabdnLaabaabaabaabdhcamhamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index c11a0421bda..5b09cc250c5 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -1,7 +1,7 @@ /obj/machinery/atmospherics/binary dir = SOUTH initialize_directions = SOUTH|NORTH - use_power = 1 + use_power = IDLE_POWER_USE var/datum/gas_mixture/air1 var/datum/gas_mixture/air2 @@ -150,4 +150,4 @@ /obj/machinery/atmospherics/binary/process_atmos() ..() - return parent1 && parent2 \ No newline at end of file + return parent1 && parent2 diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 0eed9729f87..a3903f278fb 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -5,7 +5,7 @@ name = "omni device" icon = 'icons/atmos/omni_devices.dmi' icon_state = "base" - use_power = 1 + use_power = IDLE_POWER_USE initialize_directions = 0 can_unwrench = 1 @@ -299,4 +299,4 @@ for(var/datum/omni_port/port in ports) if(!port.parent) return 0 - return 1 \ No newline at end of file + return 1 diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index e750256b0df..c0787a95612 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -1,7 +1,7 @@ /obj/machinery/atmospherics/trinary dir = SOUTH initialize_directions = SOUTH|NORTH|WEST - use_power = 1 + use_power = IDLE_POWER_USE var/on = 0 @@ -209,4 +209,4 @@ /obj/machinery/atmospherics/trinary/process_atmos() ..() - return parent1 && parent2 && parent3 \ No newline at end of file + return parent1 && parent2 && parent3 diff --git a/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm b/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm index 39441f8ed87..51415223de2 100644 --- a/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm @@ -2,7 +2,7 @@ icon = 'icons/obj/atmospherics/cold_sink.dmi' icon_state = "on_cool" density = 1 - use_power = 1 + use_power = IDLE_POWER_USE name = "cold sink" desc = "Cools gas when connected to pipe network" @@ -39,4 +39,4 @@ if(abs(old_temperature-air_contents.temperature) > 1) parent.update = 1 - return 1 \ No newline at end of file + return 1 diff --git a/code/ATMOSPHERICS/components/unary_devices/heat_source.dm b/code/ATMOSPHERICS/components/unary_devices/heat_source.dm index 2b0cbc14277..31eb7305ded 100644 --- a/code/ATMOSPHERICS/components/unary_devices/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary_devices/heat_source.dm @@ -2,7 +2,7 @@ icon = 'icons/obj/atmospherics/cold_sink.dmi' icon_state = "intact_off" density = 1 - use_power = 1 + use_power = IDLE_POWER_USE name = "heat reservoir" desc = "Heats gas when connected to pipe network" @@ -38,4 +38,4 @@ if(abs(old_temperature-air_contents.temperature) > 1) parent.update = 1 - return 1 \ No newline at end of file + return 1 diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm index fe5b6a0a445..345afd9921e 100644 --- a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm @@ -1,7 +1,7 @@ /obj/machinery/atmospherics/unary/outlet_injector icon = 'icons/atmos/injector.dmi' icon_state = "map_injector" - use_power = 1 + use_power = IDLE_POWER_USE layer = 3 can_unwrench = 1 diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 99eeb1883ea..1f2670371f8 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -8,7 +8,7 @@ name = "air vent" desc = "Has a valve and pump attached to it" - use_power = 1 + use_power = IDLE_POWER_USE can_unwrench = 1 var/open = 0 diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 11b1fc0f920..8b5c4b2afb2 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -7,7 +7,7 @@ name = "air scrubber" desc = "Has a valve and pump attached to it" - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 60 diff --git a/code/ATMOSPHERICS/pipes/pipe.dm b/code/ATMOSPHERICS/pipes/pipe.dm index 48c482ac906..4cd51e66b67 100644 --- a/code/ATMOSPHERICS/pipes/pipe.dm +++ b/code/ATMOSPHERICS/pipes/pipe.dm @@ -4,7 +4,7 @@ var/volume = 0 force = 20 layer = 2.4 //under wires with their 2.44 - use_power = 0 + use_power = NO_POWER_USE can_unwrench = 1 var/alert_pressure = 80*ONE_ATMOSPHERE //minimum pressure before check_pressure(...) should be called diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 376fcd45559..be6326272f7 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -35,8 +35,8 @@ #define MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND 0.012 #define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 //Minimum temperature difference before group processing is suspended #define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 //Minimum temperature difference before the gas temperatures are just set to be equal -#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION T20C+10 -#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION T20C+200 +#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION (T20C+10) +#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION (T20C+200) #define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4 #define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 #define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0 @@ -45,8 +45,8 @@ #define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 //a hack for now //Must be between 0 and 1. Values closer to 1 equalize temperature faster //Should not exceed 0.4 else strange heat flow occur -#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD 150+T0C -#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST 100+T0C +#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD (150+T0C) +#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST (100+T0C) #define FIRE_SPREAD_RADIOSITY_SCALE 0.85 #define FIRE_CARBON_ENERGY_RELEASED 2500000 //Amount of heat released per mole of burnt carbon into the tile #define FIRE_PLASMA_ENERGY_RELEASED 15000000 //Amount of heat released per mole of burnt plasma into the tile @@ -56,8 +56,8 @@ //Plasma fire properties #define OXYGEN_BURN_RATE_BASE 7 #define PLASMA_BURN_RATE_DELTA 20 -#define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C -#define PLASMA_UPPER_TEMPERATURE 1370+T0C +#define PLASMA_MINIMUM_BURN_TEMPERATURE (100+T0C) +#define PLASMA_UPPER_TEMPERATURE (1370+T0C) #define PLASMA_MINIMUM_OXYGEN_NEEDED 2 #define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30 #define PLASMA_OXYGEN_FULLBURN 10 diff --git a/code/__DEFINES/crafting.dm b/code/__DEFINES/crafting.dm index 8218d392640..4b783490568 100644 --- a/code/__DEFINES/crafting.dm +++ b/code/__DEFINES/crafting.dm @@ -5,3 +5,10 @@ #define CAT_FOOD "Food" #define CAT_MISC "Misc" #define CAT_PRIMAL "Tribal" + +#define RECIPE_MICROWAVE "Microwave" +#define RECIPE_OVEN "Oven" +#define RECIPE_GRILL "Grill" +#define RECIPE_CANDY "Candy" + +#define RECIPE_FAIL null \ No newline at end of file diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 0ed5dd944db..8e1b8516172 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -91,6 +91,9 @@ /proc/log_adminsay(text, mob/speaker) if(config.log_adminchat) WRITE_LOG(GLOB.world_game_log, "ADMINSAY: [speaker.simple_info_line()]: [html_decode(text)][log_end]") + +/proc/log_qdel(text) + WRITE_LOG(GLOB.world_qdel_log, "QDEL: [text]") /proc/log_mentorsay(text, mob/speaker) if(config.log_adminchat) diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm index 65bffa7515a..8a06b552db2 100644 --- a/code/_globalvars/lists/misc.dm +++ b/code/_globalvars/lists/misc.dm @@ -31,6 +31,16 @@ var/list/round_end_sounds = list( // Maps available round end sounds to their du 'sound/goonstation/misc/newround2.ogg' = 14.8 SECONDS ) +GLOBAL_LIST_INIT(cooking_recipe_types, list( + RECIPE_MICROWAVE = /datum/recipe/microwave, + RECIPE_OVEN = /datum/recipe/oven, + RECIPE_GRILL = /datum/recipe/grill, + RECIPE_CANDY = /datum/recipe/candy + )) +GLOBAL_LIST_INIT(cooking_recipes, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list())) +GLOBAL_LIST_INIT(cooking_ingredients, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list())) +GLOBAL_LIST_INIT(cooking_reagents, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list())) + GLOBAL_LIST(station_level_space_turfs) -#define EGG_LAYING_MESSAGES list("lays an egg.", "squats down and croons.", "begins making a huge racket.", "begins clucking raucously.") \ No newline at end of file +#define EGG_LAYING_MESSAGES list("lays an egg.", "squats down and croons.", "begins making a huge racket.", "begins clucking raucously.") diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index c48600ca40c..f2e463f2af1 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -6,6 +6,8 @@ GLOBAL_VAR(config_error_log) GLOBAL_PROTECT(config_error_log) GLOBAL_VAR(world_runtime_log) GLOBAL_PROTECT(world_runtime_log) +GLOBAL_VAR(world_qdel_log) +GLOBAL_PROTECT(world_qdel_log) GLOBAL_VAR(world_href_log) GLOBAL_PROTECT(world_href_log) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 823294e4d4e..97dd02838d0 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -59,7 +59,7 @@ SUBSYSTEM_DEF(garbage) msg += " | Fail:[fail_counts.Join(",")]" ..(msg) -/* TO-DO + /datum/controller/subsystem/garbage/Shutdown() //Adds the del() log to the qdel log file var/list/dellog = list() @@ -83,7 +83,6 @@ SUBSYSTEM_DEF(garbage) if(I.no_hint) dellog += "\tNo hint: [I.no_hint] times" log_qdel(dellog.Join("\n")) -*/ /datum/controller/subsystem/garbage/fire() //the fact that this resets its processing each fire (rather then resume where it left off) is intentional. diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index 83ca8f7f0ea..99d97e45626 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -53,19 +53,18 @@ return -1 return . -/datum/recipe/proc/check_items(obj/container) //1=precisely, 0=insufficiently, -1=superfluous - if(!items) - if(locate(/obj/) in container) - return -1 - else - return 1 +/datum/recipe/proc/check_items(obj/container, list/ignored_items = null) //1=precisely, 0=insufficiently, -1=superfluous . = 1 - var/list/checklist = items.Copy() + var/list/checklist = items ? items.Copy() : list() for(var/obj/O in container) + if(ignored_items && is_type_in_list(O, ignored_items)) //skip if this is something we are ignoring + continue + if(!items) + return -1 var/found = 0 for(var/type in checklist) if(istype(O,type)) - checklist-=type + checklist -= type found = 1 break if(!found) @@ -95,16 +94,16 @@ container.reagents.clear_reagents() return result_obj -/proc/select_recipe(list/datum/recipe/avaiable_recipes, obj/obj, exact = 1 as num) +/proc/select_recipe(list/datum/recipe/available_recipes, obj/obj, exact = 1 as num, list/ignored_items = null) if(!exact) exact = -1 var/list/datum/recipe/possible_recipes = new - for(var/datum/recipe/recipe in avaiable_recipes) - if(recipe.check_reagents(obj.reagents)==exact && recipe.check_items(obj)==exact) - possible_recipes+=recipe - if(possible_recipes.len==0) + for(var/datum/recipe/recipe in available_recipes) + if(recipe.check_reagents(obj.reagents) == exact && recipe.check_items(obj, ignored_items) == exact) + possible_recipes += recipe + if(possible_recipes.len == 0) return null - else if(possible_recipes.len==1) + else if(possible_recipes.len == 1) return possible_recipes[1] else //okay, let's select the most complicated recipe var/r_count = 0 diff --git a/code/datums/spell.dm b/code/datums/spell.dm index d1ba64824f5..1a78f8be2ca 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -321,28 +321,40 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/include_user = 0 //if it includes usr in the target list var/random_target = 0 // chooses random viable target instead of asking the caster var/random_target_priority = TARGET_CLOSEST // if random_target is enabled how it will pick the target - + var/humans_only = 0 //for avoiding simple animals and only doing "human" mobs, 0 = all mobs, 1 = humans only /obj/effect/proc_holder/spell/aoe_turf //affects all turfs in view or range (depends) var/inner_radius = -1 //for all your ring spell needs /obj/effect/proc_holder/spell/targeted/choose_targets(mob/user = usr) var/list/targets = list() - + switch(max_targets) if(0) //unlimited - for(var/mob/living/target in view_or_range(range, user, selection_type)) - targets += target + + if(!humans_only) + for(var/mob/living/target in view_or_range(range, user, selection_type)) + targets += target + else + for(var/mob/living/carbon/human/target in view_or_range(range, user, selection_type)) + targets += target + if(1) //single target can be picked if(range < 0) targets += user else var/possible_targets = list() - - for(var/mob/living/M in view_or_range(range, user, selection_type)) - if(!include_user && user == M) - continue - possible_targets += M + + if(!humans_only) + for(var/mob/living/M in view_or_range(range, user, selection_type)) + if(!include_user && user == M) + continue + possible_targets += M + else + for(var/mob/living/carbon/human/M in view_or_range(range, user, selection_type)) + if(!include_user && user == M) + continue + possible_targets += M //targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets //Adds a safety check post-input to make sure those targets are actually in range. @@ -366,8 +378,12 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin else var/list/possible_targets = list() - for(var/mob/living/target in view_or_range(range, user, selection_type)) - possible_targets += target + if(!humans_only) + for(var/mob/living/target in view_or_range(range, user, selection_type)) + possible_targets += target + else + for(var/mob/living/carbon/human/target in view_or_range(range, user, selection_type)) + possible_targets += target for(var/i=1,i<=max_targets,i++) if(!possible_targets.len) break diff --git a/code/datums/spells/knock.dm b/code/datums/spells/knock.dm index 1d296c26d41..301dd5086b2 100644 --- a/code/datums/spells/knock.dm +++ b/code/datums/spells/knock.dm @@ -30,4 +30,28 @@ SC.locked = 0 C.open() + return + +/obj/effect/proc_holder/spell/aoe_turf/knock/greater + name = "Greater Knock" + desc = "On first cast, will remove access restrictions on all airlocks on the Cyberiad, and announce this spell's use to the station. On any further cast, will open all doors in sight. Cannot be refunded once bought!" + + charge_max = 200 + invocation = "MAIOR OXIN FIERA" + invocation_type = "shout" + range = 7 + level_max = 0 //Cannot be improved, quality of life since can't be refunded + cooldown_min = 200 + var/used = FALSE + +/obj/effect/proc_holder/spell/aoe_turf/knock/greater/cast(list/targets, mob/user = usr) + if(!used) + used = TRUE + for(var/obj/machinery/door/airlock/A in airlocks) + if(is_station_level(A.z)) + A.req_access = list() + A.req_one_access = list() + command_announcement.Announce("We have removed all access requirements on your station's airlocks. You can thank us later!", "Greetings!", 'sound/misc/notice2.ogg', , , "Space Wizard Federation Message") + else + ..() return \ No newline at end of file diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 628b754a5ae..2db64b30bdb 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -943,6 +943,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/reagent_containers/food/condiment/peppermill, /obj/item/kitchen/rollingpin, /obj/item/storage/fancy/egg_box, + /obj/item/mixing_bowl, + /obj/item/mixing_bowl, /obj/item/reagent_containers/food/condiment/enzyme, /obj/item/reagent_containers/food/condiment/sugar, /obj/item/reagent_containers/food/snacks/meat/monkey, diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 44a9ae7e522..d8dabdb4a10 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -394,4 +394,10 @@ for(var/obj/machinery/door/airlock/temp_airlock in src) temp_airlock.prison_open() for(var/obj/machinery/door/window/temp_windoor in src) - temp_windoor.open() \ No newline at end of file + temp_windoor.open() + +/area/AllowDrop() + CRASH("Bad op: area/AllowDrop() called") + +/area/drop_location() + CRASH("Bad op: area/drop_location() called") \ No newline at end of file diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 3c541a308ff..f1e84856b38 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -204,9 +204,6 @@ -/atom/proc/allow_drop() - return 1 - /atom/proc/CheckExit() return 1 @@ -712,4 +709,13 @@ var/list/blood_splatter_icons = list() .["Jump to turf"] = "?_src_=holder;adminplayerobservecoodjump=1;X=[curturf.x];Y=[curturf.y];Z=[curturf.z]" .["Add reagent"] = "?_src_=vars;addreagent=[UID()]" .["Trigger explosion"] = "?_src_=vars;explode=[UID()]" - .["Trigger EM pulse"] = "?_src_=vars;emp=[UID()]" \ No newline at end of file + .["Trigger EM pulse"] = "?_src_=vars;emp=[UID()]" + +/atom/proc/AllowDrop() + return FALSE + +/atom/proc/drop_location() + var/atom/L = loc + if(!L) + return null + return L.AllowDrop() ? L : get_turf(L) \ No newline at end of file diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 98a3b047883..c206cc7aab8 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -56,7 +56,7 @@ icon_state = "scanner_open" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 50 active_power_usage = 300 interact_offline = 1 @@ -103,8 +103,8 @@ for(var/obj/item/stock_parts/micro_laser/P in component_parts) damage_coeff = P.rating -/obj/machinery/dna_scannernew/allow_drop() - return 0 +/obj/machinery/dna_scannernew/AllowDrop() + return FALSE /obj/machinery/dna_scannernew/relaymove(mob/user as mob) if(user.stat) @@ -359,7 +359,7 @@ var/obj/item/disk/data/disk = null var/selected_menu_key = null anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 400 var/waiting_for_user_input=0 // Fix for #274 (Mash create block injector without answering dialog to make unlimited injectors) - N3X @@ -533,7 +533,7 @@ occupantData["name"] = connected.occupant.dna.real_name occupantData["stat"] = connected.occupant.stat occupantData["isViableSubject"] = 1 - if((NOCLONE in connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna || connected.occupant.dna.species.bodyflags & NO_DNA) + if((NOCLONE in connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna || (NO_DNA in connected.occupant.dna.species.species_traits)) occupantData["isViableSubject"] = 0 occupantData["health"] = connected.occupant.health occupantData["maxHealth"] = connected.occupant.maxHealth diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 37292beb8fe..2e75d15a77d 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -171,11 +171,9 @@ H.visible_message("[user] sprays a cloud of fine ice crystals engulfing, [H]!", "[user] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.") add_attack_logs(user, C, "Cryokinesis") - H.bodytemperature = max(0, H.bodytemperature - 50) - H.adjustFireLoss(5) + H.bodytemperature = max(0, H.bodytemperature - 100) if(!handle_suit) - C.bodytemperature = max(0, C.bodytemperature - 100) - C.adjustFireLoss(10) + C.bodytemperature = max(0, C.bodytemperature - 200) C.ExtinguishMob() C.visible_message("[user] sprays a cloud of fine ice crystals, engulfing [C]!") diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 0e1fc7daa86..e17b5098c5c 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -120,4 +120,17 @@ B.mind.special_role = SPECIAL_ROLE_BLOB_OVERMIND spawn(0) if(is_offspring) - B.verbs -= /mob/camera/blob/verb/split_consciousness \ No newline at end of file + B.verbs -= /mob/camera/blob/verb/split_consciousness + +/obj/structure/blob/core/proc/lateblobtimer() + addtimer(CALLBACK(src, .proc/lateblobcheck), 50) + +/obj/structure/blob/core/proc/lateblobcheck() + if(overmind) + overmind.add_points(60) + if(overmind.mind) + overmind.mind.special_role = SPECIAL_ROLE_BLOB_OVERMIND + else + log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks a overmind.mind.") + else + log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks an overmind.") \ No newline at end of file diff --git a/code/game/gamemodes/blob/blobs/storage.dm b/code/game/gamemodes/blob/blobs/storage.dm index f29fb9af405..8c9da104edf 100644 --- a/code/game/gamemodes/blob/blobs/storage.dm +++ b/code/game/gamemodes/blob/blobs/storage.dm @@ -7,7 +7,7 @@ var/mob/camera/blob/overmind = null /obj/structure/blob/storage/update_icon() - if(health <= 0) + if(health <= 0 && !QDELETED(src)) overmind.max_blob_points -= 50 qdel(src) diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index c01f335ba08..da5c31fc092 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -81,3 +81,18 @@ if(req_human && !ishuman(user)) return 0 return 1 + +// Transform the target to the chosen dna. Used in transform.dm and tiny_prick.dm (handy for changes since it's the same thing done twice) +/obj/effect/proc_holder/changeling/proc/transform_dna(var/mob/living/carbon/human/H, var/datum/dna/D) + if(!D) + return + + H.set_species(D.species.type) + H.dna = D.Clone() + H.real_name = D.real_name + domutcheck(H, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them + H.flavor_text = "" + H.dna.UpdateSE() + H.dna.UpdateUI() + H.sync_organ_dna(1) + H.UpdateAppearance() diff --git a/code/game/gamemodes/changeling/powers/headcrab.dm b/code/game/gamemodes/changeling/powers/headcrab.dm index 60adda8f088..96d4a784f45 100644 --- a/code/game/gamemodes/changeling/powers/headcrab.dm +++ b/code/game/gamemodes/changeling/powers/headcrab.dm @@ -6,6 +6,11 @@ dna_cost = 1 req_human = 1 +/obj/effect/proc_holder/changeling/headcrab/try_to_sting(mob/user, mob/target) + if(alert("Are you sure you wish to do this? This action cannot be undone.",,"Yes","No")=="No") + return + ..() + /obj/effect/proc_holder/changeling/headcrab/sting_action(mob/user) var/datum/mind/M = user.mind var/list/organs = user.get_organs_zone("head", 1) @@ -37,4 +42,4 @@ to_chat(crab, "You burst out of the remains of your former body in a shower of gore!") user.gib() feedback_add_details("changeling_powers","LR") - return 1 + return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index bb216ddad35..58afbb73dfe 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -100,7 +100,6 @@ /obj/effect/proc_holder/changeling/sting/transformation/sting_action(var/mob/user, var/mob/target) add_attack_logs(user, target, "Transformation sting (changeling) (new identity is [selected_dna.real_name])") - var/datum/dna/NewDNA = selected_dna if(issmall(target)) to_chat(user, "Our genes cry out as we sting [target.name]!") @@ -111,13 +110,7 @@ target.visible_message("[target] begins to violenty convulse!","You feel a tiny prick and a begin to uncontrollably convulse!") spawn(10) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - H.set_species(NewDNA.species.type) - target.dna = NewDNA.Clone() - target.real_name = NewDNA.real_name - target.UpdateAppearance() - domutcheck(target, null) + transform_dna(target,selected_dna)//target is always human so no problem here feedback_add_details("changeling_powers","TS") return TRUE diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm index bacdc8b0d8b..8e1334fb30e 100644 --- a/code/game/gamemodes/changeling/powers/transform.dm +++ b/code/game/gamemodes/changeling/powers/transform.dm @@ -14,16 +14,8 @@ if(!chosen_dna) return - if(ishuman(user)) - user.set_species(chosen_dna.species.type) - user.dna = chosen_dna.Clone() - user.real_name = chosen_dna.real_name - domutcheck(user, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them - user.flavor_text = "" - user.dna.UpdateSE() - user.dna.UpdateUI() - user.sync_organ_dna(1) - user.UpdateAppearance() + + transform_dna(user,chosen_dna) user.changeling_update_languages(changeling.absorbed_languages) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 0c609c818b4..102efcdc898 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -369,6 +369,7 @@ var/round_start_time = 0 if(player.mind.assigned_role == "Captain") captainless=0 if(player.mind.assigned_role != player.mind.special_role) + job_master.AssignRank(player, player.mind.assigned_role, 0) job_master.EquipRank(player, player.mind.assigned_role, 0) EquipCustomItems(player) if(captainless) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 8f4b5dab95e..7c2b44f5cab 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -185,7 +185,7 @@ set name = "Destroy RCDs" set desc = "Detonate all RCDs on the station, while sparing onboard cyborg RCDs." - if(stat || malf_cooldown) + if(stat || malf_cooldown > world.time) return for(var/obj/item/rcd/RCD in rcd_list) @@ -193,9 +193,7 @@ RCD.detonate_pulse() to_chat(src, "RCD detonation pulse emitted.") - malf_cooldown = 1 - spawn(100) - malf_cooldown = 0 + malf_cooldown = world.time + 100 /datum/AI_Module/large/mecha_domination @@ -454,7 +452,7 @@ set name = "Reactivate Cameranet" set category = "Malfunction" - if(stat || malf_cooldown) + if(stat || malf_cooldown > world.time) return var/fixedcams = 0 //Tells the AI how many cams it fixed. Stats are fun. @@ -477,9 +475,7 @@ break to_chat(src, "Diagnostic complete! Operations completed: [fixedcams].") - malf_cooldown = 1 - spawn(30) //Lag protection - malf_cooldown = 0 + malf_cooldown = world.time + 30 /datum/AI_Module/large/upgrade_cameras diff --git a/code/game/gamemodes/miniantags/guardian/types/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm index c679beac91a..6c784e1ee0a 100644 --- a/code/game/gamemodes/miniantags/guardian/types/healer.dm +++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm @@ -47,8 +47,8 @@ changeNext_move(CLICK_CD_MELEE) if(heal_cooldown <= world.time && !stat) var/mob/living/carbon/C = target - C.adjustBruteLoss(-5) - C.adjustFireLoss(-5) + C.adjustBruteLoss(-5, robotic=1) + C.adjustFireLoss(-5, robotic=1) C.adjustOxyLoss(-5) C.adjustToxLoss(-5) heal_cooldown = world.time + 20 diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 17afd375952..65f02aac59c 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -146,6 +146,7 @@ proc/issyndicate(mob/living/M as mob) M.set_species(/datum/species/human, TRUE) M.dna.ready_dna(M) // Quadriplegic Nuke Ops won't be participating in the paralympics + M.dna.species.create_organs(M) M.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ops. M.overeatduration = 0 diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 6b78a31dac0..54b9ecc3fc5 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -19,7 +19,7 @@ var/bomb_set var/removal_stage = 0 // 0 is no removal, 1 is covers removed, 2 is covers open, 3 is sealant open, 4 is unwrenched, 5 is removed from bolts. var/lastentered var/is_syndicate = 0 - use_power = 0 + use_power = NO_POWER_USE unacidable = 1 var/previous_level = "" var/datum/wires/nuclearbomb/wires = null diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index ea846e394a5..3aed3bf73ab 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -22,6 +22,7 @@ charge_max = 300 clothes_req = 0 action_icon_state = "glare" + humans_only = 1 /obj/effect/proc_holder/spell/targeted/glare/cast(list/targets, mob/user = usr) for(var/mob/living/carbon/human/target in targets) @@ -263,6 +264,7 @@ range = 1 //Adjacent to user var/enthralling = 0 action_icon_state = "enthrall" + humans_only = 1 /obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets, mob/user = usr) var/mob/living/carbon/human/ling = user @@ -595,6 +597,7 @@ clothes_req = 0 include_user = 0 action_icon_state = "revive_thrall" + humans_only = 1 /obj/effect/proc_holder/spell/targeted/reviveThrall/cast(list/targets, mob/user = usr) if(!shadowling_check(user)) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 0c380010e6a..ff101cbb5c1 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -202,6 +202,14 @@ category = "Mobility" cost = 1 +/datum/spellbook_entry/greaterknock + name = "Greater Knock" + spell_type = /obj/effect/proc_holder/spell/aoe_turf/knock/greater + log_name = "GK" + category = "Mobility" + cost = 2 + refundable = 0 //global effect on cast + /datum/spellbook_entry/fleshtostone name = "Flesh to Stone" spell_type = /obj/effect/proc_holder/spell/targeted/touch/flesh_to_stone @@ -535,7 +543,10 @@ if(istype(O, /obj/item/antag_spawner/slaughter_demon)) to_chat(user, "On second thought, maybe summoning a demon is a bad idea. You refund your points.") - uses+=2 + if(istype(O, /obj/item/antag_spawner/slaughter_demon/laughter)) + uses += 1 + else + uses += 2 for(var/datum/spellbook_entry/item/bloodbottle/BB in entries) if(!isnull(BB.limit)) BB.limit++ diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 718f714d031..1cdd33672b0 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -412,8 +412,45 @@ var/global/datum/controller/occupations/job_master return 1 +/datum/controller/occupations/proc/AssignRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0) + if(!H) + return null + var/datum/job/job = GetJob(rank) -/datum/controller/occupations/proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0) + H.job = rank + + var/alt_title = null + + if(H.mind) + H.mind.assigned_role = rank + alt_title = H.mind.role_alt_title + + CreateMoneyAccount(H, rank, job) + + to_chat(H, "You are the [alt_title ? alt_title : rank].") + to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.") + to_chat(H, "For more information on how the station works, see Standard Operating Procedure (SOP)") + if(job.is_service) + to_chat(H, "As a member of Service, make sure to read up on your Department SOP") + if(job.is_supply) + to_chat(H, "As a member of Supply, make sure to read up on your Department SOP") + if(job.is_command) + to_chat(H, "As an important member of Command, read up on your Department SOP") + if(job.is_legal) + to_chat(H, "Your job requires complete knowledge of Space Law and Legal Standard Operating Procedure") + if(job.is_engineering) + to_chat(H, "As a member of Engineering, make sure to read up on your Department SOP") + if(job.is_medical) + to_chat(H, "As a member of Medbay, make sure to read up on your Department SOP") + if(job.is_science) + to_chat(H, "As a member of Science, make sure to read up on your Department SOP") + if(job.is_security) + to_chat(H, "As a member of Security, you are to know Space Law, Legal Standard Operating Procedure, as well as your Department SOP") + if(job.req_admin_notify) + to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp.") + + return H +/datum/controller/occupations/proc/EquipRank(mob/living/carbon/human/H, rank, joined_late = 0) // Equip and put them in an area if(!H) return null @@ -457,40 +494,11 @@ var/global/datum/controller/occupations/job_master H.buckled.loc = H.loc H.buckled.dir = H.dir - var/alt_title = null - if(H.mind) - H.mind.assigned_role = rank - alt_title = H.mind.role_alt_title - - CreateMoneyAccount(H, rank, job) - if(job) var/new_mob = job.equip(H) if(ismob(new_mob)) H = new_mob - to_chat(H, "You are the [alt_title ? alt_title : rank].") - to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.") - to_chat(H, "For more information on how the station works, see Standard Operating Procedure (SOP)") - if(job.is_service) - to_chat(H, "As a member of Service, make sure to read up on your Department SOP") - if(job.is_supply) - to_chat(H, "As a member of Supply, make sure to read up on your Department SOP") - if(job.is_command) - to_chat(H, "As an important member of Command, read up on your Department SOP") - if(job.is_legal) - to_chat(H, "Your job requires complete knowledge of Space Law and Legal Standard Operating Procedure") - if(job.is_engineering) - to_chat(H, "As a member of Engineering, make sure to read up on your Department SOP") - if(job.is_medical) - to_chat(H, "As a member of Medbay, make sure to read up on your Department SOP") - if(job.is_science) - to_chat(H, "As a member of Science, make sure to read up on your Department SOP") - if(job.is_security) - to_chat(H, "As a member of Security, you are to know Space Law, Legal Standard Operating Procedure, as well as your Department SOP") - if(job.req_admin_notify) - to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp.") - if(job && H) job.after_spawn(H) diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 79fd53e5083..f1171177c42 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -6,7 +6,7 @@ level = 1 // underfloor layer = 2.5 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 0 var/syndicate = 0 var/area_bypass = FALSE @@ -77,4 +77,4 @@ /obj/machinery/bluespace_beacon/syndicate/Destroy() if(mycomputer) mycomputer.mybeacon = null - return ..() \ No newline at end of file + return ..() diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm index dc06a13e076..5fb11e932c2 100644 --- a/code/game/machinery/Freezer.dm +++ b/code/game/machinery/Freezer.dm @@ -5,7 +5,7 @@ density = 1 var/min_temperature = 0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE current_heat_capacity = 1000 layer = 3 armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 360d5cc5aff..49ab34601b5 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -5,7 +5,7 @@ icon_state = "table2-idle" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 1 active_power_usage = 5 var/mob/living/carbon/human/victim = null diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 44ef4ee26da..77ddcde0a46 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -519,8 +519,8 @@ return return -/obj/machinery/sleeper/allow_drop() - return 0 +/obj/machinery/sleeper/AllowDrop() + return FALSE /obj/machinery/sleeper/verb/move_inside() set name = "Enter Sleeper" diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index de32918c068..e9201838763 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -75,7 +75,7 @@ icon = 'icons/obj/monitors.dmi' icon_state = "alarm0" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 4 active_power_usage = 8 power_channel = ENVIRON diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 9ad575f74d7..78b94f969fd 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -74,7 +74,7 @@ var/datum/canister_icons/canister_icon_container = new() pressure_resistance = 7*ONE_ATMOSPHERE var/temperature_resistance = 1000 + T0C volume = 1000 - use_power = 0 + use_power = NO_POWER_USE interact_offline = 1 var/release_log = "" var/busy = 0 diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 03fa12a1c26..d3d23e96bba 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -10,7 +10,7 @@ var/frequency = 0 var/id var/id_tag - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 5 req_one_access_txt = "24;10" diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 34088a6314c..dfecc3a4409 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -1,6 +1,6 @@ /obj/machinery/portable_atmospherics name = "atmoalter" - use_power = 0 + use_power = NO_POWER_USE armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100) var/datum/gas_mixture/air_contents = new diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 81ee03c5ee8..a0e9ee978dd 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -21,7 +21,7 @@ var/hack_wire var/disable_wire var/shock_wire - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 100 var/busy = 0 diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 5382c9ec429..a76bd387ac7 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -12,7 +12,7 @@ var/active = 0 settagwhitelist = list("id_tag", "logic_id_tag") anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 var/range = 7 @@ -162,7 +162,7 @@ var/id = null var/active = 0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 @@ -201,4 +201,4 @@ sleep(50) icon_state = "launcherbtt" - active = 0 \ No newline at end of file + active = 0 diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index e555ee91ce8..07f22d8373e 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -3,7 +3,7 @@ desc = "It's used to monitor rooms." icon = 'icons/obj/monitors.dmi' icon_state = "camera" - use_power = 2 + use_power = ACTIVE_POWER_USE idle_power_usage = 5 active_power_usage = 10 layer = WALL_OBJ_LAYER diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 8baf02088bb..03ebe757789 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -1,25 +1,25 @@ +#define ASSEMBLY_UNBUILT 0 // Nothing done to it +#define ASSEMBLY_WRENCHED 1 // Wrenched in place +#define ASSEMBLY_WELDED 2 // Welded in place +#define ASSEMBLY_WIRED 3 // Wires attached (Upgradable now) +#define ASSEMBLY_BUILT 4 // Fully built (incl panel closed) + /obj/item/camera_assembly name = "camera assembly" desc = "A pre-fabricated security camera kit, ready to be assembled and mounted to a surface." icon = 'icons/obj/monitors.dmi' icon_state = "cameracase" w_class = WEIGHT_CLASS_SMALL - anchored = 0 + anchored = FALSE materials = list(MAT_METAL=400, MAT_GLASS=250) max_integrity = 150 can_be_hit = TRUE // Motion, EMP-Proof, X-Ray var/list/obj/item/possible_upgrades = list(/obj/item/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma, /obj/item/analyzer) var/list/upgrades = list() - var/state = 0 - var/busy = 0 - /* - 0 = Nothing done to it - 1 = Wrenched in place - 2 = Welded in place - 3 = Wires attached to it (you can now attach/dettach upgrades) - 4 = Screwdriver panel closed and is fully built (you cannot attach upgrades) - */ + var/state = ASSEMBLY_UNBUILT + var/busy = FALSE + /obj/item/camera_assembly/Destroy() QDEL_LIST(upgrades) @@ -28,74 +28,72 @@ /obj/item/camera_assembly/attackby(obj/item/I, mob/living/user, params) switch(state) - if(0) + if(ASSEMBLY_UNBUILT) // State 0 if(iswrench(I) && isturf(loc)) playsound(loc, I.usesound, 50, 1) - to_chat(user, "You wrench the assembly into place.") + to_chat(user, "You wrench the assembly into place.") anchored = 1 - state = 1 + state = ASSEMBLY_WRENCHED update_icon() auto_turn() return - if(1) + if(ASSEMBLY_WRENCHED) // State 1 if(iswelder(I)) if(weld(I, user)) - to_chat(user, "You weld the assembly securely into place.") - anchored = 1 - state = 2 + to_chat(user, "You weld the assembly securely into place.") + anchored = TRUE + state = ASSEMBLY_WELDED return else if(iswrench(I)) playsound(loc, I.usesound, 50, 1) - to_chat(user, "You unattach the assembly from it's place.") - anchored = 0 + to_chat(user, "You unattach the assembly from it's place.") + anchored = FALSE update_icon() - state = 0 + state = ASSEMBLY_UNBUILT return - if(2) - // State 2 + if(ASSEMBLY_WELDED) if(iscoil(I)) var/obj/item/stack/cable_coil/C = I if(C.use(2)) to_chat(user, "You add wires to the assembly.") playsound(loc, I.usesound, 50, 1) - state = 3 + state = ASSEMBLY_WIRED else to_chat(user, "You need 2 coils of wire to wire the assembly.") return else if(iswelder(I)) if(weld(I, user)) - to_chat(user, "You unweld the assembly from it's place.") - state = 1 - anchored = 1 + to_chat(user, "You unweld the assembly from it's place.") + state = ASSEMBLY_WRENCHED + anchored = TRUE return - if(3) - // State 3 + if(ASSEMBLY_WIRED) if(isscrewdriver(I)) playsound(loc, I.usesound, 50, 1) var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")) if(!input) - to_chat(usr, "No input found please hang up and try your call again.") + to_chat(usr, "No input found please hang up and try your call again.") return var/list/tempnetwork = splittext(input, ",") if(tempnetwork.len < 1) - to_chat(usr, "No network found please hang up and try your call again.") + to_chat(usr, "No network found please hang up and try your call again.") return var/area/camera_area = get_area(src) var/temptag = "[sanitize(camera_area.name)] ([rand(1, 999)])" input = strip_html(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag)) - state = 4 + state = ASSEMBLY_BUILT var/obj/machinery/camera/C = new(loc) loc = C C.assembly = src @@ -104,7 +102,7 @@ C.network = uniquelist(tempnetwork) tempnetwork = difflist(C.network,restricted_camera_networks) - if(!tempnetwork.len)//Camera isn't on any open network - remove its chunk from AI visibility. + if(!tempnetwork.len) // Camera isn't on any open network - remove its chunk from AI visibility. cameranet.removeCamera(C) C.c_tag = input @@ -122,8 +120,8 @@ else if(iswirecutter(I)) new/obj/item/stack/cable_coil(get_turf(src), 2) playsound(loc, I.usesound, 50, 1) - to_chat(user, "You cut the wires from the circuits.") - state = 2 + to_chat(user, "You cut the wires from the circuits.") + state = ASSEMBLY_WELDED return // Upgrades! @@ -131,7 +129,7 @@ if(!user.unEquip(I)) to_chat(user, "[I] is stuck!") return - to_chat(user, "You attach [I] into the assembly inner circuits.") + to_chat(user, "You attach [I] into the assembly inner circuits.") upgrades += I user.drop_item() I.loc = src @@ -141,7 +139,7 @@ else if(iscrowbar(I) && upgrades.len) var/obj/U = locate(/obj) in upgrades if(U) - to_chat(user, "You unattach an upgrade from the assembly.") + to_chat(user, "You unattach an upgrade from the assembly.") playsound(loc, I.usesound, 50, 1) U.loc = get_turf(src) upgrades -= U @@ -161,23 +159,29 @@ ..() /obj/item/camera_assembly/proc/weld(obj/item/weldingtool/WT, mob/living/user) - if(busy) - return 0 + return FALSE if(!WT.remove_fuel(0, user)) - return 0 + return FALSE - to_chat(user, "You start to weld the [src]..") + to_chat(user, "You start to weld the [src]...") playsound(loc, WT.usesound, 50, 1) - busy = 1 + busy = TRUE if(do_after(user, 20 * WT.toolspeed, target = src)) - busy = 0 + busy = FALSE if(!WT.isOn()) - return 0 - return 1 - busy = 0 - return 0 + return FALSE + return TRUE + busy = FALSE + return FALSE /obj/item/camera_assembly/deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/metal(loc) - qdel(src) \ No newline at end of file + qdel(src) + + +#undef ASSEMBLY_UNBUILT +#undef ASSEMBLY_WRENCHED +#undef ASSEMBLY_WELDED +#undef ASSEMBLY_WIRED +#undef ASSEMBLY_BUILT diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 6b728f2a20b..d85a89606ea 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/power.dmi' icon_state = "ccharger0" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 60 power_channel = EQUIP @@ -123,4 +123,4 @@ use_power(200) //this used to use CELLRATE, but CELLRATE is fucking awful. feel free to fix this properly! charging.give(175) //inefficiency. - updateicon() \ No newline at end of file + updateicon() diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index cf34302f118..5d5e6bd9511 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -515,7 +515,7 @@ var/eventstarted = 0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 6 power_channel = ENVIRON diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 21d061bfd45..a332e7df7c8 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -116,7 +116,10 @@ /obj/machinery/computer/security/proc/get_user_access(mob/user) var/list/access = list() - if(ishuman(user)) + + if(emagged) + access = get_all_accesses() // Assume captain level access when emagged + else if(ishuman(user)) access = user.get_access() else if((isAI(user) || isrobot(user)) && CanUseTopic(user, default_state) == STATUS_INTERACTIVE) access = get_all_accesses() // Assume captain level access when AI @@ -159,7 +162,6 @@ var/list/access = get_user_access(user) if(emagged) - access = get_all_accesses() // Assume captain level access when emagged data["emagged"] = 1 var/list/networks_list = list() diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index cfddc393875..9afe0113cc4 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -4,7 +4,7 @@ icon_state = "computer" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 300 active_power_usage = 300 var/obj/item/circuitboard/circuit = null //if circuit==null, computer can't disassembly diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index f3f4ec8fc3d..4efdcb69ee8 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -3,7 +3,7 @@ desc = "Used to monitor active health sensors built into most of the crew's uniforms." icon_keyboard = "med_key" icon_screen = "crew" - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 250 active_power_usage = 500 light_color = LIGHT_COLOR_DARKBLUE @@ -33,4 +33,4 @@ crew_monitor.ui_interact(user, ui_key, ui, force_open) /obj/machinery/computer/crew/interact(mob/user) - crew_monitor.ui_interact(user) \ No newline at end of file + crew_monitor.ui_interact(user) diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index 08f7a45221d..2fa4e6f1177 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -3,7 +3,7 @@ desc = "Used to monitor power levels across the station." icon_screen = "power" icon_keyboard = "power_key" - use_power = 2 + use_power = ACTIVE_POWER_USE idle_power_usage = 20 active_power_usage = 80 light_color = LIGHT_COLOR_ORANGE diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 7537c0abdb2..5c26f423e96 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -50,7 +50,7 @@ /obj/machinery/computer/secure_data/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "secure_data.tmpl", name, 800, 380) + ui = new(user, src, ui_key, "secure_data.tmpl", name, 800, 800) ui.open() /obj/machinery/computer/secure_data/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 4c437be1146..953a476d1a8 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -4,7 +4,7 @@ icon_state = "box_0" density = 1 anchored = 1 - use_power = 0 + use_power = NO_POWER_USE var/obj/item/circuitboard/circuit = null var/list/components = null var/list/req_components = null @@ -655,11 +655,11 @@ obj/item/circuitboard/rdserver build_path = /obj/machinery/mecha_part_fabricator/spacepod board_type = "machine" origin_tech = "programming=2;engineering=2" - frame_desc = "Requires 3 Matter Bins, 2 Manipulators, 2 Micro-Lasers, and 1 Console Screen." + frame_desc = "Requires 2 Matter Bins, 1 Manipulators, 1 Micro-Lasers, and 1 Console Screen." req_components = list( - /obj/item/stock_parts/matter_bin = 3, - /obj/item/stock_parts/manipulator = 2, - /obj/item/stock_parts/micro_laser = 2, + /obj/item/stock_parts/matter_bin = 2, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/console_screen = 1) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 6cea3116f57..e4bdd652998 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -149,8 +149,8 @@ parent.update = 1 -/obj/machinery/atmospherics/unary/cryo_cell/allow_drop() - return 0 +/obj/machinery/atmospherics/unary/cryo_cell/AllowDrop() + return FALSE /obj/machinery/atmospherics/unary/cryo_cell/relaymove(mob/user as mob) diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 00cddbb9c23..879773c3850 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -27,7 +27,7 @@ */ anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 @@ -62,7 +62,7 @@ req_access = list() req_one_access = list() playsound(loc, "sparks", 100, 1) - + /obj/machinery/door_control/attack_ghost(mob/user) if(user.can_advanced_admin_interact()) return attack_hand(user) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 4de934f1c96..a076fcec8fd 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -306,6 +306,10 @@ About the new airlock wires panel: else return 0 +//Checks if the user can get shocked and shocks him if it can. Returns TRUE if it happened +/obj/machinery/door/airlock/proc/shock_user(mob/user, prob) + return (!issilicon(user) && isElectrified() && shock(user, prob)) + /obj/machinery/door/airlock/update_icon(state=0, override=0) if(operating && !override) return @@ -630,11 +634,25 @@ About the new airlock wires panel: return ..() /obj/machinery/door/airlock/attack_hand(mob/user) - if(!issilicon(user)) - if(isElectrified()) - if(shock(user, 100)) - return + if(shock_user(user, 100)) + return + if(headbutt_airlock(user)) + return//Smack that head against that airlock + if(remove_airlock_note(user, FALSE)) + return + + if(panel_open) + if(security_level) + to_chat(user, "Wires are protected!") + return + wires.Interact(user) + else + ..() + + +//Checks if the user can headbutt the airlock and does it if it can. Returns TRUE if it happened +/obj/machinery/door/airlock/proc/headbutt_airlock(mob/user) if(ishuman(user) && prob(40) && density) var/mob/living/carbon/human/H = user if(H.getBrainLoss() >= 60 && Adjacent(user)) @@ -648,15 +666,23 @@ About the new airlock wires panel: H.UpdateDamageIcon() else visible_message("[user] headbutts the airlock. Good thing [user.p_theyre()] wearing a helmet.") - return + return TRUE + return FALSE +//For the tools being used on the door. Since you don't want to call the attack_hand method if you're using hands. That would be silly +//Also it's a bit inconsistent that when you access the panel you headbutt it. But not while crowbarring +//Try to interact with the panel. If the user can't it'll try activating the door +/obj/machinery/door/airlock/proc/interact_with_panel(mob/user) + if(shock_user(user, 100)) + return + if(panel_open) if(security_level) to_chat(user, "Wires are protected!") return wires.Interact(user) else - ..() + try_to_activate_door(user) /obj/machinery/door/airlock/CanUseTopic(mob/user) if(!issilicon(user) && !isobserver(user)) @@ -777,13 +803,14 @@ About the new airlock wires panel: return 1 /obj/machinery/door/airlock/attackby(obj/item/C, mob/user, params) - if(!issilicon(user)) - if(isElectrified()) - if(shock(user, 75)) - return + if(shock_user(user, 75)) + return add_fingerprint(user) + if(headbutt_airlock(user))//See if the user headbutts the airlock + return + if(panel_open) switch(security_level) if(AIRLOCK_SECURITY_NONE) @@ -922,23 +949,19 @@ About the new airlock wires panel: update_icon() else if(iswirecutter(C)) if(note) - user.visible_message("[user] cuts down [note] from [src].", "You remove [note] from [src].") - playsound(src, 'sound/items/Wirecutter.ogg', 50, 1) - note.forceMove(get_turf(user)) - note = null - update_icon() + remove_airlock_note(user, TRUE) else - return attack_hand(user) + return interact_with_panel(user) else if(ismultitool(C)) - return attack_hand(user) + return interact_with_panel(user) else if(istype(C, /obj/item/assembly/signaler)) - return attack_hand(user) + return interact_with_panel(user) else if(istype(C, /obj/item/pai_cable)) // -- TLE var/obj/item/pai_cable/cable = C cable.plugin(src, user) else if(istype(C, /obj/item/paper) || istype(C, /obj/item/photo)) if(note) - to_chat(user, "There's already something pinned to this airlock! Use wirecutters to remove it.") + to_chat(user, "There's already something pinned to this airlock! Use wirecutters or your hands to remove it.") return if(!user.unEquip(C)) to_chat(user, "For some reason, you can't attach [C]!") @@ -1294,6 +1317,23 @@ About the new airlock wires panel: else if(istype(note, /obj/item/photo)) return "photo" +//Removes the current note on the door if any. Returns if a note is removed +/obj/machinery/door/airlock/proc/remove_airlock_note(mob/user, wirecutters_used=TRUE) + if(note) + if(!wirecutters_used) + if (ishuman(user) && user.a_intent == INTENT_GRAB)//grab that note + user.visible_message("[user] removes [note] from [src].", "You remove [note] from [src].") + playsound(src, 'sound/items/poster_ripped.ogg', 50, 1) + else return FALSE + else + user.visible_message("[user] cuts down [note] from [src].", "You remove [note] from [src].") + playsound(src, 'sound/items/Wirecutter.ogg', 50, 1) + note.forceMove(get_turf(user)) + note = null + update_icon() + return TRUE + return FALSE + /obj/machinery/door/airlock/narsie_act() var/turf/T = get_turf(src) var/runed = prob(20) diff --git a/code/game/machinery/dye_generator.dm b/code/game/machinery/dye_generator.dm index 52b11da599b..1519981dfc7 100644 --- a/code/game/machinery/dye_generator.dm +++ b/code/game/machinery/dye_generator.dm @@ -4,7 +4,7 @@ icon_state = "barbervend" density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 40 var/dye_color = "#FFFFFF" diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 889263da2f8..23ee6e19403 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -4,7 +4,7 @@ name = "Embedded Controller" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 var/on = 1 diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index b3664c58cd6..9528b527d6e 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -13,7 +13,7 @@ FIRE ALARM var/lockdownbyai = 0 anchored = 1.0 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100) - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 6 power_channel = ENVIRON @@ -70,7 +70,7 @@ FIRE ALARM /obj/machinery/firealarm/attackby(obj/item/I, mob/user, params) add_fingerprint(user) - if(iswirecutter(I) && buildstage == 2) + if(isscrewdriver(I) && buildstage == 2) wiresexposed = !wiresexposed update_icon() return @@ -281,7 +281,7 @@ Just a object used in constructing fire alarms var/timing = 0.0 var/lockdownbyai = 0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 6 diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 7a13b0bf796..23eafe8874b 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -121,7 +121,7 @@ var/id = null var/active = 0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index 8ac57a5cec6..013be887cce 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -1,23 +1,22 @@ -//these are probably broken - /obj/machinery/floodlight - name = "Emergency Floodlight" + name = "emergency floodlight" icon = 'icons/obj/machines/floodlight.dmi' icon_state = "flood00" - anchored = 0 - density = 1 - var/on = 0 + anchored = FALSE + density = TRUE + light_power = 20 + var/on = FALSE var/obj/item/stock_parts/cell/high/cell = null var/use = 5 - var/unlocked = 0 - var/open = 0 + var/unlocked = FALSE + var/open = FALSE var/brightness_on = 14 - light_power = 20 - //var/brightness_on = 999 //can't remember what the maxed out value is //Lighting overhaul: No max, stop TRYING TO ILLUMINATE MORE TILES THAN THE MAP CONSISTS OF. -/obj/machinery/floodlight/New() + +/obj/machinery/floodlight/Initialize() + . = ..() src.cell = new(src) - ..() + mapVarInit() /obj/machinery/floodlight/Destroy() QDEL_NULL(cell) @@ -30,13 +29,12 @@ if(on) cell.charge -= use if(cell.charge <= 0) - on = 0 + on = FALSE updateicon() set_light(0) src.visible_message("[src] shuts down due to lack of power!") - return -/obj/machinery/floodlight/attack_ai(mob/user as mob) +/obj/machinery/floodlight/attack_ai() return /obj/machinery/floodlight/attack_hand(mob/user as mob) @@ -51,25 +49,33 @@ cell.update_icon() src.cell = null - to_chat(user, "You remove the power cell") + to_chat(user, "You remove the power cell.") updateicon() return if(on) - on = 0 - to_chat(user, "You turn off the light") + on = FALSE + to_chat(user, "You turn off the light.") set_light(0) else if(!cell) return if(cell.charge <= 0) return - on = 1 - to_chat(user, "You turn on the light") + on = TRUE + to_chat(user, "You turn on the light.") set_light(brightness_on) updateicon() +/obj/machinery/floodlight/proc/mapVarInit() + if(on) + if(!cell) + return + if(cell.charge <= 0) + return + set_light(brightness_on) + updateicon() /obj/machinery/floodlight/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/wrench)) @@ -79,32 +85,32 @@ "[user] tightens \the [src]'s casters.", \ " You have tightened \the [src]'s casters.", \ "You hear ratchet.") - anchored = 1 + anchored = TRUE else if(anchored) playsound(src.loc, W.usesound, 50, 1) user.visible_message( \ "[user] loosens \the [src]'s casters.", \ " You have loosened \the [src]'s casters.", \ "You hear ratchet.") - anchored = 0 + anchored = FALSE if(istype(W, /obj/item/screwdriver)) if(!open) if(unlocked) - unlocked = 0 + unlocked = FALSE to_chat(user, "You screw the battery panel in place.") else - unlocked = 1 + unlocked = TRUE to_chat(user, "You unscrew the battery panel.") if(istype(W, /obj/item/crowbar)) if(unlocked) if(open) - open = 0 + open = FALSE overlays = null to_chat(user, "You crowbar the battery panel in place.") else if(unlocked) - open = 1 + open = TRUE to_chat(user, "You remove the battery panel.") if(istype(W, /obj/item/stock_parts/cell)) diff --git a/code/game/machinery/gameboard.dm b/code/game/machinery/gameboard.dm index 526a935cf90..ab93e69f36d 100644 --- a/code/game/machinery/gameboard.dm +++ b/code/game/machinery/gameboard.dm @@ -5,7 +5,7 @@ desc = "A holographic table allowing the crew to have fun(TM) on boring shifts! One player per board." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE var/cooling_down = 0 light_color = LIGHT_COLOR_LIGHTBLUE @@ -100,4 +100,4 @@ if(default_deconstruction_crowbar(I, ignore_panel = TRUE)) return else - return ..() \ No newline at end of file + return ..() diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index bda66a55622..405182d8874 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -40,7 +40,7 @@ var/list/holopads = list() desc = "It's a floor-mounted device for projecting holographic images." icon_state = "holopad0" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them. @@ -386,7 +386,8 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/proc/SetLightsAndPower() var/total_users = masters.len + LAZYLEN(holo_calls) - use_power = HOLOPAD_PASSIVE_POWER_USAGE + HOLOGRAM_POWER_USAGE * total_users + use_power = total_users > 0 ? ACTIVE_POWER_USE : IDLE_POWER_USE + active_power_usage = HOLOPAD_PASSIVE_POWER_USAGE + (HOLOGRAM_POWER_USAGE * total_users) if(total_users) set_light(2) icon_state = "holopad1" diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index 4958cdf60f6..713e29abf8a 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -41,7 +41,7 @@ var/id = null var/active = 0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 22d1177c437..87ec7974711 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -7,7 +7,7 @@ var/id = null var/on = 1.0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index fcf8de24ca5..6f080b8351b 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -100,7 +100,7 @@ Class Procs: layer = BELOW_OBJ_LAYER var/stat = 0 var/emagged = 0 - var/use_power = 1 + var/use_power = IDLE_POWER_USE //0 = dont run the auto //1 = run auto, use idle //2 = run auto, use active @@ -210,9 +210,9 @@ Class Procs: /obj/machinery/proc/auto_use_power() if(!powered(power_channel)) return 0 - if(use_power == 1) + if(use_power == IDLE_POWER_USE) use_power(idle_power_usage,power_channel, 1) - else if(use_power >= 2) + else if(use_power >= ACTIVE_POWER_USE) use_power(active_power_usage,power_channel, 1) return 1 diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 0ff8847a8d8..09774a6d600 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -13,7 +13,7 @@ level = 1 // underfloor layer = 2.5 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 50 var/freq = 1449 // radio frequency @@ -151,10 +151,10 @@ // Update power usage: if(on) - use_power = 2 + use_power = ACTIVE_POWER_USE active_power_usage = electricity_level*15 else - use_power = 0 + use_power = NO_POWER_USE // Overload conditions: @@ -199,7 +199,7 @@ icon_state = "airlock_control_standby" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 45 var/frequency = 1449 var/code = 0 @@ -404,26 +404,3 @@ rpath += copytext(path, i, i+1) // else, add to list // there doesn't HAVE to be separators but it makes paths syntatically visible - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 8021816cb40..8bc5976d638 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "mass_driver" anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 50 @@ -215,4 +215,4 @@ return src.dir = turn(src.dir, -90) - return \ No newline at end of file + return diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 43613ef4990..1b3dfe19001 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -87,15 +87,11 @@ var/obj/item/pipe/P = new (loc, pipe_type=p_type, dir=p_dir) P.update() P.add_fingerprint(usr) - wait = 1 - spawn(10) - wait = 0 + wait = world.time + 10 if(href_list["makemeter"]) - if(!wait) + if(wait < world.time) new /obj/item/pipe_meter(loc) - wait = 1 - spawn(15) - wait = 0 + wait = world.time + 15 if(href_list["makegsensor"]) if(!wait) new /obj/item/pipe_gsensor(loc) @@ -192,12 +188,10 @@ usr.set_machine(src) add_fingerprint(usr) - if(!wait) + if(wait < world.time) var/p_type = text2num(href_list["dmake"]) var/obj/structure/disposalconstruct/C = new(loc, p_type) if(p_type in list(PIPE_DISPOSALS_BIN, PIPE_DISPOSALS_OUTLET, PIPE_DISPOSALS_CHUTE)) C.density = TRUE C.add_fingerprint(usr) - wait = 1 - spawn(15) - wait = 0 + wait = world.time + 15 diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 9d44ac09231..53e406cf433 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -9,7 +9,7 @@ icon_state = "turretCover" anchored = 1 density = 0 - use_power = 1 //this turret uses and requires power + use_power = IDLE_POWER_USE //this turret uses and requires power idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power power_channel = EQUIP //drains power from the EQUIPMENT channel @@ -997,7 +997,7 @@ var/list/turret_icons syndicate = 1 installation = null always_up = 1 - use_power = 0 + use_power = NO_POWER_USE has_cover = 0 raised = 1 scan_range = 9 diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index fe46d2746c8..672402ac351 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/telescience.dmi' icon_state = "qpad-idle" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 200 active_power_usage = 5000 var/teleport_cooldown = 400 //30 seconds base due to base parts diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index abc8d137679..8c061800020 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -4,7 +4,7 @@ icon_state = "recharger0" desc = "A charging dock for energy based weaponry." anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 4 active_power_usage = 250 var/obj/item/charging = null @@ -48,7 +48,7 @@ return 1 G.forceMove(src) charging = G - use_power = 2 + use_power = ACTIVE_POWER_USE update_icon() else to_chat(user, "[src] isn't connected to anything!") @@ -66,7 +66,7 @@ charging.forceMove(loc) user.put_in_hands(charging) charging = null - use_power = 1 + use_power = IDLE_POWER_USE update_icon() /obj/machinery/recharger/attack_tk(mob/user) @@ -74,7 +74,7 @@ charging.update_icon() charging.forceMove(loc) charging = null - use_power = 1 + use_power = IDLE_POWER_USE update_icon() /obj/machinery/recharger/process() diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index f987b698772..7e3bafbdc39 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -4,7 +4,7 @@ icon_state = "borgcharger0" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 1000 var/mob/occupant = null @@ -109,8 +109,8 @@ /obj/machinery/recharge_station/Bumped(var/mob/AM) move_inside(AM) -/obj/machinery/recharge_station/allow_drop() - return 0 +/obj/machinery/recharge_station/AllowDrop() + return FALSE /obj/machinery/recharge_station/relaymove(mob/user as mob) if(user.stat) @@ -177,7 +177,7 @@ occupant.forceMove(loc) occupant = null build_icon() - use_power = 1 + use_power = IDLE_POWER_USE return /obj/machinery/recharge_station/proc/restock_modules() diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index f1e27be33fa..b655635ba1a 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -4,14 +4,14 @@ icon = 'icons/effects/effects.dmi' icon_state = "shield-old" density = 1 - opacity = 0 + opacity = FALSE anchored = 1 unacidable = 1 var/const/max_health = 200 var/health = max_health //The shield can only take so much beating (prevents perma-prisons) /obj/machinery/shield/New() - src.dir = pick(1,2,3,4) + dir = pick(NORTH, SOUTH, EAST, WEST) ..() /obj/machinery/shield/Initialize() @@ -19,7 +19,7 @@ ..() /obj/machinery/shield/Destroy() - opacity = 0 + opacity = FALSE density = 0 air_update_turf(1) return ..() @@ -30,43 +30,48 @@ move_update_air(T) /obj/machinery/shield/CanPass(atom/movable/mover, turf/target, height) - if(!height) return 0 - else return ..() + if(!height) + return FALSE + return ..() -/obj/machinery/shield/CanAtmosPass(var/turf/T) +/obj/machinery/shield/CanAtmosPass(turf/T) return !density -/obj/machinery/shield/attackby(obj/item/W as obj, mob/user as mob, params) - if(!istype(W)) return +/obj/machinery/shield/attackby(obj/item/I, mob/user, params) + if(!istype(I)) + return //Calculate damage - var/aforce = W.force - if(W.damtype == BRUTE || W.damtype == BURN) - src.health -= aforce + var/aforce = I.force + if(I.damtype == BRUTE || I.damtype == BURN) + health -= aforce //Play a fitting sound - playsound(src.loc, 'sound/effects/EMPulse.ogg', 75, 1) + playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1) - - if(src.health <= 0) + if(health <= 0) visible_message("The [src] dissipates") qdel(src) return - opacity = 1 - spawn(20) if(src) opacity = 0 + opacity = TRUE + spawn(20) + if(src) + opacity = FALSE ..() -/obj/machinery/shield/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/shield/bullet_act(obj/item/projectile/Proj) health -= Proj.damage ..() if(health <=0) visible_message("The [src] dissipates") qdel(src) return - opacity = 1 - spawn(20) if(src) opacity = 0 + opacity = TRUE + spawn(20) + if(src) + opacity = FALSE /obj/machinery/shield/ex_act(severity) switch(severity) @@ -79,7 +84,6 @@ if(3.0) if(prob(25)) qdel(src) - return /obj/machinery/shield/emp_act(severity) switch(severity) @@ -114,10 +118,10 @@ return //The shield becomes dense to absorb the blow.. purely asthetic. - opacity = 1 + opacity = TRUE spawn(20) if(src) - opacity = 0 + opacity = FALSE /obj/machinery/shieldgen @@ -126,17 +130,17 @@ icon = 'icons/obj/objects.dmi' icon_state = "shieldoff" density = 1 - opacity = 0 + opacity = FALSE anchored = 0 pressure_resistance = 2*ONE_ATMOSPHERE req_access = list(access_engine) var/const/max_health = 100 var/health = max_health var/active = 0 - var/malfunction = 0 //Malfunction causes parts of the shield to slowly dissapate + var/malfunction = FALSE //Malfunction causes parts of the shield to slowly dissapate var/list/deployed_shields = list() - var/is_open = 0 //Whether or not the wires are exposed - var/locked = 0 + var/is_open = FALSE //Whether or not the wires are exposed + var/locked = FALSE /obj/machinery/shieldgen/Destroy() QDEL_LIST(deployed_shields) @@ -145,9 +149,10 @@ /obj/machinery/shieldgen/proc/shields_up() - if(active) return 0 //If it's already turned on, how did this get called? + if(active) + return //If it's already turned on, how did this get called? - src.active = 1 + active = 1 update_icon() for(var/turf/target_tile in range(2, src)) @@ -156,9 +161,10 @@ deployed_shields += new /obj/machinery/shield(target_tile) /obj/machinery/shieldgen/proc/shields_down() - if(!active) return 0 //If it's already off, how did this get called? + if(!active) + return //If it's already off, how did this get called? - src.active = 0 + active = 0 update_icon() for(var/obj/machinery/shield/shield_tile in deployed_shields) @@ -173,7 +179,7 @@ /obj/machinery/shieldgen/proc/checkhp() if(health <= 30) - src.malfunction = 1 + malfunction = TRUE if(health <= 0) qdel(src) update_icon() @@ -182,28 +188,28 @@ /obj/machinery/shieldgen/ex_act(severity) switch(severity) if(1.0) - src.health -= 75 - src.checkhp() + health -= 75 + checkhp() if(2.0) - src.health -= 30 + health -= 30 if(prob(15)) - src.malfunction = 1 - src.checkhp() + malfunction = TRUE + checkhp() if(3.0) - src.health -= 10 - src.checkhp() + health -= 10 + checkhp() return /obj/machinery/shieldgen/emp_act(severity) switch(severity) if(1) - src.health /= 2 //cut health in half - malfunction = 1 - locked = pick(0,1) + health = health * 0.5 //cut health in half + malfunction = TRUE + locked = pick(TRUE, FALSE) if(2) if(prob(50)) - src.health *= 0.3 //chop off a third of the health - malfunction = 1 + health *= 0.3 //chop off a third of the health + malfunction = TRUE checkhp() /obj/machinery/shieldgen/attack_hand(mob/user as mob) @@ -214,70 +220,70 @@ to_chat(user, "The panel must be closed before operating this machine.") return - if(src.active) + if(active) user.visible_message("[bicon(src)] [user] deactivated the shield generator.", \ "[bicon(src)] You deactivate the shield generator.", \ "You hear heavy droning fade out.") - src.shields_down() + shields_down() else if(anchored) user.visible_message("[bicon(src)] [user] activated the shield generator.", \ "[bicon(src)] You activate the shield generator.", \ "You hear heavy droning.") - src.shields_up() + shields_up() else to_chat(user, "The device must first be secured to the floor.") - return -/obj/machinery/shieldgen/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/card/emag)) - malfunction = 1 +/obj/machinery/shieldgen/attackby(obj/item/I as obj, mob/user as mob, params) + if(istype(I, /obj/item/card/emag)) + malfunction = TRUE update_icon() - else if(istype(W, /obj/item/screwdriver)) - playsound(src.loc, W.usesound, 100, 1) + else if(isscrewdriver(I)) + playsound(loc, I.usesound, 100, 1) if(is_open) to_chat(user, "You close the panel.") - is_open = 0 + is_open = FALSE else to_chat(user, "You open the panel and expose the wiring.") - is_open = 1 + is_open = TRUE - else if(istype(W, /obj/item/stack/cable_coil) && malfunction && is_open) - var/obj/item/stack/cable_coil/coil = W + else if(istype(I, /obj/item/stack/cable_coil) && malfunction && is_open) + var/obj/item/stack/cable_coil/coil = I to_chat(user, "You begin to replace the wires.") - //if(do_after(user, min(60, round( ((maxhealth/health)*10)+(malfunction*10) ), target = src)) //Take longer to repair heavier damage if(do_after(user, 30 * coil.toolspeed, target = src)) - if(!src || !coil) return + if(!src || !coil) + return coil.use(1) health = max_health - malfunction = 0 + malfunction = TRUE playsound(loc, coil.usesound, 50, 1) to_chat(user, "You repair the [src]!") update_icon() - else if(istype(W, /obj/item/wrench)) + else if(istype(I, /obj/item/wrench)) if(locked) to_chat(user, "The bolts are covered, unlocking this would retract the covers.") return if(anchored) - playsound(src.loc, W.usesound, 100, 1) + playsound(loc, I.usesound, 100, 1) to_chat(user, "You unsecure the [src] from the floor!") if(active) to_chat(user, "The [src] shuts off!") - src.shields_down() + shields_down() anchored = 0 else - if(istype(get_turf(src), /turf/space)) return //No wrenching these in space! - playsound(src.loc, W.usesound, 100, 1) + if(istype(get_turf(src), /turf/space)) + return //No wrenching these in space! + playsound(loc, I.usesound, 100, 1) to_chat(user, "You secure the [src] to the floor!") anchored = 1 - else if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda)) - if(src.allowed(user)) - src.locked = !src.locked - to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") + else if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) + if(allowed(user)) + locked = !locked + to_chat(user, "The controls are now [locked ? "locked." : "unlocked."]") else to_chat(user, "Access denied.") @@ -287,11 +293,12 @@ /obj/machinery/shieldgen/update_icon() if(active) - src.icon_state = malfunction ? "shieldonbr":"shieldon" + icon_state = malfunction ? "shieldonbr":"shieldon" else - src.icon_state = malfunction ? "shieldoffbr":"shieldoff" + icon_state = malfunction ? "shieldoffbr":"shieldoff" return + ////FIELD GEN START //shameless copypasta from fieldgen, powersink, and grille #define maxstoredpower 500 /obj/machinery/shieldwallgen @@ -309,24 +316,24 @@ var/last_check = 0 var/check_delay = 10 var/recalc = 0 - var/locked = 1 + var/locked = TRUE var/destroyed = 0 var/directwired = 1 -// var/maxshieldload = 200 var/obj/structure/cable/attached // the attached cable var/storedpower = 0 flags = CONDUCT - use_power = 0 + use_power = NO_POWER_USE /obj/machinery/shieldwallgen/proc/power() if(!anchored) power = 0 return 0 - var/turf/T = src.loc + var/turf/T = loc var/obj/structure/cable/C = T.get_cable_node() var/datum/powernet/PN - if(C) PN = C.powernet // find the powernet of the connected cable + if(C) + PN = C.powernet // find the powernet of the connected cable if(!PN) power = 0 @@ -345,32 +352,33 @@ // message_admins("[PN.load]", 1) // use_power(250) //uses APC power -/obj/machinery/shieldwallgen/attack_hand(mob/user as mob) +/obj/machinery/shieldwallgen/attack_hand(mob/user) if(state != 1) to_chat(user, "The shield generator needs to be firmly secured to the floor first.") return 1 - if(src.locked && !istype(user, /mob/living/silicon)) + if(locked && !issilicon(user)) to_chat(user, "The controls are locked!") return 1 if(power != 1) to_chat(user, "The shield generator needs to be powered by wire underneath.") return 1 - if(src.active >= 1) - src.active = 0 + if(active >= 1) + active = 0 icon_state = "Shield_Gen" user.visible_message("[user] turned the shield generator off.", \ "You turn off the shield generator.", \ "You hear heavy droning fade out.") - for(var/dir in list(1,2,4,8)) src.cleanup(dir) + for(var/dir in list(NORTH, SOUTH, EAST, WEST)) + cleanup(dir) else - src.active = 1 + active = 1 icon_state = "Shield_Gen +a" user.visible_message("[user] turned the shield generator on.", \ "You turn on the shield generator.", \ "You hear heavy droning.") - src.add_fingerprint(user) + add_fingerprint(user) /obj/machinery/shieldwallgen/process() spawn(100) @@ -381,12 +389,10 @@ storedpower = maxstoredpower if(storedpower <= 0) storedpower = 0 -// if(shieldload >= maxshieldload) //there was a loop caused by specifics of process(), so this was needed. -// shieldload = maxshieldload - if(src.active == 1) - if(!src.state == 1) - src.active = 0 + if(active == 1) + if(!state == 1) + active = 0 return spawn(1) setup_field(1) @@ -396,18 +402,19 @@ setup_field(4) spawn(4) setup_field(8) - src.active = 2 - if(src.active >= 1) - if(src.power == 0) - src.visible_message("The [src.name] shuts down due to lack of power!", \ + active = 2 + if(active >= 1) + if(power == 0) + visible_message("The [name] shuts down due to lack of power!", \ "You hear heavy droning fade out") icon_state = "Shield_Gen" - src.active = 0 - for(var/dir in list(1,2,4,8)) src.cleanup(dir) + active = 0 + for(var/dir in list(NORTH, SOUTH, EAST, WEST)) + cleanup(dir) -/obj/machinery/shieldwallgen/proc/setup_field(var/NSEW = 0) - var/turf/T = src.loc - var/turf/T2 = src.loc +/obj/machinery/shieldwallgen/proc/setup_field(NSEW = 0) + var/turf/T = loc + var/turf/T2 = loc var/obj/machinery/shieldwallgen/G var/steps = 0 var/oNSEW = 0 @@ -439,7 +446,7 @@ if(isnull(G)) return - T2 = src.loc + T2 = loc for(var/dist = 0, dist < steps, dist += 1) // creates each field tile var/field_dir = get_dir(T2,get_step(T2, NSEW)) @@ -450,30 +457,30 @@ CF.dir = field_dir -/obj/machinery/shieldwallgen/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) +/obj/machinery/shieldwallgen/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/wrench)) if(active) to_chat(user, "Turn off the field generator first.") return else if(state == 0) state = 1 - playsound(src.loc, W.usesound, 75, 1) + playsound(loc, I.usesound, 75, 1) to_chat(user, "You secure the external reinforcing bolts to the floor.") - src.anchored = 1 + anchored = 1 return else if(state == 1) state = 0 - playsound(src.loc, W.usesound, 75, 1) + playsound(loc, I.usesound, 75, 1) to_chat(user, "You undo the external reinforcing bolts.") - src.anchored = 0 + anchored = 0 return - if(istype(W, /obj/item/card/id)||istype(W, /obj/item/pda)) - if(src.allowed(user)) - src.locked = !src.locked - to_chat(user, "Controls are now [src.locked ? "locked." : "unlocked."]") + if(istype(I, /obj/item/card/id)||istype(I, /obj/item/pda)) + if(allowed(user)) + locked = !locked + to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]") else to_chat(user, "Access denied.") @@ -481,18 +488,19 @@ add_fingerprint(user) ..() -/obj/machinery/shieldwallgen/proc/cleanup(var/NSEW) +/obj/machinery/shieldwallgen/proc/cleanup(NSEW) var/obj/machinery/shieldwall/F var/obj/machinery/shieldwallgen/G - var/turf/T = src.loc - var/turf/T2 = src.loc + var/turf/T = loc + var/turf/T2 = loc for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for fields T = get_step(T2, NSEW) T2 = T if(locate(/obj/machinery/shieldwall) in T) F = (locate(/obj/machinery/shieldwall) in T) - qdel(F) + if(F.gen_primary == src || F.gen_secondary == src) + qdel(F) if(locate(/obj/machinery/shieldwallgen) in T) G = (locate(/obj/machinery/shieldwallgen) in T) @@ -500,19 +508,19 @@ break /obj/machinery/shieldwallgen/Destroy() - src.cleanup(1) - src.cleanup(2) - src.cleanup(4) - src.cleanup(8) + cleanup(1) + cleanup(2) + cleanup(4) + cleanup(8) return ..() -/obj/machinery/shieldwallgen/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/shieldwallgen/bullet_act(obj/item/projectile/Proj) storedpower -= Proj.damage ..() return -//////////////Containment Field START +////////////// Containment Field START /obj/machinery/shieldwall name = "Shield" desc = "An energy shield." @@ -524,21 +532,20 @@ luminosity = 3 var/needs_power = 0 var/active = 1 -// var/power = 10 var/delay = 5 var/last_active var/mob/U var/obj/machinery/shieldwallgen/gen_primary var/obj/machinery/shieldwallgen/gen_secondary -/obj/machinery/shieldwall/New(var/obj/machinery/shieldwallgen/A, var/obj/machinery/shieldwallgen/B) +/obj/machinery/shieldwall/New(obj/machinery/shieldwallgen/A, obj/machinery/shieldwallgen/B) ..() - src.gen_primary = A - src.gen_secondary = B + gen_primary = A + gen_secondary = B if(A && B) needs_power = 1 -/obj/machinery/shieldwall/attack_hand(mob/user as mob) +/obj/machinery/shieldwall/attack_hand(mob/user) return /obj/machinery/shieldwall/rpd_blocksusage() @@ -553,14 +560,14 @@ if(!(gen_primary.active)||!(gen_secondary.active)) qdel(src) return -// + if(prob(50)) gen_primary.storedpower -= 10 else gen_secondary.storedpower -=10 -/obj/machinery/shieldwall/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/shieldwall/bullet_act(obj/item/projectile/Proj) if(needs_power) var/obj/machinery/shieldwallgen/G if(prob(50)) @@ -600,7 +607,8 @@ /obj/machinery/shieldwall/CanPass(atom/movable/mover, turf/target, height=0) - if(height==0) return 1 + if(height == 0) + return TRUE if(istype(mover) && mover.checkpass(PASSGLASS)) return prob(20) @@ -608,7 +616,7 @@ if(istype(mover, /obj/item/projectile)) return prob(10) else - return !src.density + return !density /obj/machinery/shieldwall/syndicate diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 994e27194f0..fa99ecf8951 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -18,7 +18,6 @@ account = get_card_account(user.get_active_hand()) else account = null - ui_interact(user) /obj/machinery/slot_machine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) @@ -30,81 +29,78 @@ /obj/machinery/slot_machine/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) var/data[0] - data["working"] = working data["money"] = account ? account.money : null data["plays"] = plays data["result"] = result data["resultlvl"] = resultlvl - return data /obj/machinery/slot_machine/Topic(href, href_list) add_fingerprint(usr) if(href_list["ops"]) - var/operation = text2num(href_list["ops"]) - if(operation == 1) // Play - if(working == 1) + if(text2num(href_list["ops"])) // Play + if(working) return if(!account || account.money < 10) return if(!account.charge(10, null, "Bet", "Slot Machine", "Slot Machine")) return - plays += 1 + plays++ working = 1 icon_state = "slots-on" - var/roll = rand(1,4050) playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - spawn(25) - if(roll == 1) - visible_message("[src] says, 'JACKPOT! [usr.name] has won a MILLION CREDITS!'") - event_announcement.Announce("Congratulations to [usr.name] on winning the Jackpot of ONE MILLION CREDITS!", "Jackpot Winner") - result = "JACKPOT! You win one million credits!" - resultlvl = "highlight" - win_money(1000000, 'sound/goonstation/misc/airraid_loop.ogg') - else if(roll > 1 && roll <= 5) - visible_message("[src] says, 'Big Winner! [usr.name] has won a hundred thousand credits!'") - event_announcement.Announce("Congratulations to [usr.name] on winning a hundred thousand credits!", "Big Winner") - result = "Big Winner! You win a hundred thousand credits!" - resultlvl = "good" - win_money(100000, 'sound/goonstation/misc/klaxon.ogg') - else if(roll > 5 && roll <= 50) - visible_message("[src] says, 'Big Winner! [usr.name] has won ten thousand credits!'") - result = "You win ten thousand credits!" - resultlvl = "good" - win_money(10000, 'sound/goonstation/misc/klaxon.ogg') - else if(roll > 50 && roll <= 100) - visible_message("[src] says, 'Winner! [usr.name] has won a thousand credits!'") - result = "You win a thousand credits!" - resultlvl = "good" - win_money(1000, 'sound/goonstation/misc/bell.ogg') - else if(roll > 100 && roll <= 200) - visible_message("[src] says, 'Winner! [usr.name] has won a hundred credits!'") - result = "You win a hundred credits!" - resultlvl = "good" - win_money(100, 'sound/goonstation/misc/bell.ogg') - else if(roll > 200 && roll <= 300) - visible_message("[src] says, 'Winner! [usr.name] has won fifty credits!'") - result = "You win fifty credits!" - resultlvl = "good" - win_money(50) - else if(roll > 300 && roll <= 1000) - visible_message("[src] says, 'Winner! [usr.name] has won ten credits!'") - result = "You win ten credits!" - resultlvl = "good" - win_money(10) - else - result = "No luck!" - resultlvl = "average" - working = 0 - icon_state = "slots-off" + addtimer(CALLBACK(src, .proc/spin_slots, usr.name), 25) + +/obj/machinery/slot_machine/proc/spin_slots(userName) + switch(rand(1,4050)) + if(1) + atom_say("JACKPOT! [userName] has won a MILLION CREDITS!") + event_announcement.Announce("Congratulations to [userName] on winning the Jackpot of ONE MILLION CREDITS!", "Jackpot Winner") + result = "JACKPOT! You win one million credits!" + resultlvl = "highlight" + win_money(1000000, 'sound/goonstation/misc/airraid_loop.ogg') + if(2 to 5) + atom_say("Big Winner! [userName] has won a hundred thousand credits!") + event_announcement.Announce("Congratulations to [userName] on winning a hundred thousand credits!", "Big Winner") + result = "Big Winner! You win a hundred thousand credits!" + resultlvl = "good" + win_money(100000, 'sound/goonstation/misc/klaxon.ogg') + if(6 to 50) + atom_say("Big Winner! [userName] has won ten thousand credits!") + result = "You win ten thousand credits!" + resultlvl = "good" + win_money(10000, 'sound/goonstation/misc/klaxon.ogg') + if(51 to 100) + atom_say("Winner! [userName] has won a thousand credits!") + result = "You win a thousand credits!" + resultlvl = "good" + win_money(1000, 'sound/goonstation/misc/bell.ogg') + if(101 to 200) + atom_say("Winner! [userName] has won a hundred credits!") + result = "You win a hundred credits!" + resultlvl = "good" + win_money(100, 'sound/goonstation/misc/bell.ogg') + if(201 to 300) + atom_say("Winner! [userName] has won fifty credits!") + result = "You win fifty credits!" + resultlvl = "good" + win_money(50) + if(301 to 1000) + atom_say("Winner! [userName] has won ten credits!") + result = "You win ten credits!" + resultlvl = "good" + win_money(10) + else + result = "No luck!" + resultlvl = "average" + working = 0 + icon_state = "slots-off" /obj/machinery/slot_machine/proc/win_money(amt, sound='sound/machines/ping.ogg') if(sound) playsound(loc, sound, 55, 1) - if(!account) return - - account.credit(amt, "Slot Winnings", "Slot Machine", account.owner_name) + account.credit(amt, "Slot Winnings", "Slot Machine", account.owner_name) \ No newline at end of file diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index ebf3cfeadf9..94d0921b946 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -16,7 +16,7 @@ name = "status display" anchored = 1 density = 0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 var/mode = 1 // 0 = Blank // 1 = Shuttle timer @@ -280,4 +280,4 @@ #undef FONT_COLOR #undef WARNING_FONT_COLOR #undef FONT_STYLE -#undef SCROLL_SPEED \ No newline at end of file +#undef SCROLL_SPEED diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 64e387fb731..10451c758be 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -15,7 +15,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept desc = "A dish-shaped machine used to broadcast processed subspace signals." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 25 machinetype = 5 circuitboard = /obj/item/circuitboard/telecomms/broadcaster @@ -113,7 +113,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept desc = "A compact machine used for portable subspace telecommuniations processing." density = 1 anchored = 1 - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 0 machinetype = 6 var/intercept = 0 // if nonzero, broadcasts all messages to syndicate channel @@ -167,15 +167,15 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept old_type = SYNDICATE_RADIO_TYPE if(new_freq == antag_freq) new_type = SYNDICATE_RADIO_TYPE - + for(var/cent_freq in CENT_FREQS) if(old_freq == cent_freq) old_type = CENTCOMM_RADIO_TYPE if(new_freq == cent_freq) new_type = CENTCOMM_RADIO_TYPE - + return new_type > old_type - + /** Here is the big, bad function that broadcasts a message given the appropriate @@ -246,11 +246,11 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/bad_connection = FALSE var/datum/radio_frequency/new_connection = connection - + if(connection.frequency != display_freq) bad_connection = Is_Bad_Connection(connection.frequency, display_freq) new_connection = radio_controller.return_frequency(display_freq) - + var/list/obj/item/radio/radios = list() // --- Broadcast only to intercom devices --- diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index 44403c6bf1d..ed8c531720b 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -65,31 +65,31 @@ i++ // If the log is a speech file if(C.input_type == "Speech File") - dat += "
  • [C.name] \[X\]
    " + dat += "
  • [C.name] \[X\]
    " // -- If the orator is a human, or universal translate is active, OR mob has universal speech on -- if(user.say_understands(null, C.parameters["language"]) || universal_translate || C.parameters["uspeech"]) - dat += "Data type: [C.input_type]
    " - dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
    " - dat += "Class: [C.parameters["race"]]
    " - dat += "Contents: \"[C.parameters["message"]]\"
    " + dat += "Data type: [C.input_type]
    " + dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
    " + dat += "Class: [C.parameters["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: [C.parameters["race"]]
    " - dat += "Contents: Unintelligble
    " + dat += "Data type: Audio File
    " + dat += "Source: Unidentifiable
    " + dat += "Class: [C.parameters["race"]]
    " + dat += "Contents: Unintelligble
    " dat += "

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

  • " @@ -131,7 +131,7 @@ if("scan") if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" else for(var/obj/machinery/telecomms/server/T in range(25, src)) @@ -139,9 +139,9 @@ servers.Add(T) if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" screen = 0 @@ -155,13 +155,13 @@ var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(href_list["delete"])] - temp = "- DELETED ENTRY: [D.name] -" + temp = "- DELETED ENTRY: [D.name] -" SelectedServer.log_entries.Remove(D) qdel(D) else - temp = "- FAILED: NO SELECTED MACHINE -" + temp = "- FAILED: NO SELECTED MACHINE -" if(href_list["network"]) @@ -169,14 +169,14 @@ if(newnet && ((usr in range(1, src) || issilicon(usr)))) if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" else network = newnet screen = 0 servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" updateUsrDialog() return diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 24e0c51a2b7..16113f5bcfe 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -222,7 +222,7 @@ /obj/machinery/telecomms/processor/Options_Topic(href, href_list) if(href_list["process"]) - temp = "-% Processing mode changed. %-" + temp = "-% Processing mode changed. %-" src.process_mode = !src.process_mode */ @@ -240,18 +240,18 @@ if(href_list["receive"]) receiving = !receiving - temp = "-% Receiving mode changed. %-" + temp = "-% Receiving mode changed. %-" if(href_list["broadcast"]) broadcasting = !broadcasting - temp = "-% Broadcasting mode changed. %-" + temp = "-% Broadcasting mode changed. %-" if(href_list["change_listening"]) //Lock to the station OR lock to the current position! //You need at least two receivers and two broadcasters for this to work, this includes the machine. var/result = toggle_level() if(result) - temp = "-% [src]'s signal has been successfully changed." + temp = "-% [src]'s signal has been successfully changed." else - temp = "-% [src] could not lock it's signal onto the station. Two broadcasters or receivers required." + temp = "-% [src] could not lock it's signal onto the station. Two broadcasters or receivers required." // BUS @@ -270,10 +270,10 @@ newfreq *= 10 // shift the decimal one place if(newfreq < 10000) change_frequency = newfreq - temp = "-% New frequency to change to assigned: \"[newfreq] GHz\" %-" + temp = "-% New frequency to change to assigned: \"[newfreq] GHz\" %-" else change_frequency = 0 - temp = "-% Frequency changing deactivated %-" + temp = "-% Frequency changing deactivated %-" /obj/machinery/telecomms/Topic(href, href_list) @@ -293,27 +293,27 @@ if("toggle") src.toggled = !src.toggled - temp = "-% [src] has been [src.toggled ? "activated" : "deactivated"]." + temp = "-% [src] has been [src.toggled ? "activated" : "deactivated"]." update_power() /* if("hide") src.hide = !hide - temp = "-% Shadow Link has been [src.hide ? "activated" : "deactivated"]." + temp = "-% Shadow Link has been [src.hide ? "activated" : "deactivated"]." */ if("id") var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID for this machine", src, id) as null|text),1,MAX_MESSAGE_LEN) if(newid && canAccess(usr)) id = newid - temp = "-% New ID assigned: \"[id]\" %-" + temp = "-% New ID assigned: \"[id]\" %-" if("network") var/newnet = input(usr, "Specify the new network for this machine. This will break all current links.", src, network) as null|text if(newnet && canAccess(usr)) if(length(newnet) > 15) - temp = "-% Too many characters in new network tag %-" + temp = "-% Too many characters in new network tag %-" else for(var/obj/machinery/telecomms/T in links) @@ -321,7 +321,7 @@ network = newnet links = list() - temp = "-% New network tag assigned: \"[network]\" %-" + temp = "-% New network tag assigned: \"[network]\" %-" if("freq") @@ -331,21 +331,21 @@ newfreq *= 10 // shift the decimal one place if(!(newfreq in freq_listening) && newfreq < 10000) freq_listening.Add(newfreq) - temp = "-% New frequency filter assigned: \"[newfreq] GHz\" %-" + temp = "-% New frequency filter assigned: \"[newfreq] GHz\" %-" if(href_list["delete"]) // changed the layout about to workaround a pesky runtime -- Doohl var/x = text2num(href_list["delete"]) - temp = "-% Removed frequency filter [x] %-" + temp = "-% Removed frequency filter [x] %-" freq_listening.Remove(x) if(href_list["unlink"]) if(text2num(href_list["unlink"]) <= length(links)) var/obj/machinery/telecomms/T = links[text2num(href_list["unlink"])] - temp = "-% Removed \ref[T] [T.name] from linked entities. %-" + temp = "-% Removed \ref[T] [T.name] from linked entities. %-" // Remove link entries from both T and src. @@ -363,20 +363,20 @@ if(!(P.buffer in src.links)) src.links.Add(P.buffer) - temp = "-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-" + temp = "-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-" else - temp = "-% Unable to acquire buffer %-" + temp = "-% Unable to acquire buffer %-" if(href_list["buffer"]) P.buffer = src - temp = "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-" + temp = "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-" if(href_list["flush"]) - temp = "-% Buffer successfully flushed. %-" + temp = "-% Buffer successfully flushed. %-" P.buffer = null src.Options_Topic(href, href_list) diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index 8cf29f6b8db..0a12b637a39 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -35,7 +35,7 @@ hide = 1 toggled = 1 //anchored = 1 - use_power = 0 + use_power = NO_POWER_USE //idle_power_usage = 0 autolinkers = list("c_relay") @@ -51,7 +51,7 @@ /obj/machinery/telecomms/hub/preset_cent id = "CentComm Hub" network = "tcommsat" - use_power = 0 + use_power = NO_POWER_USE autolinkers = list("hub_cent", "c_relay", "s_relay", "m_relay", "r_relay", "e_relay", "centcomm", "receiverCent", "broadcasterCent") @@ -83,7 +83,7 @@ /obj/machinery/telecomms/receiver/preset_cent id = "CentComm Receiver" network = "tcommsat" - use_power = 0 + use_power = NO_POWER_USE autolinkers = list("receiverCent") freq_listening = list(ERT_FREQ, DTH_FREQ) @@ -121,7 +121,7 @@ /obj/machinery/telecomms/bus/preset_cent id = "CentComm Bus" network = "tcommsat" - use_power = 0 + use_power = NO_POWER_USE freq_listening = list(ERT_FREQ, DTH_FREQ) autolinkers = list("processorCent", "centcomm") @@ -150,7 +150,7 @@ /obj/machinery/telecomms/processor/preset_cent id = "CentComm Processor" network = "tcommsat" - use_power = 0 + use_power = NO_POWER_USE autolinkers = list("processorCent") //Servers @@ -208,7 +208,7 @@ /obj/machinery/telecomms/server/presets/centcomm id = "CentComm Server" freq_listening = list(ERT_FREQ, DTH_FREQ) - use_power = 0 + use_power = NO_POWER_USE autolinkers = list("centcomm") //Broadcasters @@ -230,5 +230,5 @@ /obj/machinery/telecomms/broadcaster/preset_cent id = "CentComm Broadcaster" network = "tcommsat" - use_power = 0 - autolinkers = list("broadcasterCent") \ No newline at end of file + use_power = NO_POWER_USE + autolinkers = list("broadcasterCent") diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 0b9b1449137..c74d5364919 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -195,7 +195,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "This machine has a dish-like shape and green lights. It is designed to detect and process subspace radio activity." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 30 machinetype = 1 circuitboard = /obj/item/circuitboard/telecomms/receiver @@ -251,7 +251,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "A mighty piece of hardware used to send/receive massive amounts of data." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 80 machinetype = 7 circuitboard = /obj/item/circuitboard/telecomms/hub @@ -285,7 +285,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "A mighty piece of hardware used to send massive amounts of data far away." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 30 machinetype = 8 circuitboard = /obj/item/circuitboard/telecomms/relay @@ -336,7 +336,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "A mighty piece of hardware used to send massive amounts of data quickly." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 50 machinetype = 2 circuitboard = /obj/item/circuitboard/telecomms/bus @@ -388,7 +388,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "This machine is used to process large quantities of information." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 30 machinetype = 3 circuitboard = /obj/item/circuitboard/telecomms/processor @@ -425,7 +425,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "A machine used to store data and network statistics." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 15 machinetype = 4 circuitboard = /obj/item/circuitboard/telecomms/server diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index 84f3c6a47f3..93c8da26253 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -92,7 +92,7 @@ if("probe") if(machinelist.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" else for(var/obj/machinery/telecomms/T in range(25, src)) @@ -100,9 +100,9 @@ machinelist.Add(T) if(!machinelist.len) - temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" + temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" else - temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" + temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" screen = 0 @@ -112,13 +112,13 @@ var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text if(newnet && ((usr in range(1, src) || issilicon(usr)))) if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" else network = newnet screen = 0 machinelist = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" updateUsrDialog() return diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index 45f0817ef55..28a2809e5b4 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -301,7 +301,7 @@ if("scan") if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" else for(var/obj/machinery/telecomms/server/T in range(25, src)) @@ -309,9 +309,9 @@ servers.Add(T) if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" screen = 0 @@ -333,14 +333,14 @@ if(newnet && canAccess(user)) if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" else network = newnet screen = 0 servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" updateUsrDialog() diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 702d1eee8a2..53148d9de6d 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -269,7 +269,7 @@ desc = "It's the hub of a teleporting machine." icon_state = "tele0" var/accurate = 0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 2000 var/obj/machinery/teleport/station/power_station @@ -389,7 +389,7 @@ desc = "A teleporter with the target pre-set on the circuit board." icon_state = "tele0" var/recalibrating = 0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 2000 @@ -466,7 +466,7 @@ desc = "The power control station for a bluespace teleporter." icon_state = "controller" var/engaged = 0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 2000 var/obj/machinery/computer/teleporter/teleporter_console diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index d7c1465fbb9..3b911bb25c2 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -43,7 +43,7 @@ var/icon_deny //Icon_state when denying access // Power - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 var/vend_power_usage = 150 @@ -386,9 +386,8 @@ // empty at high security levels if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) var/attempt_pin = input("Enter pin code", "Vendor transaction") as num - customer_account = attempt_account_access(customer_account, attempt_pin, 2) - - if(!customer_account) + + if(!attempt_account_access(customer_account.account_number, attempt_pin, 2)) src.status_message = "Unable to access account: incorrect credentials." src.status_error = 1 return 0 @@ -1224,7 +1223,7 @@ /obj/item/reagent_containers/food/condiment/pack/hotsauce = 5, /obj/item/reagent_containers/food/condiment/saltshaker =5, /obj/item/reagent_containers/food/condiment/peppermill =5, - /obj/item/whetstone = 2, + /obj/item/whetstone = 2, /obj/item/mixing_bowl = 10, /obj/item/kitchen/mould/bear = 1, /obj/item/kitchen/mould/worm = 1, /obj/item/kitchen/mould/bean = 1, /obj/item/kitchen/mould/ball = 1, /obj/item/kitchen/mould/cane = 1, /obj/item/kitchen/mould/cash = 1, diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index a9d4b4008b6..9e3369f1af9 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -41,8 +41,8 @@ var/inject_amount = 10 salvageable = 0 -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/allow_drop() - return 0 +/obj/item/mecha_parts/mecha_equipment/medical/sleeper/AllowDrop() + return FALSE /obj/item/mecha_parts/mecha_equipment/medical/sleeper/Destroy() for(var/atom/movable/AM in src) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index d0af747dc64..65118f8c491 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -5,7 +5,7 @@ desc = "Nothing is being built." density = TRUE anchored = TRUE - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 20 active_power_usage = 5000 var/time_coeff = 1 @@ -151,10 +151,10 @@ GET_COMPONENT(materials, /datum/component/material_container) materials.use_amount(res_coef) overlays += "fab-active" - use_power = 2 + use_power = ACTIVE_POWER_USE updateUsrDialog() sleep(get_construction_time_w_coeff(D)) - use_power = 1 + use_power = IDLE_POWER_USE overlays -= "fab-active" desc = initial(desc) @@ -461,7 +461,20 @@ "Pod_Parts", "Pod_Frame", "Misc") + req_access = list(access_mechanic) + +/obj/machinery/mecha_part_fabricator/spacepod/New() + ..() + QDEL_LIST(component_parts) + component_parts = list() + component_parts += new /obj/item/circuitboard/podfab(null) + component_parts += new /obj/item/stock_parts/matter_bin(null) + component_parts += new /obj/item/stock_parts/matter_bin(null) + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/micro_laser(null) + component_parts += new /obj/item/stock_parts/console_screen(null) + RefreshParts() /obj/machinery/mecha_part_fabricator/robot name = "Robotic Fabricator" - part_sets = list("Cyborg") \ No newline at end of file + part_sets = list("Cyborg") diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index a2fa4220c3c..dd7993247b1 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -165,8 +165,6 @@ to_chat(user, "[bicon(ME)] [ME]") -/obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits. - return /obj/mecha/hear_talk(mob/M, text) if(M == occupant && radio.broadcasting) diff --git a/code/game/objects/items/devices/autopsy.dm b/code/game/objects/items/devices/autopsy.dm index daaa90a2664..929d7372752 100644 --- a/code/game/objects/items/devices/autopsy.dm +++ b/code/game/objects/items/devices/autopsy.dm @@ -146,7 +146,7 @@ if(damaging_weapon) scan_data += "Severity: [damage_desc]
    " scan_data += "Hits by weapon: [total_hits]
    " - scan_data += "Approximate time of wound infliction: [station_time(age)]
    " + scan_data += "Approximate time of wound infliction: [station_time_timestamp("hh:mm", age)]
    " scan_data += "Affected limbs: [D.organ_names]
    " scan_data += "Possible weapons:
    " for(var/weapon_name in weapon_chances) diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 9cde3e9aa6d..175ca0886ad 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -65,7 +65,7 @@ spamcheck = 0 /obj/item/megaphone/proc/saymsg(mob/living/user as mob, message) - audible_message("[user] broadcasts, \"[message]\"", hearing_distance = 14) + audible_message("[user.GetVoice()] [user.GetAltName()] broadcasts, \"[message]\"", hearing_distance = 14) log_say(message, user) for(var/obj/O in oview(14, get_turf(src))) O.hear_talk(user, "[message]") diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 687e2fa9dce..8128e1f44d4 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -45,15 +45,16 @@ name = "station intercom (Security)" frequency = SEC_I_FREQ -/obj/item/radio/intercom/New(turf/loc, var/ndir = 0, var/building = 3) +/obj/item/radio/intercom/New(turf/loc, ndir, building = 3) ..() buildstage = building if(buildstage) processing_objects.Add(src) else - pixel_x = (ndir & 3)? 0 : (ndir == 4 ? 28 : -28) - pixel_y = (ndir & 3)? (ndir ==1 ? 28 : -28) : 0 - dir=ndir + if(ndir) + pixel_x = (ndir & EAST|WEST) ? (ndir == EAST ? 28 : -28) : 0 + pixel_y = (ndir & NORTH|SOUTH) ? (ndir == NORTH ? 28 : -28) : 0 + dir=ndir b_stat=1 on = 0 global_intercoms.Add(src) diff --git a/code/game/objects/items/mixing_bowl.dm b/code/game/objects/items/mixing_bowl.dm new file mode 100644 index 00000000000..1edfdac9561 --- /dev/null +++ b/code/game/objects/items/mixing_bowl.dm @@ -0,0 +1,170 @@ + +/obj/item/mixing_bowl + name = "mixing bowl" + desc = "Mixing it up in the kitchen." + flags = OPENCONTAINER + icon = 'icons/obj/kitchen.dmi' + icon_state = "mixing_bowl" + var/max_n_of_items = 25 + var/dirty = FALSE + var/clean_icon = "mixing_bowl" + var/dirty_icon = "mixing_bowl_dirty" + +/obj/item/mixing_bowl/New() + ..() + create_reagents(100) + +/obj/item/mixing_bowl/attackby(obj/item/I, mob/user, params) + if(dirty) + if(istype(I, /obj/item/soap)) + user.visible_message("[user] starts to scrub [src].", "You start to scrub [src].") + if(do_after(user, 20 * I.toolspeed, target = src)) + clean() + user.visible_message("[user] has scrubbed [src] clean.", "You have scrubbed [src] clean.") + return 1 + else + to_chat(user, "You should clean [src] before you use it for food prep.") + return 0 + if(is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_MICROWAVE]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_GRILL]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_OVEN]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_CANDY])) + if(contents.len>=max_n_of_items) + to_chat(user, "This [src] is full of ingredients, you cannot put more.") + return 1 + if(istype(I, /obj/item/stack)) + var/obj/item/stack/S = I + if(S.amount > 1) + var/obj/item/stack/to_add = S.split(user, 1) + to_add.forceMove(src) + user.visible_message("[user] adds one of [S] to [src].", "You add one of [S] to [src].") + else + return add_item(S, user) + else + return add_item(I, user) + else if(is_type_in_list(I, list(/obj/item/reagent_containers/glass, /obj/item/reagent_containers/food/drinks, /obj/item/reagent_containers/food/condiment))) + if(!I.reagents) + return 1 + for(var/datum/reagent/R in I.reagents.reagent_list) + if(!(R.id in GLOB.cooking_reagents[RECIPE_MICROWAVE]) && !(R.id in GLOB.cooking_reagents[RECIPE_GRILL]) && !(R.id in GLOB.cooking_reagents[RECIPE_OVEN]) && !(R.id in GLOB.cooking_reagents[RECIPE_CANDY])) + to_chat(user, "Your [I] contains components unsuitable for cookery.") + return 1 + else + to_chat(user, "You have no idea what you can cook with [I].") + return 1 + +/obj/item/mixing_bowl/proc/add_item(obj/item/I, mob/user) + if(!user.drop_item()) + to_chat(user, "\The [I] is stuck to your hand, you cannot put it in [src]") + //return 0 + else + I.forceMove(src) + user.visible_message("[user] adds [I] to [src].", "You add [I] to [src].") + +/obj/item/mixing_bowl/attack_self(mob/user) + var/dat = "" + if(dirty) + dat = {"This [src] is dirty!
    Please clean it before use!
    "} + else + var/list/items_counts = new + var/list/items_measures = new + var/list/items_measures_p = new + for(var/obj/O in contents) + var/display_name = O.name + if(istype(O,/obj/item/reagent_containers/food/snacks/egg)) + items_measures[display_name] = "egg" + items_measures_p[display_name] = "eggs" + if(istype(O,/obj/item/reagent_containers/food/snacks/tofu)) + items_measures[display_name] = "tofu chunk" + items_measures_p[display_name] = "tofu chunks" + if(istype(O,/obj/item/reagent_containers/food/snacks/meat)) //any meat + items_measures[display_name] = "slab of meat" + items_measures_p[display_name] = "slabs of meat" + if(istype(O,/obj/item/reagent_containers/food/snacks/donkpocket)) + display_name = "Turnovers" + items_measures[display_name] = "turnover" + items_measures_p[display_name] = "turnovers" + if(istype(O,/obj/item/reagent_containers/food/snacks/carpmeat)) + items_measures[display_name] = "fillet of meat" + items_measures_p[display_name] = "fillets of meat" + items_counts[display_name]++ + for(var/O in items_counts) + var/N = items_counts[O] + if(!(O in items_measures)) + dat += {"[capitalize(O)]: [N] [lowertext(O)]\s
    "} + else + if(N==1) + dat += {"[capitalize(O)]: [N] [items_measures[O]]
    "} + else + dat += {"[capitalize(O)]: [N] [items_measures_p[O]]
    "} + + for(var/datum/reagent/R in reagents.reagent_list) + var/display_name = R.name + if(R.id == "capsaicin") + display_name = "Hotsauce" + if(R.id == "frostoil") + display_name = "Coldsauce" + dat += {"[display_name]: [R.volume] unit\s
    "} + + if(items_counts.len==0 && reagents.reagent_list.len==0) + dat = {"The [src] is empty
    "} + else + dat = {"Ingredients:
    [dat]"} + dat += {"

    Eject ingredients!
    "} + + var/datum/browser/popup = new(user, name, name, 400, 400) + popup.set_content(dat) + popup.open(0) + onclose(user, "[name]") + return + +/obj/item/mixing_bowl/Topic(href, href_list) + if(..()) + return + if("dispose") + dispose() + return + +/obj/item/mixing_bowl/proc/dispose() + for(var/obj/O in contents) + O.forceMove(loc) + if(reagents.total_volume) + make_dirty(5) + reagents.clear_reagents() + to_chat(usr, "You dispose of [src]'s contents.") + updateUsrDialog() + +/obj/item/mixing_bowl/proc/make_dirty(chance) + if(!chance) + return + if(prob(chance)) + dirty = TRUE + flags = null + icon_state = dirty_icon + +/obj/item/mixing_bowl/proc/clean() + dirty = FALSE + flags = OPENCONTAINER + icon_state = clean_icon + +/obj/item/mixing_bowl/wash(mob/user, atom/source) + if(..()) + clean() + +/obj/item/mixing_bowl/proc/fail(obj/source) + if(!source) + source = src + var/amount = 0 + for(var/obj/O in contents) + amount++ + if(O.reagents) + var/id = O.reagents.get_master_reagent_id() + if(id) + amount+=O.reagents.get_reagent_amount(id) + qdel(O) + if(reagents && reagents.total_volume) + var/id = reagents.get_master_reagent_id() + if(id) + amount += reagents.get_reagent_amount(id) + reagents.clear_reagents() + var/obj/item/reagent_containers/food/snacks/badrecipe/ffuu = new(get_turf(source)) + ffuu.reagents.add_reagent("carbon", amount) + ffuu.reagents.add_reagent("????", amount/10) + make_dirty(75) \ No newline at end of file diff --git a/code/game/objects/items/mountable_frames/extinguisher_frame.dm b/code/game/objects/items/mountable_frames/extinguisher_frame.dm new file mode 100644 index 00000000000..5356a154a6d --- /dev/null +++ b/code/game/objects/items/mountable_frames/extinguisher_frame.dm @@ -0,0 +1,10 @@ +/obj/item/mounted/frame/extinguisher + name = "Extinguisher Cabinet Frame" + desc = "Used for building extinguisher cabinet" + icon = 'icons/obj/closet.dmi' + icon_state = "extinguisher_frame" + mount_reqs = list("simfloor", "nospace") + +/obj/item/mounted/frame/extinguisher/do_build(turf/on_wall, mob/user) + new /obj/structure/extinguisher_cabinet/empty(get_turf(src), get_dir(user, on_wall)) + qdel(src) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 49875ed3b07..376acfe20ac 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -90,6 +90,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list( new /datum/stack_recipe("air alarm frame", /obj/item/mounted/frame/alarm_frame, 2), new /datum/stack_recipe("fire alarm frame", /obj/item/mounted/frame/firealarm, 2), new /datum/stack_recipe("intercom frame", /obj/item/mounted/frame/intercom, 2), + new /datum/stack_recipe("extinguisher cabinet frame", /obj/item/mounted/frame/extinguisher, 2), null ) @@ -170,7 +171,6 @@ var/global/list/datum/stack_recipe/wood_recipes = list( new /datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), new /datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("easel", /obj/structure/easel, 3, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), new /datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50), new /datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10), diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index e55569b23e8..b6b3021a08e 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -31,7 +31,10 @@ /obj/item/stack/examine(mob/user) if(..(user, 1)) - to_chat(user, "There are [amount] [singular_name]\s in the stack.") + if(singular_name) + to_chat(user, "There are [amount] [singular_name]\s in the stack.") + else + to_chat(user, "There are [amount] [name]\s in the stack.") /obj/item/stack/attack_self(mob/user) list_recipes(user) diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index c28fd68fc62..20766ef38cb 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -6,14 +6,26 @@ w_class = WEIGHT_CLASS_TINY var/colour = "red" var/open = 0 + var/list/lipstick_colors = list( + "purple" = "purple", + "jade" = "#216F43", + "lime" = "lime", + "black" = "black", + "green" = "green", + "blue" = "blue", + "white" = "white") + /obj/item/lipstick/purple name = "purple lipstick" colour = "purple" /obj/item/lipstick/jade - //It's still called Jade, but theres no HTML color for jade, so we use lime. name = "jade lipstick" + colour = "#216F43" + +/obj/item/lipstick/lime + name = "lime lipstick" colour = "lime" /obj/item/lipstick/black @@ -36,8 +48,9 @@ name = "lipstick" /obj/item/lipstick/random/New() - colour = pick("red","purple","lime","black","green","blue","white") - name = "[colour] lipstick" + var/lscolor = pick(lipstick_colors)//A random color is picked from the var defined initially in a new var. + colour = lipstick_colors[lscolor]//The color of the lipstick is pulled from the new variable (right hand side, HTML & Hex RGB) + name = "[lscolor] lipstick"//The new variable is also used to match the name to the color of the lipstick. Kudos to Desolate & Lemon /obj/item/lipstick/attack_self(mob/user as mob) diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm index 4a01914a31a..03125313656 100644 --- a/code/game/objects/items/weapons/garrote.dm +++ b/code/game/objects/items/weapons/garrote.dm @@ -84,8 +84,7 @@ unwield(U) U.swap_hand() // For whatever reason the grab will not properly work if we don't have the free hand active. - M.grabbedby(U, 1) - var/obj/item/grab/G = U.get_active_hand() + var/obj/item/grab/G = M.grabbedby(U, 1) U.swap_hand() if(G && istype(G)) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index d9aee2c5347..5a6131b2d4a 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -135,6 +135,7 @@ desc = "You can use this to wrap items in." icon = 'icons/obj/items.dmi' icon_state = "wrap_paper" + singular_name = "wrapping paper" flags = NOBLUDGEON amount = 25 max_amount = 25 diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 5d4ae050073..f24b60c62d0 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -557,3 +557,6 @@ else log_runtime(EXCEPTION("Non-list thing found in storage/deserialize."), src, list("Thing: [thing]")) ..() + +/obj/item/storage/AllowDrop() + return TRUE \ No newline at end of file diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 57e0290346e..b8437f3b7ed 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -3,6 +3,7 @@ desc = "A roll of sticky tape. Possibly for taping ducks... or was that ducts?" icon = 'icons/obj/bureaucracy.dmi' icon_state = "taperoll" + singular_name = "tape roll" w_class = WEIGHT_CLASS_TINY amount = 10 max_amount = 10 diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm deleted file mode 100644 index 4d02555eac5..00000000000 --- a/code/game/objects/structures/artstuff.dm +++ /dev/null @@ -1,136 +0,0 @@ -/////////// -// EASEL // -/////////// - -/obj/structure/easel - name = "easel" - desc = "only for the finest of art!" - icon = 'icons/obj/artstuff.dmi' - icon_state = "easel" - density = 1 - burn_state = FLAMMABLE - burntime = 15 - var/obj/item/canvas/painting = null - -/obj/structure/easel/Destroy() - QDEL_NULL(painting) - return ..() - -//Adding canvases -/obj/structure/easel/attackby(var/obj/item/I, var/mob/user, params) - if(istype(I, /obj/item/canvas)) - var/obj/item/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/canvas - name = "11px by 11px canvas" - desc = "Draw out your soul on this canvas! Only crayons can draw on it. Examine it to focus on the canvas." - icon = 'icons/obj/artstuff.dmi' - icon_state = "11x11" - burn_state = FLAMMABLE - var/whichGlobalBackup = 1 //List index - -/obj/item/canvas/nineteenXnineteen - name = "19px by 19px canvas" - icon_state = "19x19" - whichGlobalBackup = 2 - -/obj/item/canvas/twentythreeXnineteen - name = "23px by 19px canvas" - icon_state = "23x19" - whichGlobalBackup = 3 - -/obj/item/canvas/twentythreeXtwentythree - name = "23px by 23px canvas" - icon_state = "23x23" - whichGlobalBackup = 4 - - -//Find the right size blank canvas -/obj/item/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/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 - - var/icon/masterpiece = icon(icon,icon_state) - //Cleaning one pixel with a soap or rag - if(istype(I, /obj/item/soap) || istype(I, /obj/item/reagent_containers/glass/rag)) - //Pixel info created only when needed - 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 1 - - //Drawing one pixel with a crayon - if(istype(I, /obj/item/toy/crayon)) - var/obj/item/toy/crayon/C = I - var/pix = masterpiece.GetPixel(pixX, pixY) - if(pix && pix != C.colour) // if the located pixel isn't blank (null)) - DrawPixelOn(C.colour, pixX, pixY) - qdel(masterpiece) - return 1 - - ..() - -//Clean the whole canvas -/obj/item/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 \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 64eddc7739e..2f681c79d76 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -423,4 +423,7 @@ /obj/structure/closet/get_remote_view_fullscreens(mob/user) if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS))) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) \ No newline at end of file + user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + +/obj/structure/closet/AllowDrop() + return TRUE \ No newline at end of file diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 048961defd5..568fb0ededc 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -1,3 +1,8 @@ +#define NO_EXTINGUISHER 0 +#define NORMAL_EXTINGUISHER 1 +#define MINI_EXTINGUISHER 2 + + /obj/structure/extinguisher_cabinet name = "extinguisher cabinet" desc = "A small wall mounted cabinet designed to hold a fire extinguisher." @@ -5,13 +10,28 @@ icon_state = "extinguisher_closed" anchored = 1 density = 0 - var/obj/item/extinguisher/has_extinguisher = new/obj/item/extinguisher + var/obj/item/extinguisher/has_extinguisher = null + var/extinguishertype var/opened = 0 + var/material_drop = /obj/item/stack/sheet/metal + +/obj/structure/extinguisher_cabinet/New(turf/loc, ndir = null) + ..() + if(ndir) + pixel_x = (ndir & EAST|WEST) ? (ndir == EAST ? 28 : -28) : 0 + pixel_y = (ndir & NORTH|SOUTH)? (ndir == WEST ? 28 : -28) : 0 + switch(extinguishertype) + if(NO_EXTINGUISHER) + return + if(MINI_EXTINGUISHER) + has_extinguisher = new/obj/item/extinguisher/mini + else + has_extinguisher = new/obj/item/extinguisher /obj/structure/extinguisher_cabinet/Destroy() QDEL_NULL(has_extinguisher) return ..() - + /obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user, params) if(isrobot(user) || isalien(user)) return @@ -23,13 +43,34 @@ to_chat(user, "You place [O] in [src].") else opened = !opened + else if(istype(O, /obj/item/weldingtool)) + if(has_extinguisher) + to_chat(user, "You need to remove the extinguisher before deconstructing the cabinet!") + return + if(!opened) + to_chat(user, "Open the cabinet before cutting it apart!") + return + var/obj/item/weldingtool/WT = O + if(!WT.remove_fuel(0, user)) + return + to_chat(user, "You begin cutting [src] apart...") + playsound(loc, WT.usesound, 40, 1) + if(do_after(user, 40 * WT.toolspeed, 1, target = src)) + if(!src ||!opened || !WT.isOn()) // !src to prevent it being duped + return + visible_message("[user] slices apart [src].", + "You cut [src] apart with [WT].", + "You hear welding.") + var/turf/T = get_turf(src) + new material_drop(T) + qdel(src) else opened = !opened update_icon() - /obj/structure/extinguisher_cabinet/attack_hand(mob/user) if(isrobot(user) || isalien(user)) + to_chat(user, "You don't have the dexterity to do this!") return if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -70,3 +111,11 @@ icon_state = "extinguisher_full" else icon_state = "extinguisher_empty" + +/obj/structure/extinguisher_cabinet/empty/New(turf/loc, ndir = null) + extinguishertype = NO_EXTINGUISHER + ..() + +#undef NO_EXTINGUISHER +#undef NORMAL_EXTINGUISHER +#undef MINI_EXTINGUISHER diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 179615dada3..31bfadee7d7 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -243,7 +243,7 @@ icon_state = "shower" density = 0 anchored = 1 - use_power = 0 + use_power = NO_POWER_USE var/on = 0 var/obj/effect/mist/mymist = null var/ismist = 0 //needs a var so we can make it linger~ @@ -756,4 +756,3 @@ qdel(src) if(prob(50)) new /obj/item/stack/sheet/cardboard(T) - diff --git a/code/game/turfs/simulated/floor/mineral.dm b/code/game/turfs/simulated/floor/mineral.dm index 35b7960b742..d2e147d9532 100644 --- a/code/game/turfs/simulated/floor/mineral.dm +++ b/code/game/turfs/simulated/floor/mineral.dm @@ -157,18 +157,14 @@ honk() /turf/simulated/floor/mineral/bananium/proc/honk() - if(!spam_flag) - spam_flag = 1 + if(spam_flag < world.time) playsound(src, 'sound/items/bikehorn.ogg', 50, 1) - spawn(20) - spam_flag = 0 + spam_flag = world.time + 20 /turf/simulated/floor/mineral/bananium/proc/squeek() - if(!spam_flag) - spam_flag = 1 + if(spam_flag < world.time) playsound(src, "clownstep", 50, 1) - spawn(10) - spam_flag = 0 + spam_flag = world.time + 10 /turf/simulated/floor/mineral/bananium/airless oxygen = 0.01 @@ -255,4 +251,4 @@ return //unbreakable /turf/simulated/floor/plating/abductor2/burn_tile() - return //unburnable \ No newline at end of file + return //unburnable diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 337233b5bf4..012d270005a 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -475,3 +475,6 @@ SSair.remove_from_active(T0) T0.CalculateAdjacentTurfs() SSair.add_to_active(T0,1) + +/turf/AllowDrop() + return TRUE \ No newline at end of file diff --git a/code/game/world.dm b/code/game/world.dm index 516346aeca3..2e57bf99a62 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -442,9 +442,11 @@ var/failed_old_db_connections = 0 GLOB.world_game_log = "[GLOB.log_directory]/game.log" GLOB.world_href_log = "[GLOB.log_directory]/hrefs.log" GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log" + GLOB.world_qdel_log = "[GLOB.log_directory]/qdel.log" start_log(GLOB.world_game_log) start_log(GLOB.world_href_log) start_log(GLOB.world_runtime_log) + start_log(GLOB.world_qdel_log) if(fexists(GLOB.config_error_log)) fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 5c8e1c77745..230fbb6555c 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -32,7 +32,7 @@ client/proc/one_click_antag() if(M.stat || !M.mind || M.mind.special_role) return FALSE if(temp) - if(M.mind.assigned_role in temp.restricted_jobs || M.client.prefs.species in temp.protected_species) + if(M.mind.assigned_role in temp.restricted_jobs || M.mind.assigned_role in temp.protected_jobs || M.client.prefs.species in temp.protected_species) return FALSE if(role) // Don't even bother evaluating if there's no role if(player_old_enough_antag(M.client,role) && (role in M.client.prefs.be_special) && (!jobban_isbanned(M, role))) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 2f794dafbd0..c5d6a50c418 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -435,6 +435,7 @@ Traitors and the like can also be revived with the previous role mostly intact. //Now for special roles and equipment. switch(new_character.mind.special_role) if("traitor") + job_master.AssignRank(new_character, new_character.mind.assigned_role, 0) job_master.EquipRank(new_character, new_character.mind.assigned_role, 1) ticker.mode.equip_traitor(new_character) if("Wizard") @@ -465,6 +466,7 @@ Traitors and the like can also be revived with the previous role mostly intact. call(/datum/game_mode/proc/add_law_zero)(new_character) //Add aliens. else + job_master.AssignRank(new_character, new_character.mind.assigned_role, 0) job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)//Or we simply equip them. //Announces the character on all the systems, based on the record. diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm index 754841a9471..c3158e9ccba 100644 --- a/code/modules/arcade/arcade_base.dm +++ b/code/modules/arcade/arcade_base.dm @@ -6,7 +6,7 @@ icon_state = "clawmachine_on" density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 40 var/tokens = 0 var/freeplay = 0 //for debugging and admin kindness @@ -111,7 +111,7 @@ if(!customer_account) to_chat(user, "Unable to access account: incorrect credentials.") return 0 - + return customer_account.charge(token_price, null, "Purchase of [name] credit", name, name) /obj/machinery/arcade/proc/start_play(mob/user as mob) diff --git a/code/modules/arcade/prize_counter.dm b/code/modules/arcade/prize_counter.dm index 4e2e4e9a0d7..d8666c36617 100644 --- a/code/modules/arcade/prize_counter.dm +++ b/code/modules/arcade/prize_counter.dm @@ -6,7 +6,7 @@ icon_state = "prize_counter-on" density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 40 var/tickets = 0 @@ -205,4 +205,4 @@ th.cost.toomuch {background:maroon;} print_tickets() else new /obj/item/stack/tickets(get_turf(src), tickets) - tickets = 0 \ No newline at end of file + tickets = 0 diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index cfbcec7ae64..d6e72f1505c 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -31,7 +31,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null /obj/machinery/gateway/centerstation density = 1 icon_state = "offcenter" - use_power = 1 + use_power = IDLE_POWER_USE //warping vars var/list/linked = list() @@ -169,7 +169,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null /obj/machinery/gateway/centeraway density = 1 icon_state = "offcenter" - use_power = 0 + use_power = NO_POWER_USE var/calibrated = 1 var/list/linked = list() //a list of the connected gateway chunks var/ready = 0 diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm index 966ce6053f6..b0a092b7e7d 100644 --- a/code/modules/awaymissions/mission_code/challenge.dm +++ b/code/modules/awaymissions/mission_code/challenge.dm @@ -28,10 +28,10 @@ anchored = 1 density = 1 - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 0 active_power_usage = 0 active = 1 locked = 1 - state = 2 \ No newline at end of file + state = 2 diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index b26bdba7d92..9ebd1d88b6b 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -46,7 +46,7 @@ anchored = 1 density = 1 - use_power = 0 + use_power = NO_POWER_USE var/chargesa = 1 var/insistinga = 0 @@ -72,7 +72,7 @@ else chargesa-- insistinga = 0 - var/wish = input("You want...","Wish") as null|anything in list("Power","Wealth","Immortality","To Kill","Peace") + var/wish = input("You want...","Wish") as null|anything in list("Power","Wealth","Immortality","Peace") switch(wish) if("Power") to_chat(user, "Your wish is granted, but at a terrible cost...") @@ -115,28 +115,6 @@ to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") human.set_species(/datum/species/shadow) user.regenerate_icons() - if("To Kill") - to_chat(user, "Your wish is granted, but at a terrible cost...") - to_chat(user, "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart.") - ticker.mode.traitors += user.mind - user.mind.special_role = SPECIAL_ROLE_TRAITOR - var/datum/objective/hijack/hijack = new - hijack.owner = user.mind - user.mind.objectives += hijack - to_chat(user, "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!") - var/obj_count = 1 - for(var/datum/objective/OBJ in user.mind.objectives) - to_chat(user, "Objective #[obj_count]: [OBJ.explanation_text]") - obj_count++ - if(ishuman(user)) - var/mob/living/carbon/human/human = user - if(!isshadowperson(human)) - to_chat(user, "Your flesh rapidly mutates!") - to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") - to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness.") - to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") - human.set_species(/datum/species/shadow) - user.regenerate_icons() if("Peace") to_chat(user, "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.") to_chat(user, "You feel as if you just narrowly avoided a terrible fate...") @@ -288,4 +266,4 @@ say("How could you betray the Syndicate?") for(var/mob/living/simple_animal/hostile/syndicate/ranged/wildwest/W in living_mob_list) W.on_alert = TRUE - ..(gibbed) \ No newline at end of file + ..(gibbed) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 838670221ad..99f7fa69746 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -109,136 +109,42 @@ if("shop") if(href_list["KarmaBuy"]) var/karma=verify_karma() + if(isnull(karma)) //Doesn't display anything if karma database is down. + return switch(href_list["KarmaBuy"]) if("1") - if(karma <5) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Barber?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Barber",5) - return + karma_purchase(karma,5,"job","Barber") if("2") - if(karma <5) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Brig Physician?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Brig Physician",5) - return + karma_purchase(karma,5,"job","Brig Physician") if("3") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Nanotrasen Representative?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Nanotrasen Representative",30) - return + karma_purchase(karma,30,"job","Nanotrasen Representative") if("5") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Blueshield?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Blueshield",30) - return + karma_purchase(karma,30,"job","Blueshield") if("6") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Mechanic?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Mechanic",30) - return + karma_purchase(karma,30,"job","Mechanic") if("7") - if(karma <45) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Magistrate?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Magistrate",45) - return + karma_purchase(karma,45,"job","Magistrate") if("9") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Security Pod Pilot?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Security Pod Pilot",30) - return + karma_purchase(karma,30,"job","Security Pod Pilot") if(href_list["KarmaBuy2"]) var/karma=verify_karma() + if(isnull(karma)) //Doesn't display anything if karma database is down. + return switch(href_list["KarmaBuy2"]) if("1") - if(karma <15) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Machine People?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Machine",15) - return + karma_purchase(karma,15,"species","Machine People","Machine") if("2") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Kidan?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Kidan",30) - return + karma_purchase(karma,30,"species","Kidan") if("3") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Grey?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Grey",30) - return + karma_purchase(karma,30,"species","Grey") if("4") - if(karma <45) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Vox?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Vox",45) - return + karma_purchase(karma,45,"species","Vox") if("5") - if(karma <45) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Slime People?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Slime People",45) - return + karma_purchase(karma,45,"species","Slime People") if("6") - if(karma <100) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Plasmaman?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Plasmaman",100) - return + karma_purchase(karma,100,"species","Plasmaman") if("7") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Drask?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Drask",30) - return + karma_purchase(karma,30,"species","Drask") if(href_list["KarmaRefund"]) var/type = href_list["KarmaRefundType"] var/job = href_list["KarmaRefund"] diff --git a/code/modules/client/preference/loadout/loadout_cosmetics.dm b/code/modules/client/preference/loadout/loadout_cosmetics.dm index c9b82a0259b..aa7f5f02576 100644 --- a/code/modules/client/preference/loadout/loadout_cosmetics.dm +++ b/code/modules/client/preference/loadout/loadout_cosmetics.dm @@ -1,7 +1,11 @@ /datum/gear/lipstick + display_name = "lipstick, red" + path = /obj/item/lipstick + sort_category = "Cosmetics" + +/datum/gear/lipstick/black display_name = "lipstick, black" path = /obj/item/lipstick/black - sort_category = "Cosmetics" /datum/gear/lipstick/jade display_name = "lipstick, jade" @@ -11,9 +15,13 @@ display_name = "lipstick, purple" path = /obj/item/lipstick/purple -/datum/gear/lipstick/red - display_name = "lipstick, red" - path = /obj/item/lipstick +/datum/gear/lipstick/blue + display_name = "lipstick, blue" + path = /obj/item/lipstick/blue + +/datum/gear/lipstick/lime + display_name = "lipstick, lime" + path = /obj/item/lipstick/lime /datum/gear/monocle display_name = "monocle" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 95ae68dcd26..f371ae3997b 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -103,7 +103,7 @@ item_color = "centcom" /obj/item/clothing/under/rank/centcom/officer - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant-Commander\" and bears \"N.C.V. Fearless CV-286\" on the left shounder." + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant-Commander\" and bears \"N.C.V. Fearless CV-286\" on the left shoulder." name = "\improper Nanotrasen Officers Uniform" icon_state = "officer" item_state = "g_suit" @@ -112,7 +112,7 @@ flags_size = ONESIZEFITSALL /obj/item/clothing/under/rank/centcom/captain - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain\" and bears \"N.C.V. Fearless CV-286\" on the left shounder." + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain\" and bears \"N.C.V. Fearless CV-286\" on the left shoulder." name = "\improper Nanotrasen Captains Uniform" icon_state = "centcom" item_state = "dg_suit" @@ -120,7 +120,7 @@ displays_id = 0 /obj/item/clothing/under/rank/centcom/blueshield - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant\" and bears \"N.S.S. Cyberiad\" on the left shounder." + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant\" and bears \"N.S.S. Cyberiad\" on the left shoulder." name = "\improper Nanotrasen Navy Uniform" icon_state = "officer" item_state = "g_suit" @@ -128,8 +128,12 @@ displays_id = 0 flags_size = ONESIZEFITSALL +/obj/item/clothing/under/rank/centcom/blueshield/New() + ..() + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant\" and bears [station_name()] on the left shoulder." + /obj/item/clothing/under/rank/centcom/representative - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears \"N.S.S. Cyberiad\" on the left shounder." + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears \"N.S.S. Cyberiad\" on the left shoulder." name = "\improper Nanotrasen Navy Uniform" icon_state = "officer" item_state = "g_suit" @@ -137,6 +141,10 @@ displays_id = 0 flags_size = ONESIZEFITSALL +/obj/item/clothing/under/rank/centcom/representative/New() + ..() + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears [station_name()] on the left shoulder." + /obj/item/clothing/under/rank/centcom/diplomatic desc = "A very gaudy and official looking uniform of the Nanotrasen Diplomatic Corps." name = "\improper Nanotrasen Diplomatic Uniform" @@ -831,4 +839,4 @@ icon_state = "medicalgown" item_state = "medicalgown" item_color = "medicalgown" - body_parts_covered = UPPER_TORSO|LOWER_TORSO \ No newline at end of file + body_parts_covered = UPPER_TORSO|LOWER_TORSO diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index ddd824e7d01..6d98c57f387 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -945,6 +945,14 @@ flags_inv = HIDEEARS //////////// Uniforms //////////// +/obj/item/clothing/under/fluff/benjaminfallout // Benjaminfallout: Pretzel Brassheart + icon = 'icons/obj/custom_items.dmi' + name = "Pretzel's dress" + desc = "A nice looking dress" + icon_state = "fallout_dress" + item_state = "fallout_dress" + item_color = "fallout_dress" + /obj/item/clothing/under/fluff/soviet_casual_uniform // Norstead : Natalya Sokolova icon = 'icons/obj/custom_items.dmi' name = "Soviet Casual Uniform" @@ -1043,6 +1051,15 @@ item_color = "aegisuniform" displays_id = 0 +/obj/item/clothing/under/fluff/elo_turtleneck // vforcebomber: E.L.O. + name = "E.L.O's Turtleneck" + desc = "This TurtleNeck belongs to the IPC E.L.O. And has her name sown into the upper left breast, a very wooly jumper." + icon = 'icons/obj/custom_items.dmi' // for the floor sprite + icon_override = 'icons/obj/custom_items.dmi' // for the mob sprite + icon_state = "eloturtleneckfloor" + item_color = "eloturtleneck" + displays_id = FALSE + //////////// Masks //////////// /obj/item/clothing/mask/bandana/fluff/dar //sasanek12: Dar'Konr @@ -1219,6 +1236,13 @@ species_fit = null sprite_sheets = null +/obj/item/storage/backpack/fluff/syndiesatchel //SkeletalElite: Rawkkihiki + name= "Military Satchel" + desc = "A well made satchel for military operations. Totally not made by an enemy corporation" + icon = 'icons/obj/custom_items.dmi' + icon_state = "rawk_satchel" + sprite_sheets = null + /obj/item/storage/backpack/fluff/krich_back //lizardzsi: Krichahka name = "Voxcaster" desc = "Battered, Sol-made military radio backpack that had its speakers fried from playing Vox opera. The words 'Swift-Talon' are crudely scratched onto its side." @@ -1387,3 +1411,12 @@ item_state = "panzermedal" item_color = "panzermedal" slot_flags = SLOT_TIE + +/obj/item/clothing/accessory/medal/fluff/XannZxiax //Sagrotter: Xann Zxiax + name = "Zxiax Garnet" + desc = "Green Garnet on fancy blue cord, when you look at the Garnet, you feel strangely appeased." + icon = 'icons/obj/custom_items.dmi' + icon_state = "Xann_necklace" + item_state = "Xann_necklace" + item_color = "Xann_necklace" + slot_flags = SLOT_TIE diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 52494728155..e43797ef9dd 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -19,7 +19,7 @@ log transactions icon = 'icons/obj/terminals.dmi' icon_state = "atm" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 var/obj/machinery/computer/account_database/linked_db var/datum/money_account/authenticated_account diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index e58b2a861bd..a482642f023 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -1,7 +1,6 @@ /datum/event/blob - announceWhen = 60 - endWhen = 120 - var/obj/structure/blob/core/Blob + announceWhen = 120 + endWhen = 180 /datum/event/blob/announce() event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg') @@ -24,11 +23,4 @@ B.key = M.key to_chat(B, "You are now a mouse, infected with blob spores. Find somewhere isolated... before you burst and become the blob! Use ventcrawl (alt-click on vents) to move around.") var/image/alert_overlay = image('icons/mob/blob.dmi', "blank_blob") - notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, alert_overlay = alert_overlay) - -/datum/event/blob/tick() - if(!Blob) - kill() - return - if(IsMultiple(activeFor, 3)) - Blob.process() + notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, alert_overlay = alert_overlay) \ No newline at end of file diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index d8a1f4f1526..74a0baf8cd5 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -21,7 +21,7 @@ Gunshots/explosions/opening doors/less rare audio (done) var/image/halbody var/obj/halitem var/hal_screwyhud = SCREWYHUD_NONE - var/handling_hal = 0 + var/handling_hal = FALSE /mob/living/carbon/proc/handle_hallucinations() if(handling_hal) @@ -34,9 +34,9 @@ Gunshots/explosions/opening doors/less rare audio (done) //AAAAHg var/list/major = list("fake"=20,"death"=10,"xeno"=10,"singulo"=10,"borer"=10,"delusion"=20,"koolaid"=10) - handling_hal = 1 + handling_hal = TRUE while(hallucination > 20) - sleep(rand(200, 500) / (hallucination / 25)) + sleep(rand(200, 500) / (hallucination * 0.04)) if(prob(20)) continue var/list/current = list() @@ -48,10 +48,8 @@ Gunshots/explosions/opening doors/less rare audio (done) if(86 to 100) current = major - var/halpick = pickweight(current) - - hallucinate(halpick) - handling_hal = 0 + hallucinate(pickweight(current)) + handling_hal = FALSE /obj/effect/hallucination @@ -70,7 +68,7 @@ Gunshots/explosions/opening doors/less rare audio (done) var/col_mod = null var/image/current_image = null var/image_layer = MOB_LAYER - var/active = 1 //qdelery + var/active = TRUE //qdelery /obj/effect/hallucination/simple/New(loc, mob/living/carbon/T) ..() @@ -113,7 +111,7 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/simple/Destroy() if(target.client) target.client.images.Remove(current_image) - active = 0 + active = FALSE return ..() #define FAKE_FLOOD_EXPAND_TIME 20 @@ -198,21 +196,17 @@ Gunshots/explosions/opening doors/less rare audio (done) pump = U break if(!pump) - return 0 + return xeno = new(pump.loc,target) sleep(10) if(!xeno) return - xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1) - sleep(10) - if(!xeno) - return - xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1) - sleep(10) - if(!xeno) - return + for(var/i in 0 to 2) + xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) + xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1) + sleep(10) + if(!xeno) + return var/xeno_name = xeno.name to_chat(target, "[xeno_name] begins climbing into the ventilation system...") sleep(10) @@ -253,7 +247,7 @@ Gunshots/explosions/opening doors/less rare audio (done) break if(pump) borer = new(pump.loc,target) - for(var/i=0, i<11, i++) + for(var/i in 0 to 10) walk_to(borer, get_step(borer, get_cardinal_dir(borer, T))) if(borer.Adjacent(T)) to_chat(T, "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.") @@ -331,10 +325,10 @@ Gunshots/explosions/opening doors/less rare audio (done) target = T var/turf/start = get_turf(T) var/screen_border = pick(cardinal) - for(var/i = 0,i<11,i++) + for(var/i in 0 to 10) start = get_step(start, screen_border) s = new(start,target) - for(var/i = 0,i<11,i++) + for(var/i in 0 to 10) sleep(5) s.loc = get_step(get_turf(s), get_dir(s, target)) s.Show() @@ -359,10 +353,10 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/battle/New(loc, mob/living/carbon/T) target = T - var/hits = rand(3,6) + var/hits = rand(2,5) switch(rand(1,5)) if(1) //Laser fight - for(var/i=0,i0, i--) + for(var/i in 0 to rand(1,3)) playsound_local(null, 'sound/weapons/empty.ogg', 15, 1) sleep(rand(10,30)) playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1) @@ -877,10 +865,9 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ playsound_local(null, 'sound/AI/outbreak5.ogg') if(19) //Tesla loose! playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1) - sleep(20) - playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1) - sleep(20) - playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1) + for(var/i in 0 to 2) + sleep(20) + playsound_local(null, 'sound/magic/lightningbolt.ogg', 65+(35*(i-1)), 1) //65%, then 100% volume. if(20) //AI is doomsdaying! to_chat(src, "

    Anomaly Alert

    ") to_chat(src, "

    Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.

    ") @@ -987,8 +974,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ halitem.icon_state = "flashbang1" halitem.name = "Flashbang" if(client) client.screen += halitem - spawn(rand(100,250)) - qdel(halitem) + addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, halitem), rand(100,250)) if("dangerflash") //Flashes of danger if(!halimage) @@ -1007,8 +993,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ halimage = image('icons/turf/floors/Chasms.dmi',target,"smooth",TURF_LAYER) if(4) halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01) - - + if(client) client.images += halimage sleep(rand(40,60)) //Only seen for a brief moment. @@ -1054,4 +1039,4 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ spawn(rand(30,50)) //Only seen for a brief moment. if(client) client.images -= halbody - halbody = null + halbody = null \ No newline at end of file diff --git a/code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm b/code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm index d83bfaeccb0..be4f18539e2 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/cooking_machines.dmi' icon_state = "candymaker_off" cook_verbs = list("Wonderizing", "Scrumpdiddlyumptiousification", "Miracle-coating", "Flavorifaction") - recipe_type = /datum/recipe/candy + recipe_type = RECIPE_CANDY off_icon = "candymaker_off" on_icon = "candymaker_on" broken_icon = "candymaker_broke" diff --git a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm index 62aaf8440bf..802f8f08c54 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm @@ -4,7 +4,7 @@ layer = 2.9 density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 var/on = 0 var/onicon = null diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index 1e3c5602a22..bd80823addd 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -20,7 +20,7 @@ var/stealthmode = FALSE var/list/victims = list() - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 500 diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm b/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm index c1b2612533d..e95b186a9f0 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/cooking_machines.dmi' icon_state = "grill_off" cook_verbs = list("Grilling", "Searing", "Frying") - recipe_type = /datum/recipe/grill + recipe_type = RECIPE_GRILL off_icon = "grill_off" on_icon = "grill_on" broken_icon = "grill_broke" diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index a58ccc1bb2b..5d758193bae 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -7,7 +7,7 @@ anchored = 1 icon = 'icons/obj/cooking_machines.dmi' icon_state = "icecream_vat" - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 20 var/obj/item/reagent_containers/glass/beaker = null var/useramount = 15 //Last used amount diff --git a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm index ec806610601..a10f4e2fdae 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm @@ -6,7 +6,7 @@ layer = 2.9 density = 1 anchored = 0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 pass_flags = PASSTABLE diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm index 83f1126f78f..9de98749e42 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm @@ -5,7 +5,7 @@ layer = 2.9 density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 flags = OPENCONTAINER @@ -16,10 +16,7 @@ var/list/cook_verbs = list("Cooking") //Recipe & Item vars var/recipe_type //Make sure to set this on the machine definition, or else you're gonna runtime on New() - var/list/datum/recipe/available_recipes // List of the recipes you can use - var/list/acceptable_items // List of the items you can put in - var/list/acceptable_reagents // List of the reagents you can put in - var/max_n_of_items = 0 + var/max_n_of_items = 25 //Icon states var/off_icon var/on_icon @@ -35,23 +32,28 @@ ..() create_reagents(100) reagents.set_reacting(FALSE) - if(!available_recipes) - available_recipes = new - acceptable_items = new - acceptable_reagents = new - for(var/type in subtypesof(recipe_type)) + init_lists() + +/obj/machinery/kitchen_machine/proc/init_lists() + if(!GLOB.cooking_recipes[recipe_type]) + GLOB.cooking_recipes[recipe_type] = list() + GLOB.cooking_ingredients[recipe_type] = list() + GLOB.cooking_reagents[recipe_type] = list() + if(!length(GLOB.cooking_recipes[recipe_type])) + for(var/type in subtypesof(GLOB.cooking_recipe_types[recipe_type])) var/datum/recipe/recipe = new type + if(recipe in GLOB.cooking_recipes[recipe_type]) + qdel(recipe) + continue if(recipe.result) // Ignore recipe subtypes that lack a result - available_recipes += recipe + GLOB.cooking_recipes[recipe_type] += recipe for(var/item in recipe.items) - acceptable_items |= item + GLOB.cooking_ingredients[recipe_type] |= item for(var/reagent in recipe.reagents) - acceptable_reagents |= reagent - if(recipe.items) - max_n_of_items = max(max_n_of_items,recipe.count_n_items()) + GLOB.cooking_reagents[recipe_type] |= reagent else qdel(recipe) - acceptable_items |= /obj/item/reagent_containers/food/snacks/grown + GLOB.cooking_ingredients[recipe_type] |= /obj/item/reagent_containers/food/snacks/grown /******************* * Item Adding @@ -80,26 +82,14 @@ if(broken > 0) if(broken == 2 && istype(O, /obj/item/screwdriver)) // If it's broken and they're using a screwdriver - user.visible_message( \ - "[user] starts to fix part of \the [src].", \ - "You start to fix part of \the [src]." \ - ) + user.visible_message("[user] starts to fix part of [src].", "You start to fix part of [src].") if(do_after(user, 20 * O.toolspeed, target = src)) - user.visible_message( \ - "[user] fixes part of \the [src].", \ - "You have fixed part of \the [src]." \ - ) + user.visible_message("[user] fixes part of [src].", "You have fixed part of \the [src].") broken = 1 // Fix it a bit else if(broken == 1 && istype(O, /obj/item/wrench)) // If it's broken and they're doing the wrench - user.visible_message( \ - "[user] starts to fix part of \the [src].", \ - "You start to fix part of \the [src]." \ - ) + user.visible_message("[user] starts to fix part of [src].", "You start to fix part of [src].") if(do_after(user, 20 * O.toolspeed, target = src)) - user.visible_message( \ - "[user] fixes \the [src].", \ - "You have fixed \the [src]." \ - ) + user.visible_message("[user] fixes [src].", "You have fixed [src].") icon_state = off_icon broken = 0 // Fix it! dirty = 0 // just to be sure @@ -109,15 +99,9 @@ return 1 else if(dirty==100) // The machine is all dirty so can't be used! if(istype(O, /obj/item/reagent_containers/spray/cleaner) || istype(O, /obj/item/soap)) // If they're trying to clean it then let them - user.visible_message( \ - "[user] starts to clean \the [src].", \ - "You start to clean \the [src]." \ - ) + user.visible_message("[user] starts to clean [src].", "You start to clean [src].") if(do_after(user, 20 * O.toolspeed, target = src)) - user.visible_message( \ - "[user] has cleaned \the [src].", \ - "You have cleaned \the [src]." \ - ) + user.visible_message("[user] has cleaned [src].", "You have cleaned [src].") dirty = 0 // It's clean! broken = 0 // just to be sure icon_state = off_icon @@ -125,33 +109,25 @@ else //Otherwise bad luck!! to_chat(user, "It's dirty!") return 1 - else if(is_type_in_list(O,acceptable_items)) + else if(is_type_in_list(O, GLOB.cooking_ingredients[recipe_type]) || istype(O, /obj/item/mixing_bowl)) if(contents.len>=max_n_of_items) to_chat(user, "This [src] is full of ingredients, you cannot put more.") return 1 - if(istype(O,/obj/item/stack) && O:amount>1) - new O.type (src) - O:use(1) - user.visible_message( \ - "[user] has added one of [O] to \the [src].", \ - "You add one of [O] to \the [src].") + if(istype(O,/obj/item/stack)) + var/obj/item/stack/S = O + if(S.amount > 1) + var/obj/item/stack/to_add = S.split(user, 1) + to_add.forceMove(src) + user.visible_message("[user] adds one of [S] to [src].", "You add one of [S] to [src].") + else + add_item(S, user) else - if(!user.drop_item()) - to_chat(user, "\The [O] is stuck to your hand, you cannot put it in \the [src]") - return 0 - - O.forceMove(src) - user.visible_message( \ - "[user] has added \the [O] to \the [src].", \ - "You add \the [O] to \the [src].") - else if(istype(O,/obj/item/reagent_containers/glass) || \ - istype(O,/obj/item/reagent_containers/food/drinks) || \ - istype(O,/obj/item/reagent_containers/food/condiment) \ - ) + add_item(O, user) + else if(is_type_in_list(O, list(/obj/item/reagent_containers/glass, /obj/item/reagent_containers/food/drinks, /obj/item/reagent_containers/food/condiment))) if(!O.reagents) return 1 for(var/datum/reagent/R in O.reagents.reagent_list) - if(!(R.id in acceptable_reagents)) + if(!(R.id in GLOB.cooking_reagents[recipe_type])) to_chat(user, "Your [O] contains components unsuitable for cookery.") return 1 //G.reagents.trans_to(src,G.amount_per_transfer_from_this) @@ -162,6 +138,14 @@ return 1 updateUsrDialog() +/obj/machinery/kitchen_machine/proc/add_item(obj/item/I, mob/user) + if(!user.drop_item()) + to_chat(user, "\The [I] is stuck to your hand, you cannot put it in [src]") + //return 0 + else + I.forceMove(src) + user.visible_message("[user] adds [I] to [src].", "You add [I] to [src].") + /obj/machinery/kitchen_machine/attack_ai(mob/user) return 0 @@ -182,11 +166,11 @@ return var/dat = "" if(broken > 0) - dat = {"Bzzzzttttt"} + dat = {"Bzzzzttttt"} else if(operating) - dat = {"[pick(cook_verbs)] in progress!
    Please wait...!
    "} + dat = {"[pick(cook_verbs)] in progress!
    Please wait...!
    "} else if(dirty==100) - dat = {"This [src] is dirty!
    Please clean it before use!
    "} + dat = {"This [src] is dirty!
    Please clean it before use!
    "} else var/list/items_counts = new var/list/items_measures = new @@ -260,12 +244,13 @@ stop() return - var/datum/recipe/recipe = select_recipe(available_recipes,src) - var/obj/cooked - var/obj/byproduct - if(!recipe) + var/list/recipes_to_make = choose_recipes() + + if(recipes_to_make.len == 1 && recipes_to_make[1][2] == RECIPE_FAIL) + //This only runs if there is a single recipe source to be made and it is a failure (the machine was loaded with only 1 mixing bowl that results in failure OR was directly loaded with ingredients that results in failure). + //If there are multiple sources, this bit gets skipped. dirty += 1 - if(prob(max(10,dirty*5))) + if(prob(max(10,dirty*5))) //chance to get so dirty we require cleaning before next use if(!wzhzhzh(4)) abort() return @@ -274,14 +259,14 @@ muck_finish() fail() return - else if(has_extra_item()) + else if(has_extra_item()) //if extra items present, break down and require repair before next use if(!wzhzhzh(4)) abort() return broke() fail() return - else + else //otherwise just stop without requiring cleaning/repair if(!wzhzhzh(10)) abort() return @@ -289,24 +274,69 @@ fail() return else - var/halftime = round(recipe.time/10/2) - if(!wzhzhzh(halftime)) + if(!wzhzhzh(5)) abort() return - if(!wzhzhzh(halftime)) + if(!wzhzhzh(5)) abort() fail() return - cooked = recipe.make_food(src) - byproduct = recipe.get_byproduct() - stop() - if(cooked) - cooked.forceMove(loc) - for(var/i=1,iThe machine's display flashes that it has [grinded] monkey\s worth of material left.") else // I'm not sure if the \s macro works with a word in between; I'll play it safe to_chat(user, "The machine needs at least [required_grind] monkey\s worth of material to compress [cube_production] monkey\s. It only has [grinded].") - return \ No newline at end of file + return diff --git a/code/modules/food_and_drinks/kitchen_machinery/oven.dm b/code/modules/food_and_drinks/kitchen_machinery/oven.dm index cf27804d823..2827720c12e 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/oven.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/oven.dm @@ -6,7 +6,7 @@ layer = 2.9 density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE var/candy = 0 idle_power_usage = 5 var/on = FALSE //Is it making food already? diff --git a/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm b/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm index 4904a2a5d5f..67a65148244 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/cooking_machines.dmi' icon_state = "oven_off" cook_verbs = list("Baking", "Roasting", "Broiling") - recipe_type = /datum/recipe/oven + recipe_type = RECIPE_OVEN off_icon = "oven_off" on_icon = "oven_on" broken_icon = "oven_broke" diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index ad4dcb5e4d8..19c866fae43 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -9,7 +9,7 @@ var/broken = 0 var/processing = 0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 50 var/rating_speed = 1 diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index e3ca42425db..3a905a658d0 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -7,7 +7,7 @@ layer = 2.9 density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 var/max_n_of_items = 1500 @@ -227,7 +227,7 @@ if(load(O, user)) user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].") SSnanoui.update_uis(src) - + else if(istype(O, /obj/item/storage/bag)) var/obj/item/storage/bag/P = O var/plants_loaded = 0 @@ -410,7 +410,7 @@ desc = "A wooden contraption, used to dry plant products, food and leather." icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "drying_rack_on" - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 200 icon_on = "drying_rack_on" @@ -447,13 +447,13 @@ return 1 if(href_list["dryingOn"]) drying = TRUE - use_power = 2 + use_power = ACTIVE_POWER_USE update_icon() return 1 if(href_list["dryingOff"]) drying = FALSE - use_power = 1 + use_power = IDLE_POWER_USE update_icon() return 1 return 0 @@ -497,10 +497,10 @@ /obj/machinery/smartfridge/drying_rack/proc/toggle_drying(forceoff) if(drying || forceoff) drying = FALSE - use_power = 1 + use_power = IDLE_POWER_USE else drying = TRUE - use_power = 2 + use_power = ACTIVE_POWER_USE update_icon() /obj/machinery/smartfridge/drying_rack/proc/rack_dry() @@ -552,4 +552,4 @@ to_chat(usr, "Access denied.") SSnanoui.update_uis(src) return 0 - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 7efb6460b75..488966a8320 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -252,7 +252,7 @@ /obj/item/pack/attack_self(mob/user as mob) user.visible_message("[name] rips open the [src]!", "You rips open the [src]!") - var/obj/item/cardhand/H = new() + var/obj/item/cardhand/H = new(get_turf(user)) H.cards += cards cards.Cut() @@ -260,7 +260,7 @@ qdel(src) H.update_icon() - user.put_in_active_hand(H) + user.put_in_hands(H) /obj/item/cardhand name = "hand of cards" @@ -370,7 +370,7 @@ var/datum/playingcard/card = pickablecards[pickedcard] var/obj/item/cardhand/H = new(get_turf(src)) - user.put_in_active_hand(H) + user.put_in_hands(H) H.cards += card cards -= card H.parentdeck = parentdeck diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 96553775361..67979b61dd7 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -5,7 +5,7 @@ icon_state = "biogen-empty" density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 40 var/processing = 0 var/obj/item/reagent_containers/glass/beaker = null diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index d75791f5404..24ddf1dbbba 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -15,7 +15,7 @@ icon_dead = "soybean-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/soya/koi) - reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.05) + reagents_add = list("soybeanoil" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.05) /obj/item/reagent_containers/food/snacks/grown/soybeans seed = /obj/item/seeds/soya diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 903fec0c1a2..b5bea1fc6b3 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -1008,7 +1008,7 @@ icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "soil" density = 0 - use_power = 0 + use_power = NO_POWER_USE wrenchable = 0 /obj/machinery/hydroponics/soil/update_icon_hoses() diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm index 1f18edfae22..cfc44382d64 100644 --- a/code/modules/karma/karma.dm +++ b/code/modules/karma/karma.dm @@ -1,3 +1,7 @@ +/* KARMA + Everything karma related is here. + Part of karma purchase is handled in client_procs.dm */ + proc/sql_report_karma(var/mob/spender, var/mob/receiver) var/sqlspendername = sanitizeSQL(spender.name) var/sqlspenderkey = spender.ckey @@ -39,49 +43,49 @@ proc/sql_report_karma(var/mob/spender, var/mob/receiver) var/err = query.ErrorMsg() log_game("SQL ERROR during karmatotal logging (adding new key). Error : \[[err]\]\n") else - karma += 1 + karma++ query = dbcon.NewQuery("UPDATE [format_table_name("karmatotals")] SET karma=[karma] WHERE id=[id]") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during karmatotal logging (updating existing entry). Error : \[[err]\]\n") - var/list/karma_spenders = list() -// Returns 1 if mob can give karma at all; if not, tells them why +// Returns TRUE if mob can give karma at all; if not, tells them why /mob/proc/can_give_karma() if(!client) - return 0 + to_chat(src, "You can't award karma without being connected.") + return FALSE if(config.disable_karma) to_chat(src, "Karma is disabled.") - return 0 + return FALSE if(!ticker || !player_list.len || (ticker.current_state == GAME_STATE_PREGAME)) to_chat(src, "You can't award karma until the game has started.") - return 0 + return FALSE if(client.karma_spent || (ckey in karma_spenders)) to_chat(src, "You've already spent your karma for the round.") - return 0 - return 1 + return FALSE + return TRUE -// Returns 1 if mob can give karma to M; if not, tells them why +// Returns TRUE if mob can give karma to M; if not, tells them why /mob/proc/can_give_karma_to_mob(mob/M) if(!can_give_karma()) - return 0 + return FALSE if(!istype(M)) to_chat(src, "That's not a mob.") - return 0 + return FALSE if(!M.client) to_chat(src, "That mob has no client connected at the moment.") - return 0 - if(ckey == M.ckey) + return FALSE + if(M.ckey == ckey) to_chat(src, "You can't spend karma on yourself!") - return 0 + return FALSE if(client.address == M.client.address) message_admins("Illegal karma spending attempt detected from [key] to [M.key]. Using the same IP!") log_game("Illegal karma spending attempt detected from [key] to [M.key]. Using the same IP!") to_chat(src, "You can't spend karma on someone connected from the same IP.") - return 0 - return 1 + return FALSE + return TRUE /mob/verb/spend_karma_list() @@ -129,9 +133,9 @@ var/list/karma_spenders = list() if(!can_give_karma_to_mob(M)) return // Check again, just in case things changed while the alert box was up - M.client.karma += 1 + M.client.karma++ to_chat(usr, "Good karma spent on [M.name].") - client.karma_spent = 1 + client.karma_spent = TRUE karma_spenders += ckey var/special_role = "None" @@ -153,14 +157,14 @@ var/list/karma_spenders = list() if(config.disable_karma) to_chat(src, "Karma is disabled.") - return 0 + return - var/currentkarma=verify_karma() - to_chat(usr, {"
    You have [currentkarma] available."}) - return + var/currentkarma = verify_karma() + if(!isnull(currentkarma)) + to_chat(usr, {"
    You have [currentkarma] available."}) /client/proc/verify_karma() - var/currentkarma=0 + var/currentkarma = 0 if(!dbcon.IsConnected()) to_chat(usr, "Unable to connect to karma database. Please try again later.
    ") return @@ -174,24 +178,18 @@ var/list/karma_spenders = list() totalkarma = query.item[1] karmaspent = query.item[2] currentkarma = (text2num(totalkarma) - text2num(karmaspent)) -/* if(totalkarma) - to_chat(usr, {"
    You have [currentkarma] available.
    ) -You've gained [totalkarma] total karma in your time here.
    "} - else - to_chat(usr, "Your total karma is: 0
    ")*/ + return currentkarma /client/verb/karmashop() set name = "karmashop" set desc = "Spend your hard-earned karma here" - set hidden = 1 + set hidden = TRUE if(config.disable_karma) to_chat(src, "Karma is disabled.") - return 0 - + return karmashopmenu() - return /client/proc/karmashopmenu() var/dat = "
    " @@ -267,7 +265,23 @@ You've gained [totalkarma] total karma in your time here.
    "} var/datum/browser/popup = new(usr, "karmashop", "
    Karma Shop
    ", 400, 400) popup.set_content(dat) popup.open(0) - return + +//Checks if can afford, what you're purchasing, then purchases. (used in client_procs.dm) +/client/proc/karma_purchase(var/karma = 0, var/price = 1, var/category, var/name, var/DBname = null) + if(karma < price) + to_chat(usr, "You do not have enough karma!") + return + if(alert("Are you sure you want to unlock [name]?", "Confirmation", "No", "Yes") != "Yes") + return + if(karma < price) //Check one more time. (definitely not repeated code) + to_chat(usr, "You do not have enough karma!") + return + if(!isnull(DBname)) //In case database uses another name for logging. (Machine, Machine People) + name = DBname + if(category == "job") + DB_job_unlock(name,price) + else if(category == "species") + DB_species_unlock(name,price) /client/proc/DB_job_unlock(var/job,var/cost) var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'") @@ -281,9 +295,7 @@ You've gained [totalkarma] total karma in your time here.
    "} if(!dbckey) query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, job) VALUES ('[usr.ckey]','[job]')") if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during whitelist logging (adding new key). Error: \[[err]\]\n") - message_admins("SQL ERROR during whitelist logging (adding new key). Error: \[[err]\]\n") + queryErrorLog(query.ErrorMsg(),"adding new key") return else to_chat(usr, "You have unlocked [job].") @@ -297,9 +309,7 @@ You've gained [totalkarma] total karma in your time here.
    "} var/newjoblist = jointext(joblist,",") query = dbcon.NewQuery("UPDATE [format_table_name("whitelist")] SET job='[newjoblist]' WHERE ckey='[dbckey]'") if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during whitelist logging (updating existing entry). Error : \[[err]\]\n") - message_admins("SQL ERROR during whitelist logging (updating existing entry). Error : \[[err]\]\n") + queryErrorLog(query.ErrorMsg(),"updating existing entry") return else to_chat(usr, "You have unlocked [job].") @@ -321,9 +331,7 @@ You've gained [totalkarma] total karma in your time here.
    "} if(!dbckey) query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, species) VALUES ('[usr.ckey]','[species]')") if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during whitelist logging (adding new key). Error : \[[err]\]\n") - message_admins("SQL ERROR during whitelist logging (adding new key). Error : \[[err]\]\n") + queryErrorLog(query.ErrorMsg(),"adding new key") return else to_chat(usr, "You have unlocked [species].") @@ -337,9 +345,7 @@ You've gained [totalkarma] total karma in your time here.
    "} var/newspecieslist = jointext(specieslist,",") query = dbcon.NewQuery("UPDATE [format_table_name("whitelist")] SET species='[newspecieslist]' WHERE ckey='[dbckey]'") if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") - message_admins("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") + queryErrorLog(query.ErrorMsg(),"updating existing entry") return else to_chat(usr, "You have unlocked [species].") @@ -349,7 +355,7 @@ You've gained [totalkarma] total karma in your time here.
    "} to_chat(usr, "You already have this species unlocked!") return -/client/proc/karmacharge(var/cost,var/refund = 0) +/client/proc/karmacharge(var/cost,var/refund = FALSE) var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("karmatotals")] WHERE byondkey='[usr.ckey]'") query.Execute() @@ -361,9 +367,7 @@ You've gained [totalkarma] total karma in your time here.
    "} spent += cost query = dbcon.NewQuery("UPDATE [format_table_name("karmatotals")] SET karmaspent=[spent] WHERE byondkey='[usr.ckey]'") if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during karmaspent updating (updating existing entry). Error: \[[err]\]\n") - message_admins("SQL ERROR during karmaspent updating (updating existing entry). Error: \[[err]\]\n") + queryErrorLog(query.ErrorMsg(),"updating existing entry") return else to_chat(usr, "You have been [refund ? "refunded" : "charged"] [cost] karma.") @@ -372,23 +376,8 @@ You've gained [totalkarma] total karma in your time here.
    "} /client/proc/karmarefund(var/type,var/name,var/cost) switch(name) - if("Tajaran Ambassador") - cost = 30 - if("Unathi Ambassador") - cost = 30 - if("Skrell Ambassador") - cost = 30 - if("Diona Ambassador") - cost = 30 - if("Kidan Ambassador") - cost = 30 - if("Slime People Ambassador") - cost = 30 - if("Grey Ambassador") - cost = 30 - if("Vox Ambassador") - cost = 30 - if("Customs Officer") + if("Tajaran Ambassador","Unathi Ambassador","Skrell Ambassador","Diona Ambassador","Kidan Ambassador", + "Slime People Ambassador","Grey Ambassador","Vox Ambassador","Customs Officer") cost = 30 if("Nanotrasen Recruiter") cost = 10 @@ -422,9 +411,7 @@ You've gained [totalkarma] total karma in your time here.
    "} var/newtypelist = jointext(typelist,",") query = dbcon.NewQuery("UPDATE [format_table_name("whitelist")] SET [type]='[newtypelist]' WHERE ckey='[dbckey]'") if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") - message_admins("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") + queryErrorLog(query.ErrorMsg(),"updating existing entry") return else to_chat(usr, "You have been refunded [cost] karma for [type] [name].") @@ -436,6 +423,10 @@ You've gained [totalkarma] total karma in your time here.
    "} else to_chat(usr, "Your ckey ([dbckey]) was not found.") +/client/proc/queryErrorLog(err = null, errType) + log_game("SQL ERROR during whitelist logging ([errType]]). Error : \[[err]\]\n") + message_admins("SQL ERROR during whitelist logging ([errType]]). Error : \[[err]\]\n") + /client/proc/checkpurchased(var/name = null) // If the first parameter is null, return a full list of purchases var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'") query.Execute() @@ -454,10 +445,10 @@ You've gained [totalkarma] total karma in your time here.
    "} var/list/combinedlist = joblist + specieslist if(name) if(name in combinedlist) - return 1 + return TRUE else - return 0 + return FALSE else return combinedlist else - return 0 + return FALSE \ No newline at end of file diff --git a/code/modules/martial_arts/adminfu.dm b/code/modules/martial_arts/adminfu.dm index a279765c980..eaec2b1c3c8 100644 --- a/code/modules/martial_arts/adminfu.dm +++ b/code/modules/martial_arts/adminfu.dm @@ -37,8 +37,7 @@ add_to_streak("G",D) if(check_streak(A,D)) return 1 - D.grabbedby(A,1) - var/obj/item/grab/G = A.get_active_hand() + var/obj/item/grab/G = D.grabbedby(A,1) if(G) G.state = GRAB_NECK diff --git a/code/modules/martial_arts/brawling.dm b/code/modules/martial_arts/brawling.dm index b326e9f8b33..f7c4d307968 100644 --- a/code/modules/martial_arts/brawling.dm +++ b/code/modules/martial_arts/brawling.dm @@ -53,8 +53,7 @@ A.visible_message("[A] tries to grab ahold of [D], but fails!", \ "You fail to grab ahold of [D]!") return 1 - D.grabbedby(A,1) - var/obj/item/grab/G = A.get_active_hand() + var/obj/item/grab/G = D.grabbedby(A,1) if(G) D.visible_message("[A] grabs ahold of [D] drunkenly!", \ "[A] grabs ahold of [D] drunkenly!") diff --git a/code/modules/martial_arts/sleeping_carp.dm b/code/modules/martial_arts/sleeping_carp.dm index a6cd25d50c0..38f1dba77b9 100644 --- a/code/modules/martial_arts/sleeping_carp.dm +++ b/code/modules/martial_arts/sleeping_carp.dm @@ -108,8 +108,7 @@ add_to_streak("G",D) if(check_streak(A,D)) return 1 - D.grabbedby(A,1) - var/obj/item/grab/G = A.get_active_hand() + var/obj/item/grab/G = D.grabbedby(A,1) if(G) G.state = GRAB_AGGRESSIVE //Instant aggressive grab diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index 6676fd78607..4c748067a5b 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -12,7 +12,7 @@ unacidable = 1 burn_state = LAVA_PROOF | FIRE_PROOF pixel_y = -4 - use_power = 0 + use_power = NO_POWER_USE var/memory_saved = FALSE var/list/stored_items = list() var/static/list/blacklist = typecacheof(list(/obj/item/spellbook)) @@ -97,7 +97,7 @@ icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "anomaly_crystal" luminosity = 8 - use_power = 0 + use_power = NO_POWER_USE density = 1 burn_state = LAVA_PROOF | FIRE_PROOF unacidable = 1 diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 57be913c699..6c11ee7a3a4 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -1,6 +1,6 @@ // At minimum every mob has a hear_say proc. -/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) +/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) if(!client) return 0 @@ -70,12 +70,12 @@ if(speaker == src) to_chat(src, "You cannot hear yourself speak!") else - to_chat(src, "[speaker_name][alt_name] talks but you cannot hear [speaker.p_them()].") + to_chat(src, "[speaker_name][speaker.GetAltName()] talks but you cannot hear [speaker.p_them()].") else if(language) - to_chat(src, "[speaker_name][alt_name] [track][language.format_message(message, verb)]") + to_chat(src, "[speaker_name][speaker.GetAltName()] [track][language.format_message(message, verb)]") else - to_chat(src, "[speaker_name][alt_name] [track][verb], \"[message]\"") + to_chat(src, "[speaker_name][speaker.GetAltName()] [track][verb], \"[message]\"") if(speech_sound && (get_dist(speaker, src) <= world.view && src.z == speaker.z)) var/turf/source = speaker? get_turf(speaker) : get_turf(src) src.playsound_local(source, speech_sound, sound_vol, 1) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 4c01ac1a4a5..5ff0ea8e28b 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -83,7 +83,7 @@ //This is probably the main one you need to know :) //Just puts stuff on the floor for most mobs, since all mobs have hands but putting stuff in the AI/corgi/ghost hand is VERY BAD. /mob/proc/put_in_hands(obj/item/W) - W.forceMove(get_turf(src)) + W.forceMove(drop_location()) W.layer = initial(W.layer) W.plane = initial(W.plane) W.dropped() @@ -137,7 +137,7 @@ if(I) if(client) client.screen -= I - I.forceMove(loc) + I.forceMove(drop_location()) I.dropped(src) if(I) I.layer = initial(I.layer) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index ddac1cc18e9..adf81753827 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -66,7 +66,7 @@ #define MAX_ALIEN_LEAP_DIST 7 /mob/living/carbon/alien/humanoid/hunter/proc/leap_at(var/atom/A) - if(pounce_cooldown) + if(pounce_cooldown > world.time) to_chat(src, "You are too fatigued to pounce right now!") return @@ -114,9 +114,7 @@ Weaken(2, 1, 1) toggle_leap(0) - pounce_cooldown = !pounce_cooldown - spawn(pounce_cooldown_time) //3s by default - pounce_cooldown = !pounce_cooldown + pounce_cooldown = world.time + pounce_cooldown_time else if(A.density && !A.CanPass(src)) visible_message("[src] smashes into [A]!", "[src] smashes into [A]!") Weaken(2, 1, 1) diff --git a/code/modules/mob/living/carbon/brain/MMI_radio.dm b/code/modules/mob/living/carbon/brain/MMI_radio.dm index 6eeaa44a42c..7064b4a2a82 100644 --- a/code/modules/mob/living/carbon/brain/MMI_radio.dm +++ b/code/modules/mob/living/carbon/brain/MMI_radio.dm @@ -3,3 +3,4 @@ desc = "Enables radio capability on MMIs when either installed directly on the MMI, or through a cyborg's chassis." icon = 'icons/obj/module.dmi' icon_state = "cyborg_upgrade1" + origin_tech = "programming=3;biotech=2;engineering=2" diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index 907a2e4862d..f2a15119156 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -29,7 +29,7 @@ to_chat(usr, "You cannot speak, as your internal speaker is turned off.") . = FALSE -/mob/living/carbon/brain/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name) +/mob/living/carbon/brain/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios) switch(message_mode) if("headset") var/radio_worked = 0 // If any of the radios our brainmob could use functioned, this is set true so that we don't use any others @@ -45,6 +45,6 @@ radio_worked = c.radio.talk_into(src, message, message_mode, verb, speaking) return radio_worked if("whisper") - whisper_say(message, speaking, alt_name) + whisper_say(message, speaking) return 1 else return 0 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 6c2bb844155..b8e209498c2 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -178,7 +178,7 @@ emp_act /mob/living/carbon/human/grabbedby(mob/living/user) if(w_uniform) w_uniform.add_fingerprint(user) - ..() + return ..() //Returns 1 if the attack hit, 0 if it missed. /mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user, def_zone) diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm index 8e8c2c80013..06df994df5f 100644 --- a/code/modules/mob/living/carbon/human/interactive/functions.dm +++ b/code/modules/mob/living/carbon/human/interactive/functions.dm @@ -630,7 +630,7 @@ var/obj/item/reagent_containers/food/snacks/newSnack = new chosenType(get_turf(src)) TARGET = newSnack newSnack.reagents.remove_any((newSnack.reagents.total_volume/2)-1) - newSnack.name = "Synthetic [newSnack.name]" + newSnack.name = "synthetic [newSnack.name]" custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as [p_they()] vomit[p_s()] [newSnack] from [p_their()] mouth!") catch(var/exception/e) log_runtime(e, src, "Caught in SNPC cooking module") diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm index 763a5ef15be..d8d469cfd57 100644 --- a/code/modules/mob/living/carbon/human/interactive/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm @@ -581,7 +581,7 @@ saveVoice() ..() -/mob/living/carbon/human/interactive/hear_say(message, verb = "says", datum/language/language = null, alt_name = "", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol) +/mob/living/carbon/human/interactive/hear_say(message, verb = "says", datum/language/language = null, italics = 0, mob/speaker = null, sound/speech_sound, sound_vol) if(!istype(speaker, /mob/living/carbon/human/interactive)) knownStrings |= html_decode(message) ..() diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 7d408ce9199..a9f93f3d441 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -1,10 +1,10 @@ /mob/living/carbon/human/say(var/message, var/sanitize = TRUE, var/ignore_speech_problems = FALSE, var/ignore_atmospherics = FALSE) - var/alt_name = "" + ..(message, sanitize = sanitize, ignore_speech_problems = ignore_speech_problems, ignore_atmospherics = ignore_atmospherics) //ohgod we should really be passing a datum here. +/mob/living/carbon/human/GetAltName() if(name != GetVoice()) - alt_name = " (as [get_id_name("Unknown")])" - - ..(message, alt_name = alt_name, sanitize = sanitize, ignore_speech_problems = ignore_speech_problems, ignore_atmospherics = ignore_atmospherics) //ohgod we should really be passing a datum here. + return " (as [get_id_name("Unknown")])" + return ..() /mob/living/carbon/human/proc/forcesay(list/append) if(stat == CONSCIOUS) @@ -160,7 +160,7 @@ returns[3] = speech_problem_flag return returns -/mob/living/carbon/human/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name) +/mob/living/carbon/human/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios) switch(message_mode) if("intercom") for(var/obj/item/radio/intercom/I in view(1, src)) @@ -203,7 +203,7 @@ R.talk_into(src, message, null, verb, speaking) if("whisper") - whisper_say(message, speaking, alt_name) + whisper_say(message, speaking) return 1 else if(message_mode) diff --git a/code/modules/mob/living/carbon/human/species/machine.dm b/code/modules/mob/living/carbon/human/species/machine.dm index 855ad49c494..a27f7fee103 100644 --- a/code/modules/mob/living/carbon/human/species/machine.dm +++ b/code/modules/mob/living/carbon/human/species/machine.dm @@ -127,14 +127,26 @@ if((head_organ.dna.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use. hair += i + var/file = file2text("config/custom_sprites.txt") //Pulls up the custom_sprites list + var/lines = splittext(file, "\n") + + for(var/line in lines) // Looks for lines set up as screen:ckey:screen_name + var/list/Entry = splittext(line, ":") // split lines + for(var/i = 1 to Entry.len) + Entry[i] = trim(Entry[i]) // Cleans up lines + if(Entry.len != 3 || Entry[1] != "screen") // Ignore entries that aren't for screens + continue + if(Entry[2] == H.ckey) // They're in the list? Custom sprite time, var and icon change required + hair += Entry[3] // Adds custom screen to list + var/new_style = input(H, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair var/new_color = input("Please select hair color.", "Monitor Color", head_organ.hair_colour) as null|color - + if(H.incapacitated()) to_chat(H, "You were interrupted while changing your monitor display.") return if(new_style) - H.change_hair(new_style) + H.change_hair(new_style, 1) // The 1 is to enable custom sprites if(new_color) - H.change_hair_color(new_color) \ No newline at end of file + H.change_hair_color(new_color) diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index b49dd88d8e6..82c875444d2 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -83,7 +83,6 @@ if("Warden","Security Officer","Security Pod Pilot") suit=/obj/item/clothing/suit/space/eva/plasmaman/security helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security - H.equip_or_collect(new /obj/item/gun/energy/gun/advtaser(H), slot_in_backpack) if("Internal Affairs Agent") suit=/obj/item/clothing/suit/space/eva/plasmaman/lawyer helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer @@ -93,7 +92,6 @@ if("Head of Security") suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hos helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos - H.equip_or_collect(new /obj/item/gun/energy/gun(H), slot_in_backpack) if("Captain", "Blueshield") suit=/obj/item/clothing/suit/space/eva/plasmaman/security/captain helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain @@ -106,7 +104,6 @@ if("Medical Doctor","Brig Physician","Virologist") suit=/obj/item/clothing/suit/space/eva/plasmaman/medical helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical - H.equip_or_collect(new /obj/item/flashlight/pen(H), slot_in_backpack) if("Paramedic") suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/paramedic helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/paramedic diff --git a/code/modules/mob/living/carbon/human/species/vox.dm b/code/modules/mob/living/carbon/human/species/vox.dm index 1bc0b8b3b9e..d01f1ccf6fe 100644 --- a/code/modules/mob/living/carbon/human/species/vox.dm +++ b/code/modules/mob/living/carbon/human/species/vox.dm @@ -84,16 +84,21 @@ /datum/species/vox/after_equip_job(datum/job/J, mob/living/carbon/human/H) if(!H.mind || !H.mind.assigned_role || H.mind.assigned_role != "Clown" && H.mind.assigned_role != "Mime") H.unEquip(H.wear_mask) - H.unEquip(H.l_hand) H.equip_or_collect(new /obj/item/clothing/mask/breath/vox(H), slot_wear_mask) var/tank_pref = H.client && H.client.prefs ? H.client.prefs.speciesprefs : null + var/obj/item/tank/internal_tank if(tank_pref)//Diseasel, here you go - H.equip_or_collect(new /obj/item/tank/nitrogen(H), slot_l_hand) + internal_tank = new /obj/item/tank/nitrogen(H) else - H.equip_or_collect(new /obj/item/tank/emergency_oxygen/vox(H), slot_l_hand) - to_chat(H, "You are now running on nitrogen internals from the [H.l_hand] in your hand. Your species finds oxygen toxic, so you must breathe nitrogen only.") - H.internal = H.l_hand + internal_tank = new /obj/item/tank/emergency_oxygen/vox(H) + if(!H.equip_to_appropriate_slot(internal_tank)) + if(!H.put_in_any_hand_if_possible(internal_tank)) + H.unEquip(H.l_hand) + H.equip_or_collect(internal_tank, slot_l_hand) + to_chat(H, "Could not find an empty slot for internals! Please report this as a bug") + H.internal = internal_tank + to_chat(H, "You are now running on nitrogen internals from the [internal_tank]. Your species finds oxygen toxic, so you must breathe nitrogen only.") H.update_action_buttons_icon() /datum/species/vox/on_species_gain(mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index 5b0c7813ef3..4e74688e10f 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -1,10 +1,5 @@ //Lallander was here /mob/living/carbon/human/whisper(message as text) - var/alt_name = "" - - if(name != GetVoice()) - alt_name = "(as [get_id_name("Unknown")])" - message = trim_strip_html_properly(message) //bit of duplicate code, acceptable because the workaround would be annoying //parse the language code and consume it @@ -23,4 +18,4 @@ message = trim_left(message) message = handle_autohiss(message, speaking) - whisper_say(message, speaking, alt_name) \ No newline at end of file + whisper_say(message, speaking) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/say.dm b/code/modules/mob/living/carbon/slime/say.dm index 6d47231792b..04416e945ee 100644 --- a/code/modules/mob/living/carbon/slime/say.dm +++ b/code/modules/mob/living/carbon/slime/say.dm @@ -14,7 +14,7 @@ return 1 return ..() -/mob/living/carbon/slime/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) +/mob/living/carbon/slime/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) if(speaker in Friends) speech_buffer = list() speech_buffer.Add(speaker) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 55e8536cd10..2f6bb4628c3 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -95,10 +95,10 @@ proc/get_radio_key_from_channel(var/channel) returns[3] = speech_problem_flag return returns -/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) +/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios) switch(message_mode) if("whisper") //all mobs can whisper by default - whisper_say(message, speaking, alt_name) + whisper_say(message, speaking) return 1 return 0 @@ -109,7 +109,7 @@ proc/get_radio_key_from_channel(var/channel) return returns -/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/alt_name = "", var/sanitize = TRUE, var/ignore_speech_problems = FALSE, var/ignore_atmospherics = FALSE) +/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/sanitize = TRUE, var/ignore_speech_problems = FALSE, var/ignore_atmospherics = FALSE) if(client) if(client.prefs.muted & MUTE_IC) to_chat(src, "You cannot speak in IC (Muted).") @@ -184,7 +184,7 @@ proc/get_radio_key_from_channel(var/channel) return 0 var/list/used_radios = list() - if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)) + if(handle_message_mode(message_mode, message, verb, speaking, used_radios)) return 1 var/list/handle_v = handle_speech_sound() @@ -268,7 +268,7 @@ proc/get_radio_key_from_channel(var/channel) var/speech_bubble_test = say_test(message) for(var/mob/M in listening) - M.hear_say(message, verb, speaking, alt_name, italics, src, speech_sound, sound_vol) + M.hear_say(message, verb, speaking, italics, src, speech_sound, sound_vol) if(M.client) speech_bubble_recipients.Add(M.client) spawn(0) @@ -359,7 +359,7 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/proc/get_whisper_loc() return src -/mob/living/proc/whisper_say(var/message, var/datum/language/speaking = null, var/alt_name="", var/verb="whispers") +/mob/living/proc/whisper_say(var/message, var/datum/language/speaking = null, var/verb="whispers") if(client) if(client.prefs.muted & MUTE_IC) to_chat(src, "You cannot speak in IC (Muted).") @@ -381,6 +381,7 @@ proc/get_radio_key_from_channel(var/channel) var/eavesdropping_range = 2 var/watching_range = 5 var/italics = 1 + var/adverb_added = FALSE var/not_heard //the message displayed to people who could not hear the whispering if(speaking) @@ -389,6 +390,7 @@ proc/get_radio_key_from_channel(var/channel) not_heard = "[verb] something" else var/adverb = pick("quietly", "softly") + adverb_added = TRUE verb = "[speaking.speech_verb] [adverb]" not_heard = "[speaking.speech_verb] something [adverb]" else @@ -404,7 +406,7 @@ proc/get_radio_key_from_channel(var/channel) if(verb == "yells loudly") verb = "slurs emphatically" - else if(speech_problem_flag) + else if(speech_problem_flag && !adverb_added) var/adverb = pick("quietly", "softly") verb = "[verb] [adverb]" @@ -464,14 +466,14 @@ proc/get_radio_key_from_channel(var/channel) var/speech_bubble_test = say_test(message) for(var/mob/M in listening) - M.hear_say(message, verb, speaking, alt_name, italics, src) + M.hear_say(message, verb, speaking, italics, src) if(M.client) speech_bubble_recipients.Add(M.client) if(eavesdropping.len) var/new_message = stars(message) //hopefully passing the message twice through stars() won't hurt... I guess if you already don't understand the language, when they speak it too quietly to hear normally you would be able to catch even less. for(var/mob/M in eavesdropping) - M.hear_say(new_message, verb, speaking, alt_name, italics, src) + M.hear_say(new_message, verb, speaking, italics, src) if(M.client) speech_bubble_recipients.Add(M.client) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index c0393d78f92..cf9102858bd 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -69,7 +69,7 @@ var/list/ai_verbs_default = list( var/control_disabled = 0 // Set to 1 to stop AI from interacting via Click() -- TLE var/malfhacking = 0 // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite - var/malf_cooldown = 0 //Cooldown var for malf modules + var/malf_cooldown = 0 //Cooldown var for malf modules, stores a worldtime + cooldown var/obj/machinery/power/apc/malfhack = null var/explosive = 0 //does the AI explode when it dies? @@ -281,7 +281,7 @@ var/list/ai_verbs_default = list( /obj/machinery/ai_powersupply name="\improper AI power supply" active_power_usage=1000 - use_power = 2 + use_power = ACTIVE_POWER_USE power_channel = EQUIP var/mob/living/silicon/ai/powered_ai = null invisibility = 100 @@ -303,9 +303,9 @@ var/list/ai_verbs_default = list( return if(!powered_ai.anchored) loc = powered_ai.loc - use_power = 0 + use_power = NO_POWER_USE if(powered_ai.anchored) - use_power = 2 + use_power = ACTIVE_POWER_USE /mob/living/silicon/ai/proc/pick_icon() set category = "AI Commands" @@ -1250,7 +1250,7 @@ var/list/ai_verbs_default = list( else to_chat(src, "Target is not on or near any active cameras on the station.") - + /mob/living/silicon/ai/handle_fire() return diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 2728a1af55e..98b97ed0602 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -137,6 +137,6 @@ acceleration = !acceleration to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].") -/mob/camera/aiEye/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) +/mob/camera/aiEye/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) if(relay_speech) ai.relay_speech(speaker, message, verb, language) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 790ecaa399a..9bf388fe5fe 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -4,7 +4,7 @@ density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 20 active_power_usage = 5000 diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm index 053384baba5..779b3a2de14 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_say.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm @@ -1,7 +1,7 @@ /mob/living/silicon/robot/drone/say(var/message, var/datum/language/speaking = null) if(copytext(message, 1, 2) == "*") return emote(copytext(message, 2)) - + if(!speaking) speaking = parse_language(message) if(!speaking) @@ -10,6 +10,6 @@ if(speaking) return ..() -/mob/living/silicon/robot/drone/whisper_say(var/message, var/datum/language/speaking = null, var/alt_name="", var/verb="whispers") +/mob/living/silicon/robot/drone/whisper_say(var/message, var/datum/language/speaking = null, var/verb="whispers") say(message) //drones do not get to whisper, only speak normally return 1 \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index f284a0b250c..d590892cc01 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -20,6 +20,9 @@ contents -= O if(module) O.loc = module //Return item to module so it appears in its contents, so it can be taken out again. + for(var/X in O.actions) // Remove assocated actions + var/datum/action/A = X + A.Remove(src) if(module_active == O) module_active = null @@ -56,6 +59,7 @@ O.plane = HUD_PLANE O.screen_loc = inv1.screen_loc contents += O + set_actions(O) else if(!module_state_2) O.mouse_opacity = initial(O.mouse_opacity) module_state_2 = O @@ -63,6 +67,7 @@ O.plane = HUD_PLANE O.screen_loc = inv2.screen_loc contents += O + set_actions(O) else if(!module_state_3) O.mouse_opacity = initial(O.mouse_opacity) module_state_3 = O @@ -70,10 +75,16 @@ O.plane = HUD_PLANE O.screen_loc = inv3.screen_loc contents += O + set_actions(O) else to_chat(src, "You need to disable a module first!") update_icons() +/mob/living/silicon/robot/proc/set_actions(obj/item/I) + for(var/X in I.actions) + var/datum/action/A = X + A.Grant(src) + /mob/living/silicon/robot/proc/uneq_active() uneq_module(module_active) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4b127de9af7..86968bcf6c3 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -51,6 +51,7 @@ var/list/robot_verbs_default = list( var/opened = 0 var/custom_panel = null var/list/custom_panel_names = list("Cricket") + var/list/custom_eye_names = list("Cricket","Standard") var/emagged = 0 var/is_emaggable = TRUE var/eye_protection = 0 @@ -306,7 +307,7 @@ var/list/robot_verbs_default = list( module.channels = list("Service" = 1) module_sprites["Basic"] = "robot_old" module_sprites["Android"] = "droid" - module_sprites["Default"] = "robot" + module_sprites["Default"] = "Standard" module_sprites["Noble-STD"] = "Noble-STD" if("Service") @@ -317,7 +318,7 @@ var/list/robot_verbs_default = list( module_sprites["Bro"] = "Brobot" module_sprites["Rich"] = "maximillion" module_sprites["Default"] = "Service2" - module_sprites["Standard"] = "robotServ" + module_sprites["Standard"] = "Standard-Serv" module_sprites["Noble-SRV"] = "Noble-SRV" module_sprites["Cricket"] = "Cricket-SERV" @@ -329,7 +330,7 @@ var/list/robot_verbs_default = list( module_sprites["Basic"] = "Miner_old" module_sprites["Advanced Droid"] = "droid-miner" module_sprites["Treadhead"] = "Miner" - module_sprites["Standard"] = "robotMine" + module_sprites["Standard"] = "Standard-Mine" module_sprites["Noble-DIG"] = "Noble-DIG" module_sprites["Cricket"] = "Cricket-MINE" @@ -342,7 +343,7 @@ var/list/robot_verbs_default = list( module_sprites["Surgeon"] = "surgeon" module_sprites["Advanced Droid"] = "droid-medical" module_sprites["Needles"] = "medicalrobot" - module_sprites["Standard"] = "robotMedi" + module_sprites["Standard"] = "Standard-Medi" module_sprites["Noble-MED"] = "Noble-MED" module_sprites["Cricket"] = "Cricket-MEDI" status_flags &= ~CANPUSH @@ -354,7 +355,7 @@ var/list/robot_verbs_default = list( module_sprites["Red Knight"] = "Security" module_sprites["Black Knight"] = "securityrobot" module_sprites["Bloodhound"] = "bloodhound" - module_sprites["Standard"] = "robotSecy" + module_sprites["Standard"] = "Standard-Secy" module_sprites["Noble-SEC"] = "Noble-SEC" module_sprites["Cricket"] = "Cricket-SEC" status_flags &= ~CANPUSH @@ -367,7 +368,7 @@ var/list/robot_verbs_default = list( module_sprites["Basic"] = "Engineering" module_sprites["Antique"] = "engineerrobot" module_sprites["Landmate"] = "landmate" - module_sprites["Standard"] = "robotEngi" + module_sprites["Standard"] = "Standard-Engi" module_sprites["Noble-ENG"] = "Noble-ENG" module_sprites["Cricket"] = "Cricket-ENGI" magpulse = 1 @@ -378,7 +379,7 @@ var/list/robot_verbs_default = list( module_sprites["Basic"] = "JanBot2" module_sprites["Mopbot"] = "janitorrobot" module_sprites["Mop Gear Rex"] = "mopgearrex" - module_sprites["Standard"] = "robotJani" + module_sprites["Standard"] = "Standard-Jani" module_sprites["Noble-CLN"] = "Noble-CLN" module_sprites["Cricket"] = "Cricket-JANI" @@ -870,7 +871,10 @@ var/list/robot_verbs_default = list( overlays.Cut() if(stat != DEAD && !(paralysis || stunned || weakened || low_power_mode)) //Not dead, not stunned. - overlays += "eyes-[icon_state]" + if(custom_panel in custom_eye_names) + overlays += "eyes-[custom_panel]" + else + overlays += "eyes-[icon_state]" else overlays -= "eyes" diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index a66a9f30de0..48297dbb401 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -1,9 +1,9 @@ -/mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) +/mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios) log_say(message, src) if(..()) return 1 -/mob/living/silicon/robot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) +/mob/living/silicon/robot/handle_message_mode(message_mode, message, verb, speaking, used_radios) if(..()) return 1 if(message_mode) @@ -15,7 +15,7 @@ message_mode = null return radio.talk_into(src,message,message_mode,verb,speaking) -/mob/living/silicon/ai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) +/mob/living/silicon/ai/handle_message_mode(message_mode, message, verb, speaking, used_radios) if(..()) return 1 if(message_mode == "department") @@ -30,11 +30,11 @@ message_mode = null return aiRadio.talk_into(src,message,message_mode,verb,speaking) -/mob/living/silicon/pai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) +/mob/living/silicon/pai/handle_message_mode(message_mode, message, verb, speaking, used_radios) if(..()) return 1 else if(message_mode == "whisper") - whisper_say(message, speaking, alt_name) + whisper_say(message, speaking) return 1 else if(message_mode) if(message_mode == "general") diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 5e79c315f42..7f5c1916619 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -889,7 +889,7 @@ Pass a positive integer as an argument to override a bot's default speed. // Machinery to simplify topic and access calls /obj/machinery/bot_core - use_power = 0 + use_power = NO_POWER_USE var/mob/living/simple_animal/bot/owner = null /obj/machinery/bot_core/New(loc) @@ -1106,4 +1106,4 @@ Pass a positive integer as an argument to override a bot's default speed. var/image/I = path[path[1]] if(I) I.icon = null - path.Cut(1, 2) \ No newline at end of file + path.Cut(1, 2) diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 90c44f19286..085f9e2bd3d 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -44,7 +44,7 @@ icon_state = "ed209_frame" item_state = "ed209_frame" var/build_step = 0 - var/created_name = "ED-209 Security Robot" //To preserve the name if it's a unique securitron I guess + var/created_name = "\improper ED-209 Security Robot" //To preserve the name if it's a unique securitron I guess var/lasercolor = "" /obj/item/ed209_assembly/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 0efaefcce07..cd008b6ef2f 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -706,10 +706,14 @@ H.apply_damage(0.5*damage, BRUTE, "r_arm", run_armor_check("r_arm", "melee")) - var/turf/T = get_turf(src) - H.add_mob_blood(H) - H.add_splatter_floor(T) + + if(NO_BLOOD in H.dna.species.species_traits)//Does the run over mob have blood? + return//If it doesn't it shouldn't bleed (Though a check should be made eventually for things with liquid in them, like slime people, vox armalis, etc.) + + var/turf/T = get_turf(src)//Where are we? + H.add_mob_blood(H)//Cover the victim in their own blood. + H.add_splatter_floor(T)//Put the blood where we are. bloodiness += 4 var/list/blood_dna = H.get_blood_dna_list() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index ef5de1908a8..451f21ce09a 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -175,7 +175,7 @@ Auto Patrol: []"}, mode = BOT_HUNT /mob/living/simple_animal/bot/secbot/attack_hand(mob/living/carbon/human/H) - if(H.a_intent == INTENT_HARM) + if(H.a_intent == INTENT_HARM || H.a_intent == INTENT_DISARM) retaliate(H) return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 079ec7df1d2..762dea31272 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -186,9 +186,7 @@ if(istype(blobmind) && istype(C)) blobmind.special_role = SPECIAL_ROLE_BLOB var/obj/structure/blob/core/core = new(T, 200, C, 3) - if(core.overmind && core.overmind.mind) - //core.overmind.mind.name = blob.name - core.overmind.mind.special_role = SPECIAL_ROLE_BLOB_OVERMIND + core.lateblobtimer() else new /obj/structure/blob/core(T) // Ghosts will be prompted to control it. if(ismob(loc)) // in case some taj/etc ate the mouse. diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index dba62b4744c..ed4c074bff0 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -703,12 +703,12 @@ available_channels = list(":e") ..() -/mob/living/simple_animal/parrot/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name) +/mob/living/simple_animal/parrot/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios) if(message_mode && istype(ears)) ears.talk_into(src, message, message_mode, verb, speaking) used_radios += ears -/mob/living/simple_animal/parrot/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null) +/mob/living/simple_animal/parrot/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null) if(speaker != src && prob(50)) parrot_hear(html_decode(message)) ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 841c17a248e..77c98392740 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -47,6 +47,9 @@ /mob/proc/generate_name() return name +/mob/proc/GetAltName() + return "" + /mob/proc/Cell() set category = "Admin" diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 2914d8596ef..de29470cb02 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -316,12 +316,10 @@ job_master.AssignRole(src, rank, 1) var/mob/living/character = create_character() //creates the human and transfers vars and mind - character = job_master.EquipRank(character, rank, 1) //equips the human - EquipCustomItems(character) + character = job_master.AssignRank(character, rank, 1) //equips the human // AIs don't need a spawnpoint, they must spawn at an empty core if(character.mind.assigned_role == "AI") - var/mob/living/silicon/ai/ai_character = character.AIize() // AIize the character, but don't move them yet // IsJobAvailable for AI checks that there is an empty core available in this list @@ -365,6 +363,9 @@ ticker.mode.latespawn(character) + character = job_master.EquipRank(character, rank, 1) //equips the human + EquipCustomItems(character) + if(character.mind.assigned_role == "Cyborg") AnnounceCyborg(character, rank, join_message) callHook("latespawn", list(character)) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 9655a9c9e17..bdf93fbd4eb 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -890,6 +890,21 @@ icon_state = "hesphiastos_alt_rainbow" models_allowed = list("Hesphiastos Industries alt.") +/datum/sprite_accessory/hair/ipc/fluff + fluff = 1 + +/datum/sprite_accessory/hair/ipc/fluff/lumi_face //Lumi Fluff hair + name = "Lumi Face" + icon_state = "lumi_face" + +/datum/sprite_accessory/hair/ipc/fluff/lumi_blush //Lumi Fluff hair + name = "Lumi Blush" + icon_state = "lumi_blush" + +/datum/sprite_accessory/hair/ipc/fluff/lumi_waiting //Lumi Fluff hair + name = "Lumi Waiting" + icon_state = "lumi_waiting" + /* /////////////////////////////////// / =---------------------------= / diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index 2ae0c251f20..436070470ea 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -2,7 +2,7 @@ /obj/machinery/ntnet_relay name = "NTNet Quantum Relay" desc = "A very complex router and transmitter capable of connecting electronic devices together. Looks fragile." - use_power = 2 + use_power = ACTIVE_POWER_USE active_power_usage = 10000 //10kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational. Used to be 20 but that actually drained the smes one round idle_power_usage = 100 icon = 'icons/obj/stationobjs.dmi' @@ -38,9 +38,9 @@ /obj/machinery/ntnet_relay/process() if(operable()) - use_power = 2 + use_power = ACTIVE_POWER_USE else - use_power = 1 + use_power = IDLE_POWER_USE update_icon() diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 832f5558cd8..36c4409fb34 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -7,7 +7,7 @@ var/list/global_modular_computers = list() name = "modular computer" desc = "An advanced computer." - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 var/hardware_flag = 0 // A flag that describes this device type var/last_power_usage = 0 // Power usage during last tick diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm index 3be4a091301..60f711ad960 100644 --- a/code/modules/modular_computers/hardware/printer.dm +++ b/code/modules/modular_computers/hardware/printer.dm @@ -24,7 +24,7 @@ if(!check_functionality()) return FALSE - var/obj/item/paper/P = new/obj/item/paper(get_turf(holder)) + var/obj/item/paper/P = new/obj/item/paper(holder.drop_location()) // Damaged printer causes the resulting paper to be somewhat harder to read. if(damage > damage_malfunction) diff --git a/code/modules/ninja/martial_art.dm b/code/modules/ninja/martial_art.dm index c97a3e505c3..a7edb67407f 100644 --- a/code/modules/ninja/martial_art.dm +++ b/code/modules/ninja/martial_art.dm @@ -87,8 +87,7 @@ "[A]\ puts you in a [hold_name]! You are unable to speak!") step_to(D,get_step(D,D.dir),1) - D.grabbedby(A, 1) - var/obj/item/grab/G = A.get_active_hand() + var/obj/item/grab/G = D.grabbedby(A, 1) if(G) G.state = GRAB_NECK @@ -136,8 +135,7 @@ return A.pointed(D) /datum/martial_art/ninja_martial_art/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) //Instant aggressive grab - D.grabbedby(A) - var/obj/item/grab/G = A.get_active_hand() + var/obj/item/grab/G = D.grabbedby(A) if(G) G.state = GRAB_AGGRESSIVE diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index ad2fdf38eb1..2b699c36530 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -13,7 +13,7 @@ var/list/alldepartments = list() var/long_range_enabled = 0 // Can we send messages off the station? req_one_access = list(access_lawyer, access_heads, access_armory) - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 30 active_power_usage = 200 diff --git a/code/modules/paperwork/frames.dm b/code/modules/paperwork/frames.dm index c0455b872b2..9faffbcf8f5 100644 --- a/code/modules/paperwork/frames.dm +++ b/code/modules/paperwork/frames.dm @@ -35,8 +35,6 @@ icon_state = "[icon_base]-photo" else if(istype(displayed, /obj/structure/sign/poster)) icon_state = "[icon_base]-[(displayed.icon_state in wide_posters) ? "wposter" : "poster"]" - else if(istype(displayed, /obj/item/canvas)) - icon_state = "[icon_base]-canvas-[displayed.icon_state]" else icon_state = "[icon_base]-paper" diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index b096c768ee0..a8a0c8ddd19 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -7,7 +7,7 @@ var/insert_anim = "bigscanner1" anchored = 1 density = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 30 active_power_usage = 200 power_channel = EQUIP diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 3ba1a4b5210..a0df2084b2f 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -47,7 +47,7 @@ desc = "A control terminal for the area electrical systems." icon_state = "apc0" anchored = 1 - use_power = 0 + use_power = NO_POWER_USE req_access = list(access_engine_equip) var/spooky=0 var/area/area diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 8c9ee3eda0d..7bbb5ac20f9 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -4,7 +4,7 @@ icon_state = "teg" anchored = 0 density = 1 - use_power = 0 + use_power = NO_POWER_USE var/obj/machinery/atmospherics/binary/circulator/cold_circ var/obj/machinery/atmospherics/binary/circulator/hot_circ @@ -244,4 +244,4 @@ /obj/machinery/power/generator/power_change() ..() - update_icon() \ No newline at end of file + update_icon() diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 42f7cbde657..8f9d9fb14cd 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -24,7 +24,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 icon = 'icons/obj/machines/gravity_generator.dmi' anchored = 1 density = 1 - use_power = 0 + use_power = NO_POWER_USE unacidable = 1 var/sprite_number = 0 @@ -101,7 +101,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 active_power_usage = 3000 power_channel = ENVIRON sprite_number = 8 - use_power = 1 + use_power = IDLE_POWER_USE interact_offline = 1 var/on = 1 var/breaker = 1 @@ -287,7 +287,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 /obj/machinery/gravity_generator/main/proc/set_state(var/new_state) charging_state = POWER_IDLE on = new_state - use_power = on ? 2 : 1 + use_power = on ? ACTIVE_POWER_USE : IDLE_POWER_USE // Sound the alert if gravity was just enabled or disabled. var/alert = 0 var/area/area = get_area(src) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index df12267015f..f83b00ec0d3 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -133,7 +133,7 @@ desc = "A lighting fixture." anchored = 1 layer = 5 // They were appearing under mobs which is a little weird - Ostaf - use_power = 2 + use_power = ACTIVE_POWER_USE idle_power_usage = 2 active_power_usage = 20 power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list @@ -258,10 +258,10 @@ on = 0 set_light(0) else - use_power = 2 + use_power = ACTIVE_POWER_USE set_light(BR, PO, CO) else - use_power = 1 + use_power = IDLE_POWER_USE set_light(0) active_power_usage = (brightness_range * 10) @@ -484,7 +484,7 @@ // create a light tube/bulb item and put it in the user's hand - var/obj/item/light/L = new light_type() + var/obj/item/light/L = new light_type(get_turf(user)) L.status = status L.rigged = rigged L.brightness_range = brightness_range @@ -499,7 +499,7 @@ L.update() L.add_fingerprint(user) - user.put_in_active_hand(L) //puts it in our active hand + user.put_in_hands(L) //puts it in our active hand status = LIGHT_EMPTY update() @@ -576,7 +576,7 @@ /obj/machinery/light/blob_act() if(prob(75)) - broken() + qdel(src) // timed process diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 2892d0245b2..bf2563fe310 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -6,7 +6,7 @@ icon_state = "portgen0_0" density = 1 anchored = 0 - use_power = 0 + use_power = NO_POWER_USE var/active = 0 var/power_gen = 5000 diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 15b47a47635..0e255a804fe 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -12,7 +12,7 @@ anchored = 1.0 on_blueprints = TRUE var/datum/powernet/powernet = null - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 0 active_power_usage = 0 @@ -297,7 +297,7 @@ //source is an object caused electrocuting (airlock, grille, etc) //No animations will be performed by this proc. /proc/electrocute_mob(mob/living/carbon/M as mob, var/power_source, var/obj/source, var/siemens_coeff = 1.0) - if(!istype(M)) + if(!istype(M)) return 0 if(istype(M.loc,/obj/mecha)) return 0 //feckin mechs are dumb @@ -305,7 +305,7 @@ var/mob/living/carbon/human/H = M if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves - if(G.siemens_coefficient == 0) + if(G.siemens_coefficient == 0) return 0 //to avoid spamming with insulated glvoes on var/area/source_area diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index d54deb2f6f1..a85d9e880bd 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -8,7 +8,7 @@ var/global/list/rad_collectors = list() anchored = 0 density = 1 req_access = list(access_engine_equip) -// use_power = 0 +// use_power = NO_POWER_USE var/obj/item/tank/plasma/P = null var/last_power = 0 var/active = 0 @@ -148,4 +148,3 @@ var/global/list/rad_collectors = list() flick("ca_deactive", src) update_icons() return - diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 3a5a059d670..0e9bdd8ddf3 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -6,7 +6,7 @@ anchored = 1 density = 0 unacidable = 1 - use_power = 0 + use_power = NO_POWER_USE light_range = 4 layer = OBJ_LAYER + 0.1 var/obj/machinery/field/generator/FG1 = null diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index a6c86d3f2ef..0bcde54af4b 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -7,7 +7,7 @@ density = 1 req_access = list(access_engine_equip) - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 10 active_power_usage = 300 @@ -167,7 +167,7 @@ /* if((severity == 1)&&prob(1)&&prob(1)) if(src.active) src.active = 0 - src.use_power = 1 */ + src.use_power = IDLE_POWER_USE */ return 1 diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 11651ff13fe..0f281c634e3 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -26,7 +26,7 @@ field_generator power level display icon_state = "Field_Gen" anchored = 0 density = 1 - use_power = 0 + use_power = NO_POWER_USE armor = list(melee = 25, bullet = 10, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0) var/const/num_power_levels = 6 // Total number of power level icon has var/power_level = 0 diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index 02a015ba6d5..69153cb4d89 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -6,7 +6,7 @@ icon_state = "TheSingGen" anchored = 0 density = 1 - use_power = 0 + use_power = NO_POWER_USE var/energy = 0 var/creation_type = /obj/singularity diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index dfbedc07ad2..c6c6de434c2 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -281,7 +281,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin icon_state = "none" anchored = 0 density = 1 - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 0 active_power_usage = 0 var/construction_state = 0 @@ -408,10 +408,10 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin if(construction_state < 3)//Was taken apart, update state update_state() if(use_power) - use_power = 0 + use_power = NO_POWER_USE construction_state = temp_state if(construction_state >= 3) - use_power = 1 + use_power = IDLE_POWER_USE update_icon() return 1 return 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 42fbb784f49..bf20ef45140 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -6,7 +6,7 @@ reference = "control_box" anchored = 0 density = 1 - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 500 active_power_usage = 10000 construction_state = 0 @@ -42,7 +42,7 @@ /obj/machinery/particle_accelerator/control_box/update_state() if(construction_state < 3) - use_power = 0 + use_power = NO_POWER_USE assembled = 0 active = 0 for(var/obj/structure/particle_accelerator/part in connected_parts) @@ -52,7 +52,7 @@ connected_parts = list() return if(!part_scan()) - use_power = 1 + use_power = IDLE_POWER_USE active = 0 connected_parts = list() @@ -147,9 +147,9 @@ ..() if(stat & NOPOWER) active = 0 - use_power = 0 + use_power = NO_POWER_USE else if(!stat && construction_state <= 3) - use_power = 1 + use_power = IDLE_POWER_USE update_icon() if((stat & NOPOWER) || (!stat && construction_state <= 3)) //Only update the part icons if something's changed (i.e. any of the above condition sets are met). @@ -231,13 +231,13 @@ log_game("PA Control Computer turned ON by [key_name(usr)] in ([x],[y],[z])") use_log += text("\[[time_stamp()]\] [key_name(usr)] has turned on the PA Control Computer.") if(active) - use_power = 2 + use_power = ACTIVE_POWER_USE for(var/obj/structure/particle_accelerator/part in connected_parts) part.strength = strength part.powered = 1 part.update_icon() else - use_power = 1 + use_power = IDLE_POWER_USE for(var/obj/structure/particle_accelerator/part in connected_parts) part.strength = null part.powered = 0 @@ -276,4 +276,4 @@ popup.set_content(dat) popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) popup.open() - return \ No newline at end of file + return diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index a2025376e9d..7342c1f26c1 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -8,7 +8,7 @@ icon_state = "sp_base" anchored = 1 density = 1 - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 0 active_power_usage = 0 var/id = 0 @@ -279,7 +279,7 @@ icon_state = "computer" anchored = 1 density = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 250 var/icon_screen = "solar" var/icon_keyboard = "power_key" diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 20f4031a8ce..e4e3275ef26 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -10,7 +10,7 @@ icon_state = "tracker" anchored = 1 density = 1 - use_power = 0 + use_power = NO_POWER_USE var/id = 0 var/sun_angle = 0 // sun angle as set by sun datum @@ -82,4 +82,4 @@ icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" w_class = WEIGHT_CLASS_SMALL - origin_tech = "engineering=2;programming=1" \ No newline at end of file + origin_tech = "engineering=2;programming=1" diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm index 762d442a2a9..4f7e7e9c895 100644 --- a/code/modules/power/treadmill.dm +++ b/code/modules/power/treadmill.dm @@ -8,7 +8,7 @@ desc = "A power-generating treadmill." layer = 2.2 anchored = 1 - use_power = 0 + use_power = NO_POWER_USE var/speed = 0 var/friction = 0.15 // lose this much speed every ptick diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm index 08a2104383d..9d16a9c2123 100644 --- a/code/modules/projectiles/firing.dm +++ b/code/modules/projectiles/firing.dm @@ -40,6 +40,12 @@ if(!istype(targloc) || !istype(curloc) || !BB) return 0 BB.ammo_casing = src + + if(target && get_dist(user, target) <= 1) //Point blank shot must always hit + target.bullet_act(BB, BB.def_zone) + QDEL_NULL(BB) + return 1 + if(targloc == curloc) if(target) //if the target is right on our location we go straight to bullet_act() target.bullet_act(BB, BB.def_zone) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index d4d232d2ed7..cf291fba675 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -4,7 +4,7 @@ anchored = 1 icon = 'icons/obj/chemical.dmi' icon_state = "dispenser" - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 40 var/ui_title = "Chem Dispenser 5000" var/energy = 100 diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 16914c77c4d..2d031d9c2c5 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -4,7 +4,7 @@ anchored = 1 icon = 'icons/obj/chemical.dmi' icon_state = "mixer0b" - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 40 var/obj/item/reagent_containers/beaker = null var/desired_temp = 300 @@ -154,4 +154,4 @@ beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list... data["beakerContents"] = beakerContents - return data \ No newline at end of file + return data diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 90f9ed47eec..2a7dac0f48d 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -4,7 +4,7 @@ anchored = 1 icon = 'icons/obj/chemical.dmi' icon_state = "mixer0" - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 20 var/obj/item/reagent_containers/beaker = null var/obj/item/storage/pill_bottle/loaded_pill_bottle = null @@ -416,4 +416,4 @@ to_chat(user, "You can't use the [name] while it's panel is opened!") return 1 else - ..() \ No newline at end of file + ..() diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 8296550d8f9..ee2ac418555 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "mixer0" circuit = /obj/item/circuitboard/pandemic - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 20 var/temp_html = "" var/wait = null @@ -294,4 +294,4 @@ ..() return else - ..() \ No newline at end of file + ..() diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index ce5ed918932..5948d29e4cd 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -4,7 +4,7 @@ icon_state = "juicer1" layer = 2.9 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 pass_flags = PASSTABLE @@ -33,7 +33,6 @@ /obj/item/grown/novaflower = list("capsaicin" = 0, "condensedcapsaicin" = 0), //Blender Stuff - /obj/item/reagent_containers/food/snacks/grown/soybeans = list("soymilk" = 0), /obj/item/reagent_containers/food/snacks/grown/tomato = list("ketchup" = 0), /obj/item/reagent_containers/food/snacks/grown/wheat = list("flour" = -5), /obj/item/reagent_containers/food/snacks/grown/oat = list("flour" = -5), @@ -58,6 +57,7 @@ var/list/juice_items = list ( //Juicer Stuff + /obj/item/reagent_containers/food/snacks/grown/soybeans = list("soymilk" = 0), /obj/item/reagent_containers/food/snacks/grown/corn = list("corn_starch" = 0), /obj/item/reagent_containers/food/snacks/grown/tomato = list("tomatojuice" = 0), /obj/item/reagent_containers/food/snacks/grown/carrot = list("carrotjuice" = 0), @@ -446,4 +446,4 @@ var/amount = O.reagents.total_volume O.reagents.trans_to(beaker, amount) if(!O.reagents.total_volume) - remove_object(O) \ No newline at end of file + remove_object(O) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 476028b4532..9de8033a00f 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -335,7 +335,7 @@ // timed process // charge the gas reservoir and perform flush if ready /obj/machinery/disposal/process() - use_power = 0 + use_power = NO_POWER_USE if(stat & BROKEN) // nothing can happen if broken return @@ -356,13 +356,13 @@ if(stat & NOPOWER) // won't charge if no power return - use_power = 1 + use_power = IDLE_POWER_USE if(mode != 1) // if off or ready, no need to charge return // otherwise charge - use_power = 2 + use_power = ACTIVE_POWER_USE var/atom/L = loc // recharging from loc turf @@ -760,12 +760,8 @@ return if(T.intact && istype(T,/turf/simulated/floor)) //intact floor, pop the tile var/turf/simulated/floor/F = T - //F.health = 100 - F.burnt = 1 - F.intact = 0 - F.levelupdate() - new /obj/item/stack/tile(H) // add to holder so it will be thrown with other stuff - F.icon_state = "Floor[F.burnt ? "1" : ""]" + new F.builtin_tile.type(H) + F.remove_tile(null,TRUE,FALSE) if(direction) // direction is specified if(istype(T, /turf/space)) // if ended in space, then range is unlimited diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 8b2f7c4197f..1b1b5c0ffa9 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -134,6 +134,7 @@ name = "package wrapper" icon = 'icons/obj/items.dmi' icon_state = "deliveryPaper" + singular_name = "package wrapper" flags = NOBLUDGEON amount = 25 max_amount = 25 diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index cbc6ad98582..5a54bf54005 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -856,38 +856,6 @@ build_path = /obj/item/videocam category = list("initial", "Miscellaneous") -/datum/design/canvas - name = "11px by 11px Canvas" - id = "canvas" - build_type = AUTOLATHE - materials = list(MAT_METAL = 50) - build_path = /obj/item/canvas - category = list("initial", "Miscellaneous") - -/datum/design/canvas/nineteenXnineteen - name = "19px by 19px Canvas" - id = "canvas19x19" - build_type = AUTOLATHE - materials = list(MAT_METAL = 50) - build_path = /obj/item/canvas/nineteenXnineteen - category = list("initial", "Miscellaneous") - -/datum/design/canvas/twentythreeXnineteen - name = "23px by 19px Canvas" - id = "canvas23x19" - build_type = AUTOLATHE - materials = list(MAT_METAL = 70) - build_path = /obj/item/canvas/twentythreeXnineteen - category = list("initial", "Miscellaneous") - -/datum/design/canvas/twentythreeXtwentythree - name = "23px by 23px Canvas" - id = "canvas23x23" - build_type = AUTOLATHE - materials = list(MAT_METAL = 100) - build_path = /obj/item/canvas/twentythreeXtwentythree - category = list("initial", "Miscellaneous") - /datum/design/logic_board name = "Logic Circuit" id = "logic_board" diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 57886d2972c..cc6305319c7 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -272,6 +272,16 @@ build_path = /obj/item/circuitboard/mechfab category = list("Research Machinery") +/datum/design/podfab + name = "Machine Board (Spacepod Fabricator)" + desc = "The circuit board for an Spacepod Fabricator" + id = "podfab" + req_tech = list("programming" = 3, "engineering" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000) + build_path = /obj/item/circuitboard/podfab + category = list("Research Machinery") + /datum/design/mech_recharger name = "Machine Board (Mech Bay Recharger)" desc = "The circuit board for a Mech Bay Recharger." diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index e504216fe38..f6e4f2c0877 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -21,7 +21,7 @@ icon_state = "h_lathe" density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE var/recentlyExperimented = 0 var/mob/trackedIan var/mob/trackedRuntime diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 86d507d34de..88ecedbf555 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -50,7 +50,7 @@ var/global/list/obj/machinery/message_server/message_servers = list() name = "Messaging Server" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 100 @@ -199,7 +199,7 @@ var/obj/machinery/blackbox_recorder/blackbox name = "Blackbox Recorder" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 100 var/list/messages = list() //Stores messages of non-standard frequencies @@ -377,4 +377,4 @@ proc/feedback_add_details(var/variable,var/details) if(!FV) return - FV.add_details(details) \ No newline at end of file + FV.add_details(details) diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 51b4f8512e1..1e884e35c3a 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/machines/research.dmi' density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE var/busy = 0 var/hacked = 0 var/disabled = 0 @@ -130,4 +130,4 @@ use_power(min(1000, (amount_inserted / 100))) overlays += "[initial(name)]_[stack_name]" sleep(10) - overlays -= "[initial(name)]_[stack_name]" \ No newline at end of file + overlays -= "[initial(name)]_[stack_name]" diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm index da06ce169f3..b5f7540c3f2 100644 --- a/code/modules/security_levels/keycard authentication.dm +++ b/code/modules/security_levels/keycard authentication.dm @@ -17,7 +17,7 @@ var/ert_reason = "Reason for ERT" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 6 power_channel = ENVIRON diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 57142365cc4..c58f4efb300 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -256,7 +256,7 @@ var/obj/machinery/bsa/full/cannon var/notice var/target - use_power = 0 + use_power = NO_POWER_USE circuit = /obj/item/circuitboard/computer/bsa_control icon = 'icons/obj/machines/particle_accelerator3.dmi' icon_state = "control_boxp" diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index f9fb2ac20c2..9ab290f5c89 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -12,7 +12,7 @@ /datum/surgery/cybernetic_repair/internal name = "Internal Component Manipulation" steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/robotics/manipulate_robotic_organs) - possible_locs = list("eyes", "chest","head","groin","l_arm","r_arm") + possible_locs = list("eyes", "mouth", "chest","head","groin","l_arm","r_arm") requires_organic_bodypart = 0 /datum/surgery/cybernetic_amputation @@ -597,4 +597,4 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message(" [user]'s [tool.name] slips, failing to reprogram [target]'s [affected.name].", " Your [tool.name] slips, failing to reprogram [target]'s [affected.name].") - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index 38d4fa19e40..09f4ffa7920 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/telescience.dmi' icon_state = "pad-idle" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 200 active_power_usage = 5000 var/efficiency @@ -61,7 +61,7 @@ icon = 'icons/obj/telescience.dmi' icon_state = "pad-idle" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 20 active_power_usage = 500 var/stage = 0 diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm index 222699fb4ef..ee6c775b11f 100644 --- a/code/modules/vehicle/ambulance.dm +++ b/code/modules/vehicle/ambulance.dm @@ -4,7 +4,59 @@ icon_state = "docwagon2" keytype = /obj/item/key/ambulance var/obj/structure/bed/amb_trolley/bed = null + var/datum/action/ambulance_alarm/AA + var/datum/looping_sound/ambulance_alarm/soundloop +/obj/vehicle/ambulance/New() + . = ..() + AA = new(src) + soundloop = new(list(src), FALSE) + +/datum/action/ambulance_alarm + name = "Toggle Sirens" + icon_icon = 'icons/obj/vehicles.dmi' + button_icon_state = "docwagon2" + check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_LYING | AB_CHECK_CONSCIOUS + var/toggle_cooldown = 40 + var/cooldown = 0 + + +/datum/action/ambulance_alarm/Trigger() + if(!..()) + return FALSE + + var/obj/vehicle/ambulance/A = target + + if(!istype(A) || !A.soundloop) + return FALSE + + if(world.time < cooldown + toggle_cooldown) + return FALSE + + cooldown = world.time + + if(A.soundloop.muted) + A.soundloop.start() + A.set_light(4,3,"#F70027") + else + A.soundloop.stop() + A.set_light(0) + + +/datum/looping_sound/ambulance_alarm + start_length = 0 + mid_sounds = list('sound/items/WEEOO1.ogg' = 1) + mid_length = 14 + volume = 100 + + +/obj/vehicle/ambulance/post_buckle_mob(mob/living/M) + . = ..() + if(has_buckled_mobs()) + AA.Grant(M) + else + AA.Remove(M) + /obj/item/key/ambulance name = "ambulance key" @@ -56,4 +108,4 @@ to_chat(usr, "You unhook the bed to the ambulance.") else amb.bed = src - to_chat(usr, "You hook the bed to the ambulance.") + to_chat(usr, "You hook the bed to the ambulance.") \ No newline at end of file diff --git a/config/example/custom_sprites.txt b/config/example/custom_sprites.txt index 471764270d4..45d1d66058b 100644 --- a/config/example/custom_sprites.txt +++ b/config/example/custom_sprites.txt @@ -1,5 +1,7 @@ Each entry should be composed of 2 parts, divided by a colon (:) with no spaces, in order to work. Failure to do so will result in that entry being disregarded by the code. -- The first part should be either "cyborg", "ai", "hologram", "pai", or "drone". This tells the code what type of custom sprite this entry is for. The "ai" option is for AI core displays, while "hologram" is for AI hologram projections. +- The first part should be either "cyborg", "ai", "hologram", "pai", "drone", or "screen". This tells the code what type of custom sprite this entry is for. The "ai" option is for AI core displays, while "hologram" is for AI hologram projections. - The second part should be the ckey of the player this entry is for. This tells the code who it works for and also is used to retrieve the proper sprite for them to use. +- If the entry is a custom screen, it will need a 3rd part which is the screen name. This tells the code which screen to use, as well allows for someone to have more then one custom screen. + example:example \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 1928dec8482..90b3d607925 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,224 @@ -->
    +

    29 September 2018

    +

    Dapocalypse updated:

    +
      +
    • Removes extra penlight given to plasmemes.
    • +
    +

    Kyep updated:

    +
      +
    • Fixed several bugs with blob, including lateround blobs not generating biohazard alerts, blobs missing out on early resources they should have, and a bug with blob storage being broken that prevented blobs getting any resources.
    • +
    +

    Triiodine updated:

    +
      +
    • Nukies spawning with cybernetic organs/limbs
    • +
    +

    Ty-Omaha updated:

    +
      +
    • Removes canvases due to everybody crashing from them.
    • +
    +

    farie82 updated:

    +
      +
    • Headbutting the airlock is more consistent.
    • +
    • refactored the airlock code.
    • +
    • Using multitools and such on a door with a note now doesn't remove the note. Only grabbing with an empty hand now.
    • +
    + +

    28 September 2018

    +

    DarkPyrolord updated:

    +
      +
    • Fixes a ten year old atmos bug, fix will cause toxins bombs and plasma fires to be a little less lethal
    • +
    • Readds modkit sprites to items.dm to fix invis fluff item modkits.
    • +
    +

    Farie82 updated:

    +
      +
    • No more broken tile due to getting shot out of disposals.
    • +
    • Point blank shots not hitting the correct person. When multiple people are on the same tile.
    • +
    +

    Kyep updated:

    +
      +
    • The wild west away mission no longer offers hijack traitor status as a potential reward.
    • +
    • Deconstructing/reconstructing the space pod fab no longer turns it into a mech fab. No more mechanics building surprise mechs.
    • +
    • The spacepod fab circuit is now buildable in R&D.
    • +
    • Spacepod fabs now require mechanic access to use, like the mechanic R&D console does.
    • +
    +

    Purpose updated:

    +
      +
    • Mappers can now have Floodlights round-start enabled.
    • +
    +

    Tails2091 updated:

    +
      +
    • Refactored Hallucinations to match contribution guide standards a bit more.
    • +
    +

    Triiodine updated:

    +
      +
    • Fixes jade lipstick being lime.
    • +
    • Adds lime lipstick.
    • +
    • New storage implant icon
    • +
    +

    Ty-Omaha updated:

    +
      +
    • Ambulances now have sirens!
    • +
    • Shadowlings no longer are able to target simple animals (mice)
    • +
    +

    farie82 updated:

    +
      +
    • fixed cling transformed humanoids looking rather pale.
    • +
    • Fixed emagged camera consoles not opening the tabs
    • +
    +

    uc_guy updated:

    +
      +
    • Vox auto equip the nitrogen tank when spawning if possible.
    • +
    • Nitrogen tanks no longer overwrite job items.
    • +
    +

    variableundefined updated:

    +
      +
    • Benjaminfallout's fluff item.
    • +
    • Qdel log is now re-added to the garbage subsystem to enable coders to investigate sources of hard delete.
    • +
    • When you remove a light tube while lying down, the light tube disappear. This no longer happens.
    • +
    • Latejoin AI no longer spawn in naked at arrival shuttles.
    • +
    • Not spawning in with your memory of bank account at roundstart...
    • +
    + +

    27 September 2018

    +

    Anasari updated:

    +
      +
    • You can now deconstruct a fire extinguisher cabinet to yield a single piece of metal. You can construct them for five pieces of metal, with extinguisher included. (Using metal construction menu)
    • +
    +

    Birdtalon updated:

    +
      +
    • Borg modules now add item action buttons if present.
    • +
    • Beepsky responds to attacking him with disarm intent.
    • +
    +

    CornMyCob updated:

    +
      +
    • Adds in a prompt for becoming a headslug.
    • +
    +

    Crazylemon64 updated:

    +
      +
    • Adds a fluff item for ELO
    • +
    +

    DesolateG updated:

    +
      +
    • Added a check to whispering adverbs to prevent double adverbs while whispering.
    • +
    +

    FalseIncarnate updated:

    +
      +
    • Adds mixing bowls, which allow you to cook multiple recipes at the same time! The dinnerware vendor comes pre-stocked with 10!
    • +
    • Adds 2 mixing bowls to the Food Crate from cargo should you need additional. This is the same crate that includes the extra bottle of enzymes.
    • +
    • Burned messes now scale their carbon and "????" content with both physical ingredients and directly inserted reagents while burning in the cooking machines.
    • +
    • Upgraded cooking machines now attempt to evenly distribute reagents from ingredients across all produced results, rather than just the original.
    • +
    +

    Farie82 updated:

    +
      +
    • You can remove notes from an airlock now with the grab intent using an empty hand.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Fixes 128x128 menu location
    • +
    +

    Kyep updated:

    +
      +
    • Refactored shieldgen.dm, fixed a bug which could cause shieldgens to behave improperly under some rare conditions.
    • +
    +

    Purpose updated:

    +
      +
    • CPU Performance tweaks in the Bananaium floor honks & squeaks
    • +
    • Capitalisation correction in automated chef npcs
    • +
    • CPU Performance tweaks in the Xeno Hunter tackles
    • +
    • CPU Performance tweaks in Malf AI
    • +
    • NT Formal clothing now updates to the station names correctly.
    • +
    • Fixes typos in NT Formal clothing
    • +
    • Minimap is now updated
    • +
    • Holopads now use the correct amount of power.
    • +
    • CPU Performance tweaks in the Pipe Dispenser
    • +
    • Blobs now delete light fixtures correctly.
    • +
    • use_power variable is more clearly defined as non-boolean via defines.
    • +
    +

    TDSSS updated:

    +
      +
    • Atmospherics external airlocks can now be controlled by borgs and AIs
    • +
    +

    Triiodine updated:

    +
      +
    • righthand fork sprite being oriented wrong.
    • +
    +

    Ty-Omaha updated:

    +
      +
    • Fixes vending machine bank account security. You can now use them with a bank account security level above zero.
    • +
    • Fixes a bunch of \ tags
    • +
    +

    alex-gh updated:

    +
      +
    • Drask no longer take damage from cryokinesis
    • +
    • Cryokinesis deals less damage, but lowers the body temperature a lot more.
    • +
    • Autopsy scanner now prints all times in human readable format.
    • +
    +

    datlo updated:

    +
      +
    • Added the wizard spell Greater Knock, letting them remove all access restrictions on the Cyberiad and master door opening.
    • +
    +

    variableundefined updated:

    +
      +
    • drop_location & AllowDrop() has been ported over from tg. Report unexpected issues with dropping items.
    • +
    • When you late join, extra items you can't equip / hold spawn on the ground instead of in the lobby screen. Including vox medkit etc.
    • +
    • Plasmaman no longer get double the firepower when spawning in as Captain, BS, or sec roles.
    • +
    • Non-human's DNA (Except for IPC, of course) should show up properly in the DNA modifier now.
    • +
    + +

    25 September 2018

    +

    Birdtalon updated:

    +
      +
    • Secure console UI (security records) appears bigger by default.
    • +
    • One-click-antag now respects game-mode's protected jobs.
    • +
    +

    Fox McCloud updated:

    +
      +
    • adds support for 128x128 skin interface pixel size for 4K monitors
    • +
    +

    Purpose updated:

    +
      +
    • Space is now visible under corner pieces of the Intact Empty Ship ruin.
    • +
    + +

    24 September 2018

    +

    Triiodine, Desolate, updated:

    +
      +
    • Things without blood bleeding red when rolled over by a mulebot.
    • +
    + +

    19 September 2018

    +

    Birdtalon updated:

    +
      +
    • Screwdrivers now open fire alarms instead of wirecutters.
    • +
    + +

    18 September 2018

    +

    Birdtalon updated:

    +
      +
    • Laser tag ED-209 bots get the correct names upon construction.
    • +
    +

    Ty-Omaha updated:

    +
      +
    • adds a missing italics tag to nano/templates/song.tmpl
    • +
    + +

    16 September 2018

    +

    Shazbot updated:

    +
      +
    • Adds in the ability to have multiple custom screens.
    • +
    • Adds in Lumi's custom faces.
    • +
    +

    dandykong updated:

    +
      +
    • Internal manipulation surgeries can now be performed on mouths after the head is augmented.
    • +
    +

    variableundefined updated:

    +
      +
    • Contribution.md now properly state that changelog is mandated for all PR.
    • +
    +

    14 September 2018

    Ty-Omaha updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index c75be7c6d60..8d3d64e6faa 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6964,3 +6964,158 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2018-09-14: Ty-Omaha: - bugfix: Fixes logic with obscure proc adjust_bodytemperature +2018-09-16: + Shazbot: + - rscadd: Adds in the ability to have multiple custom screens. + - rscadd: Adds in Lumi's custom faces. + dandykong: + - bugfix: Internal manipulation surgeries can now be performed on mouths after the + head is augmented. + variableundefined: + - bugfix: Contribution.md now properly state that changelog is mandated for all + PR. +2018-09-18: + Birdtalon: + - bugfix: Laser tag ED-209 bots get the correct names upon construction. + Ty-Omaha: + - spellcheck: adds a missing italics tag to nano/templates/song.tmpl +2018-09-19: + Birdtalon: + - bugfix: Screwdrivers now open fire alarms instead of wirecutters. +2018-09-24: + Triiodine, Desolate,: + - bugfix: Things without blood bleeding red when rolled over by a mulebot. +2018-09-25: + Birdtalon: + - tweak: Secure console UI (security records) appears bigger by default. + - tweak: One-click-antag now respects game-mode's protected jobs. + Fox McCloud: + - rscadd: adds support for 128x128 skin interface pixel size for 4K monitors + Purpose: + - bugfix: Space is now visible under corner pieces of the Intact Empty Ship ruin. +2018-09-27: + Anasari: + - rscadd: You can now deconstruct a fire extinguisher cabinet to yield a single + piece of metal. You can construct them for five pieces of metal, with extinguisher + included. (Using metal construction menu) + Birdtalon: + - bugfix: Borg modules now add item action buttons if present. + - tweak: Beepsky responds to attacking him with disarm intent. + CornMyCob: + - tweak: Adds in a prompt for becoming a headslug. + Crazylemon64: + - rscadd: Adds a fluff item for ELO + DesolateG: + - bugfix: Added a check to whispering adverbs to prevent double adverbs while whispering. + FalseIncarnate: + - rscadd: Adds mixing bowls, which allow you to cook multiple recipes at the same + time! The dinnerware vendor comes pre-stocked with 10! + - rscadd: Adds 2 mixing bowls to the Food Crate from cargo should you need additional. + This is the same crate that includes the extra bottle of enzymes. + - tweak: Burned messes now scale their carbon and "????" content with both physical + ingredients and directly inserted reagents while burning in the cooking machines. + - tweak: Upgraded cooking machines now attempt to evenly distribute reagents from + ingredients across all produced results, rather than just the original. + Farie82: + - tweak: You can remove notes from an airlock now with the grab intent using an + empty hand. + Fox McCloud: + - bugfix: Fixes 128x128 menu location + Kyep: + - bugfix: Refactored shieldgen.dm, fixed a bug which could cause shieldgens to behave + improperly under some rare conditions. + Purpose: + - tweak: CPU Performance tweaks in the Bananaium floor honks & squeaks + - bugfix: Capitalisation correction in automated chef npcs + - tweak: CPU Performance tweaks in the Xeno Hunter tackles + - tweak: CPU Performance tweaks in Malf AI + - bugfix: NT Formal clothing now updates to the station names correctly. + - spellcheck: Fixes typos in NT Formal clothing + - bugfix: Minimap is now updated + - bugfix: Holopads now use the correct amount of power. + - tweak: CPU Performance tweaks in the Pipe Dispenser + - bugfix: Blobs now delete light fixtures correctly. + - tweak: use_power variable is more clearly defined as non-boolean via defines. + TDSSS: + - bugfix: Atmospherics external airlocks can now be controlled by borgs and AIs + Triiodine: + - bugfix: righthand fork sprite being oriented wrong. + Ty-Omaha: + - bugfix: Fixes vending machine bank account security. You can now use them with + a bank account security level above zero. + - spellcheck: Fixes a bunch of \ tags + alex-gh: + - bugfix: Drask no longer take damage from cryokinesis + - tweak: Cryokinesis deals less damage, but lowers the body temperature a lot more. + - bugfix: Autopsy scanner now prints all times in human readable format. + datlo: + - rscadd: Added the wizard spell Greater Knock, letting them remove all access restrictions + on the Cyberiad and master door opening. + variableundefined: + - tweak: drop_location & AllowDrop() has been ported over from tg. Report unexpected + issues with dropping items. + - tweak: When you late join, extra items you can't equip / hold spawn on the ground + instead of in the lobby screen. Including vox medkit etc. + - bugfix: Plasmaman no longer get double the firepower when spawning in as Captain, + BS, or sec roles. + - bugfix: Non-human's DNA (Except for IPC, of course) should show up properly in + the DNA modifier now. +2018-09-28: + DarkPyrolord: + - bugfix: Fixes a ten year old atmos bug, fix will cause toxins bombs and plasma + fires to be a little less lethal + - bugfix: Readds modkit sprites to items.dm to fix invis fluff item modkits. + Farie82: + - bugfix: No more broken tile due to getting shot out of disposals. + - bugfix: Point blank shots not hitting the correct person. When multiple people + are on the same tile. + Kyep: + - rscdel: The wild west away mission no longer offers hijack traitor status as a + potential reward. + - bugfix: Deconstructing/reconstructing the space pod fab no longer turns it into + a mech fab. No more mechanics building surprise mechs. + - tweak: The spacepod fab circuit is now buildable in R&D. + - tweak: Spacepod fabs now require mechanic access to use, like the mechanic R&D + console does. + Purpose: + - rscadd: Mappers can now have Floodlights round-start enabled. + Tails2091: + - bugfix: Refactored Hallucinations to match contribution guide standards a bit + more. + Triiodine: + - bugfix: Fixes jade lipstick being lime. + - rscadd: Adds lime lipstick. + - rscadd: New storage implant icon + Ty-Omaha: + - rscadd: Ambulances now have sirens! + - tweak: Shadowlings no longer are able to target simple animals (mice) + farie82: + - bugfix: fixed cling transformed humanoids looking rather pale. + - bugfix: Fixed emagged camera consoles not opening the tabs + uc_guy: + - tweak: Vox auto equip the nitrogen tank when spawning if possible. + - bugfix: Nitrogen tanks no longer overwrite job items. + variableundefined: + - rscadd: Benjaminfallout's fluff item. + - tweak: Qdel log is now re-added to the garbage subsystem to enable coders to investigate + sources of hard delete. + - bugfix: When you remove a light tube while lying down, the light tube disappear. + This no longer happens. + - bugfix: Latejoin AI no longer spawn in naked at arrival shuttles. + - bugfix: Not spawning in with your memory of bank account at roundstart... +2018-09-29: + Dapocalypse: + - bugfix: Removes extra penlight given to plasmemes. + Kyep: + - bugfix: Fixed several bugs with blob, including lateround blobs not generating + biohazard alerts, blobs missing out on early resources they should have, and + a bug with blob storage being broken that prevented blobs getting any resources. + Triiodine: + - bugfix: Nukies spawning with cybernetic organs/limbs + Ty-Omaha: + - rscdel: Removes canvases due to everybody crashing from them. + farie82: + - tweak: Headbutting the airlock is more consistent. + - bugfix: refactored the airlock code. + - bugfix: Using multitools and such on a door with a note now doesn't remove the + note. Only grabbing with an empty hand now. diff --git a/icons/atmos/vent_scrubber.dmi b/icons/atmos/vent_scrubber.dmi index dadc7215473..c6b6d6ccfe4 100644 Binary files a/icons/atmos/vent_scrubber.dmi and b/icons/atmos/vent_scrubber.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index d229cd65875..160ee13c6d5 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 099b5199b01..10badae1648 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index e9d610d754d..d7e258376af 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 8bcbf4146d5..653dfd5dfa9 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 901581494dd..3e129dca1d2 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/artstuff.dmi b/icons/obj/artstuff.dmi deleted file mode 100644 index 13e8ee5ebea..00000000000 Binary files a/icons/obj/artstuff.dmi and /dev/null differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index 20372528b02..de22e917ddc 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/clothing/ties_overlay.dmi b/icons/obj/clothing/ties_overlay.dmi index 37bbfbf5d25..975059bfeeb 100644 Binary files a/icons/obj/clothing/ties_overlay.dmi and b/icons/obj/clothing/ties_overlay.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index c27c19ac3aa..1ec9229ca6e 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ diff --git a/icons/obj/implants.dmi b/icons/obj/implants.dmi index 8dc2f08fdcb..6ab6a2e74bd 100644 Binary files a/icons/obj/implants.dmi and b/icons/obj/implants.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 5714fcf4c9f..4b53ea70f51 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index d5dcc49c0fc..3bbc5618967 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index c5ae8c52725..6e78de1f629 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1418,6 +1418,13 @@ menu "menu" can-check = true group = "size" saved-params = "is-checked" + elem "icon128" + name = "&128x128 (4x)" + command = ".winset \"mapwindow.map.icon-size=128\"" + category = "&Size" + can-check = true + group = "size" + saved-params = "is-checked" elem "icon96" name = "&96x96 (3x)" command = ".winset \"mapwindow.map.icon-size=96\"" diff --git a/nano/images/Cyberiad_nanomap_z1.png b/nano/images/Cyberiad_nanomap_z1.png index da0c53c8d50..3e1469e2a95 100644 Binary files a/nano/images/Cyberiad_nanomap_z1.png and b/nano/images/Cyberiad_nanomap_z1.png differ diff --git a/nano/templates/song.tmpl b/nano/templates/song.tmpl index 4b4d6669b8f..28ccae0c923 100644 --- a/nano/templates/song.tmpl +++ b/nano/templates/song.tmpl @@ -68,7 +68,7 @@ Used In File(s): \code\game\objects\structures\musician.dm By default, every note is natural and in octave 3. Defining a different state for either is remembered for each note.
      • Example: C,D,E,F,G,A,B will play a C major scale.
      • -
      • After a note has an accidental or octave placed, it will be remembered: C,C4,C#,C3 is C3,C4,C4#,C3#
      • +
      • After a note has an accidental or octave placed, it will be remembered: C,C4,C#,C3 is C3,C4,C4#,C3#

      diff --git a/paradise.dme b/paradise.dme index 71f21a7e4e5..8722d8ae565 100644 --- a/paradise.dme +++ b/paradise.dme @@ -777,6 +777,7 @@ #include "code\game\objects\items\flag.dm" #include "code\game\objects\items\latexballoon.dm" #include "code\game\objects\items\misc.dm" +#include "code\game\objects\items\mixing_bowl.dm" #include "code\game\objects\items\random_items.dm" #include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\toys.dm" @@ -814,6 +815,7 @@ #include "code\game\objects\items\mountable_frames\air_alarm.dm" #include "code\game\objects\items\mountable_frames\apc_frame.dm" #include "code\game\objects\items\mountable_frames\buttons_switches.dm" +#include "code\game\objects\items\mountable_frames\extinguisher_frame.dm" #include "code\game\objects\items\mountable_frames\fire_alarm.dm" #include "code\game\objects\items\mountable_frames\frames.dm" #include "code\game\objects\items\mountable_frames\intercom.dm" @@ -952,7 +954,6 @@ #include "code\game\objects\items\weapons\tanks\watertank.dm" #include "code\game\objects\random\random.dm" #include "code\game\objects\structures\aliens.dm" -#include "code\game\objects\structures\artstuff.dm" #include "code\game\objects\structures\barsign.dm" #include "code\game\objects\structures\bedsheet_bin.dm" #include "code\game\objects\structures\coathanger.dm"