Merge branch 'master' into embed-changes

This commit is contained in:
Timothy Teakettle
2020-06-17 16:40:34 +01:00
committed by GitHub
100 changed files with 2831 additions and 264634 deletions
@@ -3,9 +3,9 @@
/turf/template_noop,
/area/template_noop)
"ac" = (
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/mesh,
/obj/structure/table,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/suture,
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
"ad" = (
+4 -4
View File
@@ -2368,7 +2368,7 @@
/turf/open/floor/plasteel/airless/white,
/area/ruin/space/derelict/medical)
"hW" = (
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/suture,
/turf/open/floor/plasteel/airless/white,
/area/ruin/space/derelict/medical)
"hX" = (
@@ -2610,13 +2610,13 @@
/turf/open/floor/plasteel/airless/white,
/area/ruin/space/derelict/medical)
"iM" = (
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/suture,
/turf/open/floor/plasteel/airless{
icon_state = "damaged2"
},
/area/ruin/space/derelict/medical)
"iN" = (
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/mesh,
/turf/open/floor/plasteel/airless{
icon_state = "damaged3"
},
@@ -2866,7 +2866,7 @@
/turf/open/floor/plasteel/airless/white,
/area/ruin/space/derelict/medical)
"jB" = (
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/mesh,
/turf/open/floor/plasteel/airless/white,
/area/ruin/space/derelict/medical)
"jC" = (
+1 -1
View File
@@ -843,7 +843,7 @@
/area/ruin/space/has_grav/ancientstation/deltacorridor)
"cx" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/suture,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/ancientstation/deltacorridor)
@@ -1610,7 +1610,7 @@
/turf/open/floor/plasteel/cafeteria,
/area/awaymission/wildwest/mines)
"fi" = (
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/suture,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
-49
View File
@@ -1,49 +0,0 @@
{
"map_name":"Ice Box Station",
"map_path":"map_files/IceBoxStation",
"map_file":[
"IcemoonUnderground_Below.dmm",
"IcemoonUnderground_Above.dmm",
"IceBoxStation.dmm"
],
"station_ruin_budget":0,
"space_ruin_levels":0,
"space_empty_levels":0,
"shuttles":{
"cargo":"cargo_box",
"ferry":"ferry_fancy",
"whiteship":"whiteship_box",
"emergency":"emergency_box"
},
"traits":[
{
"Up":1,
"Mining":true,
"Station":false,
"Linkage":null,
"Gravity":true,
"Ice Ruins Underground":true,
"Baseturf":"/turf/open/lava/plasma/ice_moon"
},
{
"Down":-1,
"Up":1,
"Mining":true,
"Station":false,
"Linkage":null,
"Gravity":true,
"Ice Ruins Underground":true,
"Baseturf":"/turf/open/openspace/icemoon"
},
{
"Down":-1,
"Mining":true,
"Linkage":null,
"Gravity":true,
"Ice Ruins":true,
"Weather_Snowstorm":true,
"Baseturf":"/turf/open/floor/plating/asteroid/snow/icemoon"
}
],
"minetype":"none"
}
-1
View File
@@ -1 +0,0 @@
#define FORCE_MAP "_maps/icebox.json"
File diff suppressed because it is too large Load Diff
+10 -10
View File
@@ -77360,8 +77360,8 @@
"cBx" = (
/obj/structure/rack,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/suture,
/obj/item/stack/medical/mesh,
/obj/item/reagent_containers/syringe/epinephrine{
pixel_x = -3;
pixel_y = 3
@@ -85495,8 +85495,8 @@
"cPs" = (
/obj/structure/table,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/suture,
/obj/item/stack/medical/mesh,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
@@ -91727,8 +91727,8 @@
"cZH" = (
/obj/structure/table/glass,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/suture,
/obj/item/stack/medical/mesh,
/obj/machinery/camera{
c_tag = "Medbay - Sleepers";
name = "medbay camera";
@@ -94026,8 +94026,8 @@
"ddp" = (
/obj/structure/table/glass,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/suture,
/obj/item/stack/medical/mesh,
/obj/structure/sign/warning/nosmoking{
pixel_y = 32
},
@@ -101144,8 +101144,8 @@
"dqj" = (
/obj/structure/table,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/suture,
/obj/item/stack/medical/mesh,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
},
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+5 -5
View File
@@ -25243,7 +25243,7 @@
pixel_y = 4
},
/obj/item/lighter,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/suture,
/turf/open/floor/plasteel/dark,
/area/maintenance/port)
"aPO" = (
@@ -27105,8 +27105,8 @@
"aSy" = (
/obj/structure/table,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/bruise_pack{
/obj/item/stack/medical/mesh,
/obj/item/stack/medical/suture{
pixel_x = 4
},
/obj/item/storage/firstaid/regular,
@@ -55554,10 +55554,10 @@
/obj/structure/table,
/obj/item/storage/firstaid/regular,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/ointment{
/obj/item/stack/medical/mesh{
pixel_y = 4
},
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/suture,
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+8 -8
View File
@@ -16073,11 +16073,11 @@
pixel_y = -1
},
/obj/item/reagent_containers/dropper,
/obj/item/stack/medical/bruise_pack{
/obj/item/stack/medical/suture{
pixel_x = -2;
pixel_y = 6
},
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/mesh,
/obj/item/healthanalyzer,
/turf/open/floor/plasteel/white,
/area/science/explab)
@@ -34517,8 +34517,8 @@
/area/gateway)
"bmm" = (
/obj/structure/rack,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/mesh,
/obj/item/stack/medical/suture,
/obj/item/reagent_containers/syringe/charcoal,
/obj/item/reagent_containers/syringe/epinephrine{
pixel_x = -1;
@@ -64186,8 +64186,8 @@
pixel_y = -32
},
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/suture,
/obj/item/stack/medical/mesh,
/obj/structure/table/glass,
/turf/open/floor/plating,
/area/medical/abandoned)
@@ -75822,11 +75822,11 @@
/obj/item/folder,
/obj/item/folder,
/obj/structure/table/reinforced,
/obj/item/stack/medical/ointment{
/obj/item/stack/medical/mesh{
pixel_x = 3;
pixel_y = -2
},
/obj/item/stack/medical/bruise_pack{
/obj/item/stack/medical/suture{
pixel_x = -3;
pixel_y = 2
},
+11 -11
View File
@@ -4919,11 +4919,11 @@
/area/maintenance/solars/port/fore)
"ajj" = (
/obj/structure/table,
/obj/item/stack/medical/ointment{
/obj/item/stack/medical/mesh{
pixel_x = 3;
pixel_y = -2
},
/obj/item/stack/medical/bruise_pack{
/obj/item/stack/medical/suture{
pixel_x = -3;
pixel_y = 2
},
@@ -46804,8 +46804,8 @@
/area/bridge/showroom/corporate)
"bOG" = (
/obj/structure/rack,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/mesh,
/obj/item/stack/medical/suture,
/obj/item/reagent_containers/syringe/charcoal,
/obj/item/reagent_containers/syringe/epinephrine{
pixel_x = -1;
@@ -52251,8 +52251,8 @@
"cap" = (
/obj/structure/table,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/mesh,
/obj/item/stack/medical/suture,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
@@ -58829,11 +58829,11 @@
pixel_y = -1
},
/obj/item/reagent_containers/dropper,
/obj/item/stack/medical/bruise_pack{
/obj/item/stack/medical/suture{
pixel_x = -2;
pixel_y = 6
},
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/mesh,
/obj/item/healthanalyzer,
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
@@ -60419,9 +60419,9 @@
/obj/effect/decal/cleanable/blood/gibs/limb,
/obj/structure/rack,
/obj/item/storage/firstaid/regular,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/suture,
/obj/item/stack/medical/suture,
/obj/item/stack/medical/mesh,
/obj/item/clothing/glasses/hud/health,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+1 -3
View File
@@ -1486,9 +1486,7 @@
/obj/structure/stone_tile/cracked{
dir = 8
},
/obj/item/malf_upgrade,
/obj/item/disk/tech_disk/illegal,
/obj/structure/safe,
/obj/item/storage/firstaid/ancient,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"pc" = (
@@ -34525,8 +34525,8 @@
/area/maintenance/department/engine)
"bBY" = (
/obj/structure/closet/crate/medical,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/mesh,
/obj/item/stack/medical/suture,
/turf/open/floor/plating,
/area/maintenance/department/engine)
"bBZ" = (
@@ -40238,7 +40238,7 @@
},
/area/maintenance/department/chapel/monastery)
"bNF" = (
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/suture,
/turf/open/floor/plasteel/dark,
/area/maintenance/department/engine)
"bNG" = (
+107 -57
View File
@@ -3310,6 +3310,19 @@
},
/turf/open/floor/plasteel/dark,
/area/security/brig)
"aWM" = (
/obj/structure/cable{
icon_state = "4-8"
},
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/navbeacon{
codes_txt = "patrol;next_patrol=HOP2";
location = "Stbd"
},
/turf/open/floor/plasteel,
/area/storage/primary)
"aXh" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -3333,6 +3346,19 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
"aYf" = (
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/machinery/navbeacon{
codes_txt = "patrol;next_patrol=QM";
location = "CHW"
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"aZz" = (
/obj/effect/turf_decal/tile/blue{
dir = 8
@@ -5121,6 +5147,7 @@
/obj/structure/disposalpipe/trunk{
dir = 1
},
/obj/machinery/disposal/bin,
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"bDg" = (
@@ -7177,9 +7204,8 @@
/obj/structure/cable{
icon_state = "0-2"
},
/obj/machinery/door/poddoor/preopen{
id = "capshut";
name = "privacy shutters"
/obj/machinery/door/poddoor/shutters{
id = "capshut"
},
/turf/open/floor/plating,
/area/crew_quarters/heads/captain)
@@ -7441,9 +7467,8 @@
icon_state = "0-2"
},
/obj/structure/cable,
/obj/machinery/door/poddoor/preopen{
id = "capshut";
name = "privacy shutters"
/obj/machinery/door/poddoor/shutters{
id = "capshut"
},
/turf/open/floor/plating,
/area/crew_quarters/heads/captain)
@@ -7563,9 +7588,8 @@
/obj/structure/cable{
icon_state = "1-4"
},
/obj/machinery/door/poddoor/preopen{
id = "capshut";
name = "privacy shutters"
/obj/machinery/door/poddoor/shutters{
id = "capshut"
},
/turf/open/floor/plating,
/area/crew_quarters/heads/captain)
@@ -8980,6 +9004,14 @@
pixel_y = 7
},
/obj/item/pen/red,
/obj/item/stamp{
pixel_x = -3;
pixel_y = 3
},
/obj/item/stamp/denied{
pixel_x = 4;
pixel_y = -2
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"cWO" = (
@@ -11413,11 +11445,11 @@
/turf/open/floor/plasteel,
/area/storage/auxiliary)
"ewI" = (
/obj/machinery/rnd/production/circuit_imprinter,
/obj/item/radio/intercom{
name = "Station Intercom (General)";
pixel_y = 29
},
/obj/machinery/rnd/production/circuit_imprinter/department/science,
/turf/open/floor/plasteel/white,
/area/science/robotics/lab)
"ewK" = (
@@ -15265,14 +15297,14 @@
/turf/closed/wall/r_wall,
/area/teleporter)
"gLO" = (
/obj/machinery/door/poddoor{
id = "trash";
name = "disposal bay door"
},
/obj/machinery/conveyor{
dir = 4;
id = "garbage"
},
/obj/machinery/door/poddoor{
id = "trash";
name = "disposal bay door"
},
/turf/open/floor/plating,
/area/maintenance/disposal)
"gMD" = (
@@ -18139,6 +18171,10 @@
/obj/structure/disposalpipe/junction{
dir = 8
},
/obj/machinery/navbeacon{
codes_txt = "patrol;next_patrol=AIW";
location = "QM"
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"inA" = (
@@ -18262,6 +18298,10 @@
/obj/structure/disposalpipe/segment{
dir = 10
},
/obj/machinery/navbeacon{
codes_txt = "patrol;next_patrol=Stbd";
location = "HOP"
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"irg" = (
@@ -19169,10 +19209,6 @@
name = "Atmospherics Maintenance";
req_access_txt = "12;24"
},
/obj/machinery/door/firedoor/border_only{
dir = 4;
name = "east facing firelock"
},
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -19636,6 +19672,10 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/navbeacon{
codes_txt = "patrol;next_patrol=AIE";
location = "AftH"
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"jhF" = (
@@ -19701,15 +19741,7 @@
/obj/effect/turf_decal/tile/brown{
dir = 4
},
/obj/structure/table,
/obj/item/stamp{
pixel_x = -3;
pixel_y = 3
},
/obj/item/stamp/denied{
pixel_x = 4;
pixel_y = -2
},
/obj/machinery/computer/bounty,
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"jjB" = (
@@ -19718,12 +19750,6 @@
/area/crew_quarters/dorms)
"jjC" = (
/obj/structure/closet/crate,
/obj/item/stack/sheet/mineral/plasma{
amount = 30
},
/obj/item/stack/sheet/mineral/plasma{
amount = 30
},
/obj/item/stack/sheet/mineral/plasma{
amount = 30
},
@@ -22567,11 +22593,6 @@
icon_state = "0-8"
},
/obj/machinery/shieldwallgen/xenobiologyaccess,
/obj/machinery/computer/security/telescreen{
name = "Test Chamber Monitor";
network = list("test");
pixel_y = -30
},
/turf/open/floor/plasteel/white,
/area/science/misc_lab)
"leq" = (
@@ -24654,6 +24675,10 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/engine,
/area/engine/engineering)
"muk" = (
/obj/machinery/rnd/bepis,
/turf/open/floor/engine,
/area/science/misc_lab)
"muN" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
@@ -25748,9 +25773,6 @@
name = "Atmospherics Maintenance";
req_access_txt = "12;24"
},
/obj/machinery/door/firedoor/border_only{
name = "south facing firelock"
},
/turf/open/floor/plasteel,
/area/maintenance/department/electrical)
"ncH" = (
@@ -25992,7 +26014,7 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone3)
"nhO" = (
/obj/machinery/airalarm{
/obj/machinery/airalarm/server{
dir = 1;
pixel_y = -22
},
@@ -27527,9 +27549,6 @@
name = "Electrical Maintenance";
req_access_txt = "11"
},
/obj/machinery/door/firedoor/border_only{
dir = 1
},
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/construction/storage)
@@ -27835,6 +27854,16 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"okq" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/machinery/navbeacon{
codes_txt = "patrol;next_patrol=Dorm";
location = "HOP2"
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"okt" = (
/obj/machinery/light/small,
/obj/effect/landmark/event_spawn,
@@ -29490,6 +29519,7 @@
dir = 1
},
/obj/structure/disposalpipe/trunk,
/obj/machinery/disposal/bin,
/turf/open/floor/plating,
/area/engine/engineering)
"piX" = (
@@ -32380,7 +32410,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/firedoor/border_only{
dir = 4;
name = "east facing firelock"
@@ -32880,6 +32909,10 @@
/obj/structure/disposalpipe/segment{
dir = 5
},
/obj/machinery/navbeacon{
codes_txt = "patrol;next_patrol=CHE";
location = "AIE"
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"rfj" = (
@@ -36951,6 +36984,11 @@
"tDO" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible,
/obj/machinery/portable_atmospherics/canister/toxins,
/obj/machinery/computer/security/telescreen{
name = "Test Chamber Monitor";
network = list("test");
pixel_x = -30
},
/turf/open/floor/plasteel/white,
/area/science/misc_lab)
"tDY" = (
@@ -39545,6 +39583,13 @@
},
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
"veC" = (
/obj/machinery/navbeacon{
codes_txt = "patrol;next_patrol=CHW";
location = "Dorm"
},
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"veF" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/drinks/drinkingglass{
@@ -42215,9 +42260,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/machinery/door/firedoor/border_only{
dir = 8
},
/obj/machinery/door/airlock/atmos/abandoned{
name = "Atmospherics Maintenance";
req_access_txt = "12;24"
@@ -43558,6 +43600,14 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
/area/maintenance/disposal)
"xzn" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/navbeacon{
codes_txt = "patrol;next_patrol=HOP";
location = "CHE"
},
/turf/open/floor/carpet,
/area/hallway/secondary/exit/departure_lounge)
"xzL" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
@@ -66113,7 +66163,7 @@ xUL
dYZ
jKV
fYx
oDm
aYf
xSN
wje
jrH
@@ -77974,7 +78024,7 @@ qGn
lud
ngB
joq
wdk
xzn
wdk
iOW
wdk
@@ -79545,7 +79595,7 @@ gZG
dRF
lep
bEa
bcp
muk
bcp
bEa
udT
@@ -82543,7 +82593,7 @@ qFH
tYo
dJb
iJs
mtP
veC
unt
raA
lfV
@@ -87661,7 +87711,7 @@ avT
bBh
avT
aKf
gLO
irQ
huF
cfp
gxY
@@ -89208,7 +89258,7 @@ irQ
emH
cfp
gmH
gNI
okq
skK
vKa
vgH
@@ -89974,7 +90024,7 @@ avT
bBh
avT
aKf
irQ
gLO
jvV
evO
cfp
@@ -93595,7 +93645,7 @@ qgm
hcu
vju
eYu
xOj
aWM
vUs
gUa
sda
+4 -4
View File
@@ -49,7 +49,7 @@
/area/holodeck/rec_center/bunker)
"ak" = (
/obj/structure/table,
/obj/item/stack/medical/ointment{
/obj/item/stack/medical/mesh{
heal_burn = 10
},
/turf/open/floor/holofloor/asteroid,
@@ -355,7 +355,7 @@
/area/holodeck/rec_center/lounge)
"bc" = (
/obj/structure/table,
/obj/item/stack/medical/bruise_pack{
/obj/item/stack/medical/suture{
heal_brute = 10
},
/turf/open/floor/holofloor/asteroid,
@@ -10568,8 +10568,8 @@
/area/wizard_station)
"yD" = (
/obj/structure/table/wood,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/suture,
/obj/item/stack/medical/mesh,
/turf/open/floor/engine/cult,
/area/wizard_station)
"yE" = (
+2 -2
View File
@@ -333,8 +333,8 @@
"aT" = (
/obj/structure/table,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/suture,
/obj/item/stack/medical/mesh,
/obj/machinery/light{
dir = 4
},
+2 -2
View File
@@ -365,11 +365,11 @@
/area/shuttle/escape)
"bi" = (
/obj/structure/table,
/obj/item/stack/medical/bruise_pack{
/obj/item/stack/medical/suture{
pixel_x = 5;
pixel_y = 5
},
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/suture,
/turf/open/floor/mineral/plastitanium,
/area/shuttle/escape)
"bj" = (
+2 -2
View File
@@ -608,8 +608,8 @@
"bu" = (
/obj/structure/table/reinforced,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/bruise_pack,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/suture,
/obj/item/stack/medical/mesh,
/obj/effect/turf_decal/bot_white,
/turf/open/floor/plasteel/dark,
/area/shuttle/syndicate/medical)
+1
View File
@@ -27,6 +27,7 @@
#define BOT_NAV 15 // computing navigation
#define BOT_WAIT_FOR_NAV 16 // waiting for nav computation
#define BOT_NO_ROUTE 17 // no destination beacon found (or no route)
#define BOT_TIPPED 18 // someone tipped a medibot over ;_;
//Bot types
#define SEC_BOT (1<<0) // Secutritrons (Beepsky) and ED-209s
+2
View File
@@ -7,6 +7,8 @@
#define SHUTTLE_STRANDED "stranded"
#define SHUTTLE_ESCAPE "escape"
#define SHUTTLE_ENDGAME "endgame: game over"
#define SHUTTLE_RECHARGING "recharging"
#define SHUTTLE_PREARRIVAL "landing"
#define EMERGENCY_IDLE_OR_RECALLED (SSshuttle.emergency && ((SSshuttle.emergency.mode == SHUTTLE_IDLE) || (SSshuttle.emergency.mode == SHUTTLE_RECALL)))
#define EMERGENCY_ESCAPED_OR_ENDGAMED (SSshuttle.emergency && ((SSshuttle.emergency.mode == SHUTTLE_ESCAPE) || (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)))
+1 -1
View File
@@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/airlock_painter = 1,
/obj/item/stack/cable_coil/random = 4,
/obj/item/stack/cable_coil/random/five = 6,
/obj/item/stack/medical/bruise_pack = 1,
/obj/item/stack/medical/suture = 1,
/obj/item/stack/rods/ten = 9,
/obj/item/stack/rods/twentyfive = 1,
/obj/item/stack/rods/fifty = 1,
@@ -521,3 +521,10 @@
* Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best.
*/
/datum/config_entry/flag/use_field_of_vision
//Shuttle size limiter
/datum/config_entry/number/max_shuttle_count
config_entry_value = 6
/datum/config_entry/number/max_shuttle_size
config_entry_value = 250
@@ -124,9 +124,9 @@
category = CAT_MISC
subcategory = CAT_TOOL
/datum/crafting_recipe/bruise_pack
name = "Bruise Pack"
result = /obj/item/stack/medical/bruise_pack/one
/datum/crafting_recipe/brute_pack
name = "Suture Pack"
result = /obj/item/stack/medical/suture/one
time = 1
reqs = list(/obj/item/stack/medical/gauze = 1,
/datum/reagent/medicine/styptic_powder = 10)
@@ -134,8 +134,8 @@
subcategory = CAT_TOOL
/datum/crafting_recipe/burn_pack
name = "Burn Ointment"
result = /obj/item/stack/medical/ointment/one
name = "Regenerative Mesh"
result = /obj/item/stack/medical/mesh/one
time = 1
reqs = list(/obj/item/stack/medical/gauze = 1,
/datum/reagent/medicine/silver_sulfadiazine = 10)
+4
View File
@@ -103,6 +103,10 @@
/area/shuttle/custom
name = "Custom player shuttle"
/area/shuttle/custom/powered
name = "Custom Powered player shuttle"
requires_power = FALSE
/area/shuttle/arrival
name = "Arrival Shuttle"
unique = TRUE // SSjob refers to this area for latejoiners
+3
View File
@@ -872,6 +872,9 @@
/atom/proc/GenerateTag()
return
/atom/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
return
// Generic logging helper
/atom/proc/log_message(message, message_type, color=null, log_globally=TRUE)
if(!log_globally)
+5
View File
@@ -35,6 +35,11 @@
M.unset_machine() //to properly reset the view of the users if the console is deleted.
return ..()
/obj/machinery/computer/security/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
for(var/i in network)
network -= i
network += "[idnum][i]"
/obj/machinery/computer/security/can_interact(mob/user)
if((!hasSiliconAccessInArea(user) && !Adjacent(user)) || is_blind(user) || !in_view_range(user, src))
return FALSE
@@ -0,0 +1,33 @@
/obj/machinery/shuttle
name = "shuttle component"
desc = "Something for shuttles."
density = TRUE
obj_integrity = 250
max_integrity = 250
icon = 'icons/turf/shuttle.dmi'
icon_state = "burst_plasma"
idle_power_usage = 150
circuit = /obj/item/circuitboard/machine/shuttle/engine
var/icon_state_closed = "burst_plasma"
var/icon_state_open = "burst_plasma_open"
var/icon_state_off = "burst_plasma_off"
/obj/machinery/shuttle/Initialize()
. = ..()
GLOB.custom_shuttle_machines += src
/obj/machinery/shuttle/Destroy()
. = ..()
GLOB.custom_shuttle_machines -= src
/obj/machinery/shuttle/attackby(obj/item/I, mob/living/user, params)
if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_closed, I))
return
if(default_pry_open(I))
return
if(panel_open)
if(default_change_direction_wrench(user, I))
return
if(default_deconstruction_crowbar(I))
return
return ..()
@@ -0,0 +1,138 @@
//-----------------------------------------------
//-------------Engine Thrusters------------------
//-----------------------------------------------
#define ENGINE_HEAT_TARGET 600
#define ENGINE_HEATING_POWER 5000000
/obj/machinery/shuttle/engine
name = "shuttle thruster"
desc = "A thruster for shuttles."
density = TRUE
obj_integrity = 250
max_integrity = 250
icon = 'icons/turf/shuttle.dmi'
icon_state = "burst_plasma"
idle_power_usage = 150
circuit = /obj/item/circuitboard/machine/shuttle/engine
var/thrust = 0
var/fuel_use = 0
var/bluespace_capable = TRUE
var/cooldown = 0
var/thruster_active = FALSE
var/datum/weakref/attached_heater
/obj/machinery/shuttle/engine/plasma
name = "plasma thruster"
desc = "A thruster that burns plasma stored in an adjacent plasma thruster heater."
icon_state = "burst_plasma"
icon_state_off = "burst_plasma_off"
idle_power_usage = 0
circuit = /obj/item/circuitboard/machine/shuttle/engine/plasma
thrust = 25
fuel_use = 0.24
bluespace_capable = FALSE
cooldown = 45
/obj/machinery/shuttle/engine/void
name = "void thruster"
desc = "A thruster using technology to breach voidspace for propulsion."
icon_state = "burst_void"
icon_state_off = "burst_void"
icon_state_closed = "burst_void"
icon_state_open = "burst_void_open"
idle_power_usage = 0
circuit = /obj/item/circuitboard/machine/shuttle/engine/void
thrust = 400
fuel_use = 0
bluespace_capable = TRUE
cooldown = 90
/obj/machinery/shuttle/engine/Initialize()
. = ..()
check_setup()
/obj/machinery/shuttle/engine/on_construction()
. = ..()
check_setup()
/obj/machinery/shuttle/engine/proc/check_setup()
var/heater_turf
switch(dir)
if(NORTH)
heater_turf = get_offset_target_turf(src, 0, 1)
if(SOUTH)
heater_turf = get_offset_target_turf(src, 0, -1)
if(EAST)
heater_turf = get_offset_target_turf(src, 1, 0)
if(WEST)
heater_turf = get_offset_target_turf(src, -1, 0)
if(!heater_turf)
attached_heater = null
update_engine()
return
attached_heater = null
for(var/obj/machinery/atmospherics/components/unary/shuttle/heater/as_heater in heater_turf)
if(as_heater.dir != dir)
continue
if(as_heater.panel_open)
continue
if(!as_heater.anchored)
continue
attached_heater = WEAKREF(as_heater)
break
update_engine()
return
/obj/machinery/shuttle/engine/proc/update_engine()
if(!attached_heater)
icon_state = icon_state_off
thruster_active = FALSE
return
var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolved_heater = attached_heater.resolve()
if(panel_open)
thruster_active = FALSE
else if(resolved_heater?.hasFuel(1))
icon_state = icon_state_closed
thruster_active = TRUE
else
thruster_active = FALSE
icon_state = icon_state_off
return
/obj/machinery/shuttle/engine/void/update_engine()
if(panel_open)
thruster_active = FALSE
return
thruster_active = TRUE
icon_state = icon_state_closed
return
//Thanks to spaceheater.dm for inspiration :)
/obj/machinery/shuttle/engine/proc/fireEngine()
var/turf/heatTurf = loc
if(!heatTurf)
return
var/datum/gas_mixture/env = heatTurf.return_air()
var/heat_cap = env.heat_capacity()
var/req_power = abs(env.return_temperature() - ENGINE_HEAT_TARGET) * heat_cap
req_power = min(req_power, ENGINE_HEATING_POWER)
var/deltaTemperature = req_power / heat_cap
if(deltaTemperature < 0)
return
env.temperature += deltaTemperature
air_update_turf()
/obj/machinery/shuttle/engine/attackby(obj/item/I, mob/living/user, params)
check_setup()
if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_closed, I))
return
if(default_pry_open(I))
return
if(panel_open)
if(default_change_direction_wrench(user, I))
return
if(default_deconstruction_crowbar(I))
return
return ..()
@@ -0,0 +1,132 @@
//-----------------------------------------------
//--------------Engine Heaters-------------------
//This uses atmospherics, much like a thermomachine,
//but instead of changing temp, it stores plasma and uses
//it for the engine.
//-----------------------------------------------
/obj/machinery/atmospherics/components/unary/shuttle
name = "shuttle atmospherics device"
desc = "This does something to do with shuttle atmospherics"
icon_state = "heater"
icon = 'icons/turf/shuttle.dmi'
/obj/machinery/atmospherics/components/unary/shuttle/heater
name = "engine heater"
desc = "Directs energy into compressed particles in order to power an attached thruster."
icon_state = "heater_pipe"
var/icon_state_closed = "heater_pipe"
var/icon_state_open = "heater_pipe_open"
var/icon_state_off = "heater_pipe"
idle_power_usage = 50
circuit = /obj/item/circuitboard/machine/shuttle/heater
density = TRUE
max_integrity = 400
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 30)
layer = OBJ_LAYER
showpipe = TRUE
pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY
var/gas_type = /datum/gas/plasma
var/efficiency_multiplier = 1
var/gas_capacity = 0
/obj/machinery/atmospherics/components/unary/shuttle/heater/New()
. = ..()
GLOB.custom_shuttle_machines += src
SetInitDirections()
update_adjacent_engines()
updateGasStats()
/obj/machinery/atmospherics/components/unary/shuttle/heater/Destroy()
. = ..()
update_adjacent_engines()
GLOB.custom_shuttle_machines -= src
/obj/machinery/atmospherics/components/unary/shuttle/heater/on_construction()
..(dir, dir)
SetInitDirections()
update_adjacent_engines()
/obj/machinery/atmospherics/components/unary/shuttle/heater/default_change_direction_wrench(mob/user, obj/item/I)
if(!..())
return FALSE
SetInitDirections()
var/obj/machinery/atmospherics/node = nodes[1]
if(node)
node.disconnect(src)
nodes[1] = null
if(!parents[1])
return
nullifyPipenet(parents[1])
atmosinit()
node = nodes[1]
if(node)
node.atmosinit()
node.addMember(src)
build_network()
return TRUE
/obj/machinery/atmospherics/components/unary/shuttle/heater/RefreshParts()
var/cap = 0
var/eff = 0
for(var/obj/item/stock_parts/matter_bin/M in component_parts)
cap += M.rating
for(var/obj/item/stock_parts/micro_laser/L in component_parts)
eff += L.rating
gas_capacity = 5000 * ((cap - 1) ** 2) + 1000
efficiency_multiplier = round(((eff / 2) / 2.8) ** 2, 0.1)
updateGasStats()
/obj/machinery/atmospherics/components/unary/shuttle/heater/examine(mob/user)
. = ..()
var/datum/gas_mixture/air_contents = airs[1]
. += "The engine heater's gas dial reads [air_contents.return_volume()] liters in internal tank.<br>"
/obj/machinery/atmospherics/components/unary/shuttle/heater/proc/updateGasStats()
var/datum/gas_mixture/air_contents = airs[1]
if(!air_contents)
return
air_contents.volume = gas_capacity
air_contents.temperature = T20C
/obj/machinery/atmospherics/components/unary/shuttle/heater/proc/hasFuel(var/required)
var/datum/gas_mixture/air_contents = airs[1]
var/moles = air_contents.total_moles()
return moles >= required
/obj/machinery/atmospherics/components/unary/shuttle/heater/proc/consumeFuel(var/amount)
var/datum/gas_mixture/air_contents = airs[1]
air_contents.remove(amount)
return
/obj/machinery/atmospherics/components/unary/shuttle/heater/attackby(obj/item/I, mob/living/user, params)
update_adjacent_engines()
if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_closed, I))
return
if(default_pry_open(I))
return
if(panel_open)
if(default_change_direction_wrench(user, I))
return
if(default_deconstruction_crowbar(I))
return
return ..()
/obj/machinery/atmospherics/components/unary/shuttle/heater/proc/update_adjacent_engines()
var/engine_turf
switch(dir)
if(NORTH)
engine_turf = get_offset_target_turf(src, 0, -1)
if(SOUTH)
engine_turf = get_offset_target_turf(src, 0, 1)
if(EAST)
engine_turf = get_offset_target_turf(src, -1, 0)
if(WEST)
engine_turf = get_offset_target_turf(src, 1, 0)
if(!engine_turf)
return
for(var/obj/machinery/shuttle/engine/E in engine_turf)
E.check_setup()
+1 -1
View File
@@ -290,7 +290,7 @@
if("shuttle_id")
update()
/obj/machinery/status_display/shuttle/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override)
/obj/machinery/status_display/shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override)
if (port && (shuttle_id == initial(shuttle_id) || override))
shuttle_id = port.id
update()
@@ -491,7 +491,7 @@
/obj/item/kitchen/knife = 5,
/obj/item/screwdriver = 5,
/obj/item/crowbar/red = 1, //Dont you need a crowbar to open this?
/obj/item/stack/medical/bruise_pack = 3,
/obj/item/stack/medical/suture = 3,
/obj/item/reagent_containers/food/drinks/bottle/vodka = 2,
/obj/item/radio = 5,
/obj/item/flashlight = 4,
+46 -9
View File
@@ -83,7 +83,7 @@
/obj/item/card/emag/bluespace
name = "bluespace cryptographic sequencer"
desc = "It's a blue card with a magnetic strip attached to some circuitry. It appears to have some sort of transmitter attached to it."
color = rgb(40, 130, 255)
icon_state = "emag_bs"
prox_check = FALSE
/obj/item/card/emag/attack()
@@ -166,6 +166,7 @@
slot_flags = ITEM_SLOT_ID
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
var/id_type_name = "identification card"
var/mining_points = 0 //For redeeming at mining equipment vendors
var/list/access = list()
var/registered_name = null // The name registered_name on the card
@@ -174,6 +175,8 @@
var/bank_support = ID_FREE_BANK_ACCOUNT
var/datum/bank_account/registered_account
var/obj/machinery/paystand/my_store
var/uses_overlays = TRUE
var/icon/cached_flat_icon
/obj/item/card/id/Initialize(mapload)
. = ..()
@@ -362,20 +365,38 @@
/obj/item/card/id/RemoveID()
return src
/*
Usage:
update_label()
Sets the id name to whatever registered_name and assignment is
/obj/item/card/id/update_overlays()
. = ..()
if(!uses_overlays)
return
cached_flat_icon = null
var/job = assignment ? ckey(GetJobName()) : null
if(registered_name == "Captain")
job = "captain"
if(registered_name && registered_name != "Captain")
. += mutable_appearance(icon, "assigned")
if(job)
. += mutable_appearance(icon, "id[job]")
/obj/item/card/id/proc/get_cached_flat_icon()
if(!cached_flat_icon)
cached_flat_icon = getFlatIcon(src)
return cached_flat_icon
/obj/item/card/id/get_examine_string(mob/user, thats = FALSE)
if(uses_overlays)
return "[icon2html(get_cached_flat_icon(), user)] [thats? "That's ":""][get_examine_name(user)]" //displays all overlays in chat
return ..()
update_label("John Doe", "Clowny")
Properly formats the name and occupation and sets the id name to the arguments
*/
/obj/item/card/id/proc/update_label(newname, newjob)
if(newname || newjob)
name = "[(!newname) ? "identification card" : "[newname]'s ID Card"][(!newjob) ? "" : " ([newjob])"]"
update_icon()
return
name = "[(!registered_name) ? "identification card" : "[registered_name]'s ID Card"][(!assignment) ? "" : " ([assignment])"]"
update_icon()
/obj/item/card/id/silver
name = "silver identification card"
@@ -388,6 +409,7 @@ update_label("John Doe", "Clowny")
/obj/item/card/id/silver/reaper
name = "Thirteen's ID Card (Reaper)"
access = list(ACCESS_MAINT_TUNNELS)
icon_state = "reaper"
assignment = "Reaper"
registered_name = "Thirteen"
@@ -539,7 +561,7 @@ update_label("John Doe", "Clowny")
/obj/item/card/id/ert
name = "\improper CentCom ID"
desc = "An ERT ID card."
icon_state = "centcom"
icon_state = "ert_commander"
registered_name = "Emergency Response Team Commander"
assignment = "Emergency Response Team Commander"
@@ -548,6 +570,7 @@ update_label("John Doe", "Clowny")
. = ..()
/obj/item/card/id/ert/Security
icon_state = "ert_security"
registered_name = "Security Response Officer"
assignment = "Security Response Officer"
@@ -556,6 +579,7 @@ update_label("John Doe", "Clowny")
. = ..()
/obj/item/card/id/ert/Engineer
icon_state = "ert_engineer"
registered_name = "Engineer Response Officer"
assignment = "Engineer Response Officer"
@@ -564,6 +588,7 @@ update_label("John Doe", "Clowny")
. = ..()
/obj/item/card/id/ert/Medical
icon_state = "ert_medical"
registered_name = "Medical Response Officer"
assignment = "Medical Response Officer"
@@ -572,6 +597,7 @@ update_label("John Doe", "Clowny")
. = ..()
/obj/item/card/id/ert/chaplain
icon_state = "ert_chaplain"
registered_name = "Religious Response Officer"
assignment = "Religious Response Officer"
@@ -624,40 +650,49 @@ update_label("John Doe", "Clowny")
. += "<span class='notice'>Your sentence is up! You're free!</span>"
/obj/item/card/id/prisoner/one
icon_state = "prisoner_001"
name = "Prisoner #13-001"
registered_name = "Prisoner #13-001"
/obj/item/card/id/prisoner/two
icon_state = "prisoner_002"
name = "Prisoner #13-002"
registered_name = "Prisoner #13-002"
/obj/item/card/id/prisoner/three
icon_state = "prisoner_003"
name = "Prisoner #13-003"
registered_name = "Prisoner #13-003"
/obj/item/card/id/prisoner/four
icon_state = "prisoner_004"
name = "Prisoner #13-004"
registered_name = "Prisoner #13-004"
/obj/item/card/id/prisoner/five
icon_state = "prisoner_005"
name = "Prisoner #13-005"
registered_name = "Prisoner #13-005"
/obj/item/card/id/prisoner/six
icon_state = "prisoner_006"
name = "Prisoner #13-006"
registered_name = "Prisoner #13-006"
/obj/item/card/id/prisoner/seven
icon_state = "prisoner_007"
name = "Prisoner #13-007"
registered_name = "Prisoner #13-007"
/obj/item/card/id/mining
name = "mining ID"
icon_state = "retro"
access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
/obj/item/card/id/away
name = "a perfectly generic identification card"
desc = "A perfectly generic identification card. Looks like it could use some flavor."
icon_state = "retro"
access = list(ACCESS_AWAY_GENERAL)
/obj/item/card/id/away/hotel
@@ -700,6 +735,7 @@ update_label("John Doe", "Clowny")
/obj/item/card/id/departmental_budget
name = "departmental card (FUCK)"
desc = "Provides access to the departmental budget."
icon_state = "budgetcard"
var/department_ID = ACCOUNT_CIV
var/department_name = ACCOUNT_CIV_NAME
@@ -712,6 +748,7 @@ update_label("John Doe", "Clowny")
B.bank_cards += src
name = "departmental card ([department_name])"
desc = "Provides access to the [department_name]."
icon_state = "[lowertext(department_ID)]_budget"
SSeconomy.dep_cards += src
/obj/item/card/id/departmental_budget/Destroy()
@@ -379,3 +379,11 @@
/obj/item/circuitboard/computer/nanite_cloud_controller
name = "Nanite Cloud Control (Computer Board)"
build_path = /obj/machinery/computer/nanite_cloud_controller
/obj/item/circuitboard/computer/shuttle/flight_control
name = "Shuttle Flight Control (Computer Board)"
build_path = /obj/machinery/computer/custom_shuttle
/obj/item/circuitboard/computer/shuttle/docker
name = "Shuttle Navigation Computer (Computer Board)"
build_path = /obj/machinery/computer/camera_advanced/shuttle_docker/custom
@@ -1102,3 +1102,28 @@
/obj/item/stock_parts/micro_laser = 2,
/obj/item/stock_parts/scanning_module = 2
)
/obj/item/circuitboard/machine/shuttle/engine
name = "Thruster (Machine Board)"
build_path = /obj/machinery/shuttle/engine
req_components = list()
/obj/item/circuitboard/machine/shuttle/engine/plasma
name = "Plasma Thruster (Machine Board)"
build_path = /obj/machinery/shuttle/engine/plasma
req_components = list(/obj/item/stock_parts/capacitor = 2,
/obj/item/stack/cable_coil = 5,
/obj/item/stock_parts/micro_laser = 1)
/obj/item/circuitboard/machine/shuttle/engine/void
name = "Void Thruster (Machine Board)"
build_path = /obj/machinery/shuttle/engine/void
req_components = list(/obj/item/stock_parts/capacitor/quadratic = 2,
/obj/item/stack/cable_coil = 5,
/obj/item/stock_parts/micro_laser/quadultra = 1)
/obj/item/circuitboard/machine/shuttle/heater
name = "Electronic Engine Heater (Machine Board)"
build_path = /obj/machinery/atmospherics/components/unary/shuttle/heater
req_components = list(/obj/item/stock_parts/micro_laser = 2,
/obj/item/stock_parts/matter_bin = 1)
+121 -1
View File
@@ -13,18 +13,33 @@
novariants = FALSE
item_flags = NOBLUDGEON
var/self_delay = 50
var/other_delay = 0
var/repeating = FALSE
/obj/item/stack/medical/attack(mob/living/M, mob/user)
. = ..()
try_heal(M, user)
/obj/item/stack/medical/proc/try_heal(mob/living/M, mob/user, silent = FALSE)
if(!M.can_inject(user, TRUE))
return
if(M == user)
user.visible_message("<span class='notice'>[user] starts to apply \the [src] on [user.p_them()]self...</span>", "<span class='notice'>You begin applying \the [src] on yourself...</span>")
if(!silent)
user.visible_message("<span class='notice'>[user] starts to apply \the [src] on [user.p_them()]self...</span>", "<span class='notice'>You begin applying \the [src] on yourself...</span>")
if(!do_mob(user, M, self_delay, extra_checks=CALLBACK(M, /mob/living/proc/can_inject, user, TRUE)))
return
else if(other_delay)
if(!silent)
user.visible_message("<span class='notice'>[user] starts to apply \the [src] on [M].</span>", "<span class='notice'>You begin applying \the [src] on [M]...</span>")
if(!do_mob(user, M, other_delay, extra_checks=CALLBACK(M, /mob/living/proc/can_inject, user, TRUE)))
return
if(heal(M, user))
log_combat(user, M, "healed", src.name)
use(1)
if(repeating && amount > 0)
try_heal(M, user, TRUE)
/obj/item/stack/medical/proc/heal(mob/living/M, mob/user)
@@ -174,3 +189,108 @@
/obj/item/stack/medical/ointment/suicide_act(mob/living/user)
user.visible_message("<span class='suicide'>[user] is squeezing \the [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic?</span>")
return TOXLOSS
/obj/item/stack/medical/suture
name = "suture"
desc = "Sterile sutures used to seal up cuts and lacerations."
gender = PLURAL
singular_name = "suture"
icon_state = "suture"
self_delay = 30
other_delay = 10
amount = 15
max_amount = 15
repeating = TRUE
var/heal_brute = 10
grind_results = list(/datum/reagent/medicine/spaceacillin = 2)
/obj/item/stack/medical/suture/one
amount = 1
/obj/item/stack/medical/suture/heal(mob/living/M, mob/user)
. = ..()
if(M.stat == DEAD)
to_chat(user, "<span class='warning'>[M] is dead! You can not help [M.p_them()].</span>")
return
if(iscarbon(M))
return heal_carbon(M, user, heal_brute, 0)
if(isanimal(M))
var/mob/living/simple_animal/critter = M
if (!(critter.healable))
to_chat(user, "<span class='warning'>You cannot use \the [src] on [M]!</span>")
return FALSE
else if (critter.health == critter.maxHealth)
to_chat(user, "<span class='notice'>[M] is at full health.</span>")
return FALSE
user.visible_message("<span class='green'>[user] applies \the [src] on [M].</span>", "<span class='green'>You apply \the [src] on [M].</span>")
M.heal_bodypart_damage(heal_brute)
return TRUE
to_chat(user, "<span class='warning'>You can't heal [M] with the \the [src]!</span>")
/obj/item/stack/medical/mesh
name = "regenerative mesh"
desc = "A bacteriostatic mesh used to dress burns."
gender = PLURAL
singular_name = "regenerative mesh"
icon_state = "regen_mesh"
self_delay = 30
other_delay = 10
amount = 15
max_amount = 15
repeating = TRUE
var/heal_burn = 10
var/is_open = TRUE ///This var determines if the sterile packaging of the mesh has been opened.
grind_results = list(/datum/reagent/medicine/spaceacillin = 2)
/obj/item/stack/medical/mesh/one
amount = 1
/obj/item/stack/medical/mesh/Initialize()
. = ..()
if(amount == max_amount) //only seal full mesh packs
is_open = FALSE
update_icon()
/obj/item/stack/medical/mesh/update_icon_state()
if(!is_open)
icon_state = "regen_mesh_closed"
else
return ..()
/obj/item/stack/medical/mesh/heal(mob/living/M, mob/user)
. = ..()
if(M.stat == DEAD)
to_chat(user, "<span class='warning'>[M] is dead! You can not help [M.p_them()].</span>")
return
if(iscarbon(M))
return heal_carbon(M, user, 0, heal_burn)
to_chat(user, "<span class='warning'>You can't heal [M] with the \the [src]!</span>")
/obj/item/stack/medical/mesh/try_heal(mob/living/M, mob/user, silent = FALSE)
if(!is_open)
to_chat(user, "<span class='warning'>You need to open [src] first.</span>")
return
. = ..()
/obj/item/stack/medical/mesh/AltClick(mob/living/user)
if(!is_open)
to_chat(user, "<span class='warning'>You need to open [src] first.</span>")
return
. = ..()
/obj/item/stack/medical/mesh/attack_hand(mob/user)
if(!is_open & user.get_inactive_held_item() == src)
to_chat(user, "<span class='warning'>You need to open [src] first.</span>")
return
. = ..()
/obj/item/stack/medical/mesh/attack_self(mob/user)
if(!is_open)
is_open = TRUE
to_chat(user, "<span class='notice'>You open the sterile mesh package.</span>")
update_icon()
playsound(src, 'sound/items/poster_ripped.ogg', 20, TRUE)
return
. = ..()
+2 -2
View File
@@ -755,8 +755,8 @@ obj/item/storage/box/stingbangs
//////
/obj/item/storage/box/hug/medical/PopulateContents()
new /obj/item/stack/medical/bruise_pack(src)
new /obj/item/stack/medical/ointment(src)
new /obj/item/stack/medical/suture(src)
new /obj/item/stack/medical/mesh(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
// Clown survival box
+10 -10
View File
@@ -37,10 +37,10 @@
if(empty)
return
new /obj/item/stack/medical/gauze(src)
new /obj/item/stack/medical/bruise_pack(src)
new /obj/item/stack/medical/bruise_pack(src)
new /obj/item/stack/medical/ointment(src)
new /obj/item/stack/medical/ointment(src)
new /obj/item/stack/medical/suture(src)
new /obj/item/stack/medical/suture(src)
new /obj/item/stack/medical/mesh(src)
new /obj/item/stack/medical/mesh(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
new /obj/item/healthanalyzer(src)
@@ -52,12 +52,12 @@
if(empty)
return
new /obj/item/stack/medical/gauze(src)
new /obj/item/stack/medical/bruise_pack(src)
new /obj/item/stack/medical/bruise_pack(src)
new /obj/item/stack/medical/bruise_pack(src)
new /obj/item/stack/medical/ointment(src)
new /obj/item/stack/medical/ointment(src)
new /obj/item/stack/medical/ointment(src)
new /obj/item/stack/medical/suture(src)
new /obj/item/stack/medical/suture(src)
new /obj/item/stack/medical/suture(src)
new /obj/item/stack/medical/mesh(src)
new /obj/item/stack/medical/mesh(src)
new /obj/item/stack/medical/mesh(src)
/obj/item/storage/firstaid/fire
name = "burn treatment kit"
@@ -581,7 +581,7 @@
uniform = /obj/item/clothing/under/rank/rnd/scientist
shoes = /obj/item/clothing/shoes/laceup
id = /obj/item/card/id/away/old/sci
l_pocket = /obj/item/stack/medical/bruise_pack
l_pocket = /obj/item/stack/medical/suture
assignedrole = "Ancient Crew"
job_description = "Oldstation Crew"
@@ -88,7 +88,7 @@
/obj/item/t_scanner = 5,
/obj/item/airlock_painter = 1,
/obj/item/stack/cable_coil = 6,
/obj/item/stack/medical/bruise_pack = 1,
/obj/item/stack/medical/suture = 1,
/obj/item/stack/rods = 3,
/obj/item/stack/sheet/cardboard = 2,
/obj/item/stack/sheet/metal = 1,
@@ -11,7 +11,7 @@
desc = "It's watching you suspiciously."
/obj/structure/closet/crate/necropolis/tendril/PopulateContents()
var/loot = rand(1,28)
var/loot = rand(1,29)
switch(loot)
if(1)
new /obj/item/shared_storage/red(src)
@@ -77,6 +77,11 @@
new /obj/item/bedsheet/cult(src)
if(28)
new /obj/item/clothing/neck/necklace/memento_mori(src)
if(29)
if(prob(50))
new /obj/item/malf_upgrade
else
new /obj/item/disk/tech_disk/illegal
//KA modkit design discs
/obj/item/disk/design_disk/modkit_disc
@@ -1,7 +1,13 @@
//MEDBOT
//MEDBOT PATHFINDING
//MEDBOT ASSEMBLY
#define MEDBOT_PANIC_NONE 0
#define MEDBOT_PANIC_LOW 15
#define MEDBOT_PANIC_MED 35
#define MEDBOT_PANIC_HIGH 55
#define MEDBOT_PANIC_FUCK 70
#define MEDBOT_PANIC_ENDING 90
#define MEDBOT_PANIC_END 100
/mob/living/simple_animal/bot/medbot
name = "\improper Medibot"
@@ -64,6 +70,13 @@
var/upgraded_dispenser_3 //Do we have the nicer chemicals? - replaces bic with sal acid
var/upgraded_dispenser_4 //Do we have the nicer chemicals? - replaces charcoal/toxin with pentetic acid / pentetic jelly
//How panicked we are about being tipped over (why would you do this?)
var/tipped_status = MEDBOT_PANIC_NONE
//The name we got when we were tipped
var/tipper_name
//The last time we were tipped/righted and said a voice line, to avoid spam
var/last_tipping_action_voice = 0
/mob/living/simple_animal/bot/medbot/mysterious
name = "\improper Mysterious Medibot"
desc = "International Medibot of mystery."
@@ -373,10 +386,91 @@
else
return
/mob/living/simple_animal/bot/medbot/proc/tip_over(mob/user)
mobility_flags &= ~MOBILITY_MOVE
playsound(src, 'sound/machines/warning-buzzer.ogg', 50)
user.visible_message("<span class='danger'>[user] tips over [src]!</span>", "<span class='danger'>You tip [src] over!</span>")
mode = BOT_TIPPED
var/matrix/mat = transform
transform = mat.Turn(180)
/mob/living/simple_animal/bot/medbot/proc/set_right(mob/user)
mobility_flags &= MOBILITY_MOVE
var/list/messagevoice
if(user)
user.visible_message("<span class='notice'>[user] sets [src] right-side up!</span>", "<span class='green'>You set [src] right-side up!</span>")
if(user.name == tipper_name)
messagevoice = list("I forgive you." = 'sound/voice/medbot/forgive.ogg')
else
messagevoice = list("Thank you!" = 'sound/voice/medbot/thank_you.ogg', "You are a good person." = 'sound/voice/medbot/youre_good.ogg')
else
visible_message("<span class='notice'>[src] manages to writhe wiggle enough to right itself.</span>")
messagevoice = list("Fuck you." = 'sound/voice/medbot/fuck_you.ogg', "Your behavior has been reported, have a nice day." = 'sound/voice/medbot/reported.ogg')
tipper_name = null
if(world.time > last_tipping_action_voice + 15 SECONDS)
last_tipping_action_voice = world.time
var/message = pick(messagevoice)
speak(message)
playsound(src, messagevoice[message], 70)
tipped_status = MEDBOT_PANIC_NONE
mode = BOT_IDLE
transform = matrix()
// if someone tipped us over, check whether we should ask for help or just right ourselves eventually
/mob/living/simple_animal/bot/medbot/proc/handle_panic()
tipped_status++
var/list/messagevoice
switch(tipped_status)
if(MEDBOT_PANIC_LOW)
messagevoice = list("I require assistance." = 'sound/voice/medbot/i_require_asst.ogg')
if(MEDBOT_PANIC_MED)
messagevoice = list("Please put me back." = 'sound/voice/medbot/please_put_me_back.ogg')
if(MEDBOT_PANIC_HIGH)
messagevoice = list("Please, I am scared!" = 'sound/voice/medbot/please_im_scared.ogg')
if(MEDBOT_PANIC_FUCK)
messagevoice = list("I don't like this, I need help!" = 'sound/voice/medbot/dont_like.ogg', "This hurts, my pain is real!" = 'sound/voice/medbot/pain_is_real.ogg')
if(MEDBOT_PANIC_ENDING)
messagevoice = list("Is this the end?" = 'sound/voice/medbot/is_this_the_end.ogg', "Nooo!" = 'sound/voice/medbot/nooo.ogg')
if(MEDBOT_PANIC_END)
speak("PSYCH ALERT: Crewmember [tipper_name] recorded displaying antisocial tendencies torturing bots in [get_area(src)]. Please schedule psych evaluation.", radio_channel)
set_right() // strong independent medbot
if(prob(tipped_status))
do_jitter_animation(tipped_status * 0.1)
if(messagevoice)
var/message = pick(messagevoice)
speak(message)
playsound(src, messagevoice[message], 70)
else if(prob(tipped_status * 0.2))
playsound(src, 'sound/machines/warning-buzzer.ogg', 30, extrarange=-2)
/mob/living/simple_animal/bot/medbot/examine(mob/user)
. = ..()
if(tipped_status == MEDBOT_PANIC_NONE)
return
switch(tipped_status)
if(MEDBOT_PANIC_NONE to MEDBOT_PANIC_LOW)
. += "It appears to be tipped over, and is quietly waiting for someone to set it right."
if(MEDBOT_PANIC_LOW to MEDBOT_PANIC_MED)
. += "It is tipped over and requesting help."
if(MEDBOT_PANIC_MED to MEDBOT_PANIC_HIGH)
. += "They are tipped over and appear visibly distressed." // now we humanize the medbot as a they, not an it
if(MEDBOT_PANIC_HIGH to MEDBOT_PANIC_FUCK)
. += "<span class='warning'>They are tipped over and visibly panicking!</span>"
if(MEDBOT_PANIC_FUCK to INFINITY)
. += "<span class='warning'><b>They are freaking out from being tipped over!</b></span>"
/mob/living/simple_animal/bot/medbot/handle_automated_action()
if(!..())
return
if(mode == BOT_TIPPED)
handle_panic()
return
if(mode == BOT_HEALING)
return
@@ -392,10 +486,14 @@
if(QDELETED(patient))
if(!shut_up && prob(1))
var/list/messagevoice = list("Radar, put a mask on!" = 'sound/voice/medbot/radar.ogg',"There's always a catch, and I'm the best there is." = 'sound/voice/medbot/catch.ogg',"I knew it, I should've been a plastic surgeon." = 'sound/voice/medbot/surgeon.ogg',"What kind of medbay is this? Everyone's dropping like flies." = 'sound/voice/medbot/flies.ogg',"Delicious!" = 'sound/voice/medbot/delicious.ogg')
var/message = pick(messagevoice)
speak(message)
playsound(loc, messagevoice[message], 50, 0)
if(emagged && prob(30))
var/list/i_need_scissors = list('sound/voice/medbot/fuck_you.ogg', 'sound/voice/medbot/turn_off.ogg', 'sound/voice/medbot/im_different.ogg', 'sound/voice/medbot/close.ogg', 'sound/voice/medbot/shindemashou.ogg')
playsound(src, pick(i_need_scissors), 70)
else
var/list/messagevoice = list("Radar, put a mask on!" = 'sound/voice/medbot/radar.ogg',"There's always a catch, and I'm the best there is." = 'sound/voice/medbot/catch.ogg',"I knew it, I should've been a plastic surgeon." = 'sound/voice/medbot/surgeon.ogg',"What kind of medbay is this? Everyone's dropping like flies." = 'sound/voice/medbot/flies.ogg',"Delicious!" = 'sound/voice/medbot/delicious.ogg', "Why are we still here? Just to suffer?" = 'sound/voice/medbot/why.ogg')
var/message = pick(messagevoice)
speak(message)
playsound(src, messagevoice[message], 50)
var/scan_range = (stationary_mode ? 1 : DEFAULT_SCAN_RANGE) //If in stationary mode, scan range is limited to adjacent patients.
patient = scan(/mob/living/carbon/human, oldpatient, scan_range)
oldpatient = patient
@@ -506,6 +604,27 @@
/mob/living/simple_animal/bot/medbot/proc/get_healchem_toxin(mob/M)
return HAS_TRAIT(M, TRAIT_TOXINLOVER)? treatment_tox_toxlover : treatment_tox
/mob/living/simple_animal/bot/medbot/attack_hand(mob/living/carbon/human/H)
if(H.a_intent == INTENT_DISARM && mode != BOT_TIPPED)
H.visible_message("<span class='danger'>[H] begins tipping over [src].</span>", "<span class='warning'>You begin tipping over [src]...</span>")
if(world.time > last_tipping_action_voice + 15 SECONDS)
last_tipping_action_voice = world.time // message for tipping happens when we start interacting, message for righting comes after finishing
var/list/messagevoice = list("Hey, wait..." = 'sound/voice/medbot/hey_wait.ogg',"Please don't..." = 'sound/voice/medbot/please_dont.ogg',"I trusted you..." = 'sound/voice/medbot/i_trusted_you.ogg', "Nooo..." = 'sound/voice/medbot/nooo.ogg', "Oh fuck-" = 'sound/voice/medbot/oh_fuck.ogg')
var/message = pick(messagevoice)
speak(message)
playsound(src, messagevoice[message], 70, FALSE)
if(do_after(H, 3 SECONDS, target=src))
tip_over(H)
else if(H.a_intent == INTENT_HELP && mode == BOT_TIPPED)
H.visible_message("<span class='notice'>[H] begins righting [src].</span>", "<span class='notice'>You begin righting [src]...</span>")
if(do_after(H, 3 SECONDS, target=src))
set_right(H)
else
..()
/mob/living/simple_animal/bot/medbot/UnarmedAttack(atom/A)
if(iscarbon(A))
var/mob/living/carbon/C = A
@@ -664,3 +783,11 @@
/obj/machinery/bot_core/medbot
req_one_access = list(ACCESS_MEDICAL, ACCESS_ROBOTICS)
#undef MEDBOT_PANIC_NONE
#undef MEDBOT_PANIC_LOW
#undef MEDBOT_PANIC_MED
#undef MEDBOT_PANIC_HIGH
#undef MEDBOT_PANIC_FUCK
#undef MEDBOT_PANIC_ENDING
#undef MEDBOT_PANIC_END
@@ -250,7 +250,7 @@
if(istype(O, /obj/item/stack/medical/gauze))
var/obj/item/stack/medical/gauze/G = O
reac_volume = min((reac_volume / 10), G.amount)
new/obj/item/stack/medical/ointment(get_turf(G), reac_volume)
new/obj/item/stack/medical/mesh(get_turf(G), reac_volume)
G.use(reac_volume)
/datum/reagent/medicine/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
@@ -336,7 +336,7 @@
if(istype(O, /obj/item/stack/medical/gauze))
var/obj/item/stack/medical/gauze/G = O
reac_volume = min((reac_volume / 10), G.amount)
new/obj/item/stack/medical/bruise_pack(get_turf(G), reac_volume)
new/obj/item/stack/medical/suture(get_turf(G), reac_volume)
G.use(reac_volume)
/datum/reagent/medicine/styptic_powder/on_mob_life(mob/living/carbon/M)
@@ -165,6 +165,7 @@
name = "Export Design (Gin)"
desc = "Allows for the blowing, and bottling of Gin bottles."
id = "gin_export"
reagents_list = list(/datum/reagent/consumable/ethanol/gin = 50)
build_path = /obj/item/export/bottle/gin
/datum/design/bottle/export/whiskey
@@ -167,4 +167,34 @@
id = "xenobio_slimeadv"
build_path = /obj/item/disk/xenobio_console_upgrade/slimeadv
/datum/design/board/shuttle/engine/plasma
name = "Machine Design (Plasma Thruster Board)"
desc = "The circuit board for a plasma thruster."
id = "engine_plasma"
build_path = /obj/item/circuitboard/machine/shuttle/engine/plasma
category = list ("Shuttle Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/board/shuttle/engine/void
name = "Machine Design (Void Thruster Board)"
desc = "The circuit board for a void thruster."
id = "engine_void"
build_path = /obj/item/circuitboard/machine/shuttle/engine/void
category = list ("Shuttle Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/board/shuttle/engine/heater
name = "Machine Design (Engine Heater Board)"
desc = "The circuit board for an engine heater."
id = "engine_heater"
build_path = /obj/item/circuitboard/machine/shuttle/heater
category = list ("Shuttle Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/obj/item/circuitboard/computer/shuttle/flight_control
name = "Shuttle Flight Control (Computer Board)"
build_path = /obj/machinery/computer/custom_shuttle
/obj/item/circuitboard/computer/shuttle/docker
name = "Shuttle Navigation Computer (Computer Board)"
build_path = /obj/machinery/computer/camera_advanced/shuttle_docker/custom
@@ -792,3 +792,37 @@
build_path = /obj/item/stack/sticky_tape/pointy
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
/////////////////////////////////////////
/////////////////Shuttle Upgrades////////
/////////////////////////////////////////
/datum/design/shuttle_speed_upgrade
name = "Shuttle Route Optimisation Upgrade"
desc = "A disk that allows for calculating shorter routes when inserted into a flight control console."
id = "disk_shuttle_route"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000)
build_path = /obj/item/shuttle_route_optimisation
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/shuttle_speed_upgrade_hyper
name = "Shuttle Bluespace Hyperlane Optimisation Upgrade"
desc = "A disk that allows for calculating shorter routes when inserted into a flight control console. This one abuses bluespace hyperlanes for increased efficiency."
id = "disk_shuttle_route_hyper"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000)
build_path = /obj/item/shuttle_route_optimisation/hyperlane
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/shuttle_speed_upgrade_void
name = "Shuttle Voidspace Optimisation Upgrade"
desc = "A disk that allows for calculating shorter routes when inserted into a flight control console. This one access voidspace for increased efficiency."
id = "disk_shuttle_route_void"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000)
build_path = /obj/item/shuttle_route_optimisation/void
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
@@ -42,6 +42,16 @@
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/shuttlecreator
name = "Rapid Shuttle Designator"
desc = "An advanced device capable of defining areas for use in the creation of shuttles"
id = "shuttle_creator"
build_path = /obj/item/shuttle_creator
build_type = PROTOLATHE
materials = list(/datum/material/iron = 8000, /datum/material/titanium = 5000, /datum/material/bluespace = 5000)
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/handdrill
name = "Hand Drill"
desc = "A small electric hand drill with an interchangeable screwdriver and bolt bit"
@@ -63,3 +63,36 @@
prereq_ids = list("bluespace_warping", "syndicate_basic")
design_ids = list("desynchronizer")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/////////////////////////shuttle tech/////////////////////////
/datum/techweb_node/basic_shuttle_tech
id = "basic_shuttle"
display_name = "Basic Shuttle Research"
description = "Research the technology required to create and use basic shuttles."
prereq_ids = list("bluespace_travel", "adv_engi")
design_ids = list("shuttle_creator", "engine_plasma", "engine_heater", "shuttle_control", "shuttle_docker")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
/datum/techweb_node/shuttle_route_upgrade
id = "shuttle_route_upgrade"
display_name = "Route Optimisation Upgrade"
description = "Research into bluespace tunnelling, allowing us to reduce flight times by up to 20%!"
prereq_ids = list("basic_shuttle")
design_ids = list("disk_shuttle_route")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/shuttle_route_upgrade_hyper
id = "shuttle_route_upgrade_hyper"
display_name = "Hyperlane Optimisation Upgrade"
description = "Research into bluespace hyperlane, allowing us to reduce flight times by up to 40%!"
prereq_ids = list("shuttle_route_upgrade", "micro_bluespace")
design_ids = list("disk_shuttle_route_hyper")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
/datum/techweb_node/shuttle_route_upgrade_void
id = "shuttle_route_upgrade_void"
display_name = "Nullspace Breaching Upgrade"
description = "Research into voidspace tunnelling, allowing us to significantly reduce flight times."
prereq_ids = list("shuttle_route_upgrade_hyper", "alientech")
design_ids = list("disk_shuttle_route_void", "engine_void")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 12500)
+1 -1
View File
@@ -71,6 +71,6 @@
to_chat(user, "<span class='notice'>You fried the consoles ID checking system.</span>")
return TRUE
/obj/machinery/computer/shuttle/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
/obj/machinery/computer/shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
if(port && (shuttleId == initial(shuttleId) || override))
shuttleId = port.id
+268
View File
@@ -0,0 +1,268 @@
#define Z_DIST 500
#define CUSTOM_ENGINES_START_TIME 65
#define CALCULATE_STATS_COOLDOWN 2
/obj/machinery/computer/custom_shuttle
name = "nanotrasen shuttle flight controller"
desc = "A terminal used to fly shuttles defined by the Shuttle Zoning Designator"
circuit = /obj/item/circuitboard/computer/shuttle/flight_control
icon_screen = "shuttle"
icon_keyboard = "tech_key"
light_color = LIGHT_COLOR_CYAN
req_access = list( )
var/shuttleId
var/possible_destinations = "whiteship_home"
var/admin_controlled
var/no_destination_swap = 0
var/calculated_mass = 0
var/calculated_dforce = 0
var/calculated_speed = 0
var/calculated_engine_count = 0
var/calculated_consumption = 0
var/calculated_cooldown = 0
var/calculated_non_operational_thrusters = 0
var/calculated_fuel_less_thrusters = 0
var/target_fuel_cost = 0
var/targetLocation
var/datum/browser/popup
var/stat_calc_cooldown = 0
//Upgrades
var/distance_multiplier = 1
/obj/machinery/computer/custom_shuttle/examine(mob/user)
. = ..()
. += distance_multiplier < 1 ? "Bluespace shortcut module installed. Route is [distance_multiplier]x the original length." : ""
/obj/machinery/computer/custom_shuttle/ui_interact(mob/user)
var/list/options = params2list(possible_destinations)
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
var/dat = "[M ? "Current Location : [M.getStatusText()]" : "Shuttle link required."]<br><br>"
if(M)
dat += "<A href='?src=[REF(src)];calculate=1'>Run Flight Calculations</A><br>"
dat += "<b>Shuttle Data</b><hr>"
dat += "Shuttle Mass: [calculated_mass/10]tons<br>"
dat += "Engine Force: [calculated_dforce]kN ([calculated_engine_count] engines)<br>"
dat += "Sublight Speed: [calculated_speed]ms<sup>-1</sup><br>"
dat += calculated_speed < 1 ? "<b>INSUFFICIENT ENGINE POWER</b><br>" : ""
dat += calculated_non_operational_thrusters > 0 ? "<b>Warning: [calculated_non_operational_thrusters] thrusters offline.</b><br>" : ""
dat += "Fuel Consumption: [calculated_consumption]units per distance<br>"
dat += "Engine Cooldown: [calculated_cooldown]s<hr>"
var/destination_found
for(var/obj/docking_port/stationary/S in SSshuttle.stationary)
if(!options.Find(S.id))
continue
if(!M.check_dock(S, silent=TRUE))
continue
if(calculated_speed == 0)
break
destination_found = TRUE
var/dist = round(calculateDistance(S))
dat += "<A href='?src=[REF(src)];setloc=[S.id]'>Target [S.name] (Dist: [dist] | Fuel Cost: [round(dist * calculated_consumption)] | Time: [round(dist / calculated_speed)])</A><br>"
if(!destination_found)
dat += "<B>No valid destinations</B><br>"
dat += "<hr>[targetLocation ? "Target Location : [targetLocation]" : "No Target Location"]"
dat += "<hr><A href='?src=[REF(src)];fly=1'>Initate Flight</A><br>"
dat += "<A href='?src=[REF(user)];mach_close=computer'>Close</a>"
popup = new(user, "computer", M ? M.name : "shuttle", 350, 450)
popup.set_content("<center>[dat]</center>")
popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
/obj/machinery/computer/custom_shuttle/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
src.add_fingerprint(usr)
if(!allowed(usr))
to_chat(usr, "<span class='danger'>Access denied.</span>")
return
if(href_list["calculate"])
calculateStats()
ui_interact(usr)
return
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
if(!M)
return
if(M.launch_status == ENDGAME_LAUNCHED)
return
if(href_list["setloc"])
SetTargetLocation(href_list["setloc"])
ui_interact(usr)
return
else if(href_list["fly"])
Fly()
ui_interact(usr)
return
/obj/machinery/computer/custom_shuttle/proc/calculateDistance(var/obj/docking_port/stationary/port)
var/deltaX = port.x - x
var/deltaY = port.y - y
var/deltaZ = (port.z - z) * Z_DIST
return sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) * distance_multiplier
/obj/machinery/computer/custom_shuttle/proc/linkShuttle(var/new_id)
shuttleId = new_id
possible_destinations = "whiteship_home;shuttle[new_id]_custom"
/obj/machinery/computer/custom_shuttle/proc/calculateStats(var/useFuel = FALSE, var/dist = 0, var/ignore_cooldown = FALSE)
if(!ignore_cooldown && stat_calc_cooldown >= world.time)
to_chat(usr, "<span>You are using this too fast, please slow down</span>")
return
stat_calc_cooldown = world.time + CALCULATE_STATS_COOLDOWN
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
if(!M)
return FALSE
//Reset data
calculated_mass = 0
calculated_dforce = 0
calculated_speed = 0
calculated_engine_count = 0
calculated_consumption = 0
calculated_cooldown = 0
calculated_fuel_less_thrusters = 0
calculated_non_operational_thrusters = 0
//Calculate all the data
var/list/areas = M.shuttle_areas
for(var/shuttleArea in areas)
calculated_mass += length(get_area_turfs(shuttleArea))
for(var/obj/machinery/shuttle/engine/E in shuttleArea)
E.check_setup()
if(!E.thruster_active) //Skipover thrusters with no valid heater
calculated_non_operational_thrusters ++
continue
if(E.attached_heater)
var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolvedHeater = E.attached_heater.resolve()
if(resolvedHeater && !resolvedHeater.hasFuel(dist * E.fuel_use) && useFuel)
calculated_fuel_less_thrusters ++
continue
calculated_engine_count++
calculated_dforce += E.thrust
calculated_consumption += E.fuel_use
calculated_cooldown = max(calculated_cooldown, E.cooldown)
//This should really be accelleration, but its a 2d spessman game so who cares
if(calculated_mass == 0)
return FALSE
calculated_speed = (calculated_dforce*1000) / (calculated_mass*100)
return TRUE
/obj/machinery/computer/custom_shuttle/proc/consumeFuel(var/dist)
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
if(!M)
return FALSE
//Calculate all the data
for(var/obj/machinery/shuttle/engine/shuttle_machine in GLOB.custom_shuttle_machines)
shuttle_machine.check_setup()
if(!shuttle_machine.thruster_active)
continue
if(get_area(M) != get_area(shuttle_machine))
continue
if(shuttle_machine.attached_heater)
var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolvedHeater = shuttle_machine.attached_heater.resolve()
if(resolvedHeater && !resolvedHeater.hasFuel(dist * shuttle_machine.fuel_use))
continue
resolvedHeater?.consumeFuel(dist * shuttle_machine.fuel_use)
shuttle_machine.fireEngine()
/obj/machinery/computer/custom_shuttle/proc/SetTargetLocation(var/newTarget)
if(!(newTarget in params2list(possible_destinations)))
log_admin("[usr] attempted to href dock exploit on [src] with target location \"[newTarget]\"")
message_admins("[usr] just attempted to href dock exploit on [src] with target location \"[newTarget]\"")
return
targetLocation = newTarget
say("Shuttle route calculated.")
return
/obj/machinery/computer/custom_shuttle/proc/Fly()
if(!targetLocation)
return
var/obj/docking_port/mobile/linkedShuttle = SSshuttle.getShuttle(shuttleId)
if(!linkedShuttle)
return
if(linkedShuttle.mode != SHUTTLE_IDLE)
return
if(!calculateStats(TRUE, 0, TRUE))
return
if(calculated_fuel_less_thrusters > 0)
say("Warning, [calculated_fuel_less_thrusters] do not have enough fuel for this journey, engine output may be limitted.")
if(calculated_speed < 1)
say("Insufficient engine power, shuttle requires [calculated_mass / 10]kN of thrust.")
return
var/obj/docking_port/stationary/targetPort = SSshuttle.getDock(targetLocation)
if(!targetPort)
return
var/dist = calculateDistance(targetPort)
var/time = min(max(round(dist / calculated_speed), 10), 90)
linkedShuttle.callTime = time * 10
linkedShuttle.rechargeTime = calculated_cooldown
//We need to find the direction of this console to the port
linkedShuttle.port_direction = angle2dir(dir2angle(dir) - (dir2angle(linkedShuttle.dir)) + 180)
linkedShuttle.preferred_direction = NORTH
linkedShuttle.ignitionTime = CUSTOM_ENGINES_START_TIME
linkedShuttle.count_engines()
linkedShuttle.hyperspace_sound(HYPERSPACE_WARMUP)
var/throwForce = clamp((calculated_speed / 2) - 5, 0, 10)
linkedShuttle.movement_force = list("KNOCKDOWN" = calculated_speed > 5 ? 3 : 0, "THROW" = throwForce)
if(!(targetLocation in params2list(possible_destinations)))
log_admin("[usr] attempted to launch a shuttle that has been affected by href dock exploit on [src] with target location \"[targetLocation]\"")
message_admins("[usr] attempted to launch a shuttle that has been affected by href dock exploit on [src] with target location \"[targetLocation]\"")
return
switch(SSshuttle.moveShuttle(shuttleId, targetLocation, 1))
if(0)
consumeFuel(dist)
say("Shuttle departing. Please stand away from the doors.")
if(1)
to_chat(usr, "<span class='warning'>Invalid shuttle requested.</span>")
else
to_chat(usr, "<span class='notice'>Unable to comply.</span>")
return
/obj/machinery/computer/custom_shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
if(port && (shuttleId == initial(shuttleId) || override))
linkShuttle(port.id)
//Custom shuttle docker locations
/obj/machinery/computer/camera_advanced/shuttle_docker/custom
name = "Shuttle Navigation Computer"
desc = "Used to designate a precise transit location for private ships."
lock_override = NONE
whitelist_turfs = list(/turf/open/space,
/turf/open/lava,
/turf/open/floor/plating/beach,
/turf/open/floor/plating/ashplanet,
/turf/open/floor/plating/asteroid,
/turf/open/floor/plating/lavaland_baseturf)
jumpto_ports = list("whiteship_home" = 1)
view_range = 12
designate_time = 100
circuit = /obj/item/circuitboard/computer/shuttle/docker
/obj/machinery/computer/camera_advanced/shuttle_docker/custom/Initialize()
. = ..()
GLOB.jam_on_wardec += src
/obj/machinery/computer/camera_advanced/shuttle_docker/custom/Destroy()
GLOB.jam_on_wardec -= src
return ..()
/obj/machinery/computer/camera_advanced/shuttle_docker/custom/placeLandingSpot()
if(!shuttleId)
return //Only way this would happen is if someone else delinks the console while in use somehow
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
if(M?.mode != SHUTTLE_IDLE)
to_chat(usr, "<span class='warning'>You cannot target locations while in transit.</span>")
return
..()
/obj/machinery/computer/camera_advanced/shuttle_docker/custom/attack_hand(mob/user)
if(!shuttleId)
to_chat(user, "<span class='warning'>You must link the console to a shuttle first.</span>")
return
return ..()
/obj/machinery/computer/camera_advanced/shuttle_docker/custom/proc/linkShuttle(var/new_id)
shuttleId = new_id
shuttlePortId = "shuttle[new_id]_custom"
+1 -1
View File
@@ -253,7 +253,7 @@
current_user.client.images -= remove_images
current_user.client.images += add_images
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
/obj/machinery/computer/camera_advanced/shuttle_docker/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
if(port && (shuttleId == initial(shuttleId) || override))
shuttleId = port.id
shuttlePortId = "[port.id]_custom"
+124 -45
View File
@@ -11,17 +11,31 @@
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
anchored = TRUE
//
/// The identifier of the port or ship.
/// This will be used in numerous other places like the console,
/// stationary ports and whatnot to tell them your ship's mobile
/// port can be used in these places, or the docking port is compatible, etc.
var/id
// this should point -away- from the dockingport door, ie towards the ship
///Common standard is for this to point -away- from the dockingport door, ie towards the ship
dir = NORTH
var/width = 0 //size of covered area, perpendicular to dir
var/height = 0 //size of covered area, parallel to dir
var/dwidth = 0 //position relative to covered area, perpendicular to dir
var/dheight = 0 //position relative to covered area, parallel to dir
///size of covered area, perpendicular to dir. You shouldn't modify this for mobile dockingports, set automatically.
var/width = 0
///size of covered area, parallel to dir. You shouldn't modify this for mobile dockingports, set automatically.
var/height = 0
///position relative to covered area, perpendicular to dir. You shouldn't modify this for mobile dockingports, set automatically.
var/dwidth = 0
///position relative to covered area, parallel to dir. You shouldn't modify this for mobile dockingports, set automatically.
var/dheight = 0
var/area_type
var/hidden = FALSE //are we invisible to shuttle navigation computers?
///are we invisible to shuttle navigation computers?
var/hidden = FALSE
///Delete this port after ship fly off.
var/delete_after = FALSE
/obj/docking_port/proc/get_save_vars()
return list("pixel_x", "pixel_y", "dir", "name", "req_access", "req_access_txt", "piping_layer", "color", "icon_state", "pipe_color", "amount", "width", "height", "dwidth", "dheight")
//these objects are indestructible
/obj/docking_port/Destroy(force)
@@ -155,8 +169,6 @@
/obj/docking_port/stationary
name = "dock"
area_type = SHUTTLE_DEFAULT_UNDERLYING_AREA
var/last_dock_time
var/datum/map_template/shuttle/roundstart_template
@@ -169,6 +181,9 @@
id = "[SSshuttle.stationary.len]"
if(name == "dock")
name = "dock[SSshuttle.stationary.len]"
if(!area_type)
var/area/place = get_area(src)
area_type = place?.type // We might be created in nullspace
if(mapload)
for(var/turf/T in return_turfs())
@@ -183,6 +198,13 @@
SSshuttle.stationary -= src
. = ..()
/obj/docking_port/stationary/Moved(atom/oldloc, dir, forced)
. = ..()
if(area_type) // We already have one
return
var/area/newarea = get_area(src)
area_type = newarea?.type
/obj/docking_port/stationary/proc/load_roundstart()
if(json_key)
var/sid = SSmapping.config.shuttles[json_key]
@@ -196,9 +218,6 @@
if(!roundstart_template)
CRASH("Invalid path ([roundstart_template]) passed to docking port.")
if(roundstart_template)
SSshuttle.manipulator.action_load(roundstart_template, src)
//returns first-found touching shuttleport
/obj/docking_port/stationary/get_docked()
. = locate(/obj/docking_port/mobile) in loc
@@ -235,16 +254,25 @@
var/list/shuttle_areas
var/timer //used as a timer (if you want time left to complete move, use timeLeft proc)
///used as a timer (if you want time left to complete move, use timeLeft proc)
var/timer
var/last_timer_length
///current shuttle mode
var/mode = SHUTTLE_IDLE
///time spent in transit (deciseconds). Should not be lower then 10 seconds without editing the animation of the hyperspace ripples.
var/callTime = 100
/// time spent "starting the engines". Also rate limits how often we try to reserve transit space if its ever full of transiting shuttles.
var/ignitionTime = 55
/// time spent after arrival before being able to begin ignition
var/rechargeTime = 0
/// time spent after transit 'landing' before actually arriving
var/prearrivalTime = 0
var/mode = SHUTTLE_IDLE //current shuttle mode
var/callTime = 100 //time spent in transit (deciseconds). Should not be lower then 10 seconds without editing the animation of the hyperspace ripples.
var/ignitionTime = 55 // time spent "starting the engines". Also rate limits how often we try to reserve transit space if its ever full of transiting shuttles.
// The direction the shuttle prefers to travel in
/// The direction the shuttle prefers to travel in, ie what direction
/// the animation will cause it to appear to be traveling in
var/preferred_direction = NORTH
// And the angle from the front of the shuttle to the port
/// relative direction of the docking port from the front of the shuttle
/// NORTH is towards front, EAST would be starboard side, WEST port, etc.
var/port_direction = NORTH
var/obj/docking_port/stationary/destination
@@ -254,13 +282,16 @@
var/launch_status = NOLAUNCH
var/list/movement_force = list("KNOCKDOWN" = 3, "THROW" = 2)
///Whether or not you want your ship to knock people down, and also whether it will throw them several tiles upon launching.
var/list/movement_force = list("KNOCKDOWN" = 3, "THROW" = 0)
var/list/ripples = list()
var/engine_coeff = 1 //current engine coeff
var/current_engines = 0 //current engine power
var/initial_engines = 0 //initial engine power
var/can_move_docking_ports = FALSE //if this shuttle can move docking ports other than the one it is docked at
var/engine_coeff = 1
var/current_engines = 0
var/initial_engines = 0
var/list/engine_list = list()
///if this shuttle can move docking ports other than the one it is docked at
var/can_move_docking_ports = FALSE
var/list/hidden_turfs = list()
/obj/docking_port/mobile/proc/register()
@@ -308,14 +339,12 @@
id = "[id][idnum]"
if(name == initial(name))
name = "[name] [idnum]"
for(var/i in shuttle_areas)
var/area/place = i
for(var/obj/machinery/computer/shuttle/comp in place)
comp.connect_to_shuttle(src, dock, idnum)
for(var/obj/machinery/computer/camera_advanced/shuttle_docker/comp in place)
comp.connect_to_shuttle(src, dock, idnum)
for(var/obj/machinery/status_display/shuttle/sd in place)
sd.connect_to_shuttle(src, dock, idnum)
for(var/place in shuttle_areas)
var/area/area = place
area.connect_to_shuttle(src, dock, idnum, FALSE)
for(var/each in place)
var/atom/atom = each
atom.connect_to_shuttle(src, dock, idnum, FALSE)
//this is a hook for custom behaviour. Maybe at some point we could add checks to see if engines are intact
@@ -423,7 +452,10 @@
if(initiate_docking(S1) != DOCKING_SUCCESS)
WARNING("shuttle \"[id]\" could not enter transit space. Docked at [S0 ? S0.id : "null"]. Transit dock [S1 ? S1.id : "null"].")
else
previous = S0
if(S0.delete_after)
qdel(S0, TRUE)
else
previous = S0
else
WARNING("shuttle \"[id]\" could not enter transit space. S0=[S0 ? S0.id : "null"] S1=[S1 ? S1.id : "null"]")
@@ -536,7 +568,11 @@
// If we can't dock or we don't have a transit slot, wait for 20 ds,
// then try again
switch(mode)
if(SHUTTLE_CALL)
if(SHUTTLE_CALL, SHUTTLE_PREARRIVAL)
if(prearrivalTime && mode != SHUTTLE_PREARRIVAL)
mode = SHUTTLE_PREARRIVAL
setTimer(prearrivalTime)
return
var/error = initiate_docking(destination, preferred_direction)
if(error && error & (DOCKING_NULL_DESTINATION | DOCKING_NULL_SOURCE))
var/msg = "A mobile dock in transit exited initiate_docking() with an error. This is most likely a mapping problem: Error: [error], ([src]) ([previous][ADMIN_JMP(previous)] -> [destination][ADMIN_JMP(destination)])"
@@ -547,6 +583,10 @@
else if(error)
setTimer(20)
return
if(rechargeTime)
mode = SHUTTLE_RECHARGING
setTimer(rechargeTime)
return
if(SHUTTLE_RECALL)
if(initiate_docking(previous) != DOCKING_SUCCESS)
setTimer(20)
@@ -649,6 +689,10 @@
return "ESC"
if(SHUTTLE_STRANDED)
return "ERR"
if(SHUTTLE_RECHARGING)
return "RCH"
if(SHUTTLE_PREARRIVAL)
return "LDN"
return ""
// returns 5-letter timer string, used by status screens and mob status panel
@@ -660,14 +704,14 @@
if(timeleft > 1 HOURS)
return "--:--"
else if(timeleft > 0)
return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, "0")]"
return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, " ")]"
else
return "00:00"
/obj/docking_port/mobile/proc/getStatusText()
var/obj/docking_port/stationary/dockedAt = get_docked()
var/docked_at = dockedAt?.name || "unknown"
if(istype(dockedAt, /obj/docking_port/stationary/transit))
if (timeLeft() > 1 HOURS)
return "hyperspace"
@@ -678,8 +722,10 @@
else
dst = destination
. = "transit towards [dst?.name || "unknown location"] ([getTimerStr()])"
else if(mode == SHUTTLE_RECHARGING)
return "[docked_at], recharging [getTimerStr()]"
else
return dockedAt?.name || "unknown"
return docked_at
/obj/docking_port/mobile/proc/getDbgStatusText()
@@ -711,19 +757,47 @@
return null
/obj/docking_port/mobile/proc/hyperspace_sound(phase, list/areas)
var/s
var/selected_sound
switch(phase)
if(HYPERSPACE_WARMUP)
s = 'sound/effects/hyperspace_begin.ogg'
selected_sound = "hyperspace_begin"
if(HYPERSPACE_LAUNCH)
s = 'sound/effects/hyperspace_progress.ogg'
selected_sound = "hyperspace_progress"
if(HYPERSPACE_END)
s = 'sound/effects/hyperspace_end.ogg'
selected_sound = "hyperspace_end"
else
CRASH("Invalid hyperspace sound phase: [phase]")
for(var/A in areas)
for(var/obj/machinery/door/E in A) //dumb, I know, but playing it on the engines doesn't do it justice
playsound(E, s, 100, FALSE, max(width, height) - world.view)
// This previously was played from each door at max volume, and was one of the worst things I had ever seen.
// Now it's instead played from the nearest engine if close, or the first engine in the list if far since it doesn't really matter.
// Or a door if for some reason the shuttle has no engine, fuck oh hi daniel fuck it
var/range = (engine_coeff * max(width, height))
var/long_range = range * 2.5
var/atom/distant_source
if(LAZYLEN(engine_list))
distant_source = engine_list[1]
else
for(var/A in areas)
distant_source = locate(/obj/machinery/door) in A
if(distant_source)
break
if(distant_source)
for(var/mob/M in SSmobs.clients_by_zlevel[z])
var/dist_far = get_dist(M, distant_source)
if(dist_far <= long_range && dist_far > range)
M.playsound_local(distant_source, "sound/effects/[selected_sound]_distance.ogg", 100, falloff = 20)
else if(dist_far <= range)
var/source
if(engine_list.len == 0)
source = distant_source
else
var/closest_dist = 10000
for(var/obj/O in engine_list)
var/dist_near = get_dist(M, O)
if(dist_near < closest_dist)
source = O
closest_dist = dist_near
M.playsound_local(source, "sound/effects/[selected_sound].ogg", 100, falloff = range / 2)
// Losing all initial engines should get you 2
// Adding another set of engines at 0.5 time
@@ -743,7 +817,12 @@
var/area/shuttle/areaInstance = thing
for(var/obj/structure/shuttle/engine/E in areaInstance.contents)
if(!QDELETED(E))
engine_list += E
. += E.engine_power
for(var/obj/machinery/shuttle/engine/E in areaInstance.contents)
if(!QDELETED(E))
engine_list += E
. += E.thruster_active ? 1 : 0
// Double initial engines to get to 0.5 minimum
// Lose all initial engines to get to 2
@@ -768,7 +847,7 @@
/obj/docking_port/mobile/proc/in_flight()
switch(mode)
if(SHUTTLE_CALL,SHUTTLE_RECALL)
if(SHUTTLE_CALL,SHUTTLE_RECALL,SHUTTLE_PREARRIVAL)
return TRUE
if(SHUTTLE_IDLE,SHUTTLE_IGNITING)
return FALSE
@@ -0,0 +1,370 @@
#define SHUTTLE_CREATOR_MAX_SIZE CONFIG_GET(number/max_shuttle_size)
#define CUSTOM_SHUTTLE_LIMIT CONFIG_GET(number/max_shuttle_count)
#define CARDINAL_DIRECTIONS_X list(1, 0, -1, 0)
#define CARDINAL_DIRECTIONS_Y list(0, 1, 0, -1)
GLOBAL_VAR_INIT(custom_shuttle_count, 0) //The amount of custom shuttles created to prevent creating hundreds
GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (Heaters, engines)
//============ Shuttle Creator Object ============
/obj/item/shuttle_creator
name = "Rapid Shuttle Designator"
icon = 'icons/obj/tools.dmi'
icon_state = "rsd"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
desc = "A device used to define the area required for custom ships. Uses bluespace crystals to create bluespace-capable ships."
density = FALSE
anchored = FALSE
flags_1 = CONDUCT_1
item_flags = NOBLUDGEON
force = 0
throwforce = 8
throw_speed = 3
throw_range = 5
w_class = WEIGHT_CLASS_NORMAL
req_access_txt = "11"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
var/ready = TRUE
//pre-designation
var/override_max_shuttles = FALSE
var/obj/machinery/computer/camera_advanced/shuttle_creator/internal_shuttle_creator
//During designation
var/overwritten_area = /area/space
var/list/loggedTurfs = list()
var/loggedOldArea
var/recorded_shuttle_area
var/datum/shuttle_creator_overlay_holder/overlay_holder
//After designation
var/linkedShuttleId
/obj/item/shuttle_creator/Initialize()
. = ..()
internal_shuttle_creator = new()
internal_shuttle_creator.owner_rsd = src
overlay_holder = new()
/obj/item/shuttle_creator/Destroy()
. = ..()
if(internal_shuttle_creator)
internal_shuttle_creator.owner_rsd = null
QDEL_NULL(internal_shuttle_creator)
if(overlay_holder)
QDEL_NULL(overlay_holder)
/obj/item/shuttle_creator/attack_self(mob/user)
..()
if(linkedShuttleId)
return
if(GLOB.custom_shuttle_count > CUSTOM_SHUTTLE_LIMIT && !override_max_shuttles)
to_chat(user, "<span class='warning'>Too many shuttles have been created.</span>")
message_admins("[ADMIN_FLW(user)] attempted to create a shuttle, however [CUSTOM_SHUTTLE_LIMIT] have already been created.")
return
if(!internal_shuttle_creator)
return
overlay_holder.add_client(user.client)
internal_shuttle_creator.attack_hand(user)
/obj/item/shuttle_creator/afterattack(atom/target, mob/user, proximity_flag)
. = ..()
if(!ready)
to_chat(user, "<span class='warning'>You need to define a shuttle area first.</span>")
return
if(!proximity_flag)
return
if(istype(target, /obj/machinery/computer/custom_shuttle))
if(!linkedShuttleId)
to_chat(user, "<span class='warning'>Error, no defined shuttle linked to device</span>")
return
var/obj/machinery/computer/custom_shuttle/console = target
console.linkShuttle(linkedShuttleId)
to_chat(user, "<span class='notice'>Console linked successfully!</span>")
return
else if(istype(target, /obj/machinery/computer/camera_advanced/shuttle_docker/custom))
if(!linkedShuttleId)
to_chat(user, "<span class='warning'>Error, no defined shuttle linked to device</span>")
return
var/obj/machinery/computer/camera_advanced/shuttle_docker/custom/console = target
console.linkShuttle(linkedShuttleId)
to_chat(user, "<span class='notice'>Console linked successfully!</span>")
return
to_chat(user, "<span class='warning'>The [src] bleeps. Select an airlock to create a docking port, or a valid machine to link.</span>")
return
//=========== shuttle designation actions ============
/obj/item/shuttle_creator/proc/calculate_bounds(obj/docking_port/mobile/port)
if(!port || !istype(port, /obj/docking_port/mobile))
return FALSE
//Heights is the distance away from the port
//width is the distance perpendicular to the port
var/minX = INFINITY
var/maxX = 0
var/minY = INFINITY
var/maxY = 0
for(var/turf/T in loggedTurfs)
minX = min(T.x, minX)
maxX = max(T.x, maxX)
minY = min(T.y, minY)
maxY = max(T.y, maxY)
//Make sure shuttle was actually found.
if(maxX == INFINITY || maxY == INFINITY)
return FALSE
minX--
minY--
var/width = maxX - minX
var/height = maxY - minY
var/offset_x = port.x - minX
var/offset_y = port.y - minY
switch(port.dir) //Source: code/datums/shuttles.dm line 77 (14/03/2020) :)
if(NORTH)
port.width = width
port.height = height
port.dwidth = offset_x - 1
port.dheight = offset_y - 1
if(EAST)
port.width = height
port.height = width
port.dwidth = height - offset_y
port.dheight = offset_x - 1
if(SOUTH)
port.width = width
port.height = height
port.dwidth = width - offset_x
port.dheight = height - offset_y
if(WEST)
port.width = height
port.height = width
port.dwidth = offset_y - 1
port.dheight = width - offset_x
return TRUE
//Go through all the all_turfs and check which direction doesn't have the shuttle
/obj/item/shuttle_creator/proc/getNonShuttleDirection(turf/targetTurf)
var/position = null
if(!(get_offset_target_turf(targetTurf, 0, 1) in loggedTurfs))
if(position != null)
return null
position = NORTH
if(!(get_offset_target_turf(targetTurf, 0, -1) in loggedTurfs))
if(position != null)
return null
position = SOUTH
if(!(get_offset_target_turf(targetTurf, 1, 0) in loggedTurfs))
if(position != null)
return null
position = EAST
if(!(get_offset_target_turf(targetTurf, -1, 0) in loggedTurfs))
if(position != null)
return null
position = WEST
return position
/obj/item/shuttle_creator/proc/invertDir(var/input_dir)
if(input_dir == NORTH)
return SOUTH
else if(input_dir == SOUTH)
return NORTH
else if(input_dir == EAST)
return WEST
else if(input_dir == WEST)
return EAST
return null
/obj/item/shuttle_creator/proc/shuttle_create_docking_port(atom/target, mob/user)
if(loggedTurfs.len == 0 || !recorded_shuttle_area)
to_chat(user, "<span class='warning'>Invalid shuttle, restarting bluespace systems...</span>")
return FALSE
var/datum/map_template/shuttle/new_shuttle = new /datum/map_template/shuttle()
var/obj/docking_port/mobile/port = new /obj/docking_port/mobile(get_turf(target))
var/obj/docking_port/stationary/stationary_port = new /obj/docking_port/stationary(get_turf(target))
port.callTime = 50
port.dir = 1 //Point away from space.
port.id = "custom_[GLOB.custom_shuttle_count]"
linkedShuttleId = port.id
port.ignitionTime = 25
port.name = "Custom Shuttle"
port.port_direction = 2
port.preferred_direction = 4
port.area_type = recorded_shuttle_area
stationary_port.area_type = overwritten_area
var/portDirection = getNonShuttleDirection(get_turf(port))
var/invertedDir = invertDir(portDirection)
if(!portDirection || !invertedDir)
to_chat(usr, "<span class='warning'>Shuttle creation aborted, docking airlock must be on an external wall. Please select a new airlock.</span>")
port.Destroy()
stationary_port.Destroy()
linkedShuttleId = null
return FALSE
port.dir = invertedDir
port.port_direction = portDirection
if(!calculate_bounds(port))
to_chat(usr, "<span class='warning'>Bluespace calculations failed, please select a new airlock.</span>")
port.Destroy()
stationary_port.Destroy()
linkedShuttleId = null
return FALSE
port.shuttle_areas = list()
//var/list/all_turfs = port.return_ordered_turfs(port.x, port.y, port.z, port.dir)
var/list/all_turfs = loggedTurfs
for(var/i in 1 to all_turfs.len)
var/turf/curT = all_turfs[i]
var/area/cur_area = curT.loc
//Add the area to the shuttle <3
if(istype(cur_area, recorded_shuttle_area))
if(istype(curT, /turf/open/space))
continue
if(length(curT.baseturfs) < 2)
continue
//Add the shuttle base shit to the shuttle
curT.baseturfs.Insert(3, /turf/baseturf_skipover/shuttle)
port.shuttle_areas[cur_area] = TRUE
port.linkup(new_shuttle, stationary_port)
port.movement_force = list("KNOCKDOWN" = 0, "THROW" = 0)
port.initiate_docking(stationary_port)
port.mode = SHUTTLE_IDLE
port.timer = 0
port.register()
icon_state = "rsd_used"
//Clear highlights
overlay_holder.clear_highlights()
GLOB.custom_shuttle_count ++
message_admins("[ADMIN_LOOKUPFLW(user)] created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])")
log_game("[key_name(user)] created a new shuttle with a [src] at [AREACOORD(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])")
return TRUE
/obj/item/shuttle_creator/proc/create_shuttle_area(mob/user)
//Check to see if the user can make a new area to prevent spamming
if(user)
if(user.create_area_cooldown >= world.time)
to_chat(user, "<span class='warning'>Smoke vents from the [src], maybe you should let it cooldown before using it again.</span>")
return FALSE
user.create_area_cooldown = world.time + 10
if(!loggedTurfs)
return FALSE
if(!check_area(loggedTurfs, FALSE)) //Makes sure nothing (Shuttles) has moved into the area during creation
return FALSE
//Create the new area
var/area/shuttle/custom/powered/newS
var/area/oldA = loggedOldArea
var/str = stripped_input(user, "Shuttle Name:", "Blueprint Editing", "", MAX_NAME_LEN)
if(!str || !length(str))
return FALSE
if(length(str) > 50)
to_chat(user, "<span class='warning'>The provided ship name is too long, blares the [src]</span>")
return FALSE
newS = new /area/shuttle/custom/powered()
newS.setup(str)
newS.set_dynamic_lighting()
//Shuttles always have gravity
newS.has_gravity = TRUE
newS.requires_power = TRUE
//Record the area for use when creating the docking port
recorded_shuttle_area = newS
for(var/i in 1 to loggedTurfs.len)
var/turf/turf_holder = loggedTurfs[i]
var/area/old_area = turf_holder.loc
newS.contents += turf_holder
turf_holder.change_area(old_area, newS)
newS.reg_in_areas_in_z()
var/list/firedoors = oldA.firedoors
for(var/door in firedoors)
var/obj/machinery/door/firedoor/FD = door
FD.CalculateAffectingAreas()
return TRUE
//Checks an area to ensure that the turfs provided are valid to be made into a shuttle
/obj/item/shuttle_creator/proc/check_area(list/turfs, addingTurfs = TRUE)
if(!turfs)
to_chat(usr, "<span class='warning'>Shuttles must be created in an airtight space, ensure that the shuttle is airtight, including corners.</span>")
return FALSE
if(turfs.len + (addingTurfs ? loggedTurfs.len : 0) > SHUTTLE_CREATOR_MAX_SIZE)
to_chat(usr, "<span class='warning'>The [src]'s internal cooling system wizzes violently and a message appears on the screen, \"Caution, this device can only handle the creation of shuttles up to [SHUTTLE_CREATOR_MAX_SIZE] units in size. Please reduce your shuttle by [turfs.len-SHUTTLE_CREATOR_MAX_SIZE]. Sorry for the inconvinience\"</span>")
return FALSE
//Check to see if it's a valid shuttle
for(var/i in 1 to turfs.len)
var/area/place = get_area(turfs[i])
//If any of the turfs are on station / not in space, a shuttle cannot be forced there
if(!place)
to_chat(usr, "<span class='warning'>You can't seem to overpower the bluespace harmonics in this location, try somewhere else.</span>")
return FALSE
if(istype(place, /area/space))
overwritten_area = /area/space
else if(istype(place, /area/lavaland/surface/outdoors))
overwritten_area = /area/lavaland/surface/outdoors
else
to_chat(usr, "<span class='warning'>Caution, shuttle must not use any material connected to the station. Your shuttle is currenly overlapping with [place.name]</span>")
return FALSE
//Finally, check to see if the area is actually attached
if(!LAZYLEN(loggedTurfs))
return TRUE
for(var/turf/T in turfs)
if(turf_connected_to_saved_turfs(T))
return TRUE
CHECK_TICK
to_chat(usr, "<span class='warning'>Caution, new areas of the shuttle must be connected to the other areas of the shuttle.</span>")
return FALSE
/obj/item/shuttle_creator/proc/turf_connected_to_saved_turfs(turf/T)
for(var/i in 1 to 4)
var/turf/adjacentT = get_offset_target_turf(T, CARDINAL_DIRECTIONS_X[i], CARDINAL_DIRECTIONS_Y[i])
if(adjacentT in loggedTurfs)
return TRUE
return FALSE
/obj/item/shuttle_creator/proc/turf_in_list(turf/T)
return loggedTurfs.Find(T)
/obj/item/shuttle_creator/proc/add_single_turf(turf/T)
if(!check_area(list(T)))
return FALSE
loggedTurfs |= T
loggedOldArea = get_area(T)
overlay_holder.highlight_turf(T)
/obj/item/shuttle_creator/proc/add_saved_area(mob/user)
var/static/area_or_turf_fail_types = typecacheof(list(
/turf/open/space,
/area/shuttle
))
//Detect the turfs connected in the curerrent enclosed area
var/list/turfs = detect_room(get_turf(user), area_or_turf_fail_types)
if(!check_area(turfs))
return FALSE
loggedOldArea = get_area(get_turf(user))
loggedTurfs |= turfs
overlay_holder.highlight_area(turfs)
//TODO READD THIS SHIT: icon_state = "rsd_used"
to_chat(user, "<span class='notice'>You add the area into the buffer of the [src], you made add more areas or select an airlock to act as a docking port to complete the shuttle.</span>")
return turfs
/obj/item/shuttle_creator/proc/remove_single_turf(turf/T)
if(!turf_in_list(T))
return
loggedTurfs -= T
loggedOldArea = get_area(T)
overlay_holder.unhighlight_turf(T)
/obj/item/shuttle_creator/proc/reset_saved_area()
overlay_holder.clear_highlights()
loggedTurfs.Cut()
to_chat(usr, "<span class='notice'>You reset the area buffer on the [src].</span>")
#undef CARDINAL_DIRECTIONS_X
#undef CARDINAL_DIRECTIONS_Y
@@ -0,0 +1,101 @@
//============ Actions ============
/datum/action/innate/shuttle_creator
icon_icon = 'icons/mob/actions/actions_shuttle.dmi'
var/mob/living/C
var/mob/camera/aiEye/remote/shuttle_creation/remote_eye
var/obj/item/shuttle_creator/shuttle_creator
/datum/action/innate/shuttle_creator/Activate()
if(!target)
return TRUE
C = owner
remote_eye = C.remote_control
var/obj/machinery/computer/camera_advanced/shuttle_creator/internal_console = target
shuttle_creator = internal_console.owner_rsd
//Add an area
/datum/action/innate/shuttle_creator/designate_area
name = "Designate Room"
button_icon_state = "designate_area"
/datum/action/innate/shuttle_creator/designate_area/Activate()
if(..())
return
shuttle_creator.add_saved_area(remote_eye)
//Add a single turf
/datum/action/innate/shuttle_creator/designate_turf
name = "Designate Turf"
button_icon_state = "designate_turf"
/datum/action/innate/shuttle_creator/designate_turf/Activate()
if(..())
return
var/turf/T = get_turf(remote_eye)
if(istype(T, /turf/open/space))
var/connectors_exist = FALSE
for(var/obj/structure/lattice/lattice in T)
connectors_exist = TRUE
break
if(!connectors_exist)
to_chat(usr, "<span class='warning'>This turf requires support, build some catwalks or lattices.</span>")
return
if(!shuttle_creator.check_area(list(T)))
return
if(shuttle_creator.turf_in_list(T))
return
shuttle_creator.add_single_turf(T)
//Clear a single entire area
/datum/action/innate/shuttle_creator/clear_turf
name = "Clear Turf"
button_icon_state = "clear_turf"
/datum/action/innate/shuttle_creator/clear_turf/Activate()
if(..())
return
shuttle_creator.remove_single_turf(get_turf(remote_eye))
//Clear the entire area
/datum/action/innate/shuttle_creator/reset
name = "Reset Buffer"
button_icon_state = "clear_area"
/datum/action/innate/shuttle_creator/reset/Activate()
if(..())
return
shuttle_creator.reset_saved_area()
//Finish the shuttle
/datum/action/innate/shuttle_creator/airlock
name = "Select Docking Airlock"
button_icon_state = "select_airlock"
/datum/action/innate/shuttle_creator/airlock/Activate()
if(..())
return
var/turf/T = get_turf(remote_eye)
for(var/obj/machinery/door/airlock/A in T)
if(get_area(A) != shuttle_creator.loggedOldArea)
to_chat(C, "<span class='warning'>Caution, airlock must be on the shuttle to function as a dock.</span>")
return
if(shuttle_creator.linkedShuttleId)
return
if(GLOB.custom_shuttle_count > CUSTOM_SHUTTLE_LIMIT)
to_chat(C, "<span class='warning'>Shuttle limit reached, sorry.</span>")
return
if(shuttle_creator.loggedTurfs.len > SHUTTLE_CREATOR_MAX_SIZE)
to_chat(C, "<span class='warning'>This shuttle is too large!</span>")
return
if(!shuttle_creator.getNonShuttleDirection(T))
to_chat(C, "<span class='warning'>Docking port must be on an external wall, with only 1 side exposed to space.</span>")
return
if(!shuttle_creator.create_shuttle_area(C))
return
if(shuttle_creator.shuttle_create_docking_port(A, C))
to_chat(C, "<span class='notice'>Shuttle created!</span>")
//Remove eye control
var/obj/machinery/computer/camera_advanced/shuttle_creator/internal_console = target
internal_console.remove_eye_control()
qdel(internal_console)
return
@@ -0,0 +1,93 @@
//============The internal camera console used for designating the area=============
/obj/machinery/computer/camera_advanced/shuttle_creator
name = "internal shuttle creator console"
desc = "You should not have access to this, please report this as a bug"
networks = list()
var/obj/item/shuttle_creator/owner_rsd
var/datum/action/innate/shuttle_creator/designate_area/area_action = new
var/datum/action/innate/shuttle_creator/designate_turf/turf_action = new
var/datum/action/innate/shuttle_creator/clear_turf/clear_turf_action = new
var/datum/action/innate/shuttle_creator/reset/reset_action = new
var/datum/action/innate/shuttle_creator/airlock/airlock_action = new
/obj/machinery/computer/camera_advanced/shuttle_creator/check_eye(mob/user)
if(user.eye_blind || user.incapacitated())
user.unset_machine()
/obj/machinery/computer/camera_advanced/shuttle_creator/CreateEye()
eyeobj = new /mob/camera/aiEye/remote/shuttle_creation(get_turf(owner_rsd))
eyeobj.origin = src
eyeobj.use_static = USE_STATIC_NONE
/obj/machinery/computer/camera_advanced/shuttle_creator/is_operational()
return TRUE
/obj/machinery/computer/camera_advanced/shuttle_creator/can_interact(mob/user)
if(!isliving(user))
return FALSE
var/mob/living/L = user
if(L.incapacitated())
return FALSE
return TRUE
/obj/machinery/computer/camera_advanced/shuttle_creator/GrantActions(mob/living/user)
..(user)
eyeobj.invisibility = SEE_INVISIBLE_LIVING
if(area_action)
area_action.target = src
area_action.Grant(user)
actions += area_action
if(turf_action)
turf_action.target = src
turf_action.Grant(user)
actions += turf_action
if(clear_turf_action)
clear_turf_action.target = src
clear_turf_action.Grant(user)
actions += clear_turf_action
if(reset_action)
reset_action.target = src
reset_action.Grant(user)
actions += reset_action
if(airlock_action)
airlock_action.target = src
airlock_action.Grant(user)
actions += airlock_action
/obj/machinery/computer/camera_advanced/shuttle_creator/remove_eye_control(mob/living/user)
. = ..()
owner_rsd.overlay_holder.remove_client()
eyeobj.invisibility = INVISIBILITY_MAXIMUM
if(user.client)
user.client.images -= eyeobj.user_image
/obj/machinery/computer/camera_advanced/shuttle_creator/attack_hand(mob/user)
if(!is_operational()) //you cant use broken machine you chumbis
return
if(current_user)
to_chat(user, "The console is already in use!")
return
var/mob/living/L = user
if(!can_use(user))
return
if(!eyeobj)
CreateEye()
if(!eyeobj.eye_initialized)
var/camera_location = get_turf(owner_rsd)
if(camera_location)
eyeobj.eye_initialized = TRUE
give_eye_control(L)
eyeobj.setLoc(camera_location)
var/mob/camera/aiEye/remote/shuttle_creation/shuttle_eye = eyeobj
shuttle_eye.source_turf = get_turf(user)
else
user.unset_machine()
else
var/camera_location = get_turf(owner_rsd)
var/mob/camera/aiEye/remote/shuttle_creation/eye = eyeobj
give_eye_control(L)
if(camera_location)
eye.source_turf = camera_location
eyeobj.setLoc(camera_location)
else
eyeobj.setLoc(eyeobj.loc)
@@ -0,0 +1,54 @@
//===============Camera Eye================
/mob/camera/aiEye/remote/shuttle_creation
name = "shuttle holo-drone"
icon = 'icons/obj/mining.dmi'
icon_state = "construction_drone"
visible_icon = FALSE
acceleration = 0
var/turf/source_turf
var/max_range = 12
/mob/camera/aiEye/remote/shuttle_creation/Initialize()
. = ..()
setLoc(get_turf(source_turf))
/mob/camera/aiEye/remote/shuttle_creation/update_remote_sight(mob/living/user)
user.sight = BLIND|SEE_TURFS
user.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
user.sync_lighting_plane_alpha()
return TRUE
/mob/camera/aiEye/remote/shuttle_creation/relaymove(mob/user, direct)
dir = direct //This camera eye is visible as a drone, and needs to keep the dir updated
var/initial = initial(sprint)
var/max_sprint = 50
if(cooldown && cooldown < world.timeofday) // 3 seconds
sprint = initial
for(var/i = 0; i < max(sprint, initial); i += 20)
var/turf/step = get_turf(get_step(src, direct))
if(step && can_move_to(step))
setLoc(step)
cooldown = world.timeofday + 5
if(acceleration)
sprint = min(sprint + 0.5, max_sprint)
else
sprint = initial
/mob/camera/aiEye/remote/shuttle_creation/proc/can_move_to(var/turf/T)
var/origin_x = source_turf.x
var/origin_y = source_turf.y
var/change_X = abs(origin_x - T.x)
var/change_Y = abs(origin_y - T.y)
return (change_X < max_range && change_Y < max_range)
/mob/camera/aiEye/remote/shuttle_creation/setLoc(T)
..()
if(eye_user?.client)
eye_user.client.images -= user_image
var/image/I = image(icon, loc, icon_state, FLY_LAYER, dir)
I.plane = MASSIVE_OBJ_LAYER
user_image = I
eye_user.client.images += user_image
@@ -0,0 +1,52 @@
/*
* Manages the overlays for the shuttle creator drone.
*/
/datum/shuttle_creator_overlay_holder
var/client/holder
var/list/images = list()
var/list/turfs = list()
/datum/shuttle_creator_overlay_holder/proc/add_client(client/C)
holder = C
holder.images += images
/datum/shuttle_creator_overlay_holder/proc/remove_client()
holder.images -= images
holder = null
/datum/shuttle_creator_overlay_holder/proc/clear_highlights()
if(holder)
holder.images -= images
images.Cut()
turfs.Cut()
/datum/shuttle_creator_overlay_holder/proc/create_hightlight(turf/T)
if(T in turfs)
return
var/image/I = image('icons/turf/overlays.dmi', T, "greenOverlay")
I.plane = ABOVE_LIGHTING_PLANE
images += I
holder.images += I
turfs += T
/datum/shuttle_creator_overlay_holder/proc/remove_hightlight(turf/T)
if(!(T in turfs))
return
turfs -= T
holder.images -= images
for(var/image/I in images)
if(get_turf(I) != T)
continue
images -= I
holder.images += images
/datum/shuttle_creator_overlay_holder/proc/highlight_area(list/turfs)
for(var/turf/T in turfs)
highlight_turf(T)
/datum/shuttle_creator_overlay_holder/proc/highlight_turf(turf/T)
create_hightlight(T)
/datum/shuttle_creator_overlay_holder/proc/unhighlight_turf(turf/T)
remove_hightlight(T)
@@ -0,0 +1,39 @@
/obj/item/shuttle_route_optimisation
name = "Route Optimisation Upgrade"
desc = "Used on a custom shuttle control console to calculate more efficient routes."
icon = 'icons/obj/module.dmi'
icon_state = "shuttledisk"
force = 0
throwforce = 8
throw_speed = 3
throw_range = 5
density = FALSE
anchored = FALSE
item_flags = NOBLUDGEON
var/upgrade_amount = 0.8
/obj/item/shuttle_route_optimisation/hyperlane
name = "Bluespace Hyperlane Calculator"
desc = "Used on a custom shuttle control console to allow for the following of bluespace hyperlanes, increasing the efficiency of the shuttle."
icon_state = "shuttledisk_better"
upgrade_amount = 0.6
/obj/item/shuttle_route_optimisation/void
name = "Voidspace Route Calculator"
desc = "Used on a custom shuttle control console to allow it to navigate into voidspace, making the routes almost instant."
icon_state = "shuttledisk_void"
upgrade_amount = 0.2
/obj/item/shuttle_route_optimisation/attack_obj(obj/O, mob/living/user)
. = ..()
if(!istype(O, /obj/machinery/computer))
return
if(!istype(O, /obj/machinery/computer/custom_shuttle))
to_chat(user, "<span class='warning'>This upgrade only works on a custom shuttle flight console.</span>")
return
if (!user.transferItemToLoc(src, get_turf(O)))
return
var/obj/machinery/computer/custom_shuttle/link_comp = O
link_comp.distance_multiplier = clamp(link_comp.distance_multiplier, 0, upgrade_amount)
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0)
to_chat(usr, "<span class='notice'>You insert the disk into the flight computer, allowing for routes to be [upgrade_amount]x the original distance.</span>")
-4
View File
@@ -36,10 +36,6 @@ map deltastation
minplayers 50
endmap
map icebox
minplayers 25
endmap
map snaxi
minplayers 25
endmap
+33 -253
View File
@@ -50,6 +50,39 @@
-->
<div class="commit sansserif">
<h2 class="date">17 June 2020</h2>
<h3 class="author">SmArtKar updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">New ID icons</li>
<li class="rscadd">Sutures and Meshes</li>
</ul>
<h3 class="author">Trilbyspaceclone updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Gin export takes gin now</li>
</ul>
<h2 class="date">16 June 2020</h2>
<h3 class="author">Ghommie updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">You can't blink nor use LOOC/AOOC as a petrified statue anymore.</li>
</ul>
<h3 class="author">Trilbyspaceclone updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">BEPIS decal painter has been moved to venders, replacing it being the flashdark</li>
</ul>
<h3 class="author">kevinz000 updated:</h3>
<ul class="changes bgimages16">
<li class="refactor">projectile ricochets now use a less hilariously terrible way of being handled and should be easier to w</li>
<li class="bugfix">projectile runtime/ricocheting</li>
<li class="balance">Lobotomy no longer has a 50% chance of giving you a nigh-unremovable trauma, but does 50 brain damage even on success. On failure, it will give you a lobotomy-class trauma.</li>
<li class="balance">spinesnapping from tackling now only gives a lobotomy class trauma instead of magic.</li>
</ul>
<h3 class="author">timothyteakettle updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Food carts now function as intended, allowing the pouring and mixing of drinks.</li>
<li class="rscadd">slimes can now change their color using alter form</li>
</ul>
<h2 class="date">15 June 2020</h2>
<h3 class="author">Anturk, kevinz000 updated:</h3>
<ul class="changes bgimages16">
@@ -298,259 +331,6 @@
<ul class="changes bgimages16">
<li class="tweak">remove any slurs, etc. to comply with GitHub's ToS</li>
</ul>
<h2 class="date">15 April 2020</h2>
<h3 class="author">Arturlang updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Adds garlic, a mutation of onions</li>
<li class="rscadd">You can now make garlic necklaces.</li>
<li class="tweak">Tweaked hunger to be more the same as blood level for bloodsuckers</li>
<li class="tweak">Bloodsuckers no longer get zero healing from regenerative cores, the core now heals their wounds but not their blood.</li>
<li class="balance">Bloodsucker heal is now based a lot more on blood level.</li>
<li class="bugfix">You can no longer be effectively immortal when fully auged as a bloodsucker.</li>
<li class="bugfix">Regenerative cores will regain their old names when they are renewed, no more working decayed cores.</li>
<li class="code_imp">Removes a lot of unnecesiry clutter of comments and tries to make the vars more consistent for bloodsucker code.</li>
<li class="code_imp">Made the regenerative core use one proc instead of copypasta</li>
</ul>
<h3 class="author">Auris456852 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added printer sound for admins that plays when someone messages Centcomm or the Syndicate. Just like RP!</li>
</ul>
<h3 class="author">Bhijn updated:</h3>
<ul class="changes bgimages16">
<li class="admin">The traitor panel now actually shows a list of contractor targets.</li>
<li class="server">Fail2Topic now supports Linux. Do beware that this requires some sysop experience to properly set up!</li>
<li class="config">Fail2Topic is now disabled by default, and the out-of-the-box config files have been updated to be a little more detailed.</li>
<li class="rscadd">Added a lfwb-inspired orbiting pixel + flashing outline animation to the sprint and combat mode buttons. This can be toggled via the preferences menu, and is completely independent from all HUD themes.</li>
</ul>
<h3 class="author">BuffEngineering updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">You may no longer summon plasteel from the door dimension.</li>
<li class="tweak">High security airlocks are now 33% more materially efficient!</li>
</ul>
<h3 class="author">DeltaFire15 updated:</h3>
<ul class="changes bgimages16">
<li class="balance">clockie vanguard now quickly regenerates stam while active (as its description always told you,)</li>
</ul>
<h3 class="author">Detective-Google updated:</h3>
<ul class="changes bgimages16">
<li class="balance">Shotguns are now slower and require two hands to fire.</li>
</ul>
<h3 class="author">Ghommie updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">mobs with antag statuses such as wizard, ert and nuke ops get their flavor text removed now.</li>
<li class="bugfix">Fixed megafauna mobs, goliaths and "anchored" AIs being stuffable into closets.</li>
<li class="bugfix">After years of visual agony, the Curse of The Floating Disembodied Phallus has come to an end.</li>
<li class="rscadd">Underwear now fulfills its purpose.</li>
<li class="rscadd">Privates visibility preferences.</li>
<li class="refactor">refactored polychromic clothing into an element.</li>
<li class="tweak">Blacklists unsynthetizable reagents from botany bees honey production.</li>
<li class="bugfix">Fixed toilet cistern loot spawning on the floor.</li>
<li class="tweak">The megafauna's hitbox doesn't include 0 alpha sections anymore.</li>
<li class="bugfix">Wizard robes & co work again now.</li>
<li class="bugfix">Fixed some spell casting message spam.</li>
<li class="rscadd">Added M/F body preferences.</li>
<li class="bugfix">fixed yet another few airless issues with the space hermit ruin.</li>
<li class="bugfix">Intellectual property infringment is not cool.</li>
<li class="bugfix">Near-station nuclear explosions now display the on-station nuke explosion cinematic, consistently with its clearance of the station level and its nuclear victory / total annihilation ending status.</li>
<li class="balance">Nuclear bombs can't be anchored in space areas (not just turfs) anymore, as a quick effortless way to discourage players from anchoring the device on the edge of the map.</li>
<li class="bugfix">Fixed a whacky miniature cell duping issue.</li>
<li class="bugfix">Liver failure is back!</li>
<li class="tweak">standarized a few (prefs off) side effects from enlargment chems on livers to do organ damage instead without the blood volume whackiness.</li>
<li class="tweak">High liver damage now slows mobs down.</li>
<li class="bugfix">Fixing an issue with the split personality removing the original owner from the round if the body died while the stranger was in control.</li>
<li class="bugfix">fixed a few floaty sprite accessories.</li>
<li class="bugfix">Fixed a few mutations not working correctly.</li>
<li class="bugfix">Fixed the phantom thief component, again.</li>
<li class="refactor">Made votes obfuscation settings more robust.</li>
<li class="admin">Also included them in custom votes.</li>
<li class="tweak">The map rotation vote will only hide ongoing votes now, not the results.</li>
<li class="balance">The crusher's vortex talisman trophy now has a cooldown between each spawned wall.</li>
<li class="refactor">Backend body size preferences.</li>
<li class="bugfix">Infiltrator's boots don't stop slips and "space wind" through the power of runtime errors anymore, and properly silence the user's footsteps now.</li>
<li class="tweak">Chaplains are now inelegible for bloodsuckers.</li>
<li class="bugfix">Fixed crafting hud icon overlapping the second pocket on 1:1 screen mode.</li>
<li class="code_imp">Removed some dead flightsuit code leftovers.</li>
<li class="rscadd">Reenabled the swarmers event. Also blacklisted another dozen other machineries and structures that may be critical to the shift or station integrity from swarmers' HUNGER for materials.</li>
<li class="bugfix">Fixed find_safe_turfs() searching for turfs with concentration of oxygen lower than 16 rather higher.</li>
</ul>
<h3 class="author">KathrinBailey updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Radiation shuttesr to all supermatters.</li>
<li class="rscadd">Windowed shutters to armouries where relevant.</li>
<li class="rscadd">New posters are now on the map in relevant locations.</li>
<li class="bugfix">Windowed shutter now has glass, the door closing proc sees this and no longer changes opacity.</li>
<li class="bugfix">Accidental HoochMaster removal in the bar.</li>
<li class="bugfix">Spawning looking at the supermatter with no mesons on Meta.</li>
<li class="bugfix">Missing disposal pipe outside HoP office.</li>
<li class="bugfix">Sofas were never adjusted when the pool was added.</li>
<li class="rscadd">New shutter sprites</li>
<li class="rscadd">Reinforced Shutter</li>
<li class="rscadd">Radiation Shutter</li>
<li class="rscadd">Window Shutter</li>
<li class="tweak">Shutters not being blast doors functionally.</li>
<li class="balance">Shutter armour block and health.</li>
</ul>
<h3 class="author">Kraseo updated:</h3>
<ul class="changes bgimages16">
<li class="balance">Sneaksuit now costs 5 TC rather than 3.</li>
<li class="bugfix">You can break out of neckgrabs once more.</li>
</ul>
<h3 class="author">Owai-Seek updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Port Pina Colada, Painkiller, Moscow Mule, Hivemind Eraser, Moana Lou Drinks</li>
<li class="rscadd">Gunfire, Hellfire, Sins Delight, Strawberry Daiquiri, Miami Vice, Malibu Sunset, Lizz Fizz, Hotline Miami</li>
<li class="rscadd">Strawberry and Pineapple Juice</li>
<li class="rscadd">Salami Slices</li>
<li class="tweak">Soda Dispenser Juices</li>
<li class="tweak">Reorganize Vendor Objects (Bowls, Glasses, Shot Glasses)</li>
<li class="tweak">Strawberry Milk and Tea actually use strawberry Juice.</li>
<li class="tweak">Lizards can eat egg wraps. Moved Egg Wraps to Misc</li>
</ul>
<h3 class="author">PersianXerxes updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">TGUI Next UIs for: chem heaters, chem masters, chem dispensers, and sleepers</li>
<li class="code_imp">Reworked Chem Master code</li>
</ul>
<h3 class="author">Putnam3145 updated:</h3>
<ul class="changes bgimages16">
<li class="rscdel">No more station integrity goal</li>
<li class="tweak">Upload-hacked-law goal only picksif there's an AI to upload to</li>
<li class="rscadd">A new, much more barebones holding facility for contractors.</li>
<li class="rscdel">Energy nets are gone.</li>
<li class="tweak">Various ghost roles are now easier to ghost as.</li>
<li class="tweak">The candles in the dojo no longer make the place hotter and hotter over time.</li>
<li class="rscdel">Nymphomania removed</li>
<li class="code_imp">Exhibitionism ignored by preferences now, since it was also removed</li>
<li class="code_imp">Quirk migration now does an admin log instead of a stack trace</li>
<li class="bugfix">Roundstart rulesets now roll properly.</li>
<li class="config">Added configs for various antag threat levels.</li>
<li class="bugfix">Fixed a runtime in threat calculation.</li>
<li class="tweak">Fixed up some misleading texts.</li>
<li class="tweak">Dynamic reworked to be more "storyteller-like": threat is now how threatened the station is right now and threat level is how much the mode wants the station to be threatened.</li>
<li class="tweak">Random storyteller is now truly random.</li>
<li class="tweak">Story storyteller now gives a nice rising-action-climax-falling action curve for threat level.</li>
<li class="tweak">"Chaotic" storyteller now simply ramps up threat level as round goes on.</li>
<li class="rscadd">"Classic" storyteller, basically doing what "random" did before.</li>
<li class="rscadd">Latejoin changelings for dynamic</li>
<li class="bugfix">Average threat calculation works now</li>
<li class="bugfix">Contamination is back.</li>
</ul>
<h3 class="author">Seris02 updated:</h3>
<ul class="changes bgimages16">
<li class="balance">stops hijackers from being able to remotely blow up borgs</li>
<li class="rscadd">wall walking boots</li>
<li class="bugfix">made color picking for character appearance show the colors when you pick them</li>
<li class="tweak">the sergal markings</li>
</ul>
<h3 class="author">Trilbyspaceclone updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Cooks aided by Clowns have came out with and new healthy Salad - Caesar Salad. Just dont eat the knife...</li>
<li class="rscadd">Ports over TG's Mortars and Pestles.</li>
<li class="balance">Water, Holywater and Unholywater will now now quickly purge itself if you have 151u in your system</li>
<li class="rscadd">Most crate types can now be made, some costing more do to function over fashion</li>
<li class="rscadd">Medical Mechs syringe gun now knows many more life saving chems, like Insulin, Dexalin, Prussian Blue, Kelotane and Bicaridine</li>
<li class="balance">torches take less staminda to use.</li>
<li class="balance">Glowsticks dont last as long</li>
<li class="balance">Penlights are better at being lights</li>
<li class="balance">Torches are brighter then before - Indian Johns want to be on lava land rejoy!</li>
<li class="balance">Eye lights have 30% less light coming out of them.</li>
<li class="spellcheck">Spec Ops crate no longer talks about a "Null Crate" what ever that is</li>
<li class="server">Changlogs are updateded once again as of the 28th of March on year 2020</li>
<li class="balance">White Ships, Telerelays and a defunk mining post are now always going to spawn.</li>
<li class="spellcheck">Corrects a few desc on station side ruins</li>
</ul>
<h3 class="author">Xantholne updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">bumbles will stop sleeping so much</li>
</ul>
<h3 class="author">actioninja updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Washing machines now support arbitrary dye color</li>
<li class="rscadd">Washing machines now dye nearly every item.</li>
<li class="refactor">lots of backend changes to clothing overlays, report any issues</li>
<li class="rscadd">Better glowing lights</li>
</ul>
<h3 class="author">actioninja (ported by Ghommie) updated:</h3>
<ul class="changes bgimages16">
<li class="refactor">repathed all under clothing, keep an eye out for errors.</li>
</ul>
<h3 class="author">bunny232 updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Box secmos now is now longer connected to the scrubber loop</li>
</ul>
<h3 class="author">dapnee updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">plant disk sorter in botany, bounty console for the rest of cargo, a missing air alarm in the incinerator</li>
<li class="tweak">fixed a decal in front of security, moved an AIR alarm so it doesn't look awful to ghosts/AI, asteroids don't delete air anymore, fixed more active turfs, the buttons in the bridge "should" work now, HoP and cargo desks should be secure now</li>
<li class="rscdel">quarters that found their way out of the quartermaster's back room</li>
</ul>
<h3 class="author">kappa-sama updated:</h3>
<ul class="changes bgimages16">
<li class="rscdel">normies can no longer steal circuit codes</li>
<li class="balance">doubles the Stam damage of nonlethal krav stompers</li>
<li class="bugfix">no longer Krav Maga stomp people that are standing</li>
<li class="balance">no more 20pop requirement for noslips</li>
</ul>
<h3 class="author">keronshb updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Reverts Mining Base RNG Placement</li>
</ul>
<h3 class="author">kevinz000 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Melee attacks now stagger people, preventing them from sprinting until the (relatively short lived) effect runs out. Duration equation is [(1.5 + (w_class/7.5)) * force].</li>
<li class="balance">Fireman carrying now makes the person being carried unable to use items. Piggybacking now slows down the person being ridden. In both cases, the person riding will be dazed when forcefully dismounted, and dazed for a second if dismounting from piggybacking</li>
<li class="bugfix">turfs properly initialize atom colors if they're colored.</li>
<li class="tweak">cloners now stabilize mutations while someone's cloning, meaning active genes will not life tick.</li>
<li class="code_imp">datum/pipeline return_air stack trace now gives a reference so it's actually marginally useful if caught in round.</li>
<li class="rscadd">Volumetric storage is here.</li>
<li class="rscadd">Traitor chaplains can now become neutered versions of cults.</li>
<li class="bugfix">beams should no longer go across the map and mess everything up if their source or target isn't on a turf.</li>
</ul>
<h3 class="author">kiwedespars updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added paper masks.</li>
</ul>
<h3 class="author">necromanceranne updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed limb damage calc</li>
<li class="tweak">Stunslugs are now a mixed damage taser-like slug that will allow you to apply a variety of damage while still being countered by tasers usual counters.</li>
<li class="balance">Mech scattershot guns are no longer oneshotting people into stamina crit.</li>
<li class="rscdel">Removed an number of cargo crate packs: Riot shotguns/standard shotguns, double barreled shotguns, techshell crate, swat tasers, WT550 types (not rubber or standard), traitor theft objective kits.</li>
<li class="balance">HEALTH AND STAMINA DON'T STACK FOR PUTTING YOU INTO STAMINA CRIT.</li>
<li class="balance">YOUR FISTS ARE HELLA GODDAMN STRONG.</li>
<li class="balance">ACCEPT THE FELINIDS WARES, FOR SKOOMA HAS INCREDIBLE LETHAL PROPERTIES: YOUR HANDS BECOME LIKE SWORDS.</li>
<li class="balance">BOXERS CAN ONLY KNOCK OUT OTHER BOXERS BECAUSE THEY HAVE HONOR OR SOME SHIT</li>
<li class="balance">INCREASED STAMINA DAMAGE TO LIMBS FROM 50% TO 75%.</li>
<li class="balance">Double-barreled shotguns and any child of such now can be used with off-hand equipment.</li>
<li class="rscadd">Readds bioterror darts to the nuclear operative uplink for the legacy price of 6tc! Has all new horrid reagents!</li>
<li class="balance">Scatterlaser is now in-line with buckshot. Nukies can't purchase scatterlaser shot.</li>
<li class="rscdel">Null crates are no longer available in cargo!</li>
<li class="bugfix">Sleeping Carp and Rising Bass now dodge. Again.</li>
<li class="bugfix">Russian Revolver can no longer be exploited for a free 357.</li>
<li class="balance">Several guns now shoot exactly where you click regardless of movement or turning.</li>
</ul>
<h3 class="author">timothyteakettle updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">added beacon for cooks to choose an ingredient box, which replaces the random box they used to receive</li>
<li class="rscadd">added a new sushi ingredients box</li>
<li class="rscadd">added more items to the wildcard box's possible contents</li>
<li class="rscadd">add new holodeck wrestling belt which lets you use moves only on those also wearing it</li>
<li class="rscadd">add new holodeck map featuring the holodeck wrestling belt</li>
<li class="rscadd">new reagent 'Condensed Cooking Oil'</li>
<li class="tweak">list of chems that can go into fried non-food items was changed</li>
</ul>
<h3 class="author">zeroisthebiggay updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">sneaksuit to contractor items</li>
<li class="tweak">sneaksuit is a bundle</li>
<li class="rscdel">intel potion and radio implant from contractor items</li>
<li class="rscadd">ghosts can now DNR</li>
<li class="balance">sneaksuit is not fireproof</li>
<li class="bugfix">insidious balaclava muzzlepsprite works</li>
<li class="rscadd">You can now choose your name and color as a holoparasite/guardian/holocarp!</li>
<li class="bugfix">fixes lings being able to get mechanical holoparasites</li>
</ul>
</div>
<b>GoonStation 13 Development Team</b>
+24
View File
@@ -25959,3 +25959,27 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: You can now tape knives to cleanbots
kevinz000 (port from VOREStation):
- imageadd: Ported zoomba skins for cyborgs.
2020-06-16:
Ghommie:
- bugfix: You can't blink nor use LOOC/AOOC as a petrified statue anymore.
Trilbyspaceclone:
- tweak: BEPIS decal painter has been moved to venders, replacing it being the flashdark
kevinz000:
- refactor: projectile ricochets now use a less hilariously terrible way of being
handled and should be easier to w
- bugfix: projectile runtime/ricocheting
- balance: Lobotomy no longer has a 50% chance of giving you a nigh-unremovable
trauma, but does 50 brain damage even on success. On failure, it will give you
a lobotomy-class trauma.
- balance: spinesnapping from tackling now only gives a lobotomy class trauma instead
of magic.
timothyteakettle:
- bugfix: Food carts now function as intended, allowing the pouring and mixing of
drinks.
- rscadd: slimes can now change their color using alter form
2020-06-17:
SmArtKar:
- rscadd: New ID icons
- rscadd: Sutures and Meshes
Trilbyspaceclone:
- bugfix: Gin export takes gin now
@@ -1,4 +0,0 @@
author: "Ghommie"
delete-after: True
changes:
- bugfix: "You can't blink nor use LOOC/AOOC as a petrified statue anymore."
@@ -1,4 +0,0 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- tweak: "BEPIS decal painter has been moved to venders, replacing it being the flashdark"
@@ -1,4 +0,0 @@
author: "timothyteakettle"
delete-after: True
changes:
- rscadd: "slimes can now change their color using alter form"
@@ -1,5 +0,0 @@
author: "kevinz000"
delete-after: True
changes:
- refactor: "projectile ricochets now use a less hilariously terrible way of being handled and should be easier to w"
- bugfix: "projectile runtime/ricocheting"
@@ -1,4 +0,0 @@
author: "kevinz000"
delete-after: True
changes:
- balance: "Lobotomy no longer has a 50% chance of giving you a nigh-unremovable trauma, but does 50 brain damage even on success. On failure, it will give you a lobotomy-class trauma."
@@ -1,4 +0,0 @@
author: "kevinz000"
delete-after: True
changes:
- balance: "spinesnapping from tackling now only gives a lobotomy class trauma instead of magic."
@@ -1,4 +0,0 @@
author: "timothyteakettle"
delete-after: True
changes:
- bugfix: "Food carts now function as intended, allowing the pouring and mixing of drinks."
@@ -0,0 +1,4 @@
author: "Detective-Google"
delete-after: True
changes:
- balance: "malf disk and illegal tech disk moved from ashwalker base (guaranteed) to tendrils (chance based)"
@@ -0,0 +1,5 @@
author: "timothyteakettle"
delete-after: True
changes:
- rscadd: "medbots can now be tipped over"
- soundadd: "added more medbot sounds"
@@ -0,0 +1,4 @@
author: "Detective-Google"
delete-after: True
changes:
- tweak: "cog is now less the suck"
@@ -0,0 +1,4 @@
author: "Detective-Google"
delete-after: True
changes:
- bugfix: "couple little derpy bits"
@@ -0,0 +1,4 @@
author: "SmArtKar"
delete-after: True
changes:
- rscadd: "Ported shuttles from beestation"
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+10
View File
@@ -831,6 +831,9 @@
#include "code\game\machinery\porta_turret\portable_turret.dm"
#include "code\game\machinery\porta_turret\portable_turret_construct.dm"
#include "code\game\machinery\porta_turret\portable_turret_cover.dm"
#include "code\game\machinery\shuttle\custom_shuttle.dm"
#include "code\game\machinery\shuttle\shuttle_engine.dm"
#include "code\game\machinery\shuttle\shuttle_heater.dm"
#include "code\game\machinery\telecomms\broadcasting.dm"
#include "code\game\machinery\telecomms\machine_interactions.dm"
#include "code\game\machinery\telecomms\telecomunications.dm"
@@ -3145,6 +3148,7 @@
#include "code\modules\shuttle\arrivals.dm"
#include "code\modules\shuttle\assault_pod.dm"
#include "code\modules\shuttle\computer.dm"
#include "code\modules\shuttle\custom_shuttle.dm"
#include "code\modules\shuttle\docking.dm"
#include "code\modules\shuttle\elevator.dm"
#include "code\modules\shuttle\emergency.dm"
@@ -3161,6 +3165,12 @@
#include "code\modules\shuttle\supply.dm"
#include "code\modules\shuttle\syndicate.dm"
#include "code\modules\shuttle\white_ship.dm"
#include "code\modules\shuttle\shuttle_creation\shuttle_creator.dm"
#include "code\modules\shuttle\shuttle_creation\shuttle_creator_actions.dm"
#include "code\modules\shuttle\shuttle_creation\shuttle_creator_console.dm"
#include "code\modules\shuttle\shuttle_creation\shuttle_creator_eye.dm"
#include "code\modules\shuttle\shuttle_creation\shuttle_creator_overlay.dm"
#include "code\modules\shuttle\shuttle_creation\shuttle_upgrades.dm"
#include "code\modules\spells\spell.dm"
#include "code\modules\spells\spell_types\aimed.dm"
#include "code\modules\spells\spell_types\area_teleport.dm"