Merge branch 'master' into embed-changes
This commit is contained in:
@@ -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" = (
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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
|
||||
},
|
||||
|
||||
@@ -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 +0,0 @@
|
||||
#define FORCE_MAP "_maps/icebox.json"
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -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
|
||||
},
|
||||
|
||||
@@ -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
|
||||
},
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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
|
||||
},
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
@@ -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
@@ -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>")
|
||||
@@ -36,10 +36,6 @@ map deltastation
|
||||
minplayers 50
|
||||
endmap
|
||||
|
||||
map icebox
|
||||
minplayers 25
|
||||
endmap
|
||||
|
||||
map snaxi
|
||||
minplayers 25
|
||||
endmap
|
||||
|
||||
+33
-253
@@ -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>
|
||||
|
||||
@@ -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.
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user