Merge remote-tracking branch 'refs/remotes/Citadel-Station-13/master' into iv-dripper-punctures

This commit is contained in:
Poojawa
2019-04-15 10:10:05 -05:00
73 changed files with 878 additions and 995368 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
[*]
insert_final_newline = false
insert_final_newline = true
indent_style = tab
indent_size = 4
+3 -3
View File
@@ -1,4 +1,4 @@
FROM tgstation/byond:512.1453 as base
FROM tgstation/byond:512.1463 as base
FROM base as build_base
@@ -25,7 +25,7 @@ COPY dependencies.sh .
RUN /bin/bash -c "source dependencies.sh \
&& git fetch --depth 1 origin \$RUST_G_VERSION" \
&& git checkout FETCH_HEAD \
&& cargo build --release
&& ~/.cargo/bin/cargo build --release
FROM build_base as bsql
@@ -87,4 +87,4 @@ RUN ln -s /tgstation/libBSQL.so /root/.byond/bin/libBSQL.so
VOLUME [ "/tgstation/config", "/tgstation/data" ]
ENTRYPOINT [ "DreamDaemon", "tgstation.dmb", "-port", "1337", "-trusted", "-close", "-verbose" ]
ENTRYPOINT [ "DreamDaemon", "tgstation.dmb", "-port", "1337", "-trusted", "-close", "-verbose" ]
@@ -458,4 +458,4 @@ b
b
b
a
"}
"}
@@ -87,6 +87,7 @@
/obj/item/organ/alien/plasmavessel/small,
/turf/open/floor/plating/airless,
/area/ruin/unpowered)
(1,1,1) = {"
a
a
@@ -166,9 +166,6 @@
/obj/effect/turf_decal/tile/bar{
dir = 1
},
/turf/open/floor/plasteel{
initial_gas_mix = "TEMP=2.7"
},
/turf/open/floor/plating/airless{
icon_state = "platingdmg2"
},
+17 -35
View File
@@ -2718,7 +2718,6 @@
/area/awaymission/snowdin/cave/cavern)
"gg" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/on,
/turf/open/floor/plating/asteroid/snow/ice,
/turf/open/floor/plating/snowed/cavern,
/area/awaymission/snowdin/post/cavern2)
"gh" = (
@@ -2905,11 +2904,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/awaymission/snowdin/post/gateway)
"gx" = (
/obj/structure/barricade/wooden/snowed,
/turf/open/floor/plating/asteroid/snow/ice,
/turf/open/floor/plating/snowed/cavern,
/area/awaymission/snowdin/cave/cavern)
"gy" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
piping_layer = 3;
@@ -8627,10 +8621,6 @@
},
/turf/open/floor/plasteel/dark/snowdin,
/area/awaymission/snowdin/outside)
"sT" = (
/turf/open/floor/plating/snowed/smoothed,
/turf/open/floor/plating/snowed,
/area/awaymission/snowdin/outside)
"sU" = (
/obj/effect/turf_decal/weather/snow,
/obj/effect/turf_decal/stripes/white/line{
@@ -11504,10 +11494,6 @@
},
/turf/open/floor/plating/snowed,
/area/awaymission/snowdin/outside)
"AD" = (
/turf/open/floor/plating,
/turf/open/floor/plating/snowed,
/area/awaymission/snowdin/outside)
"AE" = (
/obj/item/pen,
/turf/open/floor/plating{
@@ -12164,10 +12150,6 @@
},
/turf/open/floor/plating/asteroid/snow,
/area/awaymission/snowdin/outside)
"Cx" = (
/turf/open/floor/plating/asteroid/snow/ice,
/turf/open/floor/plating/snowed/cavern,
/area/awaymission/snowdin/cave/cavern)
"Cy" = (
/obj/machinery/light/small{
brightness = 3;
@@ -24303,7 +24285,7 @@ am
af
sx
sJ
sT
dX
te
te
te
@@ -24389,7 +24371,7 @@ af
af
af
dX
sT
dX
te
te
te
@@ -24560,7 +24542,7 @@ af
am
sx
sK
sT
dX
te
te
te
@@ -24646,7 +24628,7 @@ af
af
af
dX
sT
dX
te
te
te
@@ -24817,7 +24799,7 @@ ak
af
sx
sJ
sT
dX
te
te
te
@@ -24852,7 +24834,7 @@ dX
dX
dX
dX
sT
dX
te
te
te
@@ -24903,7 +24885,7 @@ dX
dX
dX
dX
sT
dX
te
te
te
@@ -25074,7 +25056,7 @@ af
fq
sx
sK
sT
dX
te
te
te
@@ -25160,7 +25142,7 @@ af
af
af
dX
sT
dX
te
te
te
@@ -25331,7 +25313,7 @@ af
sf
sx
sJ
sT
dX
te
te
te
@@ -25417,7 +25399,7 @@ af
af
af
dX
sT
dX
te
te
te
@@ -26715,7 +26697,7 @@ zK
oa
te
Au
AD
te
yW
af
ag
@@ -60052,8 +60034,8 @@ qi
qi
qi
qi
gx
gx
tR
tR
oZ
oZ
oZ
@@ -61188,7 +61170,7 @@ qi
oZ
oZ
oZ
Cx
qi
qi
oZ
oZ
@@ -64271,7 +64253,7 @@ sY
oZ
oZ
sY
Cx
qi
oZ
oZ
sY
@@ -64528,7 +64510,7 @@ oZ
oY
oZ
oZ
Cx
qi
oZ
oZ
oZ
+3 -23
View File
@@ -245,24 +245,10 @@
},
/turf/open/floor/plating,
/area/awaymission/research/interior/engineering)
"aS" = (
/turf/open/floor/plasteel{
icon_state = "damaged4"
},
/turf/closed/wall/mineral/plastitanium,
/area/awaymission/research/interior/engineering)
"aT" = (
/mob/living/simple_animal/hostile/syndicate/melee/sword,
/turf/open/floor/plating,
/area/awaymission/research/interior/engineering)
"aU" = (
/turf/open/floor/plasteel{
icon_state = "damaged1"
},
/turf/closed/wall/mineral/plastitanium{
dir = 4
},
/area/awaymission/research/interior/engineering)
"aV" = (
/obj/item/stack/sheet/plasteel,
/obj/effect/turf_decal/tile/yellow{
@@ -340,12 +326,6 @@
icon_state = "damaged4"
},
/area/awaymission/research/interior/engineering)
"bc" = (
/turf/open/floor/plasteel{
icon_state = "damaged5"
},
/turf/closed/wall/mineral/plastitanium,
/area/awaymission/research/interior/engineering)
"bd" = (
/turf/open/floor/plasteel{
icon_state = "damaged3"
@@ -43716,7 +43696,7 @@ al
al
al
al
aS
al
bb
bo
bG
@@ -43974,7 +43954,7 @@ ap
an
aJ
nf
bc
al
bp
bH
ar
@@ -45001,7 +44981,7 @@ al
al
al
al
aU
al
bg
bt
bL
+19 -54
View File
@@ -7539,7 +7539,6 @@
/area/awaymission/snowdin/cave/cavern)
"qj" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/on,
/turf/open/floor/plating/asteroid/snow/ice,
/turf/open/floor/plating/snowed/cavern,
/area/awaymission/snowdin/post/cavern2)
"qk" = (
@@ -8686,10 +8685,6 @@
},
/turf/open/floor/plasteel/dark/snowdin,
/area/awaymission/snowdin/outside)
"sT" = (
/turf/open/floor/plating/snowed/smoothed,
/turf/open/floor/plating/snowed,
/area/awaymission/snowdin/outside)
"sU" = (
/obj/effect/turf_decal/weather/snow,
/obj/effect/turf_decal/stripes/white/line{
@@ -8945,11 +8940,6 @@
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/ice,
/turf/open/floor/plating/asteroid/snow/ice,
/area/awaymission/snowdin/cave/cavern)
"tM" = (
/obj/structure/barricade/wooden/snowed,
/turf/open/floor/plating/asteroid/snow/ice,
/turf/open/floor/plating/snowed/cavern,
/area/awaymission/snowdin/cave/cavern)
"tN" = (
/turf/open/floor/plating/ice/smooth,
/area/awaymission/snowdin/outside)
@@ -11572,10 +11562,6 @@
},
/turf/open/floor/plating/snowed,
/area/awaymission/snowdin/outside)
"AD" = (
/turf/open/floor/plating,
/turf/open/floor/plating/snowed,
/area/awaymission/snowdin/outside)
"AE" = (
/obj/item/pen,
/turf/open/floor/plating{
@@ -12241,10 +12227,6 @@
},
/turf/open/floor/plating/asteroid/snow,
/area/awaymission/snowdin/outside)
"Cx" = (
/turf/open/floor/plating/asteroid/snow/ice,
/turf/open/floor/plating/snowed/cavern,
/area/awaymission/snowdin/cave/cavern)
"Cy" = (
/obj/machinery/light/small{
brightness = 3;
@@ -13710,13 +13692,11 @@
name = "mining conveyor"
},
/turf/open/floor/plating/asteroid/snow/ice,
/turf/open/floor/plating/snowed/cavern,
/area/awaymission/snowdin/cave/cavern)
"FO" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/loading_area,
/turf/open/floor/plating/asteroid/snow/ice,
/turf/open/floor/plating/snowed/cavern,
/area/awaymission/snowdin/cave/cavern)
"FQ" = (
/obj/effect/light_emitter{
@@ -13788,7 +13768,6 @@
dir = 4
},
/turf/open/floor/plating/asteroid/snow/ice,
/turf/open/floor/plating/snowed/cavern,
/area/awaymission/snowdin/post/mining_dock)
"FZ" = (
/turf/closed/wall/ice,
@@ -15860,20 +15839,6 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plating,
/area/awaymission/snowdin/post/mining_dock)
"WK" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
/turf/open/floor/plating/asteroid/snow/ice,
/turf/open/floor/plating/snowed/cavern,
/area/awaymission/snowdin/cave/cavern)
"XO" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/turf/open/floor/plating/asteroid/snow/ice,
/turf/open/floor/plating/snowed/cavern,
/area/awaymission/snowdin/cave/cavern)
"Yn" = (
/obj/machinery/door/airlock/external/glass,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -24415,7 +24380,7 @@ am
af
sx
sJ
sT
dX
te
te
te
@@ -24501,7 +24466,7 @@ af
af
af
dX
sT
dX
te
te
te
@@ -24672,7 +24637,7 @@ af
am
sx
sK
sT
dX
te
te
te
@@ -24758,7 +24723,7 @@ af
af
af
dX
sT
dX
te
te
te
@@ -24929,7 +24894,7 @@ ak
af
sx
sJ
sT
dX
te
te
te
@@ -24964,7 +24929,7 @@ dX
dX
dX
dX
sT
dX
te
te
te
@@ -25015,7 +24980,7 @@ dX
dX
dX
dX
sT
dX
te
te
te
@@ -25186,7 +25151,7 @@ af
fq
sx
sK
sT
dX
te
te
te
@@ -25272,7 +25237,7 @@ af
af
af
dX
sT
dX
te
te
te
@@ -25443,7 +25408,7 @@ af
sf
sx
sJ
sT
dX
te
te
te
@@ -25529,7 +25494,7 @@ af
af
af
dX
sT
dX
te
te
te
@@ -26827,7 +26792,7 @@ zK
oa
te
Au
AD
te
yW
af
ag
@@ -60164,8 +60129,8 @@ qi
qi
qi
qi
tM
tM
tP
tP
oZ
oZ
oZ
@@ -61300,7 +61265,7 @@ qi
oZ
oZ
oZ
Cx
oZ
qi
oZ
oZ
@@ -64383,7 +64348,7 @@ sY
oZ
oZ
sY
Cx
oZ
oZ
oZ
sY
@@ -64640,7 +64605,7 @@ oZ
oY
oZ
oZ
Cx
oZ
oZ
oZ
oZ
@@ -65973,7 +65938,7 @@ oZ
oZ
oZ
FN
XO
sl
Gk
GN
Hj
@@ -66486,7 +66451,7 @@ oZ
oZ
oZ
oZ
WK
By
xW
xW
xW
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
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,168 +0,0 @@
//custom access for some jobs. pasted together from ministation.
#define JOB_MODIFICATION_MAP_NAME "OmegaStation"
/datum/job/New()
..()
MAP_JOB_CHECK
supervisors = "the captain and the head of personnel"
/datum/outfit/job/New()
..()
MAP_JOB_CHECK
box = /obj/item/storage/box/survival/radio
/datum/job/assistant // Here so assistant appears on the top of the select job list.
//Command
/datum/job/captain/New()
..()
MAP_JOB_CHECK
supervisors = "Nanotrasen and Central Command"
/datum/job/hop/New()
..()
MAP_JOB_CHECK
supervisors = "the captain and Central Command"
/datum/job/hop/get_access()
MAP_JOB_CHECK_BASE
return get_all_accesses()
//Security
/datum/job/officer/New()
..()
MAP_JOB_CHECK
total_positions = 3
spawn_positions = 3
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS)
/datum/outfit/job/officer/New()
..()
MAP_JOB_CHECK
box = /obj/item/storage/box/security/radio
/datum/job/detective/New()
..()
MAP_JOB_CHECK
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS)
/datum/outfit/job/detective/New()
..()
MAP_JOB_CHECK
box = /obj/item/storage/box/security/radio
//Medbay
/datum/job/doctor/New()
..()
MAP_JOB_CHECK
selection_color = "#ffffff"
total_positions = 3
spawn_positions = 3
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS)
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS)
//Engineering
/datum/job/engineer/New()
..()
MAP_JOB_CHECK
total_positions = 2
spawn_positions = 2
access = list(ACCESS_EVA, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT)
minimal_access = list(ACCESS_EVA, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT)
/datum/outfit/job/engineer/New()
..()
MAP_JOB_CHECK
box = /obj/item/storage/box/engineer/radio
/datum/job/atmos/New()
..()
MAP_JOB_CHECK
total_positions = 2
spawn_positions = 2
//Science
/datum/job/scientist/New()
..()
MAP_JOB_CHECK
total_positions = 3
spawn_positions = 3
access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE)
minimal_access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE)
//Cargo
/datum/job/cargo_tech/New()
..()
MAP_JOB_CHECK
total_positions = 2
spawn_positions = 2
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
/datum/job/mining/New()
..()
MAP_JOB_CHECK
total_positions = 2
spawn_positions = 2
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/mining/New()
..()
box = /obj/item/storage/box/engineer/radio
//Service
/datum/job/bartender/New()
..()
MAP_JOB_CHECK
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS)
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS)
/datum/job/cook/New()
..()
MAP_JOB_CHECK
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS)
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS)
/datum/job/hydro/New()
..()
MAP_JOB_CHECK
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS)
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS)
// they get maint access because of all the hydro content in maint
/datum/job/janitor/New()
..()
MAP_JOB_CHECK
access = list(ACCESS_JANITOR, ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS)
minimal_access = list(ACCESS_JANITOR, ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS)
//Civilian
/datum/job/clown/New()
..()
MAP_JOB_CHECK
supervisors = "nobody but yourself" //Honk
MAP_REMOVE_JOB(hos)
MAP_REMOVE_JOB(chief_engineer)
MAP_REMOVE_JOB(qm)
MAP_REMOVE_JOB(cmo)
MAP_REMOVE_JOB(geneticist)
MAP_REMOVE_JOB(virologist)
MAP_REMOVE_JOB(rd)
MAP_REMOVE_JOB(warden)
MAP_REMOVE_JOB(lawyer)
MAP_REMOVE_JOB(chemist)
File diff suppressed because it is too large Load Diff
@@ -1,21 +0,0 @@
#define JOB_MODIFICATION_MAP_NAME "PubbyStation"
/datum/job/hos/New()
..()
MAP_JOB_CHECK
access += ACCESS_CREMATORIUM
minimal_access += ACCESS_CREMATORIUM
/datum/job/warden/New()
..()
MAP_JOB_CHECK
access += ACCESS_CREMATORIUM
minimal_access += ACCESS_CREMATORIUM
/datum/job/officer/New()
..()
MAP_JOB_CHECK
access += ACCESS_CREMATORIUM
minimal_access += ACCESS_CREMATORIUM
MAP_REMOVE_JOB(lawyer)
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
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -443,8 +443,8 @@
/obj/machinery/door/airlock/external/glass{
name = "E.V.A Access"
},
/turf/open/floor/plasteel,
/obj/structure/fans/tiny,
/turf/open/floor/plasteel,
/area/shuttle/abandoned/crew)
"aK" = (
/obj/effect/decal/cleanable/dirt{
+20 -24
View File
@@ -17,10 +17,6 @@
},
/turf/open/floor/plating/airless,
/area/ruin/powered/shuttle/medium_3)
"g" = (
/turf/closed/wall/mineral/plastitanium,
/turf/closed/wall/mineral/titanium,
/area/ruin/powered/shuttle/medium_3)
"h" = (
/turf/closed/wall/mineral/titanium,
/area/ruin/powered/shuttle/medium_3)
@@ -271,20 +267,20 @@ a
a
a
c
g
h
h
g
h
h
c
g
h
j
j
g
h
c
g
h
h
g
h
h
c
a
a
@@ -343,7 +339,7 @@ a
c
c
c
g
h
G
l
l
@@ -356,7 +352,7 @@ l
l
l
G
g
h
c
c
c
@@ -391,7 +387,7 @@ a
a
c
c
g
h
G
p
G
@@ -404,7 +400,7 @@ A
G
p
G
g
h
c
c
a
@@ -463,7 +459,7 @@ a
a
c
c
g
h
G
p
G
@@ -476,7 +472,7 @@ A
G
p
G
g
h
c
c
a
@@ -511,7 +507,7 @@ a
c
c
c
g
h
G
l
l
@@ -524,7 +520,7 @@ l
l
l
G
g
h
c
c
c
@@ -583,20 +579,20 @@ a
a
a
c
g
h
h
g
h
h
c
g
h
j
j
g
h
c
g
h
h
g
h
h
c
a
a
+7
View File
@@ -99,6 +99,7 @@
#define HIDEFACIALHAIR (1<<9)
#define HIDENECK (1<<10)
#define HIDETAUR (1<<11) //gotta hide that snowflake
#define HIDESNOUT (1<<12) //or do we actually hide our snoots
//bitflags for clothing coverage - also used for limbs
#define HEAD (1<<0)
@@ -131,11 +132,17 @@
#define NORMAL_SUIT_STYLE 0
#define DIGITIGRADE_SUIT_STYLE 1
//Tauric Specific suits
#define NOT_TAURIC 0
#define SNEK_TAURIC 1
#define PAW_TAURIC 2
#define HOOF_TAURIC 3
//Helmets/masks for muzzles or beaks
#define NORMAL_FACED 0
#define MUZZLE_FACED 1
#define BEAKED_FACED 2
//flags for outfits that have mutantrace variants (try not to use this): Currently only needed if you're trying to add tight fitting bootyshorts
#define NO_MUTANTRACE_VARIATION 0
#define MUTANTRACE_VARIATION 1
@@ -6,7 +6,8 @@
icon_state = "clockwork_helmet"
w_class = WEIGHT_CLASS_NORMAL
resistance_flags = FIRE_PROOF | ACID_PROOF
flags_inv = HIDEEARS|HIDEHAIR|HIDEFACE
flags_inv = HIDEEARS|HIDEHAIR|HIDEFACE|HIDESNOUT
mutantrace_variation = MUTANTRACE_VARIATION
armor = list("melee" = 50, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
/obj/item/clothing/head/helmet/clockwork/Initialize()
+2 -1
View File
@@ -319,9 +319,10 @@
icon_state = "magus"
item_state = "magus"
desc = "A helm worn by the followers of Nar'Sie."
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES|HIDESNOUT
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 10)
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/suit/magusred
name = "magus robes"
+3
View File
@@ -1584,6 +1584,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
new_snout = input(user, "Choose your character's snout:", "Character Preference") as null|anything in snowflake_snouts_list
if(new_snout)
features["snout"] = new_snout
features["mam_snouts"] = "None"
if("mam_snouts")
var/list/snowflake_mam_snouts_list = list()
@@ -1597,6 +1599,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
new_mam_snouts = input(user, "Choose your character's snout:", "Character Preference") as null|anything in snowflake_mam_snouts_list
if(new_mam_snouts)
features["mam_snouts"] = new_mam_snouts
features["snout"] = "None"
if("horns")
var/new_horns
+21
View File
@@ -8,6 +8,8 @@
var/blockTracking = 0 //For AI tracking
var/can_toggle = null
dynamic_hair_suffix = "+generic"
var/muzzle_var = NORMAL_STYLE
mutantrace_variation = NO_MUTANTRACE_VARIATION //not all hats have muzzles
/obj/item/clothing/head/Initialize()
. = ..()
@@ -15,6 +17,25 @@
var/mob/living/carbon/human/H = loc
H.update_hair()
/obj/item/clothing/head/equipped(mob/user, slot)
..()
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/datum/species/pref_species = H.dna.species
if(mutantrace_variation)
if("mam_snouts" in pref_species.default_features)
if(H.dna.features["mam_snouts"] != "None")
muzzle_var = ALT_STYLE
else if("snout" in pref_species.default_features)
if(H.dna.features["snout"] != "None")
muzzle_var = ALT_STYLE
else
muzzle_var = NORMAL_STYLE
H.update_inv_head()
/obj/item/clothing/head/worn_overlays(isinhands = FALSE)
. = list()
if(!isinhands)
+2 -1
View File
@@ -79,8 +79,9 @@
name = "atmospheric technician's firefighting helmet"
desc = "A firefighter's helmet, able to keep the user cool in any situation."
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
mutantrace_variation = MUTANTRACE_VARIATION
+4 -1
View File
@@ -74,6 +74,7 @@
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
dog_fashion = null
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/head/helmet/attack_self(mob/user)
if(can_toggle && !user.incapacitated())
@@ -210,10 +211,11 @@
icon_state = "knight_green"
item_state = "knight_green"
armor = list("melee" = 41, "bullet" = 15, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 2, "rad" = 0, "fire" = 0, "acid" = 50)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
strip_delay = 80
dog_fashion = null
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/head/helmet/knight/Initialize(mapload)
@@ -242,6 +244,7 @@
icon_state = "skull"
item_state = "skull"
strip_delay = 100
mutantrace_variation = MUTANTRACE_VARIATION
//LightToggle
+11 -10
View File
@@ -65,7 +65,8 @@
icon_state = "syndicate-helm-black-red"
item_state = "syndicate-helm-black-red"
desc = "A plastic replica of a Syndicate agent's space helmet. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/head/cueball
name = "cueball helmet"
@@ -73,7 +74,7 @@
icon_state = "cueball"
item_state="cueball"
flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
/obj/item/clothing/head/snowman
name = "Snowman Head"
@@ -81,14 +82,14 @@
icon_state = "snowman_h"
item_state = "snowman_h"
flags_cover = HEADCOVERSEYES
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
/obj/item/clothing/head/justice
name = "justice hat"
desc = "Fight for what's righteous!"
icon_state = "justicered"
item_state = "justicered"
flags_inv = HIDEHAIR|HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
flags_inv = HIDEHAIR|HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT
flags_cover = HEADCOVERSEYES
/obj/item/clothing/head/justice/blue
@@ -159,14 +160,14 @@
desc = "Bkaw!"
icon_state = "chickenhead"
item_state = "chickensuit"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
/obj/item/clothing/head/griffin
name = "griffon head"
desc = "Why not 'eagle head'? Who knows."
icon_state = "griffinhat"
item_state = "griffinhat"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
/obj/item/clothing/head/bearpelt
name = "bear pelt hat"
@@ -179,7 +180,7 @@
icon_state = "xenos"
item_state = "xenos_helm"
desc = "A helmet made out of chitinous alien hide."
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
/obj/item/clothing/head/fedora
name = "fedora"
@@ -267,13 +268,13 @@
name = "paper sack hat"
desc = "A paper sack with crude holes cut out for eyes. Useful for hiding one's identity or ugliness."
icon_state = "papersack"
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS|HIDESNOUT
/obj/item/clothing/head/papersack/smiley
name = "paper sack hat"
desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all."
icon_state = "papersack_smile"
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS|HIDESNOUT
/obj/item/clothing/head/crown
name = "crown"
@@ -297,7 +298,7 @@
name = "foam lobster head"
desc = "When everything's going to crab, protecting your head is the best choice."
icon_state = "lobster_hat"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
/obj/item/clothing/head/drfreezehat
name = "doctor freeze's wig"
+3 -2
View File
@@ -28,6 +28,7 @@
visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
resistance_flags = FIRE_PROOF
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/head/welding/attack_self(mob/user)
weldingvisortoggle(user)
@@ -113,7 +114,7 @@
icon_state = "hardhat0_pumpkin"
item_state = "hardhat0_pumpkin"
item_color = "pumpkin"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
brightness_on = 2 //luminosity when on
flags_cover = HEADCOVERSEYES
@@ -163,7 +164,7 @@
icon_state = "cardborg_h"
item_state = "cardborg_h"
flags_cover = HEADCOVERSEYES
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
dog_fashion = /datum/dog_fashion/head/cardborg
+22
View File
@@ -7,6 +7,8 @@
equip_delay_other = 40
var/mask_adjusted = 0
var/adjusted_flags = null
var/muzzle_var = NORMAL_STYLE
mutantrace_variation = NO_MUTANTRACE_VARIATION //most masks have overrides, but not all probably.
/obj/item/clothing/mask/worn_overlays(isinhands = FALSE)
@@ -18,6 +20,26 @@
IF_HAS_BLOOD_DNA(src)
. += mutable_appearance('icons/effects/blood.dmi', "maskblood")
/obj/item/clothing/mask/equipped(mob/user, slot)
..()
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/datum/species/pref_species = H.dna.species
if(mutantrace_variation)
if("mam_snouts" in pref_species.default_features)
if(H.dna.features["mam_snouts"] != "None")
muzzle_var = ALT_STYLE
else if("snout" in pref_species.default_features)
if(H.dna.features["snout"] != "None")
muzzle_var = ALT_STYLE
else
muzzle_var = NORMAL_STYLE
H.update_inv_wear_mask()
/obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE)
..()
if(ismob(loc))
+2
View File
@@ -7,6 +7,7 @@
visor_flags_inv = HIDEFACE|HIDEFACIALHAIR
w_class = WEIGHT_CLASS_SMALL
actions_types = list(/datum/action/item_action/adjust)
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/mask/balaclava/attack_self(mob/user)
adjustmask(user)
@@ -18,6 +19,7 @@
item_state = "luchag"
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
w_class = WEIGHT_CLASS_SMALL
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/mask/luchador/speechModification(message)
if(copytext(message, 1, 2) != "*")
+1
View File
@@ -13,6 +13,7 @@
flags_cover = MASKCOVERSMOUTH
visor_flags_cover = MASKCOVERSMOUTH
resistance_flags = NONE
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/mask/breath/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] is wrapping \the [src]'s tube around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide!</span>")
+9 -1
View File
@@ -3,13 +3,21 @@
desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate
icon_state = "gas_alt"
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT
w_class = WEIGHT_CLASS_NORMAL
item_state = "gas_alt"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
resistance_flags = NONE
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/mask/gas/glass
name = "glass gas mask"
desc = "A face-covering mask that can be connected to an air supply. This one doesn't obscure your face however." //More accurate
icon_state = "gas_clear"
flags_inv = HIDEEYES
// **** Welding gas mask ****
@@ -7,6 +7,7 @@
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.9
equip_delay_other = 20
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/mask/muzzle/attack_paw(mob/user)
if(iscarbon(user))
@@ -30,6 +31,7 @@
permeability_coefficient = 0.01
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 25, "rad" = 0, "fire" = 0, "acid" = 0)
actions_types = list(/datum/action/item_action/adjust)
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/mask/surgical/attack_self(mob/user)
adjustmask(user)
@@ -39,6 +41,7 @@
desc = "Warning: moustache is fake."
icon_state = "fake-moustache"
flags_inv = HIDEFACE
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/mask/fakemoustache/italian
name = "italian moustache"
@@ -66,6 +69,7 @@
name = "joy mask"
desc = "Express your happiness or hide your sorrows with this laughing face with crying tears of joy cutout."
icon_state = "joy"
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/mask/pig
name = "pig mask"
@@ -225,6 +229,7 @@
slot_flags = ITEM_SLOT_MASK
adjusted_flags = ITEM_SLOT_HEAD
icon_state = "bandbotany"
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/mask/bandana/attack_self(mob/user)
adjustmask(user)
@@ -8,7 +8,7 @@
item_state = "spaceold"
permeability_coefficient = 0.01
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
dynamic_hair_suffix = ""
dynamic_fhair_suffix = ""
cold_protection = HEAD
@@ -21,6 +21,7 @@
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
resistance_flags = NONE
dog_fashion = null
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/suit/space
name = "space suit"
@@ -443,6 +443,7 @@
icon_state = "hardsuit0-medical"
item_state = "medical_helm"
item_color = "medical"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flash_protect = 0
armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75)
scan_reagents = 1
@@ -64,6 +64,7 @@ Contains:
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/space/officer
name = "officer's jacket"
@@ -114,6 +115,7 @@ Contains:
desc = "Ho ho ho. Merrry X-mas!"
icon_state = "santahat"
flags_cover = HEADCOVERSEYES
mutantrace_variation = NO_MUTANTRACE_VARIATION
dog_fashion = /datum/dog_fashion/head/santa
@@ -137,12 +139,14 @@ Contains:
strip_delay = 40
equip_delay_other = 20
flags_cover = HEADCOVERSEYES
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/head/helmet/space/pirate/bandana
name = "royal bandana"
desc = "A space-proof bandanna crafted with reflective kevlar."
icon_state = "bandana"
item_state = "bandana"
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/space/pirate
name = "royal waistcoat "
@@ -250,6 +254,7 @@ Contains:
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = ACID_PROOF | FIRE_PROOF
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/space/freedom
name = "eagle suit"
@@ -273,6 +278,7 @@ Contains:
brightness_on = 0 //luminosity when on
actions_types = list()
item_flags = NODROP
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/space/hardsuit/carp
@@ -295,6 +301,7 @@ Contains:
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
actions_types = list()
resistance_flags = FIRE_PROOF
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/space/hardsuit/ert/paranormal
name = "paranormal response team suit"
@@ -304,6 +311,7 @@ Contains:
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF
tauric = TRUE //Citadel Add for tauric hardsuits
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize()
. = ..()
+2 -1
View File
@@ -6,9 +6,10 @@
permeability_coefficient = 0.01
clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 60, "fire" = 30, "acid" = 100)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT
resistance_flags = ACID_PROOF
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/suit/bio_suit
name = "bio suit"
+13
View File
@@ -180,6 +180,7 @@
/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet()
var/mob/living/carbon/human/H = src.loc
var/datum/species/pref_species = H.dna.species
if(!helmettype)
return
if(!helmet)
@@ -193,6 +194,18 @@
to_chat(H, "<span class='warning'>You're already wearing something on your head!</span>")
return
else if(H.equip_to_slot_if_possible(helmet,SLOT_HEAD,0,0,1))
if(helmet.mutantrace_variation)
if("mam_snouts" in pref_species.default_features)
if(H.dna.features["mam_snouts"] != "None")
helmet.muzzle_var = ALT_STYLE
else if("snout" in pref_species.default_features)
if(H.dna.features["snout"] != "None")
helmet.muzzle_var = ALT_STYLE
else
helmet.muzzle_var = NORMAL_STYLE
H.update_inv_head()
to_chat(H, "<span class='notice'>You engage the helmet on the hardsuit.</span>")
suittoggled = TRUE
H.update_inv_wear_suit()
+4 -2
View File
@@ -60,7 +60,7 @@
icon_state = "bombsuit"
clothing_flags = THICKMATERIAL
armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50)
flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
dynamic_hair_suffix = ""
dynamic_fhair_suffix = ""
cold_protection = HEAD
@@ -71,6 +71,7 @@
equip_delay_other = 70
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
resistance_flags = NONE
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/suit/bomb_suit
@@ -123,13 +124,14 @@
icon_state = "rad"
desc = "A hood with radiation protective properties. The label reads, 'Made with lead. Please do not consume insulation.'"
clothing_flags = THICKMATERIAL
flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30)
strip_delay = 60
equip_delay_other = 60
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
resistance_flags = NONE
rad_flags = RAD_PROTECT_CONTENTS
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/suit/radiation
name = "radiation suit"
+6 -33
View File
@@ -122,28 +122,23 @@
/****************SEVA Suit and Mask****************/
/obj/item/clothing/suit/hooded/seva
/obj/item/clothing/suit/hooded/explorer/seva
name = "SEVA Suit"
desc = "A fire-proof suit for exploring hot environments."
icon_state = "seva"
item_state = "seva"
w_class = WEIGHT_CLASS_BULKY
body_parts_covered = CHEST|GROIN|LEGS|ARMS
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
hoodtype = /obj/item/clothing/head/hooded/seva
hoodtype = /obj/item/clothing/head/hooded/explorer/seva
armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 25, "bio" = 50, "rad" = 25, "fire" = 100, "acid" = 25)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
resistance_flags = FIRE_PROOF | GOLIATH_WEAKNESS
tauric = TRUE //Citadel Add for tauric hardsuits
/obj/item/clothing/head/hooded/seva
/obj/item/clothing/head/hooded/explorer/seva
name = "SEVA Hood"
desc = "A fire-proof hood for exploring hot environments."
icon_state = "seva"
item_state = "seva"
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 25, "bio" = 50, "rad" = 25, "fire" = 100, "acid" = 25)
resistance_flags = FIRE_PROOF | GOLIATH_WEAKNESS
@@ -152,43 +147,27 @@
name = "SEVA Mask"
desc = "A face-covering plate that can be connected to an air supply. Intended for use with the SEVA Suit."
icon_state = "seva"
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
w_class = WEIGHT_CLASS_NORMAL
item_state = "seva"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
resistance_flags = FIRE_PROOF
/****************Exo-Suit and Mask****************/
/obj/item/clothing/suit/hooded/exo
/obj/item/clothing/suit/hooded/explorer/exo
name = "Exo-suit"
desc = "A robust suit for exploring dangerous environments."
icon_state = "exo"
item_state = "exo"
w_class = WEIGHT_CLASS_BULKY
body_parts_covered = CHEST|GROIN|LEGS|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
cold_protection = CHEST|GROIN|LEGS|ARMS
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
hoodtype = /obj/item/clothing/head/hooded/exo
hoodtype = /obj/item/clothing/head/hooded/explorer/exo
armor = list("melee" = 65, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 60, "bio" = 25, "rad" = 10, "fire" = 0, "acid" = 0)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
resistance_flags = FIRE_PROOF | GOLIATH_RESISTANCE
tauric = TRUE //Citadel Add for tauric hardsuits
/obj/item/clothing/head/hooded/exo
/obj/item/clothing/head/hooded/explorer/exo
name = "Exo-hood"
desc = "A robust helmet for exploring dangerous environments."
icon_state = "exo"
item_state = "exo"
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
armor = list("melee" = 65, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 60, "bio" = 25, "rad" = 10, "fire" = 0, "acid" = 0)
resistance_flags = FIRE_PROOF | GOLIATH_RESISTANCE
@@ -196,11 +175,5 @@
name = "Exosuit Mask"
desc = "A face-covering mask that can be connected to an air supply. Intended for use with the Exosuit."
icon_state = "exo"
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
w_class = WEIGHT_CLASS_NORMAL
item_state = "exo"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
resistance_flags = FIRE_PROOF
+3 -3
View File
@@ -329,7 +329,7 @@
/obj/item/storage/backpack/duffelbag/mining_cloned
name = "mining replacement kit"
desc = "A large bag that has advance tools and a spare jumpsuit, boots, and gloves for a newly cloned miner to get back in the field. Even as a new Id!"
/obj/item/storage/backpack/duffelbag/mining_cloned/PopulateContents()
new /obj/item/pickaxe/mini(src)
new /obj/item/clothing/under/rank/miner/lavaland(src)
@@ -356,10 +356,10 @@
var/drop_location = drop_location()
switch(selection)
if("Exo-suit")
new /obj/item/clothing/suit/hooded/exo(drop_location)
new /obj/item/clothing/suit/hooded/explorer/exo(drop_location)
new /obj/item/clothing/mask/gas/exo(drop_location)
if("SEVA suit")
new /obj/item/clothing/suit/hooded/seva(drop_location)
new /obj/item/clothing/suit/hooded/explorer/seva(drop_location)
new /obj/item/clothing/mask/gas/seva(drop_location)
SSblackbox.record_feedback("tally", "suit_voucher_redeemed", 1, selection)
@@ -1267,7 +1267,7 @@
/datum/sprite_accessory/tails_animated/human/none
name = "None"
icon_state = "none"
/*
/datum/sprite_accessory/tails/human/cat
name = "Cat"
icon_state = "cat"
@@ -1276,7 +1276,7 @@
/datum/sprite_accessory/tails_animated/human/cat
name = "Cat"
icon_state = "cat"
color_src = HAIR
color_src = HAIR*/
/datum/sprite_accessory/snouts
icon = 'icons/mob/mutant_bodyparts.dmi'
@@ -21,6 +21,7 @@
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
layer = MOB_LAYER
max_integrity = 100
mutantrace_variation = MUTANTRACE_VARIATION
var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case
@@ -557,7 +557,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
bodyparts_to_add -= "waggingspines"
if("snout" in mutant_bodyparts) //Take a closer look at that snout!
if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE)) || !HD || HD.status == BODYPART_ROBOTIC)
if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "snout"
if("frills" in mutant_bodyparts)
@@ -569,7 +569,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
bodyparts_to_add -= "horns"
if("ears" in mutant_bodyparts)
if(!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
if(!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "ears"
if("wings" in mutant_bodyparts)
@@ -607,11 +607,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
bodyparts_to_add -= "mam_waggingtail"
if("mam_ears" in mutant_bodyparts)
if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "mam_ears"
if("mam_snouts" in mutant_bodyparts) //Take a closer look at that snout!
if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE)) || !HD || HD.status == BODYPART_ROBOTIC)
if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "mam_snouts"
if("taur" in mutant_bodyparts)
@@ -691,8 +691,29 @@ GLOBAL_LIST_EMPTY(roundstart_races)
S = GLOB.moth_wings_list[H.dna.features["moth_wings"]]
if("caps")
S = GLOB.caps_list[H.dna.features["caps"]]
else
S = citadel_mutant_bodyparts(bodypart, H)
if("ipc_screen")
S = GLOB.ipc_screens_list[H.dna.features["ipc_screen"]]
if("ipc_antenna")
S = GLOB.ipc_antennas_list[H.dna.features["ipc_antenna"]]
if("mam_tail")
S = GLOB.mam_tails_list[H.dna.features["mam_tail"]]
if("mam_waggingtail")
S = GLOB.mam_tails_animated_list[H.dna.features["mam_tail"]]
if("mam_body_markings")
S = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
if("mam_ears")
S = GLOB.mam_ears_list[H.dna.features["mam_ears"]]
if("mam_snouts")
S = GLOB.mam_snouts_list[H.dna.features["mam_snouts"]]
if("taur")
S = GLOB.taur_list[H.dna.features["taur"]]
if("xenodorsal")
S = GLOB.xeno_dorsal_list[H.dna.features["xenodorsal"]]
if("xenohead")
S = GLOB.xeno_head_list[H.dna.features["xenohead"]]
if("xenotail")
S = GLOB.xeno_tail_list[H.dna.features["xenotail"]]
if(!S || S.icon_state == "none")
continue
@@ -703,9 +724,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
//A little rename so we don't have to use tail_lizard or tail_human when naming the sprites.
if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "mam_tail" || bodypart == "xenotail")
bodypart = "tail"
else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human")
else if(bodypart == "waggingtail_lizard")
bodypart = "waggingtail"
if(bodypart == "mam_waggingtail")
if(bodypart == "mam_waggingtail" || bodypart == "waggingtail_human")
bodypart = "tailwag"
if(bodypart == "mam_ears" || bodypart == "ears")
bodypart = "ears"
@@ -324,13 +324,22 @@ There are several things that need to be remembered:
/mob/living/carbon/human/update_inv_head()
..()
update_mutant_bodyparts()
var/mutable_appearance/head_overlay = overlays_standing[HEAD_LAYER]
if(head_overlay)
if(head)
remove_overlay(HEAD_LAYER)
var/obj/item/clothing/head/H = head
if(H.mutantrace_variation)
if(H.muzzle_var == ALT_STYLE)
H.alternate_worn_icon = 'modular_citadel/icons/mob/muzzled_helmet.dmi'
else
H.alternate_worn_icon = null
overlays_standing[HEAD_LAYER] = H.build_worn_icon(state = H.icon_state, default_layer = HEAD_LAYER, default_icon_file = ((head.alternate_worn_icon) ? H.alternate_worn_icon : 'icons/mob/head.dmi'))
var/mutable_appearance/head_overlay = overlays_standing[HEAD_LAYER]
if(OFFSET_HEAD in dna.species.offset_features)
head_overlay.pixel_x += dna.species.offset_features[OFFSET_HEAD][1]
head_overlay.pixel_y += dna.species.offset_features[OFFSET_HEAD][2]
overlays_standing[HEAD_LAYER] = head_overlay
overlays_standing[HEAD_LAYER] = head_overlay
apply_overlay(HEAD_LAYER)
/mob/living/carbon/human/update_inv_belt()
@@ -429,13 +438,22 @@ There are several things that need to be remembered:
/mob/living/carbon/human/update_inv_wear_mask()
..()
var/mutable_appearance/mask_overlay = overlays_standing[FACEMASK_LAYER]
if(mask_overlay)
if(wear_mask)
var/obj/item/clothing/mask/M = wear_mask
remove_overlay(FACEMASK_LAYER)
if(M.mutantrace_variation)
if(M.muzzle_var == ALT_STYLE)
M.alternate_worn_icon = 'modular_citadel/icons/mob/muzzled_mask.dmi'
else
M.alternate_worn_icon = null
overlays_standing[FACEMASK_LAYER] = M.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = ((wear_mask.alternate_worn_icon) ? M.alternate_worn_icon : 'icons/mob/mask.dmi'))
var/mutable_appearance/mask_overlay = overlays_standing[FACEMASK_LAYER]
if(OFFSET_FACEMASK in dna.species.offset_features)
mask_overlay.pixel_x += dna.species.offset_features[OFFSET_FACEMASK][1]
mask_overlay.pixel_y += dna.species.offset_features[OFFSET_FACEMASK][2]
overlays_standing[FACEMASK_LAYER] = mask_overlay
overlays_standing[FACEMASK_LAYER] = mask_overlay
apply_overlay(FACEMASK_LAYER)
update_mutant_bodyparts() //e.g. upgate needed because mask now hides lizard snout
@@ -290,7 +290,7 @@
gloves = /obj/item/clothing/gloves/color/black
mask = /obj/item/clothing/mask/gas/explorer
if(prob(20))
suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer = 6, /obj/item/clothing/suit/hooded/cloak/goliath = 2, /obj/item/clothing/suit/hooded/exo = 6, /obj/item/clothing/suit/hooded/seva = 6))
suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer = 6, /obj/item/clothing/suit/hooded/cloak/goliath = 2, /obj/item/clothing/suit/hooded/explorer/exo = 6, /obj/item/clothing/suit/hooded/explorer/seva = 6))
if(prob(30))
r_pocket = pickweight(list(/obj/item/stack/marker_beacon = 20, /obj/item/stack/spacecash/c1000 = 7, /obj/item/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/damage = 1 ))
if(prob(10))
+2 -2
View File
@@ -1,4 +1,4 @@
#!/bin/sh
#!/bin/bash
#Project dependencies file
#Final authority on what's required to fully build the project
@@ -11,7 +11,7 @@ export BYOND_MINOR=${LIST[1]}
unset LIST
#rust_g git tag
export RUST_G_VERSION=0.4.1
export RUST_G_VERSION=0.4.2
#bsql git tag
export BSQL_VERSION=v1.4.0.0
@@ -0,0 +1,7 @@
author: "Poojawa"
delete-after: True
changes:
- imageadd: "added muzzled varients of space helmets and full masks"
- imageadd: "added knight_grey to taur suits, all paranormal ERT now have tauric versions enabled"
- bugfix: "Lava knights have digitigrade and tauric versions now"
- rscadd: "Added a glass version of the gas mask, because it was in the files and looked nice. does everything regular ones do except make you an unknown"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

