Merge remote-tracking branch 'origin/master'

This commit is contained in:
Flint
2020-01-19 19:46:35 -06:00
359 changed files with 4948 additions and 3166 deletions
+36
View File
@@ -0,0 +1,36 @@
name: Compile changelogs
on:
schedule:
- cron: "0 0 * * *"
jobs:
compile:
name: "Compile changelogs"
runs-on: ubuntu-latest
steps:
- name: "Setup python"
uses: actions/setup-python@v1
with:
python-version: '3.x'
- name: "Install deps"
run: |
python -m pip install --upgrade pip
python -m pip install pyyaml
- name: "Checkout"
uses: actions/checkout@v1
with:
fetch-depth: 25
- name: "Compile"
run: |
python tools/ss13_genchangelog.py html/changelog.html html/changelogs
- name: Commit
run: |
git config --local user.email "action@github.com"
git config --local user.name "Changelogs"
git pull origin master
git commit -m "Automatic changelog compile [ci skip]" -a || true
- name: "Push"
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_MASTER_KEY }}
+22 -3
View File
@@ -1,13 +1,32 @@
Any time you make a change to the schema files, remember to increment the database schema version. Generally increment the minor number, major should be reserved for significant changes to the schema. Both values go up to 255.
The latest database version is 5.6; The query to update the schema revision table is:
The latest database version is 5.7; The query to update the schema revision table is:
INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 6);
INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 7);
or
INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 6);
INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 7);
In any query remember to add a prefix to the table names if you use one.
-----------------------------------------------------
Version 5.7, 10 January 2020 by Atlanta-Ned
Added ticket table for tracking ahelp tickets in the database.
DROP TABLE IF EXISTS `ticket`;
CREATE TABLE `ticket` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`server_ip` int(10) unsigned NOT NULL,
`server_port` smallint(5) unsigned NOT NULL,
`round_id` int(11) unsigned NOT NULL,
`ticket` smallint(11) unsigned NOT NULL,
`action` varchar(20) NOT NULL DEFAULT 'Message',
`message` text NOT NULL,
`timestamp` datetime NOT NULL,
`recipient` varchar(32) DEFAULT NULL,
`sender` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-----------------------------------------------------
+18
View File
@@ -537,6 +537,24 @@ CREATE TABLE `achievement_metadata` (
PRIMARY KEY (`achievement_key`)
) ENGINE=InnoDB;
--
-- Table structure for table `ticket`
--
DROP TABLE IF EXISTS `ticket`;
CREATE TABLE `ticket` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`server_ip` int(10) unsigned NOT NULL,
`server_port` smallint(5) unsigned NOT NULL,
`round_id` int(11) unsigned NOT NULL,
`ticket` smallint(11) unsigned NOT NULL,
`action` varchar(20) NOT NULL DEFAULT 'Message',
`message` text NOT NULL,
`timestamp` datetime NOT NULL,
`recipient` varchar(32) DEFAULT NULL,
`sender` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+18
View File
@@ -537,6 +537,24 @@ CREATE TABLE `SS13_achievement_metadata` (
PRIMARY KEY (`achievement_key`)
) ENGINE=InnoDB;
--
-- Table structure for table `SS13_ticket`
--
DROP TABLE IF EXISTS `SS13_ticket`;
CREATE TABLE `SS13_ticket` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`server_ip` int(10) unsigned NOT NULL,
`server_port` smallint(5) unsigned NOT NULL,
`round_id` int(11) unsigned NOT NULL,
`ticket` smallint(11) unsigned NOT NULL,
`action` varchar(20) NOT NULL DEFAULT 'Message',
`message` text NOT NULL,
`timestamp` datetime NOT NULL,
`recipient` varchar(32) DEFAULT NULL,
`sender` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+16 -22
View File
@@ -3,11 +3,7 @@
/turf/template_noop,
/area/template_noop)
"ab" = (
/obj/machinery/power/shieldwallgen{
active = 2;
anchored = 1;
power = 1
},
/obj/machinery/power/shieldwallgen/anchored,
/obj/structure/cable,
/turf/open/floor/plating/airless,
/area/ruin/space/has_grav/abandonedzoo)
@@ -153,11 +149,7 @@
/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/abandonedzoo)
"aE" = (
/obj/machinery/power/shieldwallgen{
active = 2;
anchored = 1;
power = 1
},
/obj/machinery/power/shieldwallgen/anchored,
/obj/structure/cable,
/turf/open/floor/plating,
/area/ruin/space/has_grav/abandonedzoo)
@@ -248,7 +240,6 @@
/obj/machinery/power/apc/unlocked{
dir = 8;
environ = 0;
equipment = 0;
lighting = 0;
name = "Worn-out APC";
pixel_x = -25
@@ -367,11 +358,8 @@
/turf/open/floor/plasteel/dark/side,
/area/ruin/space/has_grav/abandonedzoo)
"bf" = (
/obj/machinery/power/smes/magical{
desc = "A high-capacity superconducting magnetic energy storage (SMES) unit.";
name = "power storage unit"
},
/obj/structure/cable,
/obj/machinery/power/smes/engineering,
/turf/open/floor/plasteel/dark/side,
/area/ruin/space/has_grav/abandonedzoo)
"bg" = (
@@ -435,13 +423,13 @@
/turf/open/floor/plasteel/dark/side,
/area/ruin/space/has_grav/abandonedzoo)
"bs" = (
/obj/machinery/power/shieldwallgen,
/obj/structure/cable,
/obj/machinery/power/shieldwallgen/anchored,
/turf/open/floor/plating,
/area/ruin/space/has_grav/abandonedzoo)
"bt" = (
/obj/machinery/power/shieldwallgen,
/obj/structure/cable,
/obj/machinery/power/shieldwallgen/anchored,
/turf/open/floor/plating/airless,
/area/ruin/space/has_grav/abandonedzoo)
"bu" = (
@@ -496,6 +484,7 @@
/area/ruin/space/has_grav/abandonedzoo)
"bD" = (
/obj/item/clothing/mask/facehugger/dead,
/obj/structure/alien/weeds,
/turf/open/floor/plating/airless,
/area/ruin/space/has_grav/abandonedzoo)
"bE" = (
@@ -654,7 +643,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/turf/open/floor/plasteel/dark,
/turf/open/floor/plating,
/area/ruin/space/has_grav/abandonedzoo)
"wF" = (
/obj/machinery/door/airlock/hatch{
@@ -690,6 +679,11 @@
"KN" = (
/turf/template_noop,
/area/space/nearstation)
"Ng" = (
/obj/structure/alien/weeds,
/obj/structure/alien/weeds/node,
/turf/open/floor/plating/airless,
/area/ruin/space/has_grav/abandonedzoo)
(1,1,1) = {"
ab
@@ -979,7 +973,7 @@ bl
at
ac
bB
bB
Ng
bD
bH
ac
@@ -1002,7 +996,7 @@ ac
bC
bH
bH
bX
bB
bT
aa
"}
@@ -1022,7 +1016,7 @@ aL
aD
bD
bB
bX
Ng
bO
bU
bW
@@ -1043,7 +1037,7 @@ aQ
ac
bB
bB
bX
bB
bX
bP
aa
File diff suppressed because it is too large Load Diff
+51 -122
View File
@@ -970,9 +970,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrous_output{
dir = 8
},
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"acw" = (
/turf/open/floor/engine,
@@ -1042,7 +1040,8 @@
/turf/open/floor/engine/vacuum,
/area/science/mixing)
"acF" = (
/turf/open/floor/engine/airless,
/obj/machinery/portable_atmospherics/canister/air,
/turf/open/floor/engine/air,
/area/engine/atmos)
"acG" = (
/obj/structure/disposalpipe/segment{
@@ -1182,9 +1181,7 @@
/turf/open/floor/plasteel,
/area/science/storage)
"acT" = (
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"acU" = (
/obj/structure/bookcase,
@@ -1979,9 +1976,7 @@
/area/medical/virology)
"aeV" = (
/obj/machinery/air_sensor/atmos/nitrous_tank,
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"aeW" = (
/obj/effect/decal/cleanable/dirt,
@@ -4602,8 +4597,7 @@
dir = 1
},
/obj/machinery/camera{
c_tag = "Cargo - Docking Bay North";
dir = 2
c_tag = "Cargo - Docking Bay North"
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
@@ -5135,12 +5129,8 @@
},
/area/crew_quarters/kitchen)
"anM" = (
/obj/machinery/atmospherics/miner/n2o{
max_ext_kpa = 2500
},
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"anQ" = (
/obj/structure/sign/warning/docking{
@@ -8437,9 +8427,7 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrous_input{
dir = 8
},
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"axm" = (
/obj/effect/turf_decal/tile/neutral{
@@ -8450,7 +8438,7 @@
/area/hallway/primary/central)
"axn" = (
/obj/effect/landmark/xeno_spawn,
/turf/open/floor/engine/airless,
/turf/open/floor/engine/air,
/area/engine/atmos)
"axo" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
@@ -8587,9 +8575,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxin_output{
dir = 8
},
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"axE" = (
/obj/effect/turf_decal/tile/purple{
@@ -8645,9 +8631,7 @@
},
/area/science/research)
"axJ" = (
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"axK" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
@@ -8785,9 +8769,7 @@
/area/engine/atmos)
"aya" = (
/obj/effect/landmark/xeno_spawn,
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"ayb" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
@@ -8799,9 +8781,7 @@
/area/science/mixing)
"ayc" = (
/obj/machinery/air_sensor/atmos/toxin_tank,
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"ayd" = (
/obj/machinery/suit_storage_unit/atmos,
@@ -8833,12 +8813,8 @@
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"ayh" = (
/obj/machinery/atmospherics/miner/toxins{
max_ext_kpa = 2500
},
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/obj/machinery/portable_atmospherics/canister/toxins,
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"ayi" = (
/obj/machinery/light/small{
@@ -8849,17 +8825,13 @@
dir = 8;
network = list("ss13","Atmospherics")
},
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"ayj" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxin_input{
dir = 8
},
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"ayk" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
@@ -8891,9 +8863,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/carbon_output{
dir = 8
},
/turf/open/floor/engine/co2{
initial_gas_mix = "co2=1000;TEMP=293.15"
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
"ayo" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
@@ -9035,15 +9005,11 @@
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"ayD" = (
/turf/open/floor/engine/co2{
initial_gas_mix = "co2=1000;TEMP=293.15"
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
"ayF" = (
/obj/machinery/air_sensor/atmos/carbon_tank,
/turf/open/floor/engine/co2{
initial_gas_mix = "co2=1000;TEMP=293.15"
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
"ayG" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
@@ -9136,12 +9102,8 @@
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"ayS" = (
/obj/machinery/atmospherics/miner/carbon_dioxide{
max_ext_kpa = 2500
},
/turf/open/floor/engine/co2{
initial_gas_mix = "co2=1000;TEMP=293.15"
},
/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
/turf/open/floor/engine/co2,
/area/engine/atmos)
"ayT" = (
/obj/machinery/light/small{
@@ -9152,9 +9114,7 @@
dir = 8;
network = list("ss13","Atmospherics")
},
/turf/open/floor/engine/co2{
initial_gas_mix = "co2=1000;TEMP=293.15"
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
"ayU" = (
/obj/structure/closet/l3closet/scientist,
@@ -9302,17 +9262,13 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/carbon_input{
dir = 8
},
/turf/open/floor/engine/co2{
initial_gas_mix = "co2=1000;TEMP=293.15"
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
"azj" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrogen_input{
dir = 1
},
/turf/open/floor/engine/n2{
initial_gas_mix = "n2=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
"azk" = (
/obj/machinery/atmospherics/components/binary/pump{
@@ -10845,55 +10801,45 @@
/area/engine/atmos)
"aDD" = (
/obj/machinery/air_sensor/atmos/nitrogen_tank,
/turf/open/floor/engine/n2{
initial_gas_mix = "n2=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
"aDE" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/air_input{
dir = 1
},
/turf/open/floor/engine/airless,
/turf/open/floor/engine/air,
/area/engine/atmos)
"aDF" = (
/obj/machinery/air_sensor/atmos/air_tank,
/turf/open/floor/engine/airless,
/turf/open/floor/engine/air,
/area/engine/atmos)
"aDG" = (
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{
dir = 1
},
/turf/open/floor/engine/airless,
/turf/open/floor/engine/air,
/area/engine/atmos)
"aDH" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrogen_output{
dir = 1
},
/turf/open/floor/engine/n2{
initial_gas_mix = "n2=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
"aDI" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/oxygen_input{
dir = 1
},
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
"aDJ" = (
/obj/machinery/air_sensor/atmos/oxygen_tank,
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
"aDK" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/oxygen_output{
dir = 1
},
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
"aDL" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
@@ -10911,7 +10857,7 @@
dir = 1;
network = list("ss13","Atmospherics")
},
/turf/open/floor/engine/airless,
/turf/open/floor/engine/air,
/area/engine/atmos)
"aDO" = (
/obj/machinery/door/airlock/research{
@@ -31862,9 +31808,7 @@
c_tag = "Atmospherics - Nitrous Oxide Tank";
network = list("ss13","Atmospherics")
},
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"bFr" = (
/obj/structure/disposalpipe/segment{
@@ -36573,9 +36517,7 @@
/area/maintenance/fore)
"bSf" = (
/obj/machinery/light/small,
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"bSh" = (
/obj/machinery/atmospherics/components/binary/pump,
@@ -40213,22 +40155,14 @@
/turf/open/floor/plasteel/dark,
/area/tcommsat/server)
"cdL" = (
/turf/open/floor/engine/n2{
initial_gas_mix = "n2=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
"cdM" = (
/obj/machinery/atmospherics/miner/nitrogen{
max_ext_kpa = 2500
},
/turf/open/floor/engine/n2{
initial_gas_mix = "n2=1000;TEMP=293.15"
},
/obj/machinery/portable_atmospherics/canister/nitrogen,
/turf/open/floor/engine/n2,
/area/engine/atmos)
"cdN" = (
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
"cdP" = (
/obj/effect/turf_decal/tile/yellow{
@@ -40637,12 +40571,8 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"ceK" = (
/obj/machinery/atmospherics/miner/oxygen{
max_ext_kpa = 2500
},
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/open/floor/engine/o2,
/area/engine/atmos)
"ceL" = (
/obj/machinery/light/small,
@@ -40651,9 +40581,7 @@
dir = 1;
network = list("ss13","Atmospherics")
},
/turf/open/floor/engine/n2{
initial_gas_mix = "n2=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
"ceM" = (
/obj/machinery/light/small,
@@ -40662,9 +40590,7 @@
dir = 1;
network = list("ss13","Atmospherics")
},
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
"ceS" = (
/obj/effect/turf_decal/stripes/line{
@@ -40935,6 +40861,9 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
"cFG" = (
/turf/open/floor/engine/air,
/area/engine/atmos)
"cGH" = (
/obj/structure/girder,
/obj/structure/grille/broken,
@@ -89255,7 +89184,7 @@ aDw
avb
aDF
acF
acF
cFG
bPb
pjJ
bPb
@@ -89511,8 +89440,8 @@ azD
aDx
aDC
aDG
acF
acF
cFG
cFG
acj
aal
bPb
+63 -150
View File
@@ -1513,7 +1513,7 @@
/obj/machinery/light{
dir = 1
},
/obj/structure/cable,
/obj/structure/cable/layer3,
/turf/open/floor/plating{
icon_state = "panelscorched"
},
@@ -1747,7 +1747,6 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1{
dir = 4
},
/obj/structure/cable,
/turf/open/floor/engine,
/area/ai_monitored/turret_protected/aisat_interior)
"acW" = (
@@ -1947,7 +1946,6 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
/obj/structure/cable,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"adn" = (
@@ -2209,7 +2207,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 8
},
/obj/structure/cable,
/turf/open/floor/engine,
/area/ai_monitored/turret_protected/aisat/foyer)
"adF" = (
@@ -2370,7 +2367,6 @@
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable,
/turf/open/floor/engine,
/area/ai_monitored/turret_protected/aisat/atmos)
"adS" = (
@@ -2517,7 +2513,6 @@
pixel_x = -22
},
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/aisat/atmos)
"aed" = (
@@ -2536,7 +2531,6 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
/obj/structure/cable,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/atmos)
"aef" = (
@@ -2623,11 +2617,6 @@
},
/turf/open/floor/plasteel,
/area/bridge)
"aen" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"aeo" = (
/obj/structure/lattice,
/obj/structure/grille,
@@ -2913,7 +2902,6 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/obj/structure/cable,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"aeT" = (
@@ -4840,7 +4828,6 @@
name = "Abandoned External Airlock"
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/structure/cable,
/turf/open/floor/plasteel/dark,
/area/maintenance/fore)
"ahZ" = (
@@ -5183,7 +5170,6 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/structure/cable,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
@@ -6593,7 +6579,6 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
/obj/structure/cable,
/turf/open/floor/plasteel/dark,
/area/maintenance/fore)
"akP" = (
@@ -9451,7 +9436,6 @@
network = list("minisat")
},
/obj/effect/turf_decal/stripes/line,
/obj/structure/cable,
/turf/open/floor/engine,
/area/ai_monitored/turret_protected/aisat_interior)
"api" = (
@@ -12576,6 +12560,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 6
},
/obj/structure/cable,
/turf/open/floor/engine,
/area/ai_monitored/turret_protected/aisat/atmos)
"atY" = (
@@ -12670,6 +12655,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{
dir = 8
},
/obj/structure/cable,
/turf/open/floor/engine,
/area/ai_monitored/turret_protected/aisat/atmos)
"aug" = (
@@ -18760,30 +18746,18 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"aDz" = (
/turf/open/floor/engine/n2{
initial_gas_mix = "n2=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
"aDA" = (
/obj/machinery/atmospherics/miner/nitrogen{
max_ext_kpa = 2500
},
/turf/open/floor/engine/n2{
initial_gas_mix = "n2=1000;TEMP=293.15"
},
/obj/machinery/portable_atmospherics/canister/nitrogen,
/turf/open/floor/engine/n2,
/area/engine/atmos)
"aDC" = (
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
"aDD" = (
/obj/machinery/atmospherics/miner/oxygen{
max_ext_kpa = 2500
},
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/open/floor/engine/o2,
/area/engine/atmos)
"aDE" = (
/obj/machinery/camera{
@@ -19603,19 +19577,13 @@
/turf/open/floor/grass,
/area/medical/genetics/cloning)
"aFc" = (
/turf/open/floor/engine/co2{
initial_gas_mix = "co2=1000;TEMP=293.15"
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
"aFd" = (
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"aFe" = (
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"aFf" = (
/turf/open/floor/engine/vacuum,
@@ -19704,28 +19672,16 @@
/turf/open/floor/plasteel/dark,
/area/medical/cryo)
"aFm" = (
/obj/machinery/atmospherics/miner/carbon_dioxide{
max_ext_kpa = 2500
},
/turf/open/floor/engine/co2{
initial_gas_mix = "co2=1000;TEMP=293.15"
},
/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
/turf/open/floor/engine/co2,
/area/engine/atmos)
"aFn" = (
/obj/machinery/atmospherics/miner/toxins{
max_ext_kpa = 2500
},
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/obj/machinery/portable_atmospherics/canister/toxins,
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"aFo" = (
/obj/machinery/atmospherics/miner/n2o{
max_ext_kpa = 2500
},
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"aFp" = (
/obj/machinery/computer/med_data,
@@ -20322,9 +20278,7 @@
name = "atmospherics camera";
network = list("ss13","engine")
},
/turf/open/floor/engine/n2{
initial_gas_mix = "n2=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
"aGl" = (
/obj/structure/table,
@@ -20802,45 +20756,33 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrogen_input{
dir = 4
},
/turf/open/floor/engine/n2{
initial_gas_mix = "n2=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
"aGV" = (
/obj/machinery/air_sensor/atmos/nitrogen_tank,
/turf/open/floor/engine/n2{
initial_gas_mix = "n2=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
"aGW" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrogen_output{
dir = 4
},
/turf/open/floor/engine/n2{
initial_gas_mix = "n2=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
"aGX" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/oxygen_input{
dir = 4
},
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
"aGY" = (
/obj/machinery/air_sensor/atmos/oxygen_tank,
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
"aGZ" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/oxygen_output{
dir = 4
},
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
"aHa" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/air_input{
@@ -20862,67 +20804,49 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/carbon_input{
dir = 1
},
/turf/open/floor/engine/co2{
initial_gas_mix = "co2=1000;TEMP=293.15"
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
"aHe" = (
/obj/machinery/air_sensor/atmos/carbon_tank,
/turf/open/floor/engine/co2{
initial_gas_mix = "co2=1000;TEMP=293.15"
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
"aHf" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/carbon_output{
dir = 1
},
/turf/open/floor/engine/co2{
initial_gas_mix = "co2=1000;TEMP=293.15"
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
"aHg" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxin_input{
dir = 1
},
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"aHh" = (
/obj/machinery/air_sensor/atmos/toxin_tank,
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"aHi" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxin_output{
dir = 1
},
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"aHj" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrous_input{
dir = 1
},
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"aHk" = (
/obj/machinery/air_sensor/atmos/nitrous_tank,
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"aHl" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrous_output{
dir = 1
},
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"aHm" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/mix_input{
@@ -24612,9 +24536,7 @@
/area/security/main)
"aML" = (
/obj/machinery/light/floor,
/turf/open/floor/engine/n2{
initial_gas_mix = "n2=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
"aMM" = (
/obj/machinery/door/airlock/maintenance{
@@ -24658,9 +24580,7 @@
/area/science/mixing/chamber)
"aMO" = (
/obj/machinery/light/floor,
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
"aMP" = (
/obj/structure/chair{
@@ -24787,9 +24707,7 @@
name = "atmospherics camera";
network = list("ss13","engine")
},
/turf/open/floor/engine/co2{
initial_gas_mix = "co2=1000;TEMP=293.15"
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
"aNa" = (
/obj/machinery/camera{
@@ -24798,9 +24716,7 @@
name = "atmospherics camera";
network = list("ss13","engine")
},
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"aNb" = (
/obj/machinery/camera{
@@ -24809,9 +24725,7 @@
name = "atmospherics camera";
network = list("ss13","engine")
},
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"aNc" = (
/obj/machinery/camera{
@@ -30925,15 +30839,11 @@
/area/medical/virology)
"aVF" = (
/obj/effect/landmark/xeno_spawn,
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
"aVG" = (
/obj/effect/landmark/xeno_spawn,
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"aVH" = (
/obj/machinery/status_display/evac,
@@ -33358,6 +33268,7 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1,
/mob/living/simple_animal/bot/secbot/pingsky,
/obj/structure/cable,
/turf/open/floor/engine,
/area/ai_monitored/turret_protected/aisat_interior)
"aZi" = (
@@ -54496,9 +54407,7 @@
/area/maintenance/port)
"bDR" = (
/obj/machinery/light/floor,
/turf/open/floor/engine/co2{
initial_gas_mix = "co2=1000;TEMP=293.15"
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
"bDS" = (
/obj/structure/table,
@@ -55678,9 +55587,7 @@
/area/maintenance/port)
"bFG" = (
/obj/machinery/light/floor,
/turf/open/floor/engine/plasma{
initial_gas_mix = "plasma=1000;TEMP=293.15"
},
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"bFH" = (
/obj/effect/turf_decal/stripes/corner{
@@ -57232,9 +57139,7 @@
/area/hallway/primary/port)
"bId" = (
/obj/machinery/light/floor,
/turf/open/floor/engine/n2o{
initial_gas_mix = "n2o=1000;TEMP=293.15"
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"bIe" = (
/obj/machinery/atmospherics/pipe/simple/purple/visible,
@@ -57803,9 +57708,7 @@
name = "atmospherics camera";
network = list("ss13","engine")
},
/turf/open/floor/engine/o2{
initial_gas_mix = "o2=1000;TEMP=293.15"
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
"bIV" = (
/turf/closed/wall,
@@ -72801,6 +72704,7 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
/obj/structure/cable,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"cfv" = (
@@ -73357,6 +73261,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
/obj/structure/cable,
/turf/open/floor/engine,
/area/ai_monitored/turret_protected/aisat_interior)
"cgq" = (
@@ -73626,6 +73531,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
/obj/structure/cable,
/turf/open/floor/engine,
/area/ai_monitored/turret_protected/aisat_interior)
"cgK" = (
@@ -74027,6 +73933,7 @@
dir = 4
},
/obj/machinery/holopad/secure,
/obj/structure/cable,
/turf/open/floor/engine,
/area/ai_monitored/turret_protected/aisat_interior)
"chq" = (
@@ -74411,6 +74318,8 @@
dir = 5
},
/obj/structure/cable,
/obj/structure/cable_bridge,
/obj/structure/cable/layer3,
/turf/open/floor/engine,
/area/ai_monitored/storage/satellite)
"cic" = (
@@ -93840,6 +93749,10 @@
"dvN" = (
/turf/open/floor/plating/asteroid/lowpressure,
/area/space/nearstation)
"dSr" = (
/obj/machinery/portable_atmospherics/canister/air,
/turf/open/floor/engine/air,
/area/engine/atmos)
"fhz" = (
/obj/structure/cable,
/obj/machinery/holopad/secure,
@@ -119807,8 +119720,8 @@ aDD
aMO
aFM
aMY
dSr
bUQ
aMY
bFP
cCX
bUZ
@@ -121255,19 +121168,19 @@ adR
adZ
aec
aee
aen
cHu
cHu
aeS
aeS
aen
cHu
aeS
aeS
aen
cHu
aeS
aeS
aen
aen
aen
cHu
cHu
cHu
ahY
aiD
akO
+114 -244
View File
@@ -45218,14 +45218,8 @@
/turf/open/floor/plating,
/area/maintenance/starboard/secondary)
"bYc" = (
/obj/structure/window/spawner/east,
/obj/structure/window/spawner/north,
/obj/structure/window/spawner,
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/ausbushes/lavendergrass,
/obj/structure/flora/ausbushes/leafybush,
/obj/structure/flora/ausbushes/palebush,
/turf/open/floor/grass,
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/hallway/primary/central)
"bYd" = (
/obj/machinery/door/firedoor,
@@ -45692,7 +45686,8 @@
dir = 4
},
/obj/machinery/airalarm{
pixel_y = 24
dir = 4;
pixel_x = -22
},
/turf/open/floor/plasteel,
/area/security/checkpoint/medical)
@@ -46178,14 +46173,6 @@
/obj/structure/table,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"caj" = (
/obj/machinery/requests_console{
department = "Medbay";
departmentType = 1;
name = "Medbay RC"
},
/turf/closed/wall,
/area/security/checkpoint/medical)
"cak" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -47076,24 +47063,24 @@
dir = 4;
network = list("ss13","medbay")
},
/obj/structure/chair/greyscale,
/obj/item/radio/intercom{
pixel_x = -28
},
/obj/effect/turf_decal/tile/blue{
dir = 1
dir = 8
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
dir = 1
},
/obj/structure/chair,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cbS" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
/turf/open/floor/plating,
/area/security/checkpoint/medical)
"cbT" = (
@@ -47809,55 +47796,26 @@
/turf/open/floor/plasteel/white,
/area/medical/storage)
"cdw" = (
/obj/machinery/computer/security/telescreen{
desc = "Used for monitoring medbay to ensure patient safety.";
dir = 1;
name = "Medbay Monitor";
network = list("medbay");
pixel_x = -29
},
/obj/machinery/computer/med_data{
dir = 4
},
/obj/machinery/light{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/security/checkpoint/medical)
"cdx" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
/obj/machinery/computer/security/telescreen{
desc = "Used for monitoring medbay to ensure patient safety.";
dir = 4;
name = "Medbay Monitor";
network = list("medbay");
pixel_x = -32
},
/obj/structure/cable,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
/turf/open/floor/plasteel,
/area/security/checkpoint/medical)
"cdy" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/structure/cable,
/obj/effect/landmark/start/medical_doctor,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cdz" = (
@@ -48251,6 +48209,10 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
},
/obj/machinery/light{
dir = 8
},
/obj/structure/cable,
/turf/open/floor/plasteel,
/area/security/checkpoint/medical)
"ceB" = (
@@ -48849,44 +48811,13 @@
/turf/open/floor/plasteel/white,
/area/medical/storage)
"cfP" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
},
/obj/machinery/medical_kiosk,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cfQ" = (
/obj/structure/cable,
/obj/structure/window/reinforced/spawner/north,
/obj/structure/window/reinforced/spawner,
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/ausbushes/lavendergrass,
/obj/structure/flora/ausbushes/reedbush,
/obj/structure/flora/ausbushes/sunnybush,
/obj/structure/window/reinforced/spawner/west,
/turf/open/floor/grass,
/area/security/checkpoint/medical)
"cfR" = (
/obj/structure/cable,
/obj/structure/window/reinforced/spawner/east,
/obj/structure/window/reinforced/spawner/north,
/obj/structure/window/reinforced/spawner,
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/ausbushes/lavendergrass,
/obj/structure/flora/ausbushes/reedbush,
/obj/structure/flora/ausbushes/sunnybush,
/turf/open/floor/grass,
/area/security/checkpoint/medical)
"cfT" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/medical/glass{
@@ -49386,32 +49317,13 @@
/turf/open/floor/plasteel/white,
/area/medical/storage)
"cgX" = (
/obj/structure/chair/greyscale,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cgY" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/structure/chair/greyscale,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/structure/chair,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cgZ" = (
@@ -49420,17 +49332,15 @@
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cha" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/sink{
dir = 8;
pixel_x = 12
@@ -49438,12 +49348,12 @@
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
/obj/effect/turf_decal/tile/yellow,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
@@ -50063,10 +49973,6 @@
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
@@ -50082,50 +49988,13 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cir" = (
/obj/machinery/atmospherics/pipe/manifold/supply,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cit" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
/obj/structure/cable,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"ciu" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
},
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
/obj/effect/turf_decal/tile/yellow,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
@@ -50713,29 +50582,16 @@
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cjR" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
},
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cjS" = (
@@ -51348,34 +51204,21 @@
/turf/open/floor/plating,
/area/medical/medbay/central)
"clo" = (
/obj/structure/chair/greyscale{
dir = 1
},
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/effect/turf_decal/tile/blue,
/obj/structure/chair{
dir = 1
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"clp" = (
/obj/structure/table,
/obj/machinery/light,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/item/storage/firstaid/regular{
pixel_x = 4;
pixel_y = 4
@@ -51385,6 +51228,10 @@
pixel_x = -4;
pixel_y = -4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"clq" = (
@@ -51393,28 +51240,19 @@
pixel_y = -24
},
/obj/item/twohanded/required/kirbyplants,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"clr" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
dir = 8
},
/obj/effect/turf_decal/tile/blue{
dir = 8
dir = 4
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
@@ -70951,15 +70789,11 @@
/obj/structure/sign/warning/nosmoking{
pixel_y = 28
},
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
dir = 1
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
@@ -71849,15 +71683,6 @@
/obj/structure/grille/broken,
/turf/open/space/basic,
/area/space/nearstation)
"dVQ" = (
/obj/structure/window/spawner/west,
/obj/structure/window/spawner/north,
/obj/structure/window/spawner,
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/ausbushes/lavendergrass,
/obj/structure/flora/ausbushes/fernybush,
/turf/open/floor/grass,
/area/hallway/primary/central)
"dVT" = (
/obj/effect/turf_decal/tile/yellow{
dir = 8
@@ -72007,17 +71832,6 @@
/obj/structure/lattice,
/turf/open/space/basic,
/area/space/nearstation)
"eza" = (
/obj/structure/window/spawner/west,
/obj/structure/window/spawner/east,
/obj/structure/window/spawner/north,
/obj/structure/window/spawner,
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/ausbushes/lavendergrass,
/obj/structure/flora/ausbushes/brflowers,
/obj/structure/flora/ausbushes/stalkybush,
/turf/open/floor/grass,
/area/hallway/primary/central)
"eAa" = (
/obj/effect/turf_decal/tile/yellow{
dir = 4
@@ -72576,6 +72390,16 @@
},
/turf/closed/wall/r_wall,
/area/maintenance/disposal/incinerator)
"hcZ" = (
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/effect/turf_decal/tile/blue,
/obj/structure/chair{
dir = 1
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"hdb" = (
/obj/structure/bed,
/obj/item/clothing/suit/straight_jacket,
@@ -74363,6 +74187,14 @@
},
/turf/open/floor/plasteel/dark/corner,
/area/engine/storage_shared)
"oEO" = (
/obj/machinery/requests_console{
department = "Medbay";
departmentType = 1;
name = "Medbay RC"
},
/turf/closed/wall,
/area/medical/storage)
"oFI" = (
/obj/machinery/door/window/eastright{
dir = 8;
@@ -74579,6 +74411,14 @@
},
/turf/open/floor/plasteel,
/area/engine/break_room)
"ppb" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"ppz" = (
/obj/machinery/vending/boozeomat/all_access,
/obj/effect/decal/cleanable/cobweb,
@@ -75191,6 +75031,13 @@
},
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"rMv" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"rOP" = (
/obj/structure/sign/poster/official/random,
/turf/closed/wall,
@@ -75525,6 +75372,12 @@
/obj/machinery/meter,
/turf/open/floor/engine,
/area/engine/engineering)
"sWn" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"tay" = (
/turf/closed/wall,
/area/medical/medbay/central)
@@ -75632,6 +75485,13 @@
/obj/machinery/pinpointer_dispenser,
/turf/open/floor/plating,
/area/quartermaster/sorting)
"tut" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"twp" = (
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
@@ -76445,6 +76305,16 @@
/obj/structure/cable,
/turf/open/floor/plasteel,
/area/maintenance/department/science)
"wSP" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/structure/cable,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"wYq" = (
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/wood,
@@ -100272,7 +100142,7 @@ cad
cbP
cdv
cez
bXK
oEO
tay
cio
cjO
@@ -100526,7 +100396,7 @@ bWj
bXL
bXL
cae
caj
bXL
bXL
bXL
bXL
@@ -100786,11 +100656,11 @@ rVd
cbQ
cdw
ceA
cfQ
cbS
cgX
cip
cjQ
clo
sWn
wSP
hcZ
cmv
cnE
coQ
@@ -101043,10 +100913,10 @@ cag
caf
caf
ceB
cfR
cgY
cir
cdx
cbS
cgX
cbY
tut
cfP
cmv
cnF
@@ -101302,7 +101172,7 @@ cbS
cbS
bXL
dwy
cip
cbY
cdy
clp
cmu
@@ -101559,8 +101429,8 @@ cal
ceD
cfT
cgZ
cit
cjQ
rMv
ppb
clq
cmu
cmu
@@ -108747,7 +108617,7 @@ sKL
bUb
bVb
bWG
dVQ
bSS
bSS
bSS
bSS
@@ -109518,7 +109388,7 @@ jZS
bUd
bVq
bWJ
eza
bYc
bZs
aWf
ccr
+5
View File
@@ -19,6 +19,11 @@
#define MEDAL_SELFOUCH "Hands???"
#define MEDAL_SANDMAN "Mister Sandman"
#define MEDAL_CLEANBOSS "Cleanboss"
#define MEDAL_RULE8 "Rule 8"
#define MEDAL_LONGSHIFT "longshift"
//Skill medal hub IDs
#define MEDAL_LEGENDARY_MINER "Legendary Miner"
//Boss medals
+8 -6
View File
@@ -131,12 +131,14 @@
#define BODYTEMP_COOLING_MAX -100
/// The maximum number of degrees that your body can heat up in 1 tick, due to the environment, when in a hot area.
#define BODYTEMP_HEATING_MAX 30
/// The limit the human body can take before it starts taking damage from heat.
#define BODYTEMP_HEAT_DAMAGE_LIMIT (BODYTEMP_NORMAL + 50)
/// The limit the human body can take before it starts taking damage from coldness.
#define BODYTEMP_COLD_DAMAGE_LIMIT (BODYTEMP_NORMAL - 50)
/// The body temperature limit the human body can take before it starts taking damage from heat.
/// This also affects how fast the body normalises it's temperature when hot.
/// 340k is about 66c, and rather high for a human.
#define BODYTEMP_HEAT_DAMAGE_LIMIT (BODYTEMP_NORMAL + 30)
/// The body temperature limit the human body can take before it starts taking damage from cold.
/// This also affects how fast the body normalises it's temperature when cold.
/// 270k is about -3c, that is below freezing and would hurt over time.
#define BODYTEMP_COLD_DAMAGE_LIMIT (BODYTEMP_NORMAL - 40)
/// what min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0.
#define SPACE_HELM_MIN_TEMP_PROTECT 2.0
+1
View File
@@ -11,3 +11,4 @@
#define CINEMATIC_NUKE_FAR 11
#define CINEMATIC_NUKE_CLOWNOP 12
#define CINEMATIC_CULT_NUKE 13
#define CINEMATIC_CULT_FAIL 14
+1 -1
View File
@@ -204,7 +204,7 @@
// /mob signals
#define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed)
#define COMSIG_MOB_STATCHANGE "mob_statchange" //from base of mob/set_stat(): (new_stat)
#define COMSIG_MOB_CLICKON "mob_clickon" //from base of mob/clickon(): (atom/A, params)
#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon" //from base of mob/MiddleClickOn(): (atom/A)
#define COMSIG_MOB_ALTCLICKON "mob_altclickon" //from base of mob/AltClickOn(): (atom/A)
+1
View File
@@ -51,3 +51,4 @@
#define ORGAN_FAILING (1<<2) //Failing organs perform damaging effects until replaced or fixed
#define ORGAN_EXTERNAL (1<<3) //Was this organ implanted/inserted/etc, if true will not be removed during species change.
#define ORGAN_VITAL (1<<4) //Currently only the brain
#define ORGAN_SYNTHETIC_EMP (1<<5) //Synthetic organ affected by an EMP. Deteriorates over time.
-1
View File
@@ -33,7 +33,6 @@
#define NOBLIUM_RESEARCH_AMOUNT 1000
#define BZ_RESEARCH_SCALE 4
#define BZ_RESEARCH_MAX_AMOUNT 400
#define MIASMA_RESEARCH_AMOUNT 40
#define STIMULUM_RESEARCH_AMOUNT 50
//Plasma fusion properties
#define FUSION_ENERGY_THRESHOLD 3e9 //Amount of energy it takes to start a fusion reaction
+4
View File
@@ -15,6 +15,7 @@
#define MODE_INTERCOM "intercom"
#define MODE_KEY_INTERCOM "i"
#define MODE_TOKEN_INTERCOM ":i"
#define MODE_BINARY "binary"
#define MODE_KEY_BINARY "b"
@@ -63,6 +64,9 @@
//Eavesdropping
#define EAVESDROP_EXTRA_RANGE 1 //how much past the specified message_range does the message get starred, whispering only
/// How close intercoms can be for radio code use
#define MODE_RANGE_INTERCOM 1
// A link given to ghost alice to follow bob
#define FOLLOW_LINK(alice, bob) "<a href=?src=[REF(alice)];follow=[REF(bob)]>(F)</a>"
#define TURF_LINK(alice, turfy) "<a href=?src=[REF(alice)];x=[turfy.x];y=[turfy.y];z=[turfy.z]>(T)</a>"
+1 -1
View File
@@ -20,7 +20,7 @@
*
* make sure you add an update to the schema_version stable in the db changelog
*/
#define DB_MINOR_VERSION 6
#define DB_MINOR_VERSION 7
//! ## Timing subsystem
+5 -2
View File
@@ -145,6 +145,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_BOOZE_SLIDER "booze-slider"
#define TRAIT_QUICK_CARRY "quick-carry"
#define TRAIT_QUICKER_CARRY "quicker-carry"
#define TRAIT_QUICK_BUILD "quick-build"
#define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech"
#define TRAIT_UNSTABLE "unstable"
#define TRAIT_OIL_FRIED "oil_fried"
@@ -159,8 +160,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
// item traits
#define TRAIT_NODROP "nodrop"
#define TRAIT_T_RAY_VISIBLE "t-ray-visible" // Visible on t-ray scanners if the atom/var/level == 1
#define TRAIT_NODROP "nodrop"
#define TRAIT_NO_STORAGE_INSERT "no_storage_insert" //cannot be inserted in a storage.
#define TRAIT_T_RAY_VISIBLE "t-ray-visible" // Visible on t-ray scanners if the atom/var/level == 1
#define TRAIT_NO_TELEPORT "no-teleport" //you just can't
//quirk traits
@@ -190,6 +192,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
// common trait sources
#define TRAIT_GENERIC "generic"
#define GENERIC_ITEM_TRAIT "generic_item"
#define UNCONSCIOUS_BLIND "unconscious_blind"
#define EYE_DAMAGE "eye_damage"
#define GENETIC_MUTATION "genetic"
+1 -1
View File
@@ -2,7 +2,7 @@
#define TYPEID_NULL "0"
#define TYPEID_NORMAL_LIST "f"
//helper macros
#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, length(ref)-6) ) )
#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, -7) ) )
#define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST)
+1 -1
View File
@@ -20,7 +20,7 @@
continue
path += choice
if(copytext(path,-1,0) != "/") //didn't choose a directory, no need to iterate again
if(copytext_char(path, -1) != "/") //didn't choose a directory, no need to iterate again
break
var/extensions
for(var/i in valid_extensions)
+1 -43
View File
@@ -196,48 +196,6 @@
return
// Better recursive loop, technically sort of not actually recursive cause that shit is retarded, enjoy.
//No need for a recursive limit either
/proc/recursive_mob_check(atom/O,client_check=1,sight_check=1,include_radio=1)
var/list/processing_list = list(O)
var/list/processed_list = list()
var/list/found_mobs = list()
while(processing_list.len)
var/atom/A = processing_list[1]
var/passed = 0
if(ismob(A))
var/mob/A_tmp = A
passed=1
if(client_check && !A_tmp.client)
passed=0
if(sight_check && !isInSight(A_tmp, O))
passed=0
else if(include_radio && istype(A, /obj/item/radio))
passed=1
if(sight_check && !isInSight(A, O))
passed=0
if(passed)
found_mobs |= A
for(var/atom/B in A)
if(!processed_list[B])
processing_list |= B
processing_list.Cut(1, 2)
processed_list[A] = A
return found_mobs
/proc/get_hearers_in_view(R, atom/source)
// Returns a list of hearers in view(R) from source (ignoring luminosity). Used in saycode.
var/turf/T = get_turf(source)
@@ -453,7 +411,7 @@
var/list/result = list()
for(var/m in group)
var/mob/M = m
if(!M.key || !M.client || (ignore_category && GLOB.poll_ignore[ignore_category] && M.ckey in GLOB.poll_ignore[ignore_category]))
if(!M.key || !M.client || (ignore_category && GLOB.poll_ignore[ignore_category] && (M.ckey in GLOB.poll_ignore[ignore_category])))
continue
if(be_special_flag)
if(!(M.client.prefs) || !(be_special_flag in M.client.prefs.be_special))
+2 -2
View File
@@ -981,7 +981,7 @@ world
var/icon/atom_icon = new(A.icon, A.icon_state)
if(!letter)
letter = copytext(A.name, 1, 2)
letter = A.name[1]
if(uppercase == 1)
letter = uppertext(letter)
else if(uppercase == -1)
@@ -1109,7 +1109,7 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
WRITE_FILE(GLOB.iconCache[iconKey], icon)
var/iconData = GLOB.iconCache.ExportText(iconKey)
var/list/partial = splittext(iconData, "{")
return replacetext(copytext(partial[2], 3, -5), "\n", "")
return replacetext(copytext_char(partial[2], 3, -5), "\n", "")
/proc/icon2html(thing, target, icon_state, dir, frame = 1, moving = FALSE)
if (!thing)
+1 -1
View File
@@ -431,7 +431,7 @@ GLOBAL_LIST_EMPTY(species_list)
continue
if(M.stat != DEAD && !override)
continue
if(speaker_key && speaker_key in ignoring)
if(speaker_key && (speaker_key in ignoring))
continue
switch(message_type)
+2 -2
View File
@@ -28,10 +28,10 @@
. = "does"
/datum/proc/p_theyve(capitalized, temp_gender)
. = p_they(capitalized, temp_gender) + "'" + copytext(p_have(temp_gender), 3)
. = p_they(capitalized, temp_gender) + "'" + copytext_char(p_have(temp_gender), 3)
/datum/proc/p_theyre(capitalized, temp_gender)
. = p_they(capitalized, temp_gender) + "'" + copytext(p_are(temp_gender), 2)
. = p_they(capitalized, temp_gender) + "'" + copytext_char(p_are(temp_gender), 2)
/datum/proc/p_s(temp_gender) //is this a descriptive proc name, or what?
. = "s"
+6
View File
@@ -188,10 +188,16 @@
cb.InvokeAsync()
LAZYCLEARLIST(round_end_events)
var/speed_round = FALSE
if(world.time - SSticker.round_start_time <= 300 SECONDS)
speed_round = TRUE
for(var/client/C in GLOB.clients)
if(!C.credits)
C.RollCredits()
C.playtitlemusic(40)
if(speed_round)
C.give_award(/datum/award/achievement/misc/speed_round, C.mob)
var/popcount = gather_roundend_feedback()
display_report(popcount)
+11 -3
View File
@@ -16,7 +16,7 @@
return value
if(default)
return default
/proc/sanitize_inlist(value, list/List, default)
if(value in List)
return value
@@ -52,9 +52,12 @@
var/start = 1 + (text2ascii(color, 1) == 35)
var/len = length(color)
var/char = ""
// RRGGBB -> RGB but awful
var/convert_to_shorthand = desired_format == 3 && length_char(color) > 3
. = ""
for(var/i = start, i <= len, i += length(char))
var/i = start
while(i <= len)
char = color[i]
switch(text2ascii(char))
if(48 to 57) //numbers 0 to 9
@@ -65,6 +68,9 @@
. += lowertext(char)
else
break
i += length(char)
if(convert_to_shorthand && i <= len) //skip next one
i += length(color[i])
if(length_char(.) != desired_format)
if(default)
@@ -74,7 +80,9 @@
return crunch + .
/proc/sanitize_ooccolor(color)
var/list/HSL = rgb2hsl(hex2num(copytext(color,2,4)),hex2num(copytext(color,4,6)),hex2num(copytext(color,6,8)))
if(length(color) != length_char(color))
CRASH("Invalid characters in color '[color]'")
var/list/HSL = rgb2hsl(hex2num(copytext(color, 2, 4)), hex2num(copytext(color, 4, 6)), hex2num(copytext(color, 6, 8)))
HSL[3] = min(HSL[3],0.4)
var/list/RGB = hsl2rgb(arglist(HSL))
return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]"
+1 -1
View File
@@ -55,6 +55,6 @@
if(bad_chars)
bad_match = url_encode(bad_chars_regex.match)
scrubbed_url += bad_match
last_good = bad_chars + length(bad_match)
last_good = bad_chars + length(bad_chars_regex.match)
while(bad_chars)
. = scrubbed_url
+5 -5
View File
@@ -485,17 +485,17 @@
//assumes format #RRGGBB #rrggbb
/proc/color_hex2num(A)
if(!A)
if(!A || length(A) != length_char(A))
return 0
var/R = hex2num(copytext(A,2,4))
var/G = hex2num(copytext(A,4,6))
var/B = hex2num(copytext(A,6,0))
var/R = hex2num(copytext(A, 2, 4))
var/G = hex2num(copytext(A, 4, 6))
var/B = hex2num(copytext(A, 6, 8))
return R+G+B
//word of warning: using a matrix like this as a color value will simplify it back to a string after being set
/proc/color_hex2color_matrix(string)
var/length = length(string)
if(length != 7 && length != 9)
if((length != 7 && length != 9) || length != length_char(string))
return color_matrix_identity()
var/r = hex2num(copytext(string, 2, 4))/255
var/g = hex2num(copytext(string, 4, 6))/255
+2 -2
View File
@@ -31,8 +31,8 @@
/mob = "M"
)
for (var/tn in TYPES_SHORTCUTS)
if (copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ )
typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/"))
if(copytext(typename, 1, length("[tn]/") + 1) == "[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ )
typename = TYPES_SHORTCUTS[tn] + copytext(typename, length("[tn]/"))
break
.[typename] = type
+7 -13
View File
@@ -6,22 +6,16 @@
//Inverts the colour of an HTML string
/proc/invertHTML(HTMLstring)
if (!( istext(HTMLstring) ))
if(!istext(HTMLstring))
CRASH("Given non-text argument!")
else
if (length(HTMLstring) != 7)
CRASH("Given non-HTML argument!")
else if(length(HTMLstring) != 7)
CRASH("Given non-HTML argument!")
else if(length_char(HTMLstring) != 7)
CRASH("Given non-hex symbols in argument!")
var/textr = copytext(HTMLstring, 2, 4)
var/textg = copytext(HTMLstring, 4, 6)
var/textb = copytext(HTMLstring, 6, 8)
var/r = hex2num(textr)
var/g = hex2num(textg)
var/b = hex2num(textb)
textr = num2hex(255 - r, 2)
textg = num2hex(255 - g, 2)
textb = num2hex(255 - b, 2)
return text("#[][][]", textr, textg, textb)
return rgb(255 - hex2num(textr), 255 - hex2num(textg), 255 - hex2num(textb))
/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams.
if(!start || !end)
@@ -1400,7 +1394,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/proc/GUID()
var/const/GUID_VERSION = "b"
var/const/GUID_VARIANT = "d"
var/node_id = copytext(md5("[rand()*rand(1,9999999)][world.name][world.hub][world.hub_password][world.internet_address][world.address][world.contents.len][world.status][world.port][rand()*rand(1,9999999)]"), 1, 13)
var/node_id = copytext_char(md5("[rand()*rand(1,9999999)][world.name][world.hub][world.hub_password][world.internet_address][world.address][world.contents.len][world.status][world.port][rand()*rand(1,9999999)]"), 1, 13)
var/time_high = "[num2hex(text2num(time2text(world.realtime,"YYYY")), 2)][num2hex(world.realtime, 6)]"
+26 -16
View File
@@ -42,7 +42,7 @@
thealert.override_alerts = override
if(override)
thealert.timeout = null
thealert.mob_viewer = src
thealert.owner = src
if(new_master)
var/old_layer = new_master.layer
@@ -97,7 +97,7 @@
var/severity = 0
var/alerttooltipstyle = ""
var/override_alerts = FALSE //If it is overriding other alerts of the same type
var/mob/mob_viewer //the mob viewing this alert
var/mob/owner //Alert owner
/obj/screen/alert/MouseEntered(location,control,params)
@@ -227,6 +227,8 @@ or something covering your eyes."
/obj/screen/alert/mind_control/Click()
var/mob/living/L = usr
if(L != owner)
return
to_chat(L, "<span class='mind_control'>[command]</span>")
/obj/screen/alert/drunk //Not implemented
@@ -241,7 +243,7 @@ If you're feeling frisky, examine yourself and click the underlined item to pull
icon_state = "embeddedobject"
/obj/screen/alert/embeddedobject/Click()
if(isliving(usr))
if(isliving(usr) && usr == owner)
var/mob/living/carbon/human/M = usr
return M.help_shake_act(M)
@@ -270,7 +272,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
/obj/screen/alert/fire/Click()
var/mob/living/L = usr
if(!istype(L) || !L.can_resist())
if(!istype(L) || !L.can_resist() || L != owner)
return
L.changeNext_move(CLICK_CD_RESIST)
if(L.mobility_flags & MOBILITY_MOVE)
@@ -330,10 +332,10 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
/obj/screen/alert/bloodsense/process()
var/atom/blood_target
if(!mob_viewer.mind)
if(!owner.mind)
return
var/datum/antagonist/cult/antag = mob_viewer.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
var/datum/antagonist/cult/antag = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
if(!antag)
return
var/datum/objective/sacrifice/sac_objective = locate() in antag.cult_team.objectives
@@ -370,7 +372,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
add_overlay(narnar)
return
var/turf/P = get_turf(blood_target)
var/turf/Q = get_turf(mob_viewer)
var/turf/Q = get_turf(owner)
if(!P || !Q || (P.z != Q.z)) //The target is on a different Z level, we cannot sense that far.
icon_state = "runed_sense2"
desc = "You can no longer sense your target's presence."
@@ -494,7 +496,7 @@ so as to remain in compliance with the most up-to-date laws."
var/atom/target = null
/obj/screen/alert/hackingapc/Click()
if(!usr || !usr.client)
if(!usr || !usr.client || usr != owner)
return
if(!target)
return
@@ -520,7 +522,7 @@ so as to remain in compliance with the most up-to-date laws."
timeout = 300
/obj/screen/alert/notify_cloning/Click()
if(!usr || !usr.client)
if(!usr || !usr.client || usr != owner)
return
var/mob/dead/observer/G = usr
G.reenter_corpse()
@@ -534,7 +536,7 @@ so as to remain in compliance with the most up-to-date laws."
var/action = NOTIFY_JUMP
/obj/screen/alert/notify_action/Click()
if(!usr || !usr.client)
if(!usr || !usr.client || usr != owner)
return
if(!target)
return
@@ -568,7 +570,7 @@ so as to remain in compliance with the most up-to-date laws."
/obj/screen/alert/restrained/Click()
var/mob/living/L = usr
if(!istype(L) || !L.can_resist())
if(!istype(L) || !L.can_resist() || L != owner)
return
L.changeNext_move(CLICK_CD_RESIST)
if((L.mobility_flags & MOBILITY_MOVE) && (L.last_special <= world.time))
@@ -576,7 +578,7 @@ so as to remain in compliance with the most up-to-date laws."
/obj/screen/alert/restrained/buckled/Click()
var/mob/living/L = usr
if(!istype(L) || !L.can_resist())
if(!istype(L) || !L.can_resist() || L != owner)
return
L.changeNext_move(CLICK_CD_RESIST)
if(L.last_special <= world.time)
@@ -585,11 +587,14 @@ so as to remain in compliance with the most up-to-date laws."
// PRIVATE = only edit, use, or override these if you're editing the system as a whole
// Re-render all alerts - also called in /datum/hud/show_hud() because it's needed there
/datum/hud/proc/reorganize_alerts()
/datum/hud/proc/reorganize_alerts(mob/viewmob)
var/mob/screenmob = viewmob || mymob
if(!screenmob.client)
return
var/list/alerts = mymob.alerts
if(!hud_shown)
for(var/i = 1, i <= alerts.len, i++)
mymob.client.screen -= alerts[alerts[i]]
screenmob.client.screen -= alerts[alerts[i]]
return 1
for(var/i = 1, i <= alerts.len, i++)
var/obj/screen/alert/alert = alerts[alerts[i]]
@@ -609,7 +614,10 @@ so as to remain in compliance with the most up-to-date laws."
else
. = ""
alert.screen_loc = .
mymob.client.screen |= alert
screenmob.client.screen |= alert
if(!viewmob)
for(var/M in mymob.observers)
reorganize_alerts(M)
return 1
/obj/screen/alert/Click(location, control, params)
@@ -619,6 +627,8 @@ so as to remain in compliance with the most up-to-date laws."
if(paramslist["shift"]) // screen objects don't do the normal Click() stuff so we'll cheat
to_chat(usr, "<span class='boldnotice'>[name]</span> - <span class='info'>[desc]</span>")
return
if(usr != owner)
return
if(master)
return usr.client.Click(master, location, control, params)
@@ -626,5 +636,5 @@ so as to remain in compliance with the most up-to-date laws."
. = ..()
severity = 0
master = null
mob_viewer = null
owner = null
screen_loc = ""
+8
View File
@@ -93,3 +93,11 @@
screenmob.client.screen -= static_inventory
else
screenmob.client.screen += static_inventory
//We should only see observed mob alerts.
/datum/hud/ghost/reorganize_alerts(mob/viewmob)
var/mob/dead/observer/O = mymob
if (istype(O) && O.observetarget)
return
. = ..()
+1 -1
View File
@@ -189,7 +189,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
hud_version = display_hud_version
persistent_inventory_update(screenmob)
screenmob.update_action_buttons(1)
reorganize_alerts()
reorganize_alerts(screenmob)
screenmob.reload_fullscreen()
update_parallax_pref(screenmob)
@@ -163,7 +163,8 @@
if(key_pos || value_mode == VALUE_MODE_FLAG)
key_name = lowertext(copytext(str_val, 1, key_pos))
key_value = copytext(str_val, key_pos + 1)
if(key_pos)
key_value = copytext(str_val, key_pos + length(str_val[key_pos]))
var/new_key
var/new_value
var/continue_check_value
@@ -111,13 +111,13 @@
if(!L)
continue
var/firstchar = copytext(L, 1, 2)
var/firstchar = L[1]
if(firstchar == "#")
continue
var/lockthis = firstchar == "@"
if(lockthis)
L = copytext(L, 2)
L = copytext(L, length(firstchar) + 1)
var/pos = findtext(L, " ")
var/entry = null
@@ -125,7 +125,7 @@
if(pos)
entry = lowertext(copytext(L, 1, pos))
value = copytext(L, pos + 1)
value = copytext(L, pos + length(L[pos]))
else
entry = lowertext(L)
@@ -291,7 +291,7 @@ Example config:
t = trim(t)
if(length(t) == 0)
continue
else if(copytext(t, 1, 2) == "#")
else if(t[1] == "#")
continue
var/pos = findtext(t, " ")
@@ -300,7 +300,7 @@ Example config:
if(pos)
command = lowertext(copytext(t, 1, pos))
data = copytext(t, pos + 1)
data = copytext(t, pos + length(t[pos]))
else
command = lowertext(t)
+19
View File
@@ -270,6 +270,25 @@ Versioning
key = new_key
key_type = new_key_type
/datum/controller/subsystem/blackbox/proc/LogAhelp(ticket, action, message, recipient, sender)
if(!SSdbcore.Connect())
return
ticket = sanitizeSQL(ticket)
action = sanitizeSQL(action)
message = sanitizeSQL(message)
recipient = recipient ? "'[sanitizeSQL(recipient)]'" : "NULL"
sender = sender ? "'[sanitizeSQL(sender)]'" : "NULL"
var/server_ip = sanitizeSQL(world.internet_address)
var/server_port = sanitizeSQL(world.port)
var/round_id = sanitizeSQL(GLOB.round_id)
var/datum/DBQuery/query_log_ahelp = SSdbcore.NewQuery("INSERT INTO [format_table_name("ticket")] (ticket, action, message, recipient, sender, server_ip, server_port, round_id, timestamp) VALUES ('[ticket]', '[action]', '[message]', [recipient], [sender], INET_ATON(IF('[server_ip]' LIKE '', '0', '[server_ip]')), '[server_port]','[round_id]', '[SQLtime()]')")
query_log_ahelp.Execute()
qdel(query_log_ahelp)
/datum/controller/subsystem/blackbox/proc/ReportDeath(mob/living/L)
set waitfor = FALSE
if(sealed)
+1 -1
View File
@@ -113,7 +113,7 @@ SUBSYSTEM_DEF(economy)
D.adjust_money(medical_cash)
if(ishostile(m))
var/mob/living/simple_animal/hostile/H = m
if(H.stat == DEAD && H.z in SSmapping.levels_by_trait(ZTRAIT_STATION))
if(H.stat == DEAD && (H.z in SSmapping.levels_by_trait(ZTRAIT_STATION)))
dead_monsters++
CHECK_TICK
var/living_ratio = alive_crew / crew
+3 -3
View File
@@ -115,7 +115,7 @@ SUBSYSTEM_DEF(job)
if(flag && (!(flag in player.client.prefs.be_special)))
JobDebug("FOC flag failed, Player: [player], Flag: [flag], ")
continue
if(player.mind && job.title in player.mind.restricted_roles)
if(player.mind && (job.title in player.mind.restricted_roles))
JobDebug("FOC incompatible with antagonist role, Player: [player]")
continue
if(player.client.prefs.job_preferences[job.title] == level)
@@ -151,7 +151,7 @@ SUBSYSTEM_DEF(job)
JobDebug("GRJ player not enough xp, Player: [player]")
continue
if(player.mind && job.title in player.mind.restricted_roles)
if(player.mind && (job.title in player.mind.restricted_roles))
JobDebug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]")
continue
@@ -331,7 +331,7 @@ SUBSYSTEM_DEF(job)
JobDebug("DO player not enough xp, Player: [player], Job:[job.title]")
continue
if(player.mind && job.title in player.mind.restricted_roles)
if(player.mind && (job.title in player.mind.restricted_roles))
JobDebug("DO incompatible with antagonist role, Player: [player], Job:[job.title]")
continue
+12 -12
View File
@@ -37,34 +37,34 @@ SUBSYSTEM_DEF(pai)
switch(option)
if("name")
t = input("Enter a name for your pAI", "pAI Name", candidate.name) as text|null
t = sanitize_name(stripped_input(usr, "Enter a name for your pAI", "pAI Name", candidate.name, MAX_NAME_LEN))
if(t)
candidate.name = copytext(sanitize_name(t),1,MAX_NAME_LEN)
candidate.name = t
if("desc")
t = input("Enter a description for your pAI", "pAI Description", candidate.description) as message|null
t = stripped_multiline_input(usr, "Enter a description for your pAI", "pAI Description", candidate.description, MAX_MESSAGE_LEN)
if(t)
candidate.description = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
candidate.description = t
if("role")
t = input("Enter a role for your pAI", "pAI Role", candidate.role) as text|null
t = stripped_input(usr, "Enter a role for your pAI", "pAI Role", candidate.role, MAX_MESSAGE_LEN)
if(t)
candidate.role = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
candidate.role = t
if("ooc")
t = input("Enter any OOC comments", "pAI OOC Comments", candidate.comments) as message|null
t = stripped_multiline_input(usr, "Enter any OOC comments", "pAI OOC Comments", candidate.comments, MAX_MESSAGE_LEN)
if(t)
candidate.comments = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
candidate.comments = t
if("save")
candidate.savefile_save(usr)
if("load")
candidate.savefile_load(usr)
//In case people have saved unsanitized stuff.
if(candidate.name)
candidate.name = copytext(sanitize(candidate.name),1,MAX_NAME_LEN)
candidate.name = copytext_char(sanitize(candidate.name),1,MAX_NAME_LEN)
if(candidate.description)
candidate.description = copytext(sanitize(candidate.description),1,MAX_MESSAGE_LEN)
candidate.description = copytext_char(sanitize(candidate.description),1,MAX_MESSAGE_LEN)
if(candidate.role)
candidate.role = copytext(sanitize(candidate.role),1,MAX_MESSAGE_LEN)
candidate.role = copytext_char(sanitize(candidate.role),1,MAX_MESSAGE_LEN)
if(candidate.comments)
candidate.comments = copytext(sanitize(candidate.comments),1,MAX_MESSAGE_LEN)
candidate.comments = copytext_char(sanitize(candidate.comments),1,MAX_MESSAGE_LEN)
if("submit")
if(candidate)
@@ -46,6 +46,6 @@ PROCESSING_SUBSYSTEM_DEF(networks)
var/hex = md5(string)
if(!hex)
return //errored
. = "[copytext(hex, 1, 9)]" //16 ^ 8 possibilities I think.
. = "[copytext_char(hex, 1, 9)]" //16 ^ 8 possibilities I think.
if(interfaces_by_id[.])
return resolve_collisions? make_address("[num2text(rand(HID_RESTRICTED_END, 999999999), 12)]"):null
@@ -1,3 +1,4 @@
#define EXP_ASSIGN_WAYFINDER 1200
//Used to process and handle roundstart quirks
// - Quirk strings are used for faster checking in code
// - Quirk datums are stored and hold different effects, as well as being a vector for applying trait string
@@ -43,5 +44,5 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
cli.prefs.save_character()
// Assign wayfinding pinpointer granting quirk if they're new
if(cli.get_exp_living(TRUE) < 1200 && !user.has_quirk(/datum/quirk/needswayfinder))
if(cli.get_exp_living(TRUE) < EXP_ASSIGN_WAYFINDER && !user.has_quirk(/datum/quirk/needswayfinder))
user.add_quirk(/datum/quirk/needswayfinder, TRUE)
+14 -1
View File
@@ -4,7 +4,15 @@ SUBSYSTEM_DEF(profiler)
name = "Profiler"
init_order = INIT_ORDER_PROFILER
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
wait = 600
wait = 3000
flags = SS_NO_TICK_CHECK
var/fetch_cost = 0
var/write_cost = 0
/datum/controller/subsystem/profiler/stat_entry(msg)
msg += "F:[round(fetch_cost,1)]ms"
msg += "|W:[round(write_cost,1)]ms"
..(msg)
/datum/controller/subsystem/profiler/Initialize()
if(CONFIG_GET(flag/auto_profile))
@@ -40,11 +48,16 @@ SUBSYSTEM_DEF(profiler)
stack_trace("Auto profiling unsupported on this byond version")
CONFIG_SET(flag/auto_profile, FALSE)
#else
var/timer = TICK_USAGE_REAL
var/current_profile_data = world.Profile(PROFILE_REFRESH,format="json")
fetch_cost = MC_AVERAGE(fetch_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
CHECK_TICK
if(!length(current_profile_data)) //Would be nice to have explicit proc to check this
stack_trace("Warning, profiling stopped manually before dump.")
var/json_file = file("[GLOB.log_directory]/[PROFILER_FILENAME]")
if(fexists(json_file))
fdel(json_file)
timer = TICK_USAGE_REAL
WRITE_FILE(json_file, current_profile_data)
write_cost = MC_AVERAGE(write_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
#endif
+19 -4
View File
@@ -1,75 +1,90 @@
/datum/award/achievement/boss
category = "Bosses"
icon = "baseboss"
/datum/award/achievement/boss/tendril_exterminator
name = "Tendril Exterminator"
desc = "Watch your step"
database_id = BOSS_MEDAL_TENDRIL
icon = "tendril"
/datum/award/achievement/boss/boss_killer
name = "Boss Killer"
desc = "You've come a long ways from asking how to switch hands."
database_id = "Boss Killer"
icon = "firstboss"
/datum/award/achievement/boss/blood_miner_kill
name = "Blood-drunk Miner Killer"
desc = "I guess he couldn't handle his drink that well."
database_id = BOSS_MEDAL_MINER
icon = "miner"
/datum/award/achievement/boss/bubblegum_kill
name = "Bubblegum Killer"
desc = "I guess he wasn't made of candy after all"
database_id = BOSS_MEDAL_BUBBLEGUM
icon = "bbgum"
/datum/award/achievement/boss/colussus_kill
name = "Colussus Killer"
/datum/award/achievement/boss/colossus_kill
name = "Colossus Killer"
desc = "The bigger they are... the better the loot"
database_id = BOSS_MEDAL_COLOSSUS
icon = "colossus"
/datum/award/achievement/boss/drake_kill
name = "Drake Killer"
desc = "Now I can wear Rune Platebodies!"
database_id = BOSS_MEDAL_DRAKE
icon = "drake"
/datum/award/achievement/boss/hierophant_kill
name = "Hierophant Killer"
desc = "Hierophant, but not triumphant."
database_id = BOSS_MEDAL_HIEROPHANT
icon = "hierophant"
/datum/award/achievement/boss/legion_kill
name = "Legion Killer"
desc = "We were many..now we are none."
database_id = BOSS_MEDAL_LEGION
icon = "legion"
/datum/award/achievement/boss/swarmer_beacon_kill
name = "Swarm Beacon Killer"
desc = "GET THEM OFF OF ME!"
database_id = BOSS_MEDAL_SWARMERS
icon = "swarmer"
/datum/award/achievement/boss/blood_miner_crusher
name = "Blood-drunk Miner Crusher"
desc = "I guess he couldn't handle his drink that well."
database_id = BOSS_MEDAL_MINER_CRUSHER
icon = "miner"
/datum/award/achievement/boss/bubblegum_crusher
name = "Bubblegum Crusher"
desc = "I guess he wasn't made of candy after all"
database_id = BOSS_MEDAL_BUBBLEGUM_CRUSHER
icon = "bbgum"
/datum/award/achievement/boss/colussus_crusher
name = "Colussus Crusher"
/datum/award/achievement/boss/colossus_crusher
name = "Colossus Crusher"
desc = "The bigger they are... the better the loot"
database_id = BOSS_MEDAL_COLOSSUS_CRUSHER
icon = "colossus"
/datum/award/achievement/boss/drake_crusher
name = "Drake Crusher"
desc = "Now I can wear Rune Platebodies!"
database_id = BOSS_MEDAL_DRAKE_CRUSHER
icon = "drake"
/datum/award/achievement/boss/hierophant_crusher
name = "Hierophant Crusher"
desc = "Hierophant, but not triumphant."
database_id = BOSS_MEDAL_HIEROPHANT_CRUSHER
icon = "hierophant"
/datum/award/achievement/boss/legion_crusher
name = "Legion Crusher"
+21 -1
View File
@@ -1,41 +1,49 @@
/datum/award/achievement/misc
category = "Misc"
icon = "basemisc"
/datum/award/achievement/misc/meteor_examine
name = "Your Life Before Your Eyes"
desc = "Take a close look at hurtling space debris"
database_id = MEDAL_METEOR
icon = "meteors"
/datum/award/achievement/misc/pulse
name = "Jackpot"
desc = "Win a pulse rifle from an arcade machine"
database_id = MEDAL_PULSE
icon = "jackpot"
/datum/award/achievement/misc/time_waste
name = "Time waster"
desc = "Speak no evil, hear no evil, see just errors"
database_id = MEDAL_TIMEWASTE
icon = "timewaste"
/datum/award/achievement/misc/feat_of_strength
name = "Feat of Strength"
desc = "If the rod is immovable, is it passing you or are you passing it?"
database_id = MEDAL_RODSUPLEX
icon = "featofstrength"
/datum/award/achievement/misc/round_and_full
name = "Round and Full"
desc = "Well at least you aren't down the river, I hear they eat people there."
database_id = MEDAL_CLOWNCARKING
icon = "clownking"
/datum/award/achievement/misc/the_best_driver
name = "The Best Driver"
desc = "100 honks later"
database_id = MEDAL_THANKSALOT
icon = "clownthanks"
/datum/award/achievement/misc/helbitaljanken
name = "Helbitaljanken"
desc = "You janked hard"
database_id = MEDAL_HELBITALJANKEN
icon = "helbital"
/datum/award/achievement/misc/getting_an_upgrade
name = "Getting an upgrade"
desc = "Make your first unique material item!"
@@ -75,3 +83,15 @@
name = "One Lean, Mean, Cleaning Machine"
desc = "How does it feel to know that your workplace values a mop bucket on wheels more than you?" // i can do better than this give me time
database_id = MEDAL_CLEANBOSS
/datum/award/achievement/misc/rule8
name = "Rule 8"
desc = "Call an admin this is ILLEGAL!!"
database_id = MEDAL_RULE8
icon = "rule8"
/datum/award/achievement/misc/speed_round
name = "Long shift"
desc = "Well, that didn't take long."
database_id = MEDAL_LONGSHIFT
icon = "longshift"
@@ -0,0 +1,10 @@
/datum/award/achievement/skill
category = "Skills"
icon = "baseskill"
/datum/award/achievement/skill/legendary_miner
name = "Legendary miner"
desc = "No mere rock can stop me!"
database_id = MEDAL_LEGENDARY_MINER
icon = "mining"
+1 -1
View File
@@ -152,7 +152,7 @@
to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode))
/mob/camera/imaginary_friend/proc/friend_talk(message)
message = capitalize(trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)))
message = capitalize(trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)))
if(!message)
return
+14
View File
@@ -203,6 +203,20 @@
special()
screen.icon_state = "summary_cult"
/datum/cinematic/cult_fail
id = CINEMATIC_CULT_FAIL
/datum/cinematic/cult_fail/content()
screen.icon_state = "station_intact"
sleep(20)
cinematic_sound(sound('sound/creatures/narsie_rises.ogg'))
sleep(60)
cinematic_sound(sound('sound/effects/explosion_distant.ogg'))
sleep(10)
cinematic_sound(sound('sound/magic/demon_dies.ogg'))
sleep(30)
special()
/datum/cinematic/nuke_annihilation
id = CINEMATIC_ANNIHILATION
+1 -2
View File
@@ -133,12 +133,11 @@ GLOBAL_LIST_EMPTY(GPS_list)
switch(action)
if("rename")
var/atom/parentasatom = parent
var/a = input("Please enter desired tag.", parentasatom.name, gpstag) as text|null
var/a = stripped_input(usr, "Please enter desired tag.", parentasatom.name, gpstag, 20)
if (!a)
return
a = copytext(sanitize(a), 1, 20)
gpstag = a
. = TRUE
parentasatom.name = "global positioning system ([gpstag])"
+1 -1
View File
@@ -606,7 +606,7 @@
if(!stop_messages)
to_chat(M, "<span class='warning'>[host] cannot hold [I]!</span>")
return FALSE
if(is_type_in_typecache(I, cant_hold)) //Check for specific items which this container can't hold.
if(is_type_in_typecache(I, cant_hold) || HAS_TRAIT(I, TRAIT_NO_STORAGE_INSERT)) //Items which this container can't hold.
if(!stop_messages)
to_chat(M, "<span class='warning'>[host] cannot hold [I]!</span>")
return FALSE
+5 -5
View File
@@ -156,8 +156,8 @@
if(active)
return sequence
while(difficulty)
var/randnum = rand(1, length(sequence))
sequence = copytext(sequence, 1, randnum) + "X" + copytext(sequence, randnum+1, length(sequence)+1)
var/randnum = rand(1, length_char(sequence))
sequence = copytext_char(sequence, 1, randnum) + "X" + copytext_char(sequence, randnum + 1)
difficulty--
return sequence
@@ -461,14 +461,14 @@
/proc/getleftblocks(input,blocknumber,blocksize)
if(blocknumber > 1)
return copytext(input,1,((blocksize*blocknumber)-(blocksize-1)))
return copytext_char(input,1,((blocksize*blocknumber)-(blocksize-1)))
/proc/getrightblocks(input,blocknumber,blocksize)
if(blocknumber < (length(input)/blocksize))
return copytext(input,blocksize*blocknumber+1,length(input)+1)
return copytext_char(input,blocksize*blocknumber+1,length(input)+1)
/proc/getblock(input, blocknumber, blocksize=DNA_BLOCK_SIZE)
return copytext(input, blocksize*(blocknumber-1)+1, (blocksize*blocknumber)+1)
return copytext_char(input, blocksize*(blocknumber-1)+1, (blocksize*blocknumber)+1)
/proc/setblock(istring, blocknumber, replacement, blocksize=DNA_BLOCK_SIZE)
if(!istring || !blocknumber || !replacement || !blocksize)
+2 -2
View File
@@ -7,7 +7,7 @@
var/capacity
///Add a duct to our network
/datum/ductnet/proc/add_duct(obj/machinery/duct/D)
if(!D || D in ducts)
if(!D || (D in ducts))
return
ducts += D
D.duct = src
@@ -52,7 +52,7 @@
for(var/A in D.ducts)
var/obj/machinery/duct/M = A
M.duct = src //forget your old master
destroy_network()
///destroy the network and tell all our ducts and plumbers we are gone
/datum/ductnet/proc/destroy_network(delete=TRUE)
+1 -1
View File
@@ -8,7 +8,7 @@
/datum/element/digitalcamo/Attach(datum/target)
. = ..()
if(!isliving(target) || target in attached_mobs)
if(!isliving(target) || (target in attached_mobs))
return ELEMENT_INCOMPATIBLE
RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/on_examine)
RegisterSignal(target, COMSIG_LIVING_CAN_TRACK, .proc/can_track)
+1 -1
View File
@@ -44,7 +44,7 @@
for(var/line in testmerge)
var/datum/tgs_revision_information/test_merge/tm = line
var/cm = tm.pull_request_commit
var/details = ": '" + html_encode(tm.title) + "' by " + html_encode(tm.author) + " at commit " + html_encode(copytext(cm, 1, min(length(cm), 11)))
var/details = ": '" + html_encode(tm.title) + "' by " + html_encode(tm.author) + " at commit " + html_encode(copytext_char(cm, 1, 11))
if(details && findtext(details, "\[s\]") && (!usr || !usr.client.holder))
continue
. += "<a href=\"[CONFIG_GET(string/githuburl)]/pull/[tm.number]\">#[tm.number][details]</a><br>"
+2 -2
View File
@@ -268,8 +268,8 @@
var/splitpoint = findtext(prepared_line," ")
if(!splitpoint)
continue
var/command = copytext(prepared_line,1,splitpoint)
var/value = copytext(prepared_line,splitpoint+1)
var/command = copytext(prepared_line, 1, splitpoint)
var/value = copytext(prepared_line, splitpoint + length(prepared_line[splitpoint]))
switch(command)
if("DELAY")
var/delay_value = text2num(value)
+1 -1
View File
@@ -27,7 +27,7 @@
reset_streak(D)
streak = streak+element
if(length(streak) > max_streak_length)
streak = copytext(streak,2)
streak = copytext(streak, 1 + length(streak[1]))
/datum/martial_art/proc/reset_streak(mob/living/carbon/human/new_target)
current_target = new_target
+3 -3
View File
@@ -183,9 +183,9 @@
last_death = world.time
/datum/mind/proc/store_memory(new_text)
var/newlength = length(memory) + length(new_text)
var/newlength = length_char(memory) + length_char(new_text)
if (newlength > MAX_MESSAGE_LEN * 100)
memory = copytext(memory, -newlength-MAX_MESSAGE_LEN * 100)
memory = copytext_char(memory, -newlength-MAX_MESSAGE_LEN * 100)
memory += "[new_text]<BR>"
/datum/mind/proc/wipe_memory()
@@ -447,7 +447,7 @@
assigned_role = new_role
else if (href_list["memory_edit"])
var/new_memo = copytext(sanitize(input("Write new memory", "Memory", memory) as null|message),1,MAX_MESSAGE_LEN)
var/new_memo = stripped_multiline_input(usr, "Write new memory", "Memory", memory, MAX_MESSAGE_LEN)
if (isnull(new_memo))
return
memory = new_memo
@@ -176,7 +176,7 @@
/datum/mood_event/notcreepingsevere/add_effects(name)
var/list/unstable = list(name)
for(var/i in 1 to rand(3,5))
unstable += copytext(name, -1)
unstable += copytext_char(name, -1)
var/unhinged = uppertext(unstable.Join(""))//example Tinea Luxor > TINEA LUXORRRR (with randomness in how long that slur is)
description = "<span class='boldwarning'>THEY NEEEEEEED [unhinged]!!</span>\n"
+7 -5
View File
@@ -160,11 +160,13 @@
/obj/screen/alert/status_effect/strandling/Click(location, control, params)
. = ..()
to_chat(mob_viewer, "<span class='notice'>You attempt to remove the durathread strand from around your neck.</span>")
if(do_after(mob_viewer, 35, null, mob_viewer))
if(isliving(mob_viewer))
var/mob/living/L = mob_viewer
to_chat(mob_viewer, "<span class='notice'>You succesfuly remove the durathread strand.</span>")
if(usr != owner)
return
to_chat(owner, "<span class='notice'>You attempt to remove the durathread strand from around your neck.</span>")
if(do_after(owner, 35, null, owner))
if(isliving(owner))
var/mob/living/L = owner
to_chat(owner, "<span class='notice'>You succesfuly remove the durathread strand.</span>")
L.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
+1
View File
@@ -16,6 +16,7 @@
..()
if(!quirk_mob || (human_only && !ishuman(quirk_mob)) || quirk_mob.has_quirk(type))
qdel(src)
return
quirk_holder = quirk_mob
SSquirks.quirk_objects += src
to_chat(quirk_holder, gain_text)
+3
View File
@@ -150,6 +150,9 @@
var/mob/living/carbon/human/H = quirk_holder
wayfinder = new /obj/item/pinpointer/wayfinding
wayfinder.owner = H.real_name
wayfinder.roundstart = TRUE
var/list/slots = list(
"in your left pocket" = ITEM_SLOT_LPOCKET,
"in your right pocket" = ITEM_SLOT_RPOCKET,
+2 -2
View File
@@ -88,8 +88,8 @@
var/list/entry = list()
entry["parent"] = "[type]"
entry["name"] = verbpath.desc
if (copytext(verbpath.name,1,2) == "@")
entry["command"] = copytext(verbpath.name,2)
if (verbpath.name[1] == "@")
entry["command"] = copytext(verbpath.name, length(verbpath.name[1]) + 1)
else
entry["command"] = replacetext(verbpath.name, " ", "-")
+3 -3
View File
@@ -479,7 +479,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/engine/atmos
name = "Atmospherics"
icon_state = "atmos"
flags_1 = NONE
flags_1 = CULT_PERMITTED_1
/area/engine/atmospherics_engine
name = "Atmospherics Engine"
@@ -666,7 +666,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/medical/virology
name = "Virology"
icon_state = "virology"
flags_1 = NONE
flags_1 = CULT_PERMITTED_1
/area/medical/morgue
name = "Morgue"
@@ -850,7 +850,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/janitor
name = "Custodial Closet"
icon_state = "janitor"
flags_1 = NONE
flags_1 = CULT_PERMITTED_1
/area/hydroponics
name = "Hydroponics"
-5
View File
@@ -186,11 +186,6 @@
if(HAS_TRAIT(src, TRAIT_XENO_HOST))
holder.icon_state = "hudxeno"
else if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH)))
if(tod)
var/tdelta = round(world.time - timeofdeath)
if(tdelta < (DEFIB_TIME_LIMIT * 10))
holder.icon_state = "huddefib"
return
holder.icon_state = "huddead"
else
switch(virus_threat)
@@ -48,7 +48,7 @@
trimmed_list.Remove(M)
continue
if (M.mind)
if (restrict_ghost_roles && M.mind.assigned_role in GLOB.exp_specialmap[EXP_TYPE_SPECIAL]) // Are they playing a ghost role?
if (restrict_ghost_roles && (M.mind.assigned_role in GLOB.exp_specialmap[EXP_TYPE_SPECIAL])) // Are they playing a ghost role?
trimmed_list.Remove(M)
continue
if (M.mind.assigned_role in restricted_roles) // Does their job allow it?
+5
View File
@@ -162,6 +162,11 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
name_part1 = pick_list(ARCADE_FILE, "rpg_adjective_xmas")
name_part2 = pick_list(ARCADE_FILE, "rpg_enemy_xmas")
weapons = strings(ARCADE_FILE, "rpg_weapon_xmas")
else if(SSevents.holidays && SSevents.holidays[VALENTINES])
name_action = pick_list(ARCADE_FILE, "rpg_action_valentines")
name_part1 = pick_list(ARCADE_FILE, "rpg_adjective_valentines")
name_part2 = pick_list(ARCADE_FILE, "rpg_enemy_valentines")
weapons = strings(ARCADE_FILE, "rpg_weapon_valentines")
else
name_action = pick_list(ARCADE_FILE, "rpg_action")
name_part1 = pick_list(ARCADE_FILE, "rpg_adjective")
+1 -1
View File
@@ -578,7 +578,7 @@
R.fields["mrace"] = rando_race.type
R.fields["name"] = mob_occupant.real_name
R.fields["id"] = copytext(md5(mob_occupant.real_name), 2, 6)
R.fields["id"] = copytext_char(md5(mob_occupant.real_name), 2, 6)
R.fields["UE"] = dna.unique_enzymes
R.fields["UI"] = dna.uni_identity
R.fields["SE"] = dna.mutation_index
+16 -5
View File
@@ -127,15 +127,20 @@
if("crossserver")
if(authenticated==2)
var/dest = href_list["cross_dest"]
if(!checkCCcooldown())
to_chat(usr, "<span class='warning'>Arrays recycling. Please stand by.</span>")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE)
return
var/input = stripped_multiline_input(usr, "Please choose a message to transmit to allied stations. Please be aware that this process is very expensive, and abuse will lead to... termination.", "Send a message to an allied station.", "")
var/warning = dest == "all" ? "Please choose a message to transmit to allied stations." : "Please choose a message to transmit to [dest] sector station."
var/input = stripped_multiline_input(usr, "[warning] Please be aware that this process is very expensive, and abuse will lead to... termination.", "Send a message to an allied station.", "")
if(!input || !(usr in view(1,src)) || !checkCCcooldown())
return
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
send2otherserver("[station_name()]", input,"Comms_Console")
if(dest == "all")
send2otherserver("[station_name()]", input,"Comms_Console")
else
send2otherserver("[station_name()]", input,"Comms_Console", list(dest))
minor_announce(input, title = "Outgoing message to allied station")
usr.log_talk(input, LOG_SAY, tag="message to the other server")
message_admins("[ADMIN_LOOKUPFLW(usr)] has sent a message to the other server.")
@@ -470,9 +475,15 @@
if (authenticated==2)
dat += "<BR><BR><B>Captain Functions</B>"
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=announce'>Make a Captain's Announcement</A> \]"
var/cross_servers_count = length(CONFIG_GET(keyed_list/cross_server))
if(cross_servers_count)
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=crossserver'>Send a message to [cross_servers_count == 1 ? "an " : ""]allied station[cross_servers_count > 1 ? "s" : ""]</A> \]"
var/list/cross_servers = CONFIG_GET(keyed_list/cross_server)
var/our_id = CONFIG_GET(string/cross_comms_name)
if(cross_servers.len)
for(var/server in cross_servers)
if(server == our_id)
continue
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=crossserver=all;cross_dest=[server]'>Send a message to station in [server] sector.</A> \]"
if(cross_servers.len > 2)
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=crossserver;cross_dest=all'>Send a message to all allied stations</A> \]"
if(SSmapping.config.allow_custom_shuttles)
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=purchase_menu'>Purchase Shuttle</A> \]"
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=changeseclevel'>Change Alert Level</A> \]"
+16 -11
View File
@@ -248,13 +248,18 @@
var/max_line_len = 7*DNA_BLOCK_SIZE
if(viable_occupant)
temp_html += "<div class='dnaBlockNumber'>1</div>"
var/len = length(viable_occupant.dna.uni_identity)
for(var/i=1, i<=len, i++)
temp_html += "<a class='dnaBlock' href='?src=[REF(src)];task=pulseui;num=[i];'>[copytext(viable_occupant.dna.uni_identity,i,i+1)]</a>"
if ((i % max_line_len) == 0)
var/char = ""
var/ui_text = viable_occupant.dna.uni_identity
var/len_byte = length(ui_text)
var/char_it = 0
for(var/byte_it = 1, byte_it <= len_byte, byte_it += length(char))
char_it++
char = ui_text[byte_it]
temp_html += "<a class='dnaBlock' href='?src=[REF(src)];task=pulseui;num=[char_it];'>[char]</a>"
if((char_it % max_line_len) == 0)
temp_html += "</div><div class='clearBoth'>"
if((i % DNA_BLOCK_SIZE) == 0 && i < len)
temp_html += "<div class='dnaBlockNumber'>[(i / DNA_BLOCK_SIZE) + 1]</div>"
if((char_it % DNA_BLOCK_SIZE) == 0 && byte_it < len_byte)
temp_html += "<div class='dnaBlockNumber'>[(char_it / DNA_BLOCK_SIZE) + 1]</div>"
else
temp_html += "---------"
temp_html += "</div></div><br><h1>Buffer Menu</h1>"
@@ -516,7 +521,7 @@
if(!scrambled)
for(var/block in 1 to A.blocks)
var/whole_sequence = get_valid_gene_string(mutation)
var/sequence = copytext(whole_sequence, 1+(block-1)*(DNA_SEQUENCE_LENGTH*2),(DNA_SEQUENCE_LENGTH*2*block+1))
var/sequence = copytext_char(whole_sequence, 1+(block-1)*(DNA_SEQUENCE_LENGTH*2),(DNA_SEQUENCE_LENGTH*2*block+1))
temp_html += "<div class='statusLine'><table class='statusDisplay'><tr>"
for(var/i in 1 to DNA_SEQUENCE_LENGTH)
var/num = 1+(i-1)*2
@@ -698,7 +703,7 @@
viable_occupant.radiation += (RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength)/(connected.damage_coeff ** 2) //Read comment in "transferbuffer" section above for explanation
switch(href_list["task"]) //Same thing as there but values are even lower, on best part they are about 0.0*, effectively no damage
if("pulseui")
var/len = length(viable_occupant.dna.uni_identity)
var/len = length_char(viable_occupant.dna.uni_identity)
num = WRAP(num, 1, len+1)
num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2
//Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low
@@ -706,12 +711,12 @@
var/subblock = num - block*DNA_BLOCK_SIZE
last_change = "UI #[block]-[subblock]; "
var/hex = copytext(viable_occupant.dna.uni_identity, num, num+1)
var/hex = copytext_char(viable_occupant.dna.uni_identity, num, num+1)
last_change += "[hex]"
hex = scramble(hex, radstrength, radduration)
last_change += "->[hex]"
viable_occupant.dna.uni_identity = copytext(viable_occupant.dna.uni_identity, 1, num) + hex + copytext(viable_occupant.dna.uni_identity, num+1, 0)
viable_occupant.dna.uni_identity = copytext_char(viable_occupant.dna.uni_identity, 1, num) + hex + copytext_char(viable_occupant.dna.uni_identity, num + 1)
viable_occupant.updateappearance(mutations_overlay_update=1)
else
current_screen = "mainmenu"
@@ -823,7 +828,7 @@
var/true_genes = GET_SEQUENCE(current_mutation)
new_gene = true_genes[num]
jokerready = world.time + JOKER_TIMEOUT - (JOKER_UPGRADE * (connected.precision_coeff-1))
sequence = copytext(sequence, 1, num) + new_gene + copytext(sequence, num+1, length(sequence)+1)
sequence = copytext_char(sequence, 1, num) + new_gene + copytext_char(sequence, num + 1)
viable_occupant.dna.mutation_index[path] = sequence
viable_occupant.radiation += RADIATION_STRENGTH_MULTIPLIER/connected.damage_coeff
viable_occupant.domutcheck()
@@ -124,7 +124,7 @@
to_chat(usr, "<span class='danger'>Unauthorized access.</span>")
else if(href_list["warn"])
var/warning = copytext(sanitize(input(usr,"Message:","Enter your message here!","")),1,MAX_MESSAGE_LEN)
var/warning = stripped_input(usr, "Message:", "Enter your message here!", "", MAX_MESSAGE_LEN)
if(!warning)
return
var/obj/item/implant/I = locate(href_list["warn"]) in GLOB.tracked_implants
+1 -1
View File
@@ -608,7 +608,7 @@ What a mess.*/
switch(href_list["field"])
if("name")
if(istype(active1, /datum/data/record) || istype(active2, /datum/data/record))
var/t1 = copytext(sanitize(input("Please input name:", "Secure. records", active1.fields["name"], null) as text),1,MAX_MESSAGE_LEN)
var/t1 = stripped_input(usr, "Please input name:", "Secure. records", active1.fields["name"], MAX_MESSAGE_LEN)
if(!canUseSecurityRecordsConsole(usr, t1, a1))
return
if(istype(active1, /datum/data/record))
+53 -55
View File
@@ -5,6 +5,8 @@
icon_keyboard = "teleport_key"
light_color = LIGHT_COLOR_BLUE
circuit = /obj/item/circuitboard/computer/teleporter
ui_x = 475
ui_y = 130
var/regime_set = "Teleporter"
var/id
var/obj/machinery/teleport/station/power_station
@@ -31,34 +33,29 @@
break
return power_station
/obj/machinery/computer/teleporter/ui_interact(mob/user)
. = ..()
var/data = "<h3>Teleporter Status</h3>"
if(!power_station)
data += "<div class='statusDisplay'>No power station linked.</div>"
else if(!power_station.teleporter_hub)
data += "<div class='statusDisplay'>No hub linked.</div>"
/obj/machinery/computer/teleporter/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "teleporter", name, ui_x, ui_y, master_ui, state)
ui.open()
/obj/machinery/computer/teleporter/ui_data(mob/user)
var/list/data = list()
data["power_station"] = power_station ? TRUE : FALSE
data["teleporter_hub"] = power_station?.teleporter_hub ? TRUE : FALSE
data["regime_set"] = regime_set
data["target"] = !target ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]"
data["calibrating"] = calibrating
if(power_station?.teleporter_hub?.calibrated || power_station?.teleporter_hub?.accuracy >= 3)
data["calibrated"] = TRUE
else
data += "<div class='statusDisplay'>Current regime: [regime_set]<BR>"
data += "Current target: [(!target) ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]"]<BR>"
if(calibrating)
data += "Calibration: <font color='yellow'>In Progress</font>"
else if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accuracy >= 3)
data += "Calibration: <font color='green'>Optimal</font>"
else
data += "Calibration: <font color='red'>Sub-Optimal</font>"
data += "</div><BR>"
data["calibrated"] = FALSE
data += "<A href='?src=[REF(src)];regimeset=1'>Change regime</A><BR>"
data += "<A href='?src=[REF(src)];settarget=1'>Set target</A><BR>"
return data
data += "<BR><A href='?src=[REF(src)];calibrate=1'>Calibrate Hub</A>"
var/datum/browser/popup = new(user, "teleporter", name, 400, 400)
popup.set_content(data)
popup.open()
/obj/machinery/computer/teleporter/Topic(href, href_list)
/obj/machinery/computer/teleporter/ui_act(action, params)
if(..())
return
@@ -69,38 +66,39 @@
say("Error: Calibration in progress. Stand by.")
return
if(href_list["regimeset"])
power_station.engaged = 0
power_station.teleporter_hub.update_icon()
power_station.teleporter_hub.calibrated = 0
reset_regime()
if(href_list["settarget"])
power_station.engaged = 0
power_station.teleporter_hub.update_icon()
power_station.teleporter_hub.calibrated = 0
set_target(usr)
if(href_list["calibrate"])
if(!target)
say("Error: No target set to calibrate to.")
return
if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accuracy >= 3)
say("Hub is already calibrated!")
return
say("Processing hub calibration to target...")
switch(action)
if("regimeset")
power_station.engaged = FALSE
power_station.teleporter_hub.update_icon()
power_station.teleporter_hub.calibrated = FALSE
reset_regime()
. = TRUE
if("settarget")
power_station.engaged = FALSE
power_station.teleporter_hub.update_icon()
power_station.teleporter_hub.calibrated = FALSE
set_target(usr)
. = TRUE
if("calibrate")
if(!target)
say("Error: No target set to calibrate to.")
return
if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accuracy >= 3)
say("Hub is already calibrated!")
return
calibrating = 1
power_station.update_icon()
spawn(50 * (3 - power_station.teleporter_hub.accuracy)) //Better parts mean faster calibration
calibrating = 0
if(check_hub_connection())
power_station.teleporter_hub.calibrated = 1
say("Calibration complete.")
else
say("Error: Unable to detect hub.")
say("Processing hub calibration to target...")
calibrating = TRUE
power_station.update_icon()
updateDialog()
updateDialog()
spawn(50 * (3 - power_station.teleporter_hub.accuracy)) //Better parts mean faster calibration
calibrating = FALSE
if(check_hub_connection())
power_station.teleporter_hub.calibrated = TRUE
say("Calibration complete.")
else
say("Error: Unable to detect hub.")
power_station.update_icon()
. = TRUE
/obj/machinery/computer/teleporter/proc/check_hub_connection()
if(!power_station)
+13 -7
View File
@@ -305,7 +305,7 @@
if(speed <= 0)
speed = 1
if("setpath")
var/newpath = copytext(sanitize(input(usr, "Please define a new path!",,path) as text|null),1,MAX_MESSAGE_LEN)
var/newpath = stripped_input(usr, "Please define a new path!", "New Path", path, MAX_MESSAGE_LEN)
if(newpath && newpath != "")
moving = 0 // stop moving
path = newpath
@@ -366,13 +366,19 @@
// Generates the rpath variable using the path string, think of this as "string2list"
// Doesn't use params2list() because of the akward way it stacks entities
rpath = list() // clear rpath
var/maximum_character = min( 50, length(path) ) // chooses the maximum length of the iterator. 50 max length
var/maximum_characters = 50
var/lentext = length(path)
var/nextchar = ""
var/charcount = 0
for(var/i=1, i<=maximum_character, i++) // iterates through all characters in path
for(var/i = 1, i <= lentext, i += length(nextchar)) // iterates through all characters in path
nextchar = path[i] // find next character
var/nextchar = copytext(path, i, i+1) // find next character
if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore
rpath += copytext(path, i, i+1) // else, add to list
if(nextchar in list(";", "&", "*", " ")) // if char is a separator, ignore
continue
rpath += nextchar // else, add to list
// there doesn't HAVE to be separators but it makes paths syntatically visible
charcount++
if(charcount >= maximum_characters)
break
+2 -2
View File
@@ -65,7 +65,7 @@
var/index = findtext(e, "=") // format is "key=value"
if(index)
var/key = copytext(e, 1, index)
var/val = copytext(e, index+1)
var/val = copytext(e, index + length(e[index]))
codes[key] = val
else
codes[e] = "1"
@@ -189,7 +189,7 @@ Transponder Codes:<UL>"}
usr.set_machine(src)
if(href_list["locedit"])
var/newloc = copytext(sanitize(input("Enter New Location", "Navigation Beacon", location) as text|null),1,MAX_MESSAGE_LEN)
var/newloc = stripped_input(usr, "Enter New Location", "Navigation Beacon", location, MAX_MESSAGE_LEN)
if(newloc)
location = newloc
glob_lists_register()
+2 -4
View File
@@ -162,7 +162,7 @@ GLOBAL_LIST_EMPTY(allCasters)
NEWSCASTER.update_icon()
/datum/newscaster/feed_network/proc/save_photo(icon/photo)
var/photo_file = copytext(md5("\icon[photo]"), 1, 6)
var/photo_file = copytext_char(md5("\icon[photo]"), 1, 6)
if(!fexists("[GLOB.log_directory]/photos/[photo_file].png"))
//Clean up repeated frames
var/icon/clean = new /icon()
@@ -506,8 +506,6 @@ GLOBAL_LIST_EMPTY(allCasters)
scan_user(usr)
if(href_list["set_channel_name"])
channel_name = stripped_input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "", MAX_NAME_LEN)
while (findtext(channel_name," ") == 1)
channel_name = copytext(channel_name,2,length(channel_name)+1)
updateUsrDialog()
else if(href_list["set_channel_lock"])
c_locked = !c_locked
@@ -682,7 +680,7 @@ GLOBAL_LIST_EMPTY(allCasters)
updateUsrDialog()
else if(href_list["new_comment"])
var/datum/newscaster/feed_message/FM = locate(href_list["new_comment"]) in viewing_channel.messages
var/cominput = copytext(stripped_input(usr, "Write your message:", "New comment", null),1,141)
var/cominput = stripped_input(usr, "Write your message:", "New comment", null, 140)
if(cominput)
scan_user(usr)
var/datum/newscaster/feed_comment/FC = new/datum/newscaster/feed_comment
+6 -7
View File
@@ -237,10 +237,10 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments)
usr.set_machine(src)
add_fingerprint(usr)
if(reject_bad_text(href_list["write"]))
to_department = ckey(href_list["write"]) //write contains the string of the receiving department's name
if(href_list["write"])
to_department = ckey(reject_bad_text(href_list["write"])) //write contains the string of the receiving department's name
var/new_message = (to_department in GLOB.req_console_ckey_departments) && copytext(reject_bad_text(input(usr, "Write your message:", "Awaiting Input", "")),1,MAX_MESSAGE_LEN)
var/new_message = (to_department in GLOB.req_console_ckey_departments) && stripped_input(usr, "Write your message:", "Awaiting Input", "", MAX_MESSAGE_LEN)
if(new_message)
to_department = GLOB.req_console_ckey_departments[to_department]
message = new_message
@@ -248,7 +248,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments)
priority = CLAMP(text2num(href_list["priority"]), REQ_NORMAL_MESSAGE_PRIORITY, REQ_EXTREME_MESSAGE_PRIORITY)
if(href_list["writeAnnouncement"])
var/new_message = copytext(reject_bad_text(input(usr, "Write your message:", "Awaiting Input", "")),1,MAX_MESSAGE_LEN)
var/new_message = reject_bad_text(stripped_input(usr, "Write your message:", "Awaiting Input", "", MAX_MESSAGE_LEN))
if(new_message)
message = new_message
priority = CLAMP(text2num(href_list["priority"]) || REQ_NORMAL_MESSAGE_PRIORITY, REQ_NORMAL_MESSAGE_PRIORITY, REQ_EXTREME_MESSAGE_PRIORITY)
@@ -344,9 +344,8 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments)
updateUsrDialog()
/obj/machinery/requests_console/say_mod(input, message_mode)
var/ending = copytext(input, length(input) - 2)
if (ending == "!!!")
. = "blares"
if(spantext_char(input, "!", -3))
return "blares"
else
. = ..()
+1 -1
View File
@@ -229,7 +229,7 @@
"Starving",
"Obese"
)
if(new_nutrition && new_nutrition in nutrition_list)
if(new_nutrition && (new_nutrition in nutrition_list))
switch(new_nutrition)
if("Starving")
detect_nutrition = NUTRITION_LEVEL_STARVING
+3 -2
View File
@@ -225,8 +225,6 @@
active_power_usage = 50
max_integrity = 300
var/active = FALSE
var/power = 0
var/maximum_stored_power = 500
var/locked = TRUE
var/shield_range = 8
var/obj/structure/cable/attached // the attached cable
@@ -236,6 +234,9 @@
desc = "A shield generator meant for use in xenobiology."
req_access = list(ACCESS_XENOBIOLOGY)
/obj/machinery/power/shieldwallgen/anchored
anchored = TRUE
/obj/machinery/power/shieldwallgen/Initialize()
. = ..()
if(anchored)
+12 -12
View File
@@ -58,14 +58,14 @@
/// Call with no arguments to disable.
/obj/machinery/status_display/proc/set_message(m1, m2)
if(m1)
index1 = (length(m1) > CHARS_PER_LINE)
index1 = (length_char(m1) > CHARS_PER_LINE)
message1 = m1
else
message1 = ""
index1 = 0
if(m2)
index2 = (length(m2) > CHARS_PER_LINE)
index2 = (length_char(m2) > CHARS_PER_LINE)
message2 = m2
else
message2 = ""
@@ -80,19 +80,19 @@
var/line1 = message1
if(index1)
line1 = copytext("[message1]|[message1]", index1, index1+CHARS_PER_LINE)
var/message1_len = length(message1)
line1 = copytext_char("[message1]|[message1]", index1, index1 + CHARS_PER_LINE)
var/message1_len = length_char(message1)
index1 += SCROLL_SPEED
if(index1 > message1_len)
index1 -= message1_len
if(index1 > message1_len + 1)
index1 -= (message1_len + 1)
var/line2 = message2
if(index2)
line2 = copytext("[message2]|[message2]", index2, index2+CHARS_PER_LINE)
var/message2_len = length(message2)
line2 = copytext_char("[message2]|[message2]", index2, index2 + CHARS_PER_LINE)
var/message2_len = length_char(message2)
index2 += SCROLL_SPEED
if(index2 > message2_len)
index2 -= message2_len
if(index2 > message2_len + 1)
index2 -= (message2_len + 1)
update_display(line1, line2)
if (!index1 && !index2)
@@ -133,7 +133,7 @@
var/line1 = "-[shuttle.getModeStr()]-"
var/line2 = shuttle.getTimerStr()
if(length(line2) > CHARS_PER_LINE)
if(length_char(line2) > CHARS_PER_LINE)
line2 = "error"
update_display(line1, line2)
else
@@ -245,7 +245,7 @@
else
line1 = "CARGO"
line2 = SSshuttle.supply.getTimerStr()
if(length(line2) > CHARS_PER_LINE)
if(length_char(line2) > CHARS_PER_LINE)
line2 = "Error"
update_display(line1, line2)
@@ -132,7 +132,7 @@
set waitfor = FALSE
// Perform final composition steps on the message.
var/message = copytext(data["message"], 1, MAX_BROADCAST_LEN)
var/message = copytext_char(data["message"], 1, MAX_BROADCAST_LEN)
if(!message)
return
var/compression = data["compression"]
@@ -179,7 +179,7 @@
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)
var/newid = reject_bad_text(stripped_input(usr, "Specify the new ID for this machine", src, id, MAX_MESSAGE_LEN))
if(newid && canAccess(usr))
id = newid
temp = "<font color = #666633>-% New ID assigned: \"[id]\" %-</font>"
@@ -33,7 +33,7 @@
for(var/obj/machinery/telecomms/hub/H in links)
for(var/obj/machinery/telecomms/relay/R in H.links)
if(R.can_receive(signal) && R.z in signal.levels)
if(R.can_receive(signal) && (R.z in signal.levels))
return TRUE
return FALSE
+1 -1
View File
@@ -926,7 +926,7 @@
return
/obj/mecha/proc/moved_inside(mob/living/carbon/human/H)
if(H && H.client && H in range(1))
if(H && H.client && (H in range(1)))
occupant = H
H.forceMove(src)
H.update_mouse_pointer()
+3 -5
View File
@@ -345,12 +345,10 @@
//Changes the exosuit name.
if(href_list["change_name"])
var/userinput = input(usr, "Choose a new exosuit name.", "Rename exosuit", "") as null|text
if(usr != occupant || usr.incapacitated())
var/userinput = stripped_input(usr, "Choose a new exosuit name.", "Rename exosuit", "", MAX_NAME_LEN)
if(!userinput || usr != occupant || usr.incapacitated())
return
if(!isnull(userinput))
var/newname = copytext(sanitize_name(userinput),1,MAX_NAME_LEN)
name = newname ? newname : initial(name)
name = userinput
return
//Toggles ID upload.
+1 -1
View File
@@ -130,7 +130,7 @@
if (smooth & SMOOTH_DIAGONAL)
for (var/O in overlays)
var/image/I = O
if (copytext(I.icon_state, 1, 3) == "d-")
if(copytext(I.icon_state, 1, 3) == "d-") //3 == length("d-") + 1
return
var/stuff_on_wall = 0
+2
View File
@@ -178,6 +178,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
desc = "A device used to rapidly pipe things."
icon = 'icons/obj/tools.dmi'
icon_state = "rpd"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
flags_1 = CONDUCT_1
force = 10
throwforce = 10
+4 -1
View File
@@ -7,7 +7,7 @@ RSF
name = "\improper Rapid-Service-Fabricator"
desc = "A device used to rapidly deploy service items."
icon = 'icons/obj/tools.dmi'
icon_state = "rcd"
icon_state = "rsf"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
opacity = 0
@@ -35,6 +35,7 @@ RSF
matter += 10
playsound(src.loc, 'sound/machines/click.ogg', 10, TRUE)
to_chat(user, "<span class='notice'>The RSF now holds [matter]/30 fabrication-units.</span>")
icon_state = "rsf"
else
return ..()
@@ -69,9 +70,11 @@ RSF
var/mob/living/silicon/robot/R = user
if(!R.cell || R.cell.charge < 200)
to_chat(user, "<span class='warning'>You do not have enough power to use [src].</span>")
icon_state = "rsf_empty"
return
else if (matter < 1)
to_chat(user, "<span class='warning'>\The [src] doesn't have enough matter left.</span>")
icon_state = "rsf_empty"
return
var/turf/T = get_turf(A)
+10 -22
View File
@@ -398,30 +398,18 @@ update_label()
if(user.incapacitated())
return
if(popup_input == "Forge/Reset" && !forged)
var/input_text = input(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name))as text | null
if (isnull(input_text))
return
var/target_name = copytext(sanitize(input_text), 1, 26)
if(!target_name || target_name == "Unknown" || target_name == "floor" || target_name == "wall" || target_name == "r-wall") //Same as mob/dead/new_player/preferences.dm
if (ishuman(user))
var/mob/living/carbon/human/human_agent = user
// Invalid/blank names give a randomly generated one.
if (human_agent.gender == "male")
registered_name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]"
else if (human_agent.gender == "female")
registered_name = "[pick(GLOB.first_names_female)] [pick(GLOB.last_names)]"
else
registered_name = "[pick(GLOB.first_names)] [pick(GLOB.last_names)]"
var/input_name = stripped_input(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN)
input_name = reject_bad_name(input_name)
if(!input_name)
// Invalid/blank names give a randomly generated one.
if(user.gender == MALE)
input_name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]"
else if(user.gender == FEMALE)
input_name = "[pick(GLOB.first_names_female)] [pick(GLOB.last_names)]"
else
alert ("Invalid name.")
return
else
registered_name = target_name
input_name = "[pick(GLOB.first_names)] [pick(GLOB.last_names)]"
var/target_occupation = copytext(sanitize(input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", assignment ? assignment : "Assistant") as text | null),1,MAX_MESSAGE_LEN)
var/target_occupation = stripped_input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", assignment ? assignment : "Assistant", MAX_MESSAGE_LEN)
if(!target_occupation)
registered_name = ""
return
+1 -1
View File
@@ -217,7 +217,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/extinguish()
if(!lit)
return
name = copytext(name,5,length(name)+1)
name = copytext_char(name, 5) //5 == length_char("lit ") + 1
attack_verb = null
hitsound = null
damtype = BRUTE
+1 -1
View File
@@ -390,7 +390,7 @@
to_chat(user, "<span class='notice'>You spray a [temp] on \the [target.name]</span>")
if(length(text_buffer) > 1)
text_buffer = copytext(text_buffer,2)
text_buffer = copytext(text_buffer, length(text_buffer[1]) + 1)
SStgui.update_uis(src)
if(post_noise)
+10 -22
View File
@@ -306,7 +306,6 @@
var/req_defib = TRUE
var/combat = FALSE //If it penetrates armor and gives additional functionality
var/grab_ghost = FALSE
var/tlimit = DEFIB_TIME_LIMIT * 10
var/base_icon_state = "defibpaddles"
/obj/item/twohanded/shockpaddles/ComponentInitialize()
@@ -356,13 +355,16 @@
cooldown = FALSE
update_icon()
/obj/item/twohanded/shockpaddles/New(mainunit)
..()
if(check_defib_exists(mainunit, src) && req_defib)
defib = mainunit
forceMove(defib)
busy = FALSE
update_icon()
/obj/item/twohanded/shockpaddles/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NO_STORAGE_INSERT, GENERIC_ITEM_TRAIT) //stops shockpaddles from being inserted in BoH
if(!req_defib)
return //If it doesn't need a defib, just say it exists
if (!loc || !istype(loc, /obj/item/defibrillator)) //To avoid weird issues from admin spawns
return INITIALIZE_HINT_QDEL
defib = loc
busy = FALSE
update_icon()
/obj/item/twohanded/shockpaddles/update_icon_state()
icon_state = "[base_icon_state][wielded]"
@@ -397,15 +399,6 @@
forceMove(defib)
defib.update_power()
/obj/item/twohanded/shockpaddles/proc/check_defib_exists(mainunit, mob/living/carbon/M, obj/O)
if(!req_defib)
return TRUE //If it doesn't need a defib, just say it exists
if (!mainunit || !istype(mainunit, /obj/item/defibrillator)) //To avoid weird issues from admin spawns
qdel(O)
return FALSE
else
return TRUE
/obj/item/twohanded/shockpaddles/attack(mob/M, mob/user)
if(busy)
@@ -460,8 +453,6 @@
var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart)
if(H.suiciding || H.hellbound || HAS_TRAIT(H, TRAIT_HUSK))
return
if((world.time - H.timeofdeath) > tlimit)
return
if((H.getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) || (H.getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE))
return
if(!heart || (heart.organ_flags & ORGAN_FAILING))
@@ -568,7 +559,6 @@
playsound(src, 'sound/machines/defib_charge.ogg', 75, FALSE)
var/total_burn = 0
var/total_brute = 0
var/tplus = world.time - H.timeofdeath //length of time spent dead
var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart)
if(do_after(user, 20, target = H)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
for(var/obj/item/carried_item in H.contents)
@@ -592,8 +582,6 @@
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile.</span>"
else if (H.hellbound)
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existence. Further attempts futile.</span>"
else if (tplus > tlimit)
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Body has decayed for too long. Further attempts futile.</span>"
else if (!heart)
failed = "<span class='warning'>[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart is missing.</span>"
else if (heart.organ_flags & ORGAN_FAILING)
+2 -2
View File
@@ -533,13 +533,13 @@ GLOBAL_LIST_EMPTY(PDAs)
if("Clear")//Clears messages
tnote = null
if("Ringtone")
var/t = input(U, "Please enter new ringtone", name, ttone) as text|null
var/t = stripped_input(U, "Please enter new ringtone", name, ttone, 20)
if(in_range(src, U) && loc == U && t)
if(SEND_SIGNAL(src, COMSIG_PDA_CHANGE_RINGTONE, U, t) & COMPONENT_STOP_RINGTONE_CHANGE)
U << browse(null, "window=pda")
return
else
ttone = copytext(sanitize(t), 1, 20)
ttone = t
else
U << browse(null, "window=pda")
return
@@ -50,7 +50,7 @@
/obj/item/flashlight/attack(mob/living/carbon/M, mob/living/carbon/human/user)
add_fingerprint(user)
if(istype(M) && on && user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH))
if(istype(M) && on && (user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH)))
if((HAS_TRAIT(user, TRAIT_CLUMSY) || HAS_TRAIT(user, TRAIT_DUMB)) && prob(50)) //too dumb to use flashlight properly
return ..() //just hit them in the head
@@ -388,7 +388,7 @@
return TRUE
/obj/item/flashlight/emp/attack(mob/living/M, mob/living/user)
if(on && user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH)) // call original attack when examining organs
if(on && (user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH))) // call original attack when examining organs
..()
return
+1 -1
View File
@@ -109,7 +109,7 @@
to_chat(usr,"<span class='warning'>You [transmit_holder ? "enable" : "disable"] your pAI's [transmitting ? "outgoing" : "incoming"] radio transmissions!</span>")
to_chat(pai,"<span class='warning'>Your owner has [transmit_holder ? "enabled" : "disabled"] your [transmitting ? "outgoing" : "incoming"] radio transmissions!</span>")
if(href_list["setlaws"])
var/newlaws = copytext(sanitize(input("Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", pai.laws.supplied[1]) as message|null),1,MAX_MESSAGE_LEN)
var/newlaws = stripped_multiline_input("Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", pai.laws.supplied[1], MAX_MESSAGE_LEN)
if(newlaws && pai)
pai.add_supplied_law(0,newlaws)
if(href_list["toggle_holo"])
@@ -27,6 +27,7 @@
/obj/item/radio/intercom/examine(mob/user)
. = ..()
. += "<span class='notice'>Use [MODE_TOKEN_INTERCOM] when nearby to speak into it.</span>"
if(!unfastened)
. += "<span class='notice'>It's <b>screwed</b> and secured to the wall.</span>"
else
+4 -5
View File
@@ -37,7 +37,7 @@ GENE SCANNER
/obj/item/t_scanner/proc/toggle_on()
on = !on
icon_state = copytext(icon_state, 1, length(icon_state))+"[on]"
icon_state = copytext_char(icon_state, 1, -1) + "[on]"
if(on)
START_PROCESSING(SSobj, src)
else
@@ -320,8 +320,7 @@ GENE SCANNER
if(M.tod && (M.stat == DEAD || ((HAS_TRAIT(M, TRAIT_FAKEDEATH)) && !advanced)))
render_list += "<span class='info ml-1'>Time of Death: [M.tod]</span>\n"
var/tdelta = round(world.time - M.timeofdeath)
if(tdelta < (DEFIB_TIME_LIMIT * 10))
render_list += "<span class='alert ml-1'><b>Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!</b></span>\n"
render_list += "<span class='alert ml-1'><b>Subject died [DisplayTimeText(tdelta)] ago.</b></span>\n"
for(var/thing in M.diseases)
var/datum/disease/D = thing
@@ -734,10 +733,10 @@ GENE SCANNER
if(sequence)
var/display
for(var/i in 0 to length(sequence) / DNA_MUTATION_BLOCKS-1)
for(var/i in 0 to length_char(sequence) / DNA_MUTATION_BLOCKS-1)
if(i)
display += "-"
display += copytext(sequence, 1 + i*DNA_MUTATION_BLOCKS, DNA_MUTATION_BLOCKS*(1+i) + 1)
display += copytext_char(sequence, 1 + i*DNA_MUTATION_BLOCKS, DNA_MUTATION_BLOCKS*(1+i) + 1)
to_chat(user, "<span class='boldnotice'>[display]</span><br>")
@@ -6,6 +6,7 @@
w_class = WEIGHT_CLASS_SMALL
slot_flags = ITEM_SLOT_BELT
custom_price = 1750
custom_premium_price = 1750
/obj/item/sensor_device/attack_self(mob/user)
GLOB.crewmonitor.show(user,src) //Proc already exists, just had to call it
+2 -2
View File
@@ -120,8 +120,8 @@
/obj/item/organ/cyberimp/arm/toolset,
/obj/item/organ/cyberimp/arm/surgery,
/obj/item/organ/cyberimp/chest/thrusters,
/obj/item/organ/lungs/cybernetic/upgraded,
/obj/item/organ/liver/cybernetic/upgraded) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof
/obj/item/organ/lungs/cybernetic/tier3,
/obj/item/organ/liver/cybernetic/tier3) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof
for(var/V in templist)
var/atom/A = V
augment_list[initial(A.name)] = A
+31 -6
View File
@@ -17,7 +17,6 @@
var/active = FALSE
var/atom/movable/target //The thing we're searching for
var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination
var/ignore_suit_sensor_level = FALSE // Do we find people even if their suit sensors are turned off
var/alert = FALSE // TRUE to display things more seriously
var/process_scan = TRUE // some pinpointers change target every time they scan, which means we can't have it change very process but instead when it turns on.
var/icon_suffix = "" // for special pinpointer icons
@@ -70,25 +69,31 @@
if(here.z != there.z)
. += "pinon[alert ? "alert" : ""]null[icon_suffix]"
return
. += get_direction_icon(here, there)
///Called by update_icon after sanity. There is a target
/obj/item/pinpointer/proc/get_direction_icon(here, there)
if(get_dist_euclidian(here,there) <= minimum_range)
. += "pinon[alert ? "alert" : ""]direct[icon_suffix]"
return "pinon[alert ? "alert" : ""]direct[icon_suffix]"
else
setDir(get_dir(here, there))
switch(get_dist(here, there))
if(1 to 8)
. += "pinon[alert ? "alert" : "close"][icon_suffix]"
return "pinon[alert ? "alert" : "close"][icon_suffix]"
if(9 to 16)
. += "pinon[alert ? "alert" : "medium"][icon_suffix]"
return "pinon[alert ? "alert" : "medium"][icon_suffix]"
if(16 to INFINITY)
. += "pinon[alert ? "alert" : "far"][icon_suffix]"
return "pinon[alert ? "alert" : "far"][icon_suffix]"
/obj/item/pinpointer/crew // A replacement for the old crew monitoring consoles
name = "crew pinpointer"
desc = "A handheld tracking device that points to crew suit sensors."
icon_state = "pinpointer_crew"
custom_price = 1000
custom_price = 900
custom_premium_price = 900
var/has_owner = FALSE
var/pinpointer_owner = null
var/ignore_suit_sensor_level = FALSE /// Do we find people even if their suit sensors are turned off
/obj/item/pinpointer/crew/proc/trackable(mob/living/carbon/human/H)
var/turf/here = get_turf(src)
@@ -158,6 +163,26 @@
if(!target) //target can be set to null from above code, or elsewhere
active = FALSE
/obj/item/pinpointer/crew/prox //Weaker version of crew monitor primarily for EMT
name = "proximity crew pinpointer"
desc = "A handheld tracking device that displays its proximity to crew suit sensors."
icon_state = "pinpointer_crewprox"
custom_price = 300
/obj/item/pinpointer/crew/prox/get_direction_icon(here, there)
var/size = ""
if(here == there)
size = "small"
else
switch(get_dist(here, there))
if(1 to 4)
size = "xtrlarge"
if(5 to 16)
size = "large"
//17 through 28 use the normal pinion, "pinondirect"
if(29 to INFINITY)
size = "small"
return "pinondirect[size]"
/obj/item/pinpointer/pair
name = "pair pinpointer"
+1
View File
@@ -216,6 +216,7 @@
else if(Kisser.partner == src && !plush_child) //the one advancing does not take ownership of the child and we have a one child policy in the toyshop
user.visible_message("<span class='notice'>[user] is going to break [Kisser] and [src] by bashing them like that.</span>",
"<span class='notice'>[Kisser] passionately embraces [src] in your hands. Look away you perv!</span>")
user.client.give_award(/datum/award/achievement/misc/rule8, user)
if(plop(Kisser))
user.visible_message("<span class='notice'>Something drops at the feet of [user].</span>",
"<span class='notice'>The miracle of oh god did that just come out of [src]?!</span>")
+2 -2
View File
@@ -44,9 +44,9 @@
if(H.stat == DEAD || H == user)
continue
if(H.mind && (has_job_loyalties || has_role_loyalties))
if(has_job_loyalties && H.mind.assigned_role in job_loyalties)
if(has_job_loyalties && (H.mind.assigned_role in job_loyalties))
inspired += H
else if(has_role_loyalties && H.mind.special_role in role_loyalties)
else if(has_role_loyalties && (H.mind.special_role in role_loyalties))
inspired += H
else if(check_inspiration(H))
inspired += H

Some files were not shown because too many files have changed in this diff Show More