@@ -86,6 +86,7 @@
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
actions_types = list(/datum/action/item_action/toggle_helmet)
var/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/linkedhelm
tauric = TRUE //Citadel Add for tauric hardsuits
var/energy_color = "#35FFF0"
@@ -101,7 +102,14 @@
update_icon()
/obj/item/clothing/suit/space/hardsuit/lavaknight/update_icon()
var/mutable_appearance/suit_overlay = mutable_appearance('modular_citadel/icons/lavaknight/item/suit.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
var/mutable_appearance/suit_overlay
if(taurmode == SNEK_TAURIC)
suit_overlay = mutable_appearance('modular_citadel/icons/mob/taur_naga.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
else if(taurmode == PAW_TAURIC)
suit_overlay = mutable_appearance('modular_citadel/icons/mob/taur_canine.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
else
suit_overlay = mutable_appearance('modular_citadel/icons/lavaknight/item/suit.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
if(energy_color)
suit_overlay.color = energy_color
@@ -122,7 +130,14 @@
emissivelightsoff()
/obj/item/clothing/suit/space/hardsuit/lavaknight/proc/emissivelights(mob/user = usr)
var/mutable_appearance/energy_overlay = mutable_appearance('modular_citadel/icons/lavaknight/mob/suit.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
var/mutable_appearance/energy_overlay
if(taurmode == SNEK_TAURIC)
energy_overlay = mutable_appearance('modular_citadel/icons/mob/taur_naga.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
else if(taurmode == PAW_TAURIC)
energy_overlay = mutable_appearance('modular_citadel/icons/mob/taur_canine.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
else
energy_overlay = mutable_appearance('modular_citadel/icons/lavaknight/mob/suit.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
energy_overlay.color = energy_color
energy_overlay.plane = LIGHTING_PLANE + 1
user.cut_overlay(energy_overlay) //honk
@@ -159,7 +159,125 @@
*/
/******************************************
************ Human Ears/Tails *************
*************** Human Ears ****************
*******************************************/
/datum/sprite_accessory/ears/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/human/bear
name = "Bear"
icon_state = "bear"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/cow
name = "Cow"
icon_state = "cow"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/curled
name = "Curled Horn"
icon_state = "horn1"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MUTCOLORS3
/datum/sprite_accessory/ears/human/eevee
name = "Eevee"
icon_state = "eevee"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/elephant
name = "Elephant"
icon_state = "elephant"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/fennec
name = "Fennec"
icon_state = "fennec"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/fish
name = "Fish"
icon_state = "fish"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/fox
name = "Fox"
icon_state = "fox"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/human/jellyfish
name = "Jellyfish"
icon_state = "jellyfish"
color_src = HAIR
/datum/sprite_accessory/ears/lab
name = "Dog, Floppy"
icon_state = "lab"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/murid
name = "Murid"
icon_state = "murid"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/otie
name = "Otusian"
icon_state = "otie"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/human/pede
name = "Scolipede"
icon_state = "pede"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/human/sergal
name = "Sergal"
icon_state = "sergal"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/skunk
name = "skunk"
icon_state = "skunk"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/squirrel
name = "Squirrel"
icon_state = "squirrel"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/wolf
name = "Wolf"
icon_state = "wolf"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/******************************************
************** Human Tails ****************
*******************************************/
/datum/sprite_accessory/tails/human/ailurus
@@ -168,11 +286,12 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/tails_animated/human/ailurus
name = "Red Panda"
icon_state = "wah"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
@@ -185,12 +304,6 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/bear
name = "Bear"
icon_state = "bear"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/bee
name = "Bee"
icon_state = "bee"
@@ -202,7 +315,19 @@
icon_state = "bee"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/cat
name = "Cat"
icon_state = "cat"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = HAIR
/datum/sprite_accessory/tails_animated/human/cat
name = "Cat"
icon_state = "cat"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = HAIR
/datum/sprite_accessory/tails/human/catbig
name = "Cat, Big"
icon_state = "catbig"
@@ -214,13 +339,7 @@
icon_state = "catbig"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/cow
name = "Cow"
icon_state = "cow"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/cow
name = "Cow"
icon_state = "cow"
@@ -240,19 +359,7 @@
/datum/sprite_accessory/tails_animated/human/corvid
name = "Corvid"
icon_state = "crow"
/datum/sprite_accessory/ears/human/curled
name = "Curled Horn"
icon_state = "horn1"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MUTCOLORS3
/datum/sprite_accessory/ears/human/eevee
name = "Eevee"
icon_state = "eevee"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/eevee
name = "Eevee"
icon_state = "eevee"
@@ -264,19 +371,7 @@
icon_state = "eevee"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/elephant
name = "Elephant"
icon_state = "elephant"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/fennec
name = "Fennec"
icon_state = "fennec"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/fennec
name = "Fennec"
icon_state = "fennec"
@@ -288,13 +383,7 @@
icon_state = "fennec"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/fish
name = "Fish"
icon_state = "fish"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/fish
name = "Fish"
icon_state = "fish"
@@ -306,13 +395,7 @@
icon_state = "fish"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/fox
name = "Fox"
icon_state = "fox"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/tails/human/fox
name = "Fox"
icon_state = "fox"
@@ -360,12 +443,7 @@
icon_state = "insect"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/jellyfish
name = "Jellyfish"
icon_state = "jellyfish"
color_src = HAIR
/datum/sprite_accessory/tails/human/kitsune
name = "Kitsune"
icon_state = "kitsune"
@@ -377,19 +455,7 @@
icon_state = "kitsune"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/lab
name = "Dog, Floppy"
icon_state = "lab"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/murid
name = "Murid"
icon_state = "murid"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/murid
name = "Murid"
icon_state = "murid"
@@ -401,13 +467,7 @@
icon_state = "murid"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/otie
name = "Otusian"
icon_state = "otie"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/tails/human/otie
name = "Otusian"
icon_state = "otie"
@@ -431,13 +491,7 @@
icon_state = "orca"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/pede
name = "Scolipede"
icon_state = "pede"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/pede
name = "Scolipede"
icon_state = "pede"
@@ -449,13 +503,7 @@
icon_state = "pede"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/tails/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
@@ -467,13 +515,7 @@
icon_state = "rabbit"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/sergal
name = "Sergal"
icon_state = "sergal"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/sergal
name = "Sergal"
icon_state = "sergal"
@@ -485,13 +527,7 @@
icon_state = "sergal"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/skunk
name = "skunk"
icon_state = "skunk"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/skunk
name = "skunk"
icon_state = "skunk"
@@ -535,13 +571,7 @@
/datum/sprite_accessory/tails_animated/human/straighttail
name = "Straight Tail"
icon_state = "straighttail"
/datum/sprite_accessory/ears/squirrel
name = "Squirrel"
icon_state = "squirrel"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/squirrel
name = "Squirrel"
icon_state = "squirrel"
@@ -565,7 +595,7 @@
icon_state = "tentacle"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/tiger
name = "Tiger"
icon_state = "tiger"
@@ -577,13 +607,7 @@
icon_state = "tiger"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/wolf
name = "Wolf"
icon_state = "wolf"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/tails/human/wolf
name = "Wolf"
icon_state = "wolf"
@@ -595,9 +619,9 @@
icon_state = "wolf"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/******************************************
*************** Body Parts ****************
*********** Mammal Body Parts *************
*******************************************/
/datum/sprite_accessory/mam_ears
@@ -1797,7 +1821,7 @@ datum/sprite_accessory/mam_tails/insect
icon_state = "lunasune"
/*************** VIRGO PORTED HAIRS ****************************/
#define VHAIR(_name, new_state) /datum/sprite_accessory/hair/##new_state/icon_state=#new_state;/datum/sprite_accessory/hair/##new_state/name = "Virgo - " + #_name
#define VHAIR(_name, new_state) /datum/sprite_accessory/hair/##new_state/icon_state=#new_state;/datum/sprite_accessory/hair/##new_state/name = #_name + " (Virgo)"
//VIRGO PORTED HAIRS
VHAIR("Short Hair Rosa", hair_rosa_s)
VHAIR("Short Hair 80s", hair_80s_s)
@@ -1955,7 +1979,7 @@ VHAIR("Tressshoulder", hair_tressshoulder_s)
//END
#undef VHAIR
#define VFACE(_name, new_state) /datum/sprite_accessory/facial_hair/##new_state/icon_state=#new_state;;/datum/sprite_accessory/facial_hair/##new_state/name="Virgo" + #_name
#define VFACE(_name, new_state) /datum/sprite_accessory/facial_hair/##new_state/icon_state=#new_state;;/datum/sprite_accessory/facial_hair/##new_state/name= #_name + " (Virgo)"
VFACE("Watson", facial_watson_s)
VFACE("Chaplin", facial_chaplin_s)
VFACE("Fullbeard", facial_fullbeard_s)
@@ -1994,4 +2018,4 @@ VFACE("Cropped Fullbeard", facial_croppedfullbeard_s)
VFACE("Chinless Beard", facial_chinlessbeard_s)
VFACE("Moonshiner", facial_moonshiner_s)
VFACE("Tribearder", facial_tribearder_s)
#undef VFACE
#undef VFACE
@@ -82,7 +82,7 @@
if(get_turf(target) == target_oldturf)
target_table = locate(/obj/structure/table) in target_shove_turf.contents
shove_blocked = TRUE
if(shove_blocked && !target.is_shove_knockdown_blocked())
var/directional_blocked = FALSE
if(shove_dir in GLOB.cardinals) //Directional checks to make sure that we're not shoving through a windoor or something like that
@@ -151,28 +151,3 @@
/obj/item/bodypart
var/should_draw_citadel = FALSE
/datum/species/proc/citadel_mutant_bodyparts(bodypart, mob/living/carbon/human/H)
switch(bodypart)
if("ipc_screen")
return GLOB.ipc_screens_list[H.dna.features["ipc_screen"]]
if("ipc_antenna")
return GLOB.ipc_antennas_list[H.dna.features["ipc_antenna"]]
if("mam_tail")
return GLOB.mam_tails_list[H.dna.features["mam_tail"]]
if("mam_waggingtail")
return GLOB.mam_tails_animated_list[H.dna.features["mam_tail"]]
if("mam_body_markings")
return GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
if("mam_ears")
return GLOB.mam_ears_list[H.dna.features["mam_ears"]]
if("mam_snouts")
return GLOB.mam_snouts_list[H.dna.features["mam_snouts"]]
if("taur")
return GLOB.taur_list[H.dna.features["taur"]]
if("xenodorsal")
return GLOB.xeno_dorsal_list[H.dna.features["xenodorsal"]]
if("xenohead")
return GLOB.xeno_head_list[H.dna.features["xenohead"]]
if("xenotail")
return GLOB.xeno_tail_list[H.dna.features["xenotail"]]
Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 KiB

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 107 KiB

BIN
View File
Binary file not shown.
+4 -4
View File
@@ -15,10 +15,10 @@ var/admin_weight = 5 // admins are more likely to join a server with less admins
var/player_substr = "players=" // search for this substring to locate # of players
var/admin_substr = "admins=" // search for this to locate # of admins
world
/world
name = "TGstation Redirector"
world/New()
/world/New()
..()
gen_configs()
@@ -29,7 +29,7 @@ world/New()
var/link = ""
mob/Login()
/mob/Login()
..()
var/list/weights = list()
@@ -60,7 +60,7 @@ mob/Login()
src << link(serverlink)
proc/extract(var/data, var/type = PLAYERS)
/proc/extract(var/data, var/type = PLAYERS)
var/nextpos = 0
@@ -14,6 +14,13 @@
* @author Miloslav Hula (https://github.com/milo)
*/
define('S_LINK_EMBED', 1<<0);
define('S_MENTIONS', 1<<1);
define('S_MARKDOWN', 1<<2);
define('S_HTML_COMMENTS', 1<<3);
define('F_UNVALIDATED_USER', 1<<0);
define('F_SECRET_PR', 1<<1);
//CONFIGS ARE IN SECRET.PHP, THESE ARE JUST DEFAULTS!
@@ -32,17 +39,21 @@ $validation = "org";
$validation_count = 1;
$tracked_branch = 'master';
$require_changelogs = false;
$discordWebHooks = array();
require_once 'secret.php';
//CONFIG END
function log_error($msg) {
echo htmlSpecialChars($msg);
file_put_contents('htwebhookerror.log', '['.date(DATE_ATOM).'] '.$msg.PHP_EOL, FILE_APPEND);
}
set_error_handler(function($severity, $message, $file, $line) {
throw new \ErrorException($message, 0, $severity, $file, $line);
});
set_exception_handler(function($e) {
header('HTTP/1.1 500 Internal Server Error');
echo "Error on line {$e->getLine()}: " . htmlSpecialChars($e->getMessage());
file_put_contents('htwebhookerror.log', '['.date(DATE_ATOM).'] '."Error on line {$e->getLine()}: " . $e->getMessage().PHP_EOL, FILE_APPEND);
log_error('Error on line ' . $e->getLine() . ': ' . $e->getMessage());
die();
});
$rawPost = NULL;
@@ -110,24 +121,38 @@ switch (strtolower($_SERVER['HTTP_X_GITHUB_EVENT'])) {
die();
}
function apisend($url, $method = 'GET', $content = NULL) {
global $apiKey;
function apisend($url, $method = 'GET', $content = null, $authorization = null) {
if (is_array($content))
$content = json_encode($content);
$headers = array();
$headers[] = 'Content-type: application/json';
if ($authorization)
$headers[] = 'Authorization: ' . $authorization;
$scontext = array('http' => array(
'method' => $method,
'header' =>
"Content-type: application/json\r\n".
'Authorization: token ' . $apiKey,
'method' => $method,
'header' => implode("\r\n", $headers),
'ignore_errors' => true,
'user_agent' => 'tgstation13.org-Github-Automation-Tools'
));
if ($content)
$scontext['http']['content'] = $content;
return file_get_contents($url, false, stream_context_create($scontext));
}
function github_apisend($url, $method = 'GET', $content = NULL) {
global $apiKey;
return apisend($url, $method, $content, 'token ' . $apiKey);
}
function discord_webhook_send($webhook, $content) {
return apisend($webhook, 'POST', $content);
}
function validate_user($payload) {
global $validation, $validation_count;
$query = array();
@@ -148,7 +173,7 @@ function validate_user($payload) {
$querystring = '';
foreach($query as $key => $value)
$querystring .= ($querystring == '' ? '' : '+') . urlencode($key) . ':' . urlencode($value);
$res = apisend('https://api.github.com/search/issues?q='.$querystring);
$res = github_apisend('https://api.github.com/search/issues?q='.$querystring);
$res = json_decode($res, TRUE);
return $res['total_count'] >= (int)$validation_count;
@@ -156,9 +181,9 @@ function validate_user($payload) {
function get_labels($payload){
$url = $payload['pull_request']['issue_url'] . '/labels';
$existing_labels = json_decode(apisend($url), true);
$existing_labels = json_decode(github_apisend($url), true);
$existing = array();
foreach($existing_labels as $label)
foreach((array) $existing_labels as $label)
$existing[] = $label['name'];
return $existing;
}
@@ -174,7 +199,6 @@ function check_tag_and_replace($payload, $title_tag, $label, &$array_to_add_labe
function set_labels($payload, $labels, $remove) {
$existing = get_labels($payload);
$tags = array();
$tags = array_merge($labels, $existing);
@@ -188,20 +212,20 @@ function set_labels($payload, $labels, $remove) {
$final[] = $t;
$url = $payload['pull_request']['issue_url'] . '/labels';
echo apisend($url, 'PUT', $final);
echo github_apisend($url, 'PUT', $final);
}
//rip bs-12
function tag_pr($payload, $opened) {
//get the mergeable state
$url = $payload['pull_request']['url'];
$payload['pull_request'] = json_decode(apisend($url), TRUE);
$payload['pull_request'] = json_decode(github_apisend($url), TRUE);
if($payload['pull_request']['mergeable'] == null) {
//STILL not ready. Give it a bit, then try one more time
sleep(10);
$payload['pull_request'] = json_decode(apisend($url), TRUE);
$payload['pull_request'] = json_decode(github_apisend($url), TRUE);
}
$tags = array();
$title = $payload['pull_request']['title'];
if($opened) { //you only have one shot on these ones so as to not annoy maintainers
@@ -249,16 +273,16 @@ function remove_ready_for_review($payload, $labels = null){
if($index !== FALSE)
unset($labels[$index]);
$url = $payload['pull_request']['issue_url'] . '/labels';
apisend($url, 'PUT', $labels);
github_apisend($url, 'PUT', $labels);
}
function dismiss_review($payload, $id, $reason){
$content = array('message' => $reason);
apisend($payload['pull_request']['url'] . '/reviews/' . $id . '/dismissals', 'PUT', $content);
github_apisend($payload['pull_request']['url'] . '/reviews/' . $id . '/dismissals', 'PUT', $content);
}
function get_reviews($payload){
return json_decode(apisend($payload['pull_request']['url'] . '/reviews'), true);
return json_decode(github_apisend($payload['pull_request']['url'] . '/reviews'), true);
}
function check_ready_for_review($payload, $labels = null, $remove = array()){
@@ -308,7 +332,7 @@ function check_ready_for_review($payload, $labels = null, $remove = array()){
if(count($reviews_ids_with_changes_requested) > 0){
//now get the review comments for the offending reviews
$review_comments = json_decode(apisend($payload['pull_request']['review_comments_url']), true);
$review_comments = json_decode(github_apisend($payload['pull_request']['review_comments_url']), true);
foreach($review_comments as $C){
//make sure they are part of an offending review
@@ -350,7 +374,7 @@ function check_dismiss_changelog_review($payload){
if($R['body'] == $review_message && strtolower($R['state']) == 'changes_requested')
return;
//otherwise make it ourself
apisend($payload['pull_request']['url'] . '/reviews', 'POST', array('body' => $review_message, 'event' => 'REQUEST_CHANGES'));
github_apisend($payload['pull_request']['url'] . '/reviews', 'POST', array('body' => $review_message, 'event' => 'REQUEST_CHANGES'));
}
else
//kill previous reviews
@@ -403,28 +427,191 @@ function handle_pr($payload) {
return;
}
$pr_flags = 0;
if (strpos(strtolower($payload['pull_request']['title']), '[s]') !== false) {
echo "PR Announcement Halted; Secret tag detected.\n";
return;
$pr_flags |= F_SECRET_PR;
}
if (!$validated) {
echo "PR Announcement Halted; User not validated.\n";
return;
$pr_flags |= F_UNVALIDATED_USER;
}
discord_announce($action, $payload, $pr_flags);
game_announce($action, $payload, $pr_flags);
}
function filter_announce_targets($targets, $owner, $repo, $action, $pr_flags) {
foreach ($targets as $i=>$target) {
if (isset($target['exclude_events']) && in_array($action, array_map('strtolower', $target['exclude_events']))) {
unset($targets[$i]);
continue;
}
if (isset($target['announce_secret']) && $target['announce_secret']) {
if (!($pr_flags & F_SECRET_PR) && $target['announce_secret'] === 'only') {
unset($targets[$i]);
continue;
}
} else if ($pr_flags & F_SECRET_PR) {
unset($targets[$i]);
continue;
}
if (isset($target['announce_unvalidated']) && $target['announce_unvalidated']) {
if (!($pr_flags & F_UNVALIDATED_USER) && $target['announce_unvalidated'] === 'only') {
unset($targets[$i]);
continue;
}
} else if ($pr_flags & F_UNVALIDATED_USER) {
unset($targets[$i]);
continue;
}
$wildcard = false;
if (isset($target['include_repos'])) {
foreach ($target['include_repos'] as $match_string) {
$owner_repo_pair = explode('/', strtolower($match_string));
if (count($owner_repo_pair) != 2) {
log_error('Bad include repo: `'. $match_string.'`');
continue;
}
if (strtolower($owner) == $owner_repo_pair[0]) {
if (strtolower($repo) == $owner_repo_pair[1])
continue 2; //don't parse excludes when we have an exact include match
if ($owner_repo_pair[1] == '*') {
$wildcard = true;
continue; //do parse excludes when we have a wildcard match (but check the other entries for exact matches first)
}
}
}
if (!$wildcard) {
unset($targets[$i]);
continue;
}
}
if (isset($target['exclude_repos']))
foreach ($target['exclude_repos'] as $match_string) {
$owner_repo_pair = explode('/', strtolower($match_string));
if (count($owner_repo_pair) != 2) {
log_error('Bad exclude repo: `'. $match_string.'`');
continue;
}
if (strtolower($owner) == $owner_repo_pair[0]) {
if (strtolower($repo) == $owner_repo_pair[1]) {
unset($targets[$i]);
continue 2;
}
if ($owner_repo_pair[1] == '*') {
if ($wildcard)
log_error('Identical wildcard include and exclude: `'.$match_string.'`. Excluding.');
unset($targets[$i]);
continue 2;
}
}
}
}
return $targets;
}
function game_announce($action, $payload, $pr_flags) {
global $servers;
$msg = '['.$payload['pull_request']['base']['repo']['full_name'].'] Pull Request '.$action.' by '.htmlSpecialChars($payload['sender']['login']).': <a href="'.$payload['pull_request']['html_url'].'">'.htmlSpecialChars('#'.$payload['pull_request']['number'].' '.$payload['pull_request']['user']['login'].' - '.$payload['pull_request']['title']).'</a>';
sendtoallservers('?announce='.urlencode($msg), $payload);
$game_servers = filter_announce_targets($servers, $payload['pull_request']['base']['repo']['owner']['login'], $payload['pull_request']['base']['repo']['name'], $action, $pr_flags);
$msg = '?announce='.urlencode($msg).'&payload='.urlencode(json_encode($payload));
foreach ($game_servers as $serverid => $server) {
$server_message = $msg;
if (isset($server['comskey']))
$server_message .= '&key='.urlencode($server['comskey']);
game_server_send($server['address'], $server['port'], $server_message);
}
}
function discord_announce($action, $payload, $pr_flags) {
global $discordWebHooks;
$color;
switch ($action) {
case 'reopened':
case 'opened':
$color = 0x2cbe4e;
break;
case 'closed':
$color = 0xcb2431;
break;
case 'merged':
$color = 0x6f42c1;
break;
default:
return;
}
$data = array(
'username' => 'GitHub',
'avatar_url' => $payload['pull_request']['base']['user']['avatar_url'],
);
$content = 'Pull Request #'.$payload['pull_request']['number'].' *'.$action.'* by '.discord_sanitize($payload['sender']['login'])."\n".discord_sanitize($payload['pull_request']['user']['login']).' - __**'.discord_sanitize($payload['pull_request']['title']).'**__'."\n".'<'.$payload['pull_request']['html_url'].'>';
$embeds = array(
array(
'title' => '__**'.discord_sanitize($payload['pull_request']['title'], S_MARKDOWN).'**__',
'description' => discord_sanitize(str_replace(array("\r\n", "\n"), array(' ', ' '), substr($payload['pull_request']['body'], 0, 320)), S_HTML_COMMENTS),
'url' => $payload['pull_request']['html_url'],
'color' => $color,
'author' => array(
'name' => discord_sanitize($payload['pull_request']['user']['login'], S_MARKDOWN),
'url' => $payload['pull_request']['user']['html_url'],
'icon_url' => $payload['pull_request']['user']['avatar_url']
),
'footer' => array(
'text' => '#'.$payload['pull_request']['number'].' '.discord_sanitize($payload['pull_request']['base']['repo']['full_name'], S_MARKDOWN).' '.discord_sanitize($payload['pull_request']['head']['ref'], S_MARKDOWN).' -> '.discord_sanitize($payload['pull_request']['base']['ref'], S_MARKDOWN),
'icon_url' => $payload['pull_request']['base']['user']['avatar_url']
)
)
);
$discordWebHook_targets = filter_announce_targets($discordWebHooks, $payload['pull_request']['base']['repo']['owner']['login'], $payload['pull_request']['base']['repo']['name'], $action, $pr_flags);
foreach ($discordWebHook_targets as $discordWebHook) {
$sending_data = $data;
if (isset($discordWebHook['embed']) && $discordWebHook['embed']) {
$sending_data['embeds'] = $embeds;
if (!isset($discordWebHook['no_text']) || !$discordWebHook['no_text'])
$sending_data['content'] = $content;
} else {
$sending_data['content'] = $content;
}
discord_webhook_send($discordWebHook['url'], $sending_data);
}
}
function discord_sanitize($text, $flags = S_MENTIONS|S_LINK_EMBED|S_MARKDOWN) {
if ($flags & S_MARKDOWN)
$text = str_ireplace(array('\\', '*', '_', '~', '`', '|'), (array('\\\\', '\\*', '\\_', '\\~', '\\`', '\\|')), $text);
if ($flags & S_HTML_COMMENTS)
$text = preg_replace('/<!--(.*)-->/Uis', '', $text);
if ($flags & S_MENTIONS)
$text = str_ireplace(array('@everyone', '@here', '<@'), array('`@everyone`', '`@here`', '@<'), $text);
if ($flags & S_LINK_EMBED)
$text = preg_replace("/((https?|ftp|byond)\:\/\/)([a-z0-9-.]*)\.([a-z]{2,3})(\:[0-9]{2,5})?(\/(?:[a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?/mi", '<$0>', $text);
return $text;
}
//creates a comment on the payload issue
function create_comment($payload, $comment){
apisend($payload['pull_request']['comments_url'], 'POST', json_encode(array('body' => $comment)));
github_apisend($payload['pull_request']['comments_url'], 'POST', json_encode(array('body' => $comment)));
}
//returns the payload issue's labels as a flat array
function get_pr_labels_array($payload){
$url = $payload['pull_request']['issue_url'] . '/labels';
$issue = json_decode(apisend($url), true);
$issue = json_decode(github_apisend($url), true);
$result = array();
foreach($issue as $l)
$result[] = $l['name'];
@@ -492,13 +679,13 @@ function is_maintainer($payload, $author){
$repo_is_org = $payload['pull_request']['base']['repo']['owner']['type'] == 'Organization';
if($maintainer_team_id == null || !$repo_is_org) {
$collaburl = str_replace('{/collaborator}', '/' . $author, $payload['pull_request']['base']['repo']['collaborators_url']) . '/permission';
$perms = json_decode(apisend($collaburl), true);
$perms = json_decode(github_apisend($collaburl), true);
$permlevel = $perms['permission'];
return $permlevel == 'admin' || $permlevel == 'write';
}
else {
$check_url = 'https://api.github.com/teams/' . $maintainer_team_id . '/memberships/' . $author;
$result = json_decode(apisend($check_url), true);
$result = json_decode(github_apisend($check_url), true);
return isset($result['state']) && $result['state'] == 'active';
}
}
@@ -530,7 +717,7 @@ $github_diff = null;
function get_diff($payload) {
global $github_diff;
if ($github_diff === null) {
if ($github_diff === null && $payload['pull_request']['diff_url']) {
//go to the diff url
$url = $payload['pull_request']['diff_url'];
$github_diff = file_get_contents($url);
@@ -597,7 +784,7 @@ function checkchangelog($payload, $compile = true) {
$foundcltag = false;
foreach ($body as $line) {
$line = trim($line);
if (substr($line,0,4) == ':cl:' || substr($line,0,1) == '🆑') {
if (substr($line,0,4) == ':cl:' || substr($line,0,1) == '??') {
$incltag = true;
$foundcltag = true;
$pos = strpos($line, " ");
@@ -607,7 +794,7 @@ function checkchangelog($payload, $compile = true) {
$username = $tmp;
}
continue;
} else if (substr($line,0,5) == '/:cl:' || substr($line,0,6) == '/ :cl:' || substr($line,0,5) == ':/cl:' || substr($line,0,5) == '/🆑' || substr($line,0,6) == '/ 🆑' ) {
} else if (substr($line,0,5) == '/:cl:' || substr($line,0,6) == '/ :cl:' || substr($line,0,5) == ':/cl:' || substr($line,0,5) == '/??' || substr($line,0,6) == '/ ??' ) {
$incltag = false;
$changelogbody = array_merge($changelogbody, $currentchangelogblock);
continue;
@@ -773,25 +960,10 @@ function checkchangelog($payload, $compile = true) {
);
$filename = '/html/changelogs/AutoChangeLog-pr-'.$payload['pull_request']['number'].'.yml';
echo apisend($payload['pull_request']['base']['repo']['url'].'/contents'.$filename, 'PUT', $content);
echo github_apisend($payload['pull_request']['base']['repo']['url'].'/contents'.$filename, 'PUT', $content);
}
function sendtoallservers($str, $payload = null) {
global $servers;
if (!empty($payload))
$str .= '&payload='.urlencode(json_encode($payload));
foreach ($servers as $serverid => $server) {
$msg = $str;
if (isset($server['comskey']))
$msg .= '&key='.urlencode($server['comskey']);
$rtn = export($server['address'], $server['port'], $msg);
echo "Server Number $serverid replied: $rtn\n";
}
}
function export($addr, $port, $str) {
function game_server_send($addr, $port, $str) {
// All queries must begin with a question mark (ie "?players")
if($str{0} != '?') $str = ('?' . $str);
+94 -14
View File
@@ -4,7 +4,6 @@
//Github lets you have it sign the message with a secret that you can validate. This prevents people from faking events.
//This var should match the secret you configured for this webhook on github.
//This is required as otherwise somebody could trick the script into leaking the api key.
$hookSecret = '08ajh0qj93209qj90jfq932j32r';
//Api key for pushing changelogs.
@@ -14,23 +13,12 @@ $apiKey = '209ab8d879c0f987d06a09b9d879c0f987d06a09b9d8787d0a089c';
//Used to prevent potential RCEs
$repoOwnerAndName = "tgstation/tgstation";
//servers to announce PRs to
$servers = array();
/*
$servers[0] = array();
$servers[0]['address'] = 'game.tgstation13.org';
$servers[0]['port'] = '1337';
$servers[0]['comskey'] = '89aj90cq2fm0amc90832mn9rm90';
$servers[1] = array();
$servers[1]['address'] = 'game.tgstation13.org';
$servers[1]['port'] = '2337';
$servers[1]['comskey'] = '89aj90cq2fm0amc90832mn9rm90';
*/
//Auto update settings
$enable_live_tracking = true; //auto update this file from the repository
$path_to_script = 'tools/WebhookProcessor/github_webhook_processor.php';
$tracked_branch = "master";
//PR balance settings.
$trackPRBalance = true; //set this to false to disable PR balance tracking
$prBalanceJson = ''; //Set this to the path you'd like the writable pr balance file to be stored, not setting it writes it to the working directory
$startingPRBalance = 5; //Starting balance for never before seen users
@@ -44,6 +32,7 @@ $maintainer_team_id = 133041; //org team id that is exempt from PR balance syste
// "org" - user has to have a pr merged in any repo in the organization (for repos owned directly by users, this applies to any repo directly owned by the same user.)
// "disable" - disables.
//defaults to org if left blank or given invalid values.
//This can also be ignored on a per webhook or per game server bases.
$validation = "org";
//how many merged prs must they have under the rules above to have their pr announced to the game servers.
@@ -51,3 +40,94 @@ $validation_count = 1;
//enforce changelogs on PRs
$require_changelogs = false;
/*
* Announcement Settings.
* Allows you to announce prs to discord webhooks or the game servers
*/
/* Common configs:
The following config items can be added to both game server and discord announcement endpoints. Simply replace the $servers part with $discordWebHooks:
include_repos - List of repos in owner/repo format to send to this endpoint. (defaults to all repos if not defined)
* can be given in place of repo to match all repos under an organization
$servers[$configitem]['include_repos'][] = "tgstation/*";
exclude_repos - List of repos in owner/repo format to not send to this endpoint.
* can be given in place of repo to match all repos under an organization
$servers[$configitem]['exclude_repos'][] = 'tgstation/TerraGov-Marine-Corps';
$servers[$configitem]['exclude_repos'][] = 'tgstation/tgstation13.org';
exclude_events - List of events to not announce, values: opened, closed, reopened, or merged
$servers[$configitem]['exclude_events'][] = 'closed';
$servers[$configitem]['exclude_events'][] = 'reopened';
announce_secret - Announce secret/security prs that have a [s] in front of the title? Defaults to no.
Can also be set to 'only' to only announce secret prs.
$servers[$configitem]['announce_secret'] = false;
$servers[$configitem]['announce_secret'] = 'only';
announce_unvalidated - Announce prs by unvalidated users (see the validation setting above)? Defaults to no.
Can also be set to 'only' to only announce prs by unvalidated users.
$servers[$configitem]['announce_unvalidated'] = false;
//Note: the same webhook or game server can be given in mutiple announce endpoints with different settings, allowing you to say, have embeds only show on prs to certain repos by excluding the repo in a endpoint with embed = false, and including the repo in a endpoint with embed = true true. This could also be used to only block closed and reopened events on prs by unvalidated users.
//Game servers to announce PRs to.
/*
$configitem = -1;//ignore me
//Game Server Start
$servers[++$configitem] = array();
$servers[$configitem]['address'] = 'game.tgstation13.org';
$servers[$configitem]['port'] = '1337';
$servers[$configitem]['comskey'] = '89aj90cq2fm0amc90832mn9rm90';
//Game Server End
//Game Server Start
$servers[++$configitem] = array();
$servers[$configitem]['address'] = 'game.tgstation13.org';
$servers[$configitem]['port'] = '2337';
$servers[$configitem]['comskey'] = '89aj90cq2fm0amc90832mn9rm90';
//Game Server End
unset($configitem);//ignore
*/
//discord webhooks to announce PRs to.
/*
$configitem = -1;//ignore me
//Discord Webhook Start
$discordWebHooks[++$configitem] = array();
// Webhook Url (you can get this from discord via the webhook setting menu of the server or a channel.)
$discordWebHooks[$configitem]['url'] = 'https://discordapp.com/api/webhooks/538933489920245771/xaoYtVuype-P1rb_uthQLkh_C4iVL3sjtIvFEp7rsfhbBs8tDsSJgE0a9MNWJaoSPBPK';
// show an embed with more info?
$discordWebHooks[$configitem]['embed'] = true;
// if the above is true, don't include the text portion before the embed.
// (This option is not advised as it's not compatible with users who disable embeds).
$discordWebHooks[$configitem]['no_text'] = false;
//Discord Webhook End
//Discord Webhook Start
$discordWebHooks[++$configitem] = array();
// Webhook Url (you can get this from discord via the webhook setting menu of the server or a channel.)
$discordWebHooks[$configitem]['url'] = 'https://discordapp.com/api/webhooks/538933686956064769/q0uDel7S6eutvRIyEwsuZo_ppzAoxqUNeU2PRChYVsYoJmmn2f2YYSDoMjy9FhhXKqpI';
// show an embed with more info?
$discordWebHooks[$configitem]['embed'] = true;
// if the above is true, don't include the text portion before the embed.
// (This option is not advised as it's not compatible with users who disable embeds).
$discordWebHooks[$configitem]['no_text'] = false;
//Discord Webhook End
*/
unset($configitem); //ignore
@@ -0,0 +1,4 @@
/obj/machinery/power/apc/@SUBTYPES{dir = 1} : @OLD{@OLD; pixel_y = 23}
/obj/machinery/power/apc/@SUBTYPES{dir = 2} : @OLD{@OLD; pixel_y = -23}
/obj/machinery/power/apc/@SUBTYPES{dir = 4} : @OLD{@OLD; pixel_x = 24}
/obj/machinery/power/apc/@SUBTYPES{dir = 8} : @OLD{@OLD; pixel_x = -25}
@@ -0,0 +1,30 @@
/obj/effect/turf_decal/stripes/corner {dir=1} : /obj/item/bear_armor {@OLD;dir=8}
/obj/effect/turf_decal/stripes/corner {dir=2} : /obj/effect/turf_decal/stripes/corner {@OLD;dir=@SKIP}
/obj/effect/turf_decal/stripes/corner {dir=4} : /obj/effect/turf_decal/stripes/corner {@OLD;dir=1}
/obj/effect/turf_decal/stripes/corner {dir=8} : /obj/effect/turf_decal/stripes/corner {@OLD;dir=4}
/obj/item/bear_armor {dir=8} : /obj/effect/turf_decal/stripes/corner {@OLD}
/obj/effect/turf_decal/stripes/red/corner {dir=1} : /obj/item/bear_armor {@OLD;dir=8}
/obj/effect/turf_decal/stripes/red/corner {dir=2} : /obj/effect/turf_decal/stripes/red/corner {@OLD;dir=@SKIP}
/obj/effect/turf_decal/stripes/red/corner {dir=4} : /obj/effect/turf_decal/stripes/red/corner {@OLD;dir=1}
/obj/effect/turf_decal/stripes/red/corner {dir=8} : /obj/effect/turf_decal/stripes/red/corner {@OLD;dir=4}
/obj/item/bear_armor {dir=8} : /obj/effect/turf_decal/stripes/red/corner {@OLD}
/obj/effect/turf_decal/stripes/white/corner {dir=1} : /obj/item/bear_armor {@OLD;dir=8}
/obj/effect/turf_decal/stripes/white/corner {dir=2} : /obj/effect/turf_decal/stripes/white/corner {@OLD;dir=@SKIP}
/obj/effect/turf_decal/stripes/white/corner {dir=4} : /obj/effect/turf_decal/stripes/white/corner {@OLD;dir=1}
/obj/effect/turf_decal/stripes/white/corner {dir=8} : /obj/effect/turf_decal/stripes/white/corner {@OLD;dir=4}
/obj/item/bear_armor {dir=8} : /obj/effect/turf_decal/stripes/white/corner {@OLD}
/obj/effect/turf_decal/box/corners {dir=1} : /obj/item/bear_armor {@OLD;dir=8}
/obj/effect/turf_decal/box/corners {dir=2} : /obj/effect/turf_decal/box/corners {@OLD;dir=@SKIP}
/obj/effect/turf_decal/box/corners {dir=4} : /obj/effect/turf_decal/box/corners {@OLD;dir=1}
/obj/effect/turf_decal/box/corners {dir=8} : /obj/effect/turf_decal/box/corners {@OLD;dir=4}
/obj/item/bear_armor {dir=8} : /obj/effect/turf_decal/box/corners {@OLD}
/obj/effect/turf_decal/box/red/corners {dir=1} : /obj/item/bear_armor {@OLD;dir=8}
/obj/effect/turf_decal/box/red/corners {dir=2} : /obj/effect/turf_decal/box/red/corners {@OLD;dir=@SKIP}
/obj/effect/turf_decal/box/red/corners {dir=4} : /obj/effect/turf_decal/box/red/corners {@OLD;dir=1}
/obj/effect/turf_decal/box/red/corners {dir=8} : /obj/effect/turf_decal/box/red/corners {@OLD;dir=4}
/obj/item/bear_armor {dir=8} : /obj/effect/turf_decal/box/red/corners {@OLD}
/obj/effect/turf_decal/box/white/corners {dir=1} : /obj/item/bear_armor {@OLD;dir=8}
/obj/effect/turf_decal/box/white/corners {dir=2} : /obj/effect/turf_decal/box/white/corners {@OLD;dir=@SKIP}
/obj/effect/turf_decal/box/white/corners {dir=4} : /obj/effect/turf_decal/box/white/corners {@OLD;dir=1}
/obj/effect/turf_decal/box/white/corners {dir=8} : /obj/effect/turf_decal/box/white/corners {@OLD;dir=4}
/obj/item/bear_armor {dir=8} : /obj/effect/turf_decal/box/white/corners {@OLD}
+1 -1
View File
@@ -1,3 +1,3 @@
pygit2==0.26.0
pygit2==0.27.2
bidict==0.13.1
Pillow==5.1.0
+24 -11
View File
@@ -23,14 +23,14 @@ Old paths properties:
"""
default_map_directory = "../../_maps"
replacement_re = re.compile('\s*([^{]*)\s*(\{(.*)\})?')
replacement_re = re.compile(r'\s*(?P<path>[^{]*)\s*(\{(?P<props>.*)\})?')
#urgent todo: replace with actual parser, this is slow as janitor in crit
split_re = re.compile('((?:[A-Za-z0-9_\-$]+)\s*=\s*(?:"(?:.+?)"|[^";]*)|@OLD)')
split_re = re.compile(r'((?:[A-Za-z0-9_\-$]+)\s*=\s*(?:"(?:.+?)"|[^";]*)|@OLD)')
def props_to_string(props):
return "{{{0}}}".format(";".join([k+" = "+props[k] for k in props]))
return "{{{}}}".format(";".join([f"{k} = {v}" for k, v in props.items()]))
def string_to_props(propstring, verbose = False):
@@ -48,8 +48,8 @@ def string_to_props(propstring, verbose = False):
def parse_rep_string(replacement_string, verbose = False):
# translates /blah/blah {meme = "test",} into path,prop dictionary tuple
match = re.match(replacement_re, replacement_string)
path = match.group(1)
props = match.group(3)
path = match['path']
props = match['props']
if props:
prop_dict = string_to_props(props, verbose)
else:
@@ -65,9 +65,18 @@ def update_path(dmm_data, replacement_string, verbose=False):
new_path, new_path_props = parse_rep_string(replacement_def, verbose)
new_paths.append((new_path, new_path_props))
subtypes = ""
if old_path.endswith("/@SUBTYPES"):
old_path = old_path[:-len("/@SUBTYPES")]
if verbose:
print("Looking for subtypes of", old_path)
subtypes = r"(?:/\w+)*"
replacement_pattern = re.compile(rf"(?P<path>{re.escape(old_path)}{subtypes})\s*(:?{{(?P<props>.*)}})?$")
def replace_def(match):
if match.group(2):
old_props = string_to_props(match.group(2), verbose)
if match['props']:
old_props = string_to_props(match['props'], verbose)
else:
old_props = dict()
for filter_prop in old_path_props:
@@ -83,7 +92,10 @@ def update_path(dmm_data, replacement_string, verbose=False):
print("Found match : {0}".format(match.group(0)))
out_paths = []
for new_path, new_props in new_paths:
out = new_path
if new_path == "@OLD":
out = match.group('path')
else:
out = new_path
out_props = dict()
for prop_name, prop_value in new_props.items():
if prop_name == "@OLD":
@@ -106,10 +118,9 @@ def update_path(dmm_data, replacement_string, verbose=False):
return out_paths
def get_result(element):
p = re.compile("{0}\s*({{(.*)}})?$".format(re.escape(old_path)))
match = p.match(element)
match = replacement_pattern.match(element)
if match:
return replace_def(match) # = re.sub(p,replace_def,element)
return replace_def(match)
else:
return [element]
@@ -141,10 +152,12 @@ def update_all_maps(map_directory, updates, verbose=False):
def main(args):
if args.inline:
print("Using replacement:", args.update_source)
updates = [args.update_source]
else:
with open(args.update_source) as f:
updates = [line for line in f if line and not line.startswith("#") and not line.isspace()]
print(f"Using {len(updates)} replacements from file:", args.update_source)
if args.map:
update_map(args.map, updates, verbose=args.verbose)
+10 -7
View File
@@ -1,9 +1,13 @@
#!/bin/sh
#!/bin/bash
set -e
#load dep exports
. "$1/dependencies.sh"
#need to switch to game dir for Dockerfile weirdness
original_dir=$PWD
cd $1
. dependencies.sh
cd $original_dir
#find out what we have (+e is important for this)
set +e
@@ -64,7 +68,6 @@ fi
echo "Deploying rust-g..."
cd rust-g
git clean -fxd
git checkout $RUST_G_VERSION
~/.cargo/bin/cargo build --release
mv target/release/librust_g.so $1/rust_g
@@ -72,10 +75,9 @@ cd ..
echo "Deploying BSQL..."
cd BSQL
git clean -fxd
git checkout $BSQL_VERSION
mkdir mysql
mkdir artifacts
mkdir -p mysql
mkdir -p artifacts
cd artifacts
cmake .. -DCMAKE_CXX_COMPILER=g++-6 -DMARIA_LIBRARY=/usr/lib/i386-linux-gnu/libmariadb.so.2
make
@@ -92,6 +94,7 @@ shopt -s extglob dotglob
mv !(build) build
shopt -u dotglob
chmod +x build/tools/deploy.sh
build/tools/deploy.sh $1 $1/build
rm -rf build
rm -rf build
+2 -835
View File
@@ -1,836 +1,3 @@
@echo off
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="dns-prefetch" href="https://assets-cdn.github.com">
<link rel="dns-prefetch" href="https://avatars0.githubusercontent.com">
<link rel="dns-prefetch" href="https://avatars1.githubusercontent.com">
<link rel="dns-prefetch" href="https://avatars2.githubusercontent.com">
<link rel="dns-prefetch" href="https://avatars3.githubusercontent.com">
<link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
<link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
<link crossorigin="anonymous" media="all" integrity="sha512-1FLfhli3wF1EqKy4+DmsB7My96mQ71ZtDpkmg/2A8RP+5uDgJ0zAT8sRDwSG0p75xQjd9aMIVb58gpjhC//ngA==" rel="stylesheet" href="https://assets-cdn.github.com/assets/frameworks-dcca19dafecb17dea634d2f083dc7f9f.css" />
<link crossorigin="anonymous" media="all" integrity="sha512-ERzCrxQ9/KT3hsH+BMLLRcbwQp3/xat+ZqZrlySbC6YsUxwYAAGOf+5SpbATykqQxh1+B/Wz0kSpYnpdaff/tg==" rel="stylesheet" href="https://assets-cdn.github.com/assets/github-77ae44d8225d1c06908f977e09b0adab.css" />
<meta name="viewport" content="width=device-width">
<title>tgstation/PreSynchronize.bat at cd924de80da882d14fb15f3f0f21102b8c8e7c45 · tgstation/tgstation</title>
<meta name="description" content="the /tg/station branch of SS13. Contribute to tgstation/tgstation development by creating an account on GitHub.">
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub">
<link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub">
<meta property="fb:app_id" content="1401488693436528">
<meta property="og:image" content="https://avatars3.githubusercontent.com/u/1363778?s=400&amp;v=4" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="tgstation/tgstation" /><meta property="og:url" content="https://github.com/tgstation/tgstation" /><meta property="og:description" content="the /tg/station branch of SS13. Contribute to tgstation/tgstation development by creating an account on GitHub." />
<link rel="assets" href="https://assets-cdn.github.com/">
<link rel="web-socket" href="wss://live.github.com/_sockets/VjI6MzE0ODI1MTk1OmViYzlkZGNjNDZhYmMwMzY4YmJjYjFjZTRmZmZiZDg4YzA0ZjY4OGYxOTY0ODRkM2E5MzM2ODczYTIzNmVhM2M=--6c2d8ca39301e29fe1ef68370c138180226f4b09">
<meta name="pjax-timeout" content="1000">
<link rel="sudo-modal" href="/sessions/sudo_modal">
<meta name="request-id" content="ECE5:46C6:172CF08:223ED1E:5BA4903B" data-pjax-transient>
<meta name="selected-link" value="repo_source" data-pjax-transient>
<meta name="google-site-verification" content="KT5gs8h0wvaagLKAVWq8bbeNwnZZK1r1XQysX3xurLU">
<meta name="google-site-verification" content="ZzhVyEFwb7w3e0-uOTltm8Jsck2F5StVihD0exw2fsA">
<meta name="google-site-verification" content="GXs5KoUUkNCoaAZn7wPN-t01Pywp9M3sEjnt_3_ZWPc">
<meta name="octolytics-host" content="collector.githubapp.com" /><meta name="octolytics-app-id" content="github" /><meta name="octolytics-event-url" content="https://collector.githubapp.com/github-external/browser_event" /><meta name="octolytics-dimension-request_id" content="ECE5:46C6:172CF08:223ED1E:5BA4903B" /><meta name="octolytics-dimension-region_edge" content="iad" /><meta name="octolytics-dimension-region_render" content="iad" /><meta name="octolytics-actor-id" content="6293118" /><meta name="octolytics-actor-login" content="Poojawa" /><meta name="octolytics-actor-hash" content="a8cf3698b8dd6f5525fbe3f439daaa0c5b452070f8bb5e260d324a4837887888" />
<meta name="analytics-location" content="/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show" data-pjax-transient="true" />
<meta name="google-analytics" content="UA-3769691-2">
<meta class="js-ga-set" name="userId" content="dc57a225e44a4448758e8ceaed70b545" %>
<meta class="js-ga-set" name="dimension1" content="Logged In">
<meta name="hostname" content="github.com">
<meta name="user-login" content="Poojawa">
<meta name="expected-hostname" content="github.com">
<meta name="js-proxy-site-detection-payload" content="MGE2ODQ0MDAzOWUzZGY2NTk4N2I5ZTEyZTI1YzNiZDkwNzBmMjYwODU2ZDgzNWU3MGZlMzhiMGZmOTk4ODQxNnx7InJlbW90ZV9hZGRyZXNzIjoiNzEuOTAuMTY0LjExMSIsInJlcXVlc3RfaWQiOiJFQ0U1OjQ2QzY6MTcyQ0YwODoyMjNFRDFFOjVCQTQ5MDNCIiwidGltZXN0YW1wIjoxNTM3NTExNDg4LCJob3N0IjoiZ2l0aHViLmNvbSJ9">
<meta name="enabled-features" content="DASHBOARD_V2_LAYOUT_OPT_IN,EXPLORE_DISCOVER_REPOSITORIES,UNIVERSE_BANNER,MARKETPLACE_PLAN_RESTRICTION_EDITOR,MARKETPLACE_RETARGETING,QUOTE_MARKDOWN">
<meta name="html-safe-nonce" content="800ddeacd7ff9120efa459bbc42a092a76286025">
<meta http-equiv="x-pjax-version" content="7395d00cf82f905297bf628de3c71acd">
<link href="https://github.com/tgstation/tgstation/commits/cd924de80da882d14fb15f3f0f21102b8c8e7c45.atom" rel="alternate" title="Recent Commits to tgstation:cd924de80da882d14fb15f3f0f21102b8c8e7c45" type="application/atom+xml">
<meta name="go-import" content="github.com/tgstation/tgstation git https://github.com/tgstation/tgstation.git">
<meta name="octolytics-dimension-user_id" content="1363778" /><meta name="octolytics-dimension-user_login" content="tgstation" /><meta name="octolytics-dimension-repository_id" content="3234987" /><meta name="octolytics-dimension-repository_nwo" content="tgstation/tgstation" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="3234987" /><meta name="octolytics-dimension-repository_network_root_nwo" content="tgstation/tgstation" /><meta name="octolytics-dimension-repository_explore_github_marketplace_ci_cta_shown" content="false" />
<link rel="canonical" href="https://github.com/tgstation/tgstation/blob/cd924de80da882d14fb15f3f0f21102b8c8e7c45/tools/tgs4_scripts/PreSynchronize.bat" data-pjax-transient>
<meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats">
<meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors">
<link rel="mask-icon" href="https://assets-cdn.github.com/pinned-octocat.svg" color="#000000">
<link rel="icon" type="image/x-icon" class="js-site-favicon" href="https://assets-cdn.github.com/favicon.ico">
<meta name="theme-color" content="#1e2327">
<meta name="u2f-support" content="true">
<link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">
</head>
<body class="logged-in env-production page-blob">
<div class="position-relative js-header-wrapper ">
<a href="#start-of-content" tabindex="1" class="p-3 bg-blue text-white show-on-focus js-skip-to-content">Skip to content</a>
<div id="js-pjax-loader-bar" class="pjax-loader-bar"><div class="progress"></div></div>
<header class="Header f5" role="banner">
<div class="d-flex flex-justify-between px-3 container-lg">
<div class="d-flex flex-justify-between ">
<div class="">
<a class="header-logo-invertocat" href="https://github.com/" data-hotkey="g d" aria-label="Homepage" data-ga-click="Header, go to dashboard, icon:logo">
<svg height="32" class="octicon octicon-mark-github" viewBox="0 0 16 16" version="1.1" width="32" aria-hidden="true"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"/></svg>
</a>
</div>
</div>
<div class="HeaderMenu d-flex flex-justify-between flex-auto">
<div class="d-flex">
<div class="">
<div class="header-search scoped-search site-scoped-search js-site-search position-relative js-jump-to"
role="combobox"
aria-owns="jump-to-results"
aria-label="Search or jump to"
aria-haspopup="listbox"
aria-expanded="false"
>
<div class="position-relative">
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="js-site-search-form" data-scope-type="Repository" data-scope-id="3234987" data-scoped-search-url="/tgstation/tgstation/search" data-unscoped-search-url="/search" action="/tgstation/tgstation/search" accept-charset="UTF-8" method="get"><input name="utf8" type="hidden" value="&#x2713;" />
<label class="form-control header-search-wrapper header-search-wrapper-jump-to position-relative d-flex flex-justify-between flex-items-center js-chromeless-input-container">
<input type="text"
class="form-control header-search-input jump-to-field js-jump-to-field js-site-search-focus js-site-search-field is-clearable"
data-hotkey="s,/"
name="q"
value=""
placeholder="Search or jump to…"
data-unscoped-placeholder="Search or jump to…"
data-scoped-placeholder="Search or jump to…"
autocapitalize="off"
aria-autocomplete="list"
aria-controls="jump-to-results"
data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations#csrf-token=ty7nMXmfPxiycFyUIisR6hE3ePmISo7IrWYW+Yl9sgjLsHHa8HRAhk8O55AuGQZGgtHtz7vXphya+0Zzl5SfYw=="
spellcheck="false"
autocomplete="off"
>
<input type="hidden" class="js-site-search-type-field" name="type" >
<img src="https://assets-cdn.github.com/images/search-shortcut-hint.svg" alt="" class="mr-2 header-search-key-slash">
<div class="Box position-absolute overflow-hidden d-none jump-to-suggestions js-jump-to-suggestions-container">
<ul class="d-none js-jump-to-suggestions-template-container">
<li class="d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item" role="option">
<a tabindex="-1" class="no-underline d-flex flex-auto flex-items-center p-2 jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open" href="">
<div class="jump-to-octicon js-jump-to-octicon mr-2 text-center d-none">
<svg height="16" width="16" class="octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none" title="Repository" aria-label="Repository" viewBox="0 0 12 16" version="1.1" role="img"><path fill-rule="evenodd" d="M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z"/></svg>
<svg height="16" width="16" class="octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none" title="Project" aria-label="Project" viewBox="0 0 15 16" version="1.1" role="img"><path fill-rule="evenodd" d="M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h13a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1z"/></svg>
<svg height="16" width="16" class="octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none" title="Search" aria-label="Search" viewBox="0 0 16 16" version="1.1" role="img"><path fill-rule="evenodd" d="M15.7 13.3l-3.81-3.83A5.93 5.93 0 0 0 13 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 0 0 0-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z"/></svg>
</div>
<img class="avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none" alt="" aria-label="Team" src="" width="28" height="28">
<div class="jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target">
</div>
<div class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search">
<span class="js-jump-to-badge-search-text-default d-none" aria-label="in this repository">
In this repository
</span>
<span class="js-jump-to-badge-search-text-global d-none" aria-label="in all of GitHub">
All GitHub
</span>
<span aria-hidden="true" class="d-inline-block ml-1 v-align-middle"></span>
</div>
<div aria-hidden="true" class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump">
Jump to
<span class="d-inline-block ml-1 v-align-middle"></span>
</div>
</a>
</li>
</ul>
<ul class="d-none js-jump-to-no-results-template-container">
<li class="d-flex flex-justify-center flex-items-center p-3 f5 d-none">
<span class="text-gray">No suggested jump to results</span>
</li>
</ul>
<ul id="jump-to-results" role="listbox" class="js-navigation-container jump-to-suggestions-results-container js-jump-to-suggestions-results-container" >
<li class="d-flex flex-justify-center flex-items-center p-0 f5">
<img src="https://assets-cdn.github.com/images/spinners/octocat-spinner-128.gif" alt="Octocat Spinner Icon" class="m-2" width="28">
</li>
</ul>
</div>
</label>
</form> </div>
</div>
</div>
<ul class="d-flex pl-2 flex-items-center text-bold list-style-none" role="navigation">
<li>
<a class="js-selected-navigation-item HeaderNavlink px-2" data-hotkey="g p" data-ga-click="Header, click, Nav menu - item:pulls context:user" aria-label="Pull requests you created" data-selected-links="/pulls /pulls/assigned /pulls/mentioned /pulls" href="/pulls">
Pull requests
</a> </li>
<li>
<a class="js-selected-navigation-item HeaderNavlink px-2" data-hotkey="g i" data-ga-click="Header, click, Nav menu - item:issues context:user" aria-label="Issues you created" data-selected-links="/issues /issues/assigned /issues/mentioned /issues" href="/issues">
Issues
</a> </li>
<li>
<a class="js-selected-navigation-item HeaderNavlink px-2" data-ga-click="Header, click, Nav menu - item:marketplace context:user" data-octo-click="marketplace_click" data-octo-dimensions="location:nav_bar" data-selected-links=" /marketplace" href="/marketplace">
Marketplace
</a> </li>
<li>
<a class="js-selected-navigation-item HeaderNavlink px-2" data-ga-click="Header, click, Nav menu - item:explore" data-selected-links="/explore /trending /trending/developers /integrations /integrations/feature/code /integrations/feature/collaborate /integrations/feature/ship showcases showcases_search showcases_landing /explore" href="/explore">
Explore
</a> </li>
</ul>
</div>
<div class="d-flex">
<ul class="user-nav d-flex flex-items-center list-style-none" id="user-links">
<li class="dropdown">
<span class="d-inline-block px-2">
<a aria-label="You have no unread notifications" class="notification-indicator tooltipped tooltipped-s js-socket-channel js-notification-indicator" data-hotkey="g n" data-ga-click="Header, go to notifications, icon:read" data-channel="notification-changed:6293118" href="/notifications">
<span class="mail-status "></span>
<svg class="octicon octicon-bell" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M13.99 11.991v1H0v-1l.73-.58c.769-.769.809-2.547 1.189-4.416.77-3.767 4.077-4.996 4.077-4.996 0-.55.45-1 .999-1 .55 0 1 .45 1 1 0 0 3.387 1.229 4.156 4.996.38 1.879.42 3.657 1.19 4.417l.659.58h-.01zM6.995 15.99c1.11 0 1.999-.89 1.999-1.999H4.996c0 1.11.89 1.999 1.999 1.999z"/></svg>
</a>
</span>
</li>
<li class="dropdown">
<details class="details-overlay details-reset d-flex px-2 flex-items-center">
<summary class="HeaderNavlink"
aria-label="Create new…"
data-ga-click="Header, create new, icon:add">
<svg class="octicon octicon-plus float-left mr-1 mt-1" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 9H7v5H5V9H0V7h5V2h2v5h5v2z"/></svg>
<span class="dropdown-caret mt-1"></span>
</summary>
<details-menu class="dropdown-menu dropdown-menu-sw">
<a role="menuitem" class="dropdown-item" href="/new" data-ga-click="Header, create new repository">
New repository
</a>
<a role="menuitem" class="dropdown-item" href="/new/import" data-ga-click="Header, import a repository">
Import repository
</a>
<a role="menuitem" class="dropdown-item" href="https://gist.github.com/" data-ga-click="Header, create new gist">
New gist
</a>
<a role="menuitem" class="dropdown-item" href="/organizations/new" data-ga-click="Header, create new organization">
New organization
</a>
<div class="dropdown-divider"></div>
<div class="dropdown-header">
<span title="tgstation/tgstation">This repository</span>
</div>
<a role="menuitem" class="dropdown-item" href="/tgstation/tgstation/issues/new/choose" data-ga-click="Header, create new issue">
New issue
</a>
</details-menu>
</details>
</li>
<li class="dropdown">
<details class="details-overlay details-reset d-flex pl-2 flex-items-center">
<summary class="HeaderNavlink name mt-1"
aria-label="View profile and more"
data-ga-click="Header, show menu, icon:avatar">
<img alt="@Poojawa" class="avatar float-left mr-1" src="https://avatars0.githubusercontent.com/u/6293118?s=40&amp;v=4" height="20" width="20">
<span class="dropdown-caret"></span>
</summary>
<details-menu class="dropdown-menu dropdown-menu-sw">
<ul>
<li class="header-nav-current-user css-truncate"><a role="menuitem" class="no-underline user-profile-link px-3 pt-2 pb-2 mb-n2 mt-n1 d-block" href="/Poojawa" data-ga-click="Header, go to profile, text:Signed in as">Signed in as <strong class="css-truncate-target">Poojawa</strong></a></li>
<li class="dropdown-divider"></li>
<li><a role="menuitem" class="dropdown-item" href="/Poojawa" data-ga-click="Header, go to profile, text:your profile">Your profile</a></li>
<li><a role="menuitem" class="dropdown-item" href="/Poojawa?tab=repositories" data-ga-click="Header, go to repositories, text:your repositories">Your repositories</a></li>
<li><a role="menuitem" class="dropdown-item" href="/Poojawa?tab=stars" data-ga-click="Header, go to starred repos, text:your stars">Your stars</a></li>
<li><a role="menuitem" class="dropdown-item" href="https://gist.github.com/" data-ga-click="Header, your gists, text:your gists">Your gists</a></li>
<li class="dropdown-divider"></li>
<li><a role="menuitem" class="dropdown-item" href="https://help.github.com" data-ga-click="Header, go to help, text:help">Help</a></li>
<li><a role="menuitem" class="dropdown-item" href="/settings/profile" data-ga-click="Header, go to settings, icon:settings">Settings</a></li>
<li>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="logout-form" action="/logout" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="cwrBqlTqFi+7rjGuKuZTGeisJsfoD/PVfY3vlteOGawSJBzpAoXol32aBNzCIR2dPnIv0ITxkleelObSwVvy4g==" />
<button type="submit" class="dropdown-item dropdown-signout" data-ga-click="Header, sign out, icon:logout" role="menuitem">
Sign out
</button>
</form> </li>
</ul>
</details-menu>
</details>
</li>
</ul>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="sr-only right-0" action="/logout" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="ceLUe4rJix7QsRS5MywXBuaCJLelJjqq74Vr4Y94yksQzAk43KZ1phaFIcvb61mCMFwtoMnYWygMnGKlma0hBQ==" />
<button type="submit" class="dropdown-item dropdown-signout" data-ga-click="Header, sign out, icon:logout">
Sign out
</button>
</form> </div>
</div>
</div>
</header>
</div>
<div id="start-of-content" class="show-on-focus"></div>
<div id="js-flash-container">
</div>
<div role="main" class="application-main ">
<div itemscope itemtype="http://schema.org/SoftwareSourceCode" class="">
<div id="js-repo-pjax-container" data-pjax-container >
<div class="pagehead repohead instapaper_ignore readability-menu experiment-repo-nav ">
<div class="repohead-details-container clearfix container">
<ul class="pagehead-actions">
<li>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form data-autosubmit="true" data-remote="true" class="js-social-container" action="/notifications/subscribe" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="GAE/NpD6hiRnB53T97m9a3Hk6JBNlCsIOU7jEmehyc5an3j5s6cux9UuA0s5D233KATaWbOUgOIb5POzhhqc0A==" /> <input type="hidden" name="repository_id" id="repository_id" value="3234987" class="form-control" />
<div class="select-menu js-menu-container js-select-menu">
<a href="/tgstation/tgstation/subscription"
class="btn btn-sm btn-with-count select-menu-button js-menu-target"
role="button"
aria-haspopup="true"
aria-expanded="false"
aria-label="Toggle repository notifications menu"
data-ga-click="Repository, click Watch settings, action:blob#show">
<span class="js-select-button">
<svg class="octicon octicon-eye v-align-text-bottom" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z"/></svg>
Watch
</span>
</a>
<a class="social-count js-social-count"
href="/tgstation/tgstation/watchers"
aria-label="104 users are watching this repository">
104
</a>
<div class="select-menu-modal-holder">
<div class="select-menu-modal subscription-menu-modal js-menu-content">
<div class="select-menu-header js-navigation-enable" tabindex="-1">
<svg class="octicon octicon-x js-menu-close" role="img" aria-label="Close" viewBox="0 0 12 16" version="1.1" width="12" height="16"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z"/></svg>
<span class="select-menu-title">Notifications</span>
</div>
<div class="select-menu-list js-navigation-container" role="menu">
<div class="select-menu-item js-navigation-item selected" role="menuitem" tabindex="0">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<div class="select-menu-item-text">
<input type="radio" name="do" id="do_included" value="included" checked="checked" />
<span class="select-menu-item-heading">Not watching</span>
<span class="description">Be notified when participating or @mentioned.</span>
<span class="js-select-button-text hidden-select-button-text">
<svg class="octicon octicon-eye v-align-text-bottom" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z"/></svg>
Watch
</span>
</div>
</div>
<div class="select-menu-item js-navigation-item " role="menuitem" tabindex="0">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<div class="select-menu-item-text">
<input type="radio" name="do" id="do_subscribed" value="subscribed" />
<span class="select-menu-item-heading">Watching</span>
<span class="description">Be notified of all conversations.</span>
<span class="js-select-button-text hidden-select-button-text">
<svg class="octicon octicon-eye v-align-text-bottom" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z"/></svg>
Unwatch
</span>
</div>
</div>
<div class="select-menu-item js-navigation-item " role="menuitem" tabindex="0">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<div class="select-menu-item-text">
<input type="radio" name="do" id="do_ignore" value="ignore" />
<span class="select-menu-item-heading">Ignoring</span>
<span class="description">Never be notified.</span>
<span class="js-select-button-text hidden-select-button-text">
<svg class="octicon octicon-mute v-align-text-bottom" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8 2.81v10.38c0 .67-.81 1-1.28.53L3 10H1c-.55 0-1-.45-1-1V7c0-.55.45-1 1-1h2l3.72-3.72C7.19 1.81 8 2.14 8 2.81zm7.53 3.22l-1.06-1.06-1.97 1.97-1.97-1.97-1.06 1.06L11.44 8 9.47 9.97l1.06 1.06 1.97-1.97 1.97 1.97 1.06-1.06L13.56 8l1.97-1.97z"/></svg>
Stop ignoring
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
</li>
<li>
<div class="js-toggler-container js-social-container starring-container ">
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="starred js-social-form" action="/tgstation/tgstation/unstar" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="U3s3LUPoTj+ctA71daHiKOKz7pMSNnnbBpxdETWtik9+T0H5o8eL6df09xbw9gPa/H/iQkEaZJVeQNQmGx1KiA==" />
<input type="hidden" name="context" value="repository"></input>
<button
type="submit"
class="btn btn-sm btn-with-count js-toggler-target"
aria-label="Unstar this repository" title="Unstar tgstation/tgstation"
data-ga-click="Repository, click unstar button, action:blob#show; text:Unstar">
<svg class="octicon octicon-star v-align-text-bottom" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M14 6l-4.9-.64L7 1 4.9 5.36 0 6l3.6 3.26L2.67 14 7 11.67 11.33 14l-.93-4.74L14 6z"/></svg>
Unstar
</button>
<a class="social-count js-social-count" href="/tgstation/tgstation/stargazers"
aria-label="559 users starred this repository">
559
</a>
</form>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="unstarred js-social-form" action="/tgstation/tgstation/star" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="7nKJrPPubPmXraI10d9ZdN9nRAfBRc5b6BtK/YDHuPQQnAFlXXHcDkDMhVfBPeuk5t7deBFANYAqDszsfNycGw==" />
<input type="hidden" name="context" value="repository"></input>
<button
type="submit"
class="btn btn-sm btn-with-count js-toggler-target"
aria-label="Star this repository" title="Star tgstation/tgstation"
data-ga-click="Repository, click star button, action:blob#show; text:Star">
<svg class="octicon octicon-star v-align-text-bottom" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M14 6l-4.9-.64L7 1 4.9 5.36 0 6l3.6 3.26L2.67 14 7 11.67 11.33 14l-.93-4.74L14 6z"/></svg>
Star
</button>
<a class="social-count js-social-count" href="/tgstation/tgstation/stargazers"
aria-label="559 users starred this repository">
559
</a>
</form> </div>
</li>
<li>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="btn-with-count" action="/tgstation/tgstation/fork" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="io7K9+cnF7sFzTP/xobVmyU3QrSkDd3fNv9kqgUsf9xue59F6iKps9pgBWcDkzDPK/135PTAX9SgNnbfDQvJUA==" />
<button
type="submit"
class="btn btn-sm btn-with-count"
data-ga-click="Repository, show fork modal, action:blob#show; text:Fork"
title="Fork your own copy of tgstation/tgstation to your account"
aria-label="Fork your own copy of tgstation/tgstation to your account">
<svg class="octicon octicon-repo-forked v-align-text-bottom" viewBox="0 0 10 16" version="1.1" width="10" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8 1a1.993 1.993 0 0 0-1 3.72V6L5 8 3 6V4.72A1.993 1.993 0 0 0 2 1a1.993 1.993 0 0 0-1 3.72V6.5l3 3v1.78A1.993 1.993 0 0 0 5 15a1.993 1.993 0 0 0 1-3.72V9.5l3-3V4.72A1.993 1.993 0 0 0 8 1zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3 10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3-10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z"/></svg>
Fork
</button>
</form>
<a href="/tgstation/tgstation/network/members" class="social-count"
aria-label="1916 users forked this repository">
1,916
</a>
</li>
</ul>
<h1 class="public ">
<svg class="octicon octicon-repo" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z"/></svg>
<span class="author" itemprop="author"><a class="url fn" rel="author" href="/tgstation">tgstation</a></span><!--
--><span class="path-divider">/</span><!--
--><strong itemprop="name"><a data-pjax="#js-repo-pjax-container" href="/tgstation/tgstation">tgstation</a></strong>
</h1>
</div>
<nav class="reponav js-repo-nav js-sidenav-container-pjax container"
itemscope
itemtype="http://schema.org/BreadcrumbList"
role="navigation"
data-pjax="#js-repo-pjax-container">
<span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
<a class="js-selected-navigation-item selected reponav-item" itemprop="url" data-hotkey="g c" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages /tgstation/tgstation" href="/tgstation/tgstation">
<svg class="octicon octicon-code" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M9.5 3L8 4.5 11.5 8 8 11.5 9.5 13 14 8 9.5 3zm-5 0L0 8l4.5 5L6 11.5 2.5 8 6 4.5 4.5 3z"/></svg>
<span itemprop="name">Code</span>
<meta itemprop="position" content="1">
</a> </span>
<span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
<a itemprop="url" data-hotkey="g i" class="js-selected-navigation-item reponav-item" data-selected-links="repo_issues repo_labels repo_milestones /tgstation/tgstation/issues" href="/tgstation/tgstation/issues">
<svg class="octicon octicon-issue-opened" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"/></svg>
<span itemprop="name">Issues</span>
<span class="Counter">1,310</span>
<meta itemprop="position" content="2">
</a> </span>
<span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
<a data-hotkey="g p" itemprop="url" class="js-selected-navigation-item reponav-item" data-selected-links="repo_pulls checks /tgstation/tgstation/pulls" href="/tgstation/tgstation/pulls">
<svg class="octicon octicon-git-pull-request" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0 0 10 15a1.993 1.993 0 0 0 1-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 0 0-1 3.72v6.56A1.993 1.993 0 0 0 2 15a1.993 1.993 0 0 0 1-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z"/></svg>
<span itemprop="name">Pull requests</span>
<span class="Counter">39</span>
<meta itemprop="position" content="3">
</a> </span>
<a data-hotkey="g b" class="js-selected-navigation-item reponav-item" data-selected-links="repo_projects new_repo_project repo_project /tgstation/tgstation/projects" href="/tgstation/tgstation/projects">
<svg class="octicon octicon-project" viewBox="0 0 15 16" version="1.1" width="15" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h13a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1z"/></svg>
Projects
<span class="Counter" >7</span>
</a>
<a class="js-selected-navigation-item reponav-item" data-hotkey="g w" data-selected-links="repo_wiki /tgstation/tgstation/wiki" href="/tgstation/tgstation/wiki">
<svg class="octicon octicon-book" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M3 5h4v1H3V5zm0 3h4V7H3v1zm0 2h4V9H3v1zm11-5h-4v1h4V5zm0 2h-4v1h4V7zm0 2h-4v1h4V9zm2-6v9c0 .55-.45 1-1 1H9.5l-1 1-1-1H2c-.55 0-1-.45-1-1V3c0-.55.45-1 1-1h5.5l1 1 1-1H15c.55 0 1 .45 1 1zm-8 .5L7.5 3H2v9h6V3.5zm7-.5H9.5l-.5.5V12h6V3z"/></svg>
Wiki
</a>
<a class="js-selected-navigation-item reponav-item" data-selected-links="repo_graphs repo_contributors dependency_graph pulse /tgstation/tgstation/pulse" href="/tgstation/tgstation/pulse">
<svg class="octicon octicon-graph" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M16 14v1H0V0h1v14h15zM5 13H3V8h2v5zm4 0H7V3h2v10zm4 0h-2V6h2v7z"/></svg>
Insights
</a>
</nav>
</div>
<div class="container new-discussion-timeline experiment-repo-nav ">
<div class="repository-content ">
<a class="d-none js-permalink-shortcut" data-hotkey="y" href="/tgstation/tgstation/blob/cd924de80da882d14fb15f3f0f21102b8c8e7c45/tools/tgs4_scripts/PreSynchronize.bat">Permalink</a>
<!-- blob contrib key: blob_contributors:v21:a8af3c52c671641b9648cd2fb87b6033 -->
<div class="file-navigation">
<div class="select-menu branch-select-menu js-menu-container js-select-menu float-left">
<button class=" btn btn-sm select-menu-button js-menu-target css-truncate" data-hotkey="w"
type="button" aria-label="Switch branches or tags" aria-expanded="false" aria-haspopup="true">
<i>Tree:</i>
<span class="js-select-button css-truncate-target">cd924de80d</span>
</button>
<div class="select-menu-modal-holder js-menu-content js-navigation-container" data-pjax>
<div class="select-menu-modal">
<div class="select-menu-header">
<svg class="octicon octicon-x js-menu-close" role="img" aria-label="Close" viewBox="0 0 12 16" version="1.1" width="12" height="16"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z"/></svg>
<span class="select-menu-title">Switch branches/tags</span>
</div>
<div class="select-menu-filters">
<div class="select-menu-text-filter">
<input type="text" aria-label="Filter branches/tags" id="context-commitish-filter-field" class="form-control js-filterable-field js-navigation-enable" placeholder="Filter branches/tags">
</div>
<div class="select-menu-tabs">
<ul>
<li class="select-menu-tab">
<a href="#" data-tab-filter="branches" data-filter-placeholder="Filter branches/tags" class="js-select-menu-tab" role="tab">Branches</a>
</li>
<li class="select-menu-tab">
<a href="#" data-tab-filter="tags" data-filter-placeholder="Find a tag…" class="js-select-menu-tab" role="tab">Tags</a>
</li>
</ul>
</div>
</div>
<div class="select-menu-list select-menu-tab-bucket js-select-menu-tab-bucket" data-tab-filter="branches" role="menu">
<div data-filterable-for="context-commitish-filter-field" data-filterable-type="substring">
<a class="select-menu-item js-navigation-item js-navigation-open "
href="/tgstation/tgstation/blob/master/tools/tgs4_scripts/PreSynchronize.bat"
data-name="master"
data-skip-pjax="true"
rel="nofollow">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<span class="select-menu-item-text css-truncate-target js-select-menu-filter-text">
master
</span>
</a>
</div>
<div class="select-menu-no-results">Nothing to show</div>
</div>
<div class="select-menu-list select-menu-tab-bucket js-select-menu-tab-bucket" data-tab-filter="tags">
<div data-filterable-for="context-commitish-filter-field" data-filterable-type="substring">
</div>
<div class="select-menu-no-results">Nothing to show</div>
</div>
</div>
</div>
</div>
<div class="BtnGroup float-right">
<a href="/tgstation/tgstation/find/cd924de80da882d14fb15f3f0f21102b8c8e7c45"
class="js-pjax-capture-input btn btn-sm BtnGroup-item"
data-pjax
data-hotkey="t">
Find file
</a>
<clipboard-copy for="blob-path" class="btn btn-sm BtnGroup-item">
Copy path
</clipboard-copy>
</div>
<div id="blob-path" class="breadcrumb">
<span class="repo-root js-repo-root"><span class="js-path-segment"><a data-pjax="true" rel="nofollow" href="/tgstation/tgstation/tree/cd924de80da882d14fb15f3f0f21102b8c8e7c45"><span>tgstation</span></a></span></span><span class="separator">/</span><span class="js-path-segment"><a data-pjax="true" rel="nofollow" href="/tgstation/tgstation/tree/cd924de80da882d14fb15f3f0f21102b8c8e7c45/tools"><span>tools</span></a></span><span class="separator">/</span><span class="js-path-segment"><a data-pjax="true" rel="nofollow" href="/tgstation/tgstation/tree/cd924de80da882d14fb15f3f0f21102b8c8e7c45/tools/tgs4_scripts"><span>tgs4_scripts</span></a></span><span class="separator">/</span><strong class="final-path">PreSynchronize.bat</strong>
</div>
</div>
<include-fragment src="/tgstation/tgstation/contributors/cd924de80da882d14fb15f3f0f21102b8c8e7c45/tools/tgs4_scripts/PreSynchronize.bat" class="commit-tease commit-loader">
<div>
Fetching contributors&hellip;
</div>
<div class="commit-tease-contributors">
<img alt="" class="loader-loading float-left" src="https://assets-cdn.github.com/images/spinners/octocat-spinner-32-EAF2F5.gif" width="16" height="16" />
<span class="loader-error">Cannot retrieve contributors at this time</span>
</div>
</include-fragment>
<div class="file">
<div class="file-header">
<div class="file-actions">
<div class="BtnGroup">
<a id="raw-url" class="btn btn-sm BtnGroup-item" href="/tgstation/tgstation/raw/cd924de80da882d14fb15f3f0f21102b8c8e7c45/tools/tgs4_scripts/PreSynchronize.bat">Raw</a>
<a class="btn btn-sm js-update-url-with-hash BtnGroup-item" data-hotkey="b" href="/tgstation/tgstation/blame/cd924de80da882d14fb15f3f0f21102b8c8e7c45/tools/tgs4_scripts/PreSynchronize.bat">Blame</a>
<a rel="nofollow" class="btn btn-sm BtnGroup-item" href="/tgstation/tgstation/commits/cd924de80da882d14fb15f3f0f21102b8c8e7c45/tools/tgs4_scripts/PreSynchronize.bat">History</a>
</div>
<button class="btn-octicon disabled tooltipped tooltipped-nw"
type="button"
disabled
aria-label="You must be on a branch to open this file in GitHub Desktop">
<svg class="octicon octicon-device-desktop" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M15 2H1c-.55 0-1 .45-1 1v9c0 .55.45 1 1 1h5.34c-.25.61-.86 1.39-2.34 2h8c-1.48-.61-2.09-1.39-2.34-2H15c.55 0 1-.45 1-1V3c0-.55-.45-1-1-1zm0 9H1V3h14v8z"/></svg>
</button>
<button type="button" class="btn-octicon disabled tooltipped tooltipped-nw"
aria-label="You must be on a branch to make or propose changes to this file">
<svg class="octicon octicon-pencil" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M0 12v3h3l8-8-3-3-8 8zm3 2H1v-2h1v1h1v1zm10.3-9.3L12 6 9 3l1.3-1.3a.996.996 0 0 1 1.41 0l1.59 1.59c.39.39.39 1.02 0 1.41z"/></svg>
</button>
<button type="button" class="btn-octicon btn-octicon-danger disabled tooltipped tooltipped-nw"
aria-label="You must be on a branch to make or propose changes to this file">
<svg class="octicon octicon-trashcan" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M11 2H9c0-.55-.45-1-1-1H5c-.55 0-1 .45-1 1H2c-.55 0-1 .45-1 1v1c0 .55.45 1 1 1v9c0 .55.45 1 1 1h7c.55 0 1-.45 1-1V5c.55 0 1-.45 1-1V3c0-.55-.45-1-1-1zm-1 12H3V5h1v8h1V5h1v8h1V5h1v8h1V5h1v9zm1-10H2V3h9v1z"/></svg>
</button>
</div>
<div class="file-info">
4 lines (2 sloc)
<span class="file-info-divider"></span>
99 Bytes
</div>
</div>
<div itemprop="text" class="blob-wrapper data type-batchfile">
<table class="highlight tab-size js-file-line-container" data-tab-size="4">
<tr>
<td id="L1" class="blob-num js-line-number" data-line-number="1"></td>
<td id="LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">@</span><span class="pl-k">echo</span> <span class="pl-k">off</span></td>
</tr>
<tr>
<td id="L2" class="blob-num js-line-number" data-line-number="2"></td>
<td id="LC2" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="L3" class="blob-num js-line-number" data-line-number="3"></td>
<td id="LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">powershell</span> -NoProfile -ExecutionPolicy Bypass -File PreSynchronize.ps1 -game_path %<span class="pl-v">1</span></td>
</tr>
</table>
<details class="details-reset details-overlay BlobToolbar position-absolute js-file-line-actions dropdown d-none" aria-hidden="true">
<summary class="btn-octicon ml-0 px-2 p-0 bg-white border border-gray-dark rounded-1" aria-label="Inline file action toolbar">
<svg class="octicon octicon-kebab-horizontal" viewBox="0 0 13 16" version="1.1" width="13" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zm5 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zM13 7.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"/></svg>
</summary>
<details-menu>
<ul class="BlobToolbar-dropdown dropdown-menu dropdown-menu-se mt-2">
<li><clipboard-copy role="menuitem" class="dropdown-item" id="js-copy-lines" style="cursor:pointer;" data-original-text="Copy lines">Copy lines</clipboard-copy></li>
<li><clipboard-copy role="menuitem" class="dropdown-item" id="js-copy-permalink" style="cursor:pointer;" data-original-text="Copy permalink">Copy permalink</clipboard-copy></li>
<li><a class="dropdown-item js-update-url-with-hash" id="js-view-git-blame" role="menuitem" href="/tgstation/tgstation/blame/cd924de80da882d14fb15f3f0f21102b8c8e7c45/tools/tgs4_scripts/PreSynchronize.bat">View git blame</a></li>
<li><a class="dropdown-item" id="js-new-issue" role="menuitem" href="/tgstation/tgstation/issues/new/choose">Open new issue</a></li>
</ul>
</details-menu>
</details>
</div>
</div>
<details class="details-reset details-overlay details-overlay-dark">
<summary data-hotkey="l" aria-label="Jump to line"></summary>
<details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast linejump" aria-label="Jump to line">
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="js-jump-to-line-form Box-body d-flex" action="" accept-charset="UTF-8" method="get"><input name="utf8" type="hidden" value="&#x2713;" />
<input class="form-control flex-auto mr-3 linejump-input js-jump-to-line-field" type="text" placeholder="Jump to line&hellip;" aria-label="Jump to line" autofocus>
<button type="submit" class="btn" data-close-dialog>Go</button>
</form> </details-dialog>
</details>
</div>
<div class="modal-backdrop js-touch-events"></div>
</div>
</div>
</div>
</div>
<div class="footer container-lg px-3" role="contentinfo">
<div class="position-relative d-flex flex-justify-between pt-6 pb-2 mt-6 f6 text-gray border-top border-gray-light ">
<ul class="list-style-none d-flex flex-wrap ">
<li class="mr-3">&copy; 2018 <span title="0.18787s from unicorn-74c5d68655-dfkpw">GitHub</span>, Inc.</li>
<li class="mr-3"><a data-ga-click="Footer, go to terms, text:terms" href="https://github.com/site/terms">Terms</a></li>
<li class="mr-3"><a data-ga-click="Footer, go to privacy, text:privacy" href="https://github.com/site/privacy">Privacy</a></li>
<li class="mr-3"><a href="https://help.github.com/articles/github-security/" data-ga-click="Footer, go to security, text:security">Security</a></li>
<li class="mr-3"><a href="https://status.github.com/" data-ga-click="Footer, go to status, text:status">Status</a></li>
<li><a data-ga-click="Footer, go to help, text:help" href="https://help.github.com">Help</a></li>
</ul>
<a aria-label="Homepage" title="GitHub" class="footer-octicon mr-lg-4" href="https://github.com">
<svg height="24" class="octicon octicon-mark-github" viewBox="0 0 16 16" version="1.1" width="24" aria-hidden="true"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"/></svg>
</a>
<ul class="list-style-none d-flex flex-wrap ">
<li class="mr-3"><a data-ga-click="Footer, go to contact, text:contact" href="https://github.com/contact">Contact GitHub</a></li>
<li class="mr-3"><a href="https://github.com/pricing" data-ga-click="Footer, go to Pricing, text:Pricing">Pricing</a></li>
<li class="mr-3"><a href="https://developer.github.com" data-ga-click="Footer, go to api, text:api">API</a></li>
<li class="mr-3"><a href="https://training.github.com" data-ga-click="Footer, go to training, text:training">Training</a></li>
<li class="mr-3"><a href="https://blog.github.com" data-ga-click="Footer, go to blog, text:blog">Blog</a></li>
<li><a data-ga-click="Footer, go to about, text:about" href="https://github.com/about">About</a></li>
</ul>
</div>
<div class="d-flex flex-justify-center pb-6">
<span class="f6 text-gray-light"></span>
</div>
</div>
<div id="ajax-error-message" class="ajax-error-message flash flash-error">
<svg class="octicon octicon-alert" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"/></svg>
<button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error">
<svg class="octicon octicon-x" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z"/></svg>
</button>
You cant perform that action at this time.
</div>
<script crossorigin="anonymous" integrity="sha512-Bb0Wovr1o2Cb3KlmHRGIjQlsUxTAa1LYyxdQ/tsndUC+t7gAyu/2fpdLW7eex9HXv13smytm3gzMD5+Z81gb9A==" type="application/javascript" src="https://assets-cdn.github.com/assets/frameworks-2b155dd967d6dd0a278d1a91dcafbeec.js"></script>
<script crossorigin="anonymous" async="async" integrity="sha512-MsXVzDqDi5b0jU60Tq39xkgfoNu3ehfnpdo2TPM99QKvNjrx0gSHZS5fvQ8PcxqMtHugMifkKyFfgMc9UUe6/Q==" type="application/javascript" src="https://assets-cdn.github.com/assets/github-f2f02359503c1eb68287242b53372803.js"></script>
<div class="js-stale-session-flash stale-session-flash flash flash-warn flash-banner d-none">
<svg class="octicon octicon-alert" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"/></svg>
<span class="signed-in-tab-flash">You signed in with another tab or window. <a href="">Reload</a> to refresh your session.</span>
<span class="signed-out-tab-flash">You signed out in another tab or window. <a href="">Reload</a> to refresh your session.</span>
</div>
<div class="facebox" id="facebox" style="display:none;">
<div class="facebox-popup">
<div class="facebox-content" role="dialog" aria-labelledby="facebox-header" aria-describedby="facebox-description">
</div>
<button type="button" class="facebox-close js-facebox-close" aria-label="Close modal">
<svg class="octicon octicon-x" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z"/></svg>
</button>
</div>
</div>
<template id="site-details-dialog">
<details class="details-reset details-overlay details-overlay-dark lh-default text-gray-dark" open>
<summary aria-haspopup="dialog" aria-label="Close dialog"></summary>
<details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast">
<button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog>
<svg class="octicon octicon-x" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z"/></svg>
</button>
<div class="octocat-spinner my-6 js-details-dialog-spinner"></div>
</details-dialog>
</details>
</template>
<div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;" tabindex="0">
<div class="Popover-message Popover-message--bottom-left Popover-message--large Box box-shadow-large" style="width:360px;">
</div>
</div>
<div id="hovercard-aria-description" class="sr-only">
Press h to open a hovercard with more details.
</div>
</body>
</html>
powershell -NoProfile -ExecutionPolicy Bypass -File PreSynchronize.ps1 -game_path %1
File diff suppressed because it is too large Load Diff
+10 -6
View File
@@ -5,19 +5,23 @@ set -e
shopt -s globstar
if [ "$BUILD_TOOLS" = false ]; then
if grep '"aaa" = \(.+\)' _maps/**/*.dmm; then
if grep -E '^\".+\" = \(.+\)' _maps/**/*.dmm; then
echo "Non-TGM formatted map detected. Please convert it using Map Merger!"
exit 1
fi;
if grep -P '^\ttag = \"icon' _maps/**/*.dmm; then
echo "tag vars from icon state generation detected in maps, please remove them."
exit 1
fi;
if grep 'step_[xy]' _maps/**/*.dmm; then
echo "step_[xy] variables detected in maps, please remove them."
echo "step_x/step_y variables detected in maps, please remove them."
exit 1
fi;
if grep 'pixel_[xy] = 0' _maps/**/*.dmm; then
echo "pixel_[xy] = 0 detected in maps, please review to ensure they are not dirty varedits."
echo "pixel_x/pixel_y = 0 variables detected in maps, please review to ensure they are not dirty varedits."
fi;
if grep '\td[1-2] =' _maps/**/*.dmm; then
echo "d[1-2] cable variables detected in maps, please remove them."
if grep -P '\td[1-2] =' _maps/**/*.dmm; then
echo "d1/d2 cable variables detected in maps, please remove them."
exit 1
fi;
if grep '^/area/.+[\{]' _maps/**/*.dmm; then
@@ -47,7 +51,7 @@ if [ "$BUILD_TOOLS" = false ]; then
else
tools/travis/dm.sh -DTRAVISBUILDING tgstation.dme
sh tools/deploy.sh travis_test
tools/deploy.sh travis_test
mkdir travis_test/config
#test config