diff --git a/_maps/barrenquilla_mining.json b/_maps/barrenquilla_mining.json
index f472088ea7f..dca325610c0 100644
--- a/_maps/barrenquilla_mining.json
+++ b/_maps/barrenquilla_mining.json
@@ -2,7 +2,7 @@
"map_name": "Barrenquilla Mining Facility",
"map_path": "map_files/Barrenquilla_Mining",
"map_file": "Barrenquilla_Mining_Facility.dmm",
- "announce_text": "A faint distress signal has been picked up by our scanners, which have tracked the source to LO145. Through use of emergency bluespace drive tech, the ###SHIPNAME### has jumped within range of the outpost. Senior officers are present and will need to be evacuated in order to completely finish your mission. TGMC, gear up and get ready to respond!",
+ "announce_text": "Наши сканеры зафиксировали слабый сигнал бедствия, который привёл нас к LO145. Благодаря блюспейс технологиям, мы оказались рядом с аванпостом. Товарищи, приготовьтесь к битве!",
"disk_sets": {
"basic": 1
},
diff --git a/_maps/bigred_v2.json b/_maps/bigred_v2.json
index 3c34c0a9785..ed27a991c71 100644
--- a/_maps/bigred_v2.json
+++ b/_maps/bigred_v2.json
@@ -6,7 +6,7 @@
"basic": 1
},
"quickbuilds": 1800,
- "announce_text": "A second generation colony has had a beacon transmitting the same signal, nonstop. Attempts to hail the colony over comms have proved futile. Because the ship was at a nearby drydock, it has been dispatched to figure out what's wrong. TGMC, prepare to deploy!",
+ "announce_text": "На колонии 2-ого поколения был активирован аварийный маяк, безостановочно передающий один и тот же сигнал. Попытки связаться оказались тщетными. Поскольку ваш корабль находился в близлежащих доках, вас отправляют выяснить, что за чертовщина там творится. Товарищи, приготовиться к высадке!",
"traits":[{
"weather_sandstorm": true
}]
diff --git a/_maps/deltastation.json b/_maps/deltastation.json
index e4f037c72bb..9225035c56e 100644
--- a/_maps/deltastation.json
+++ b/_maps/deltastation.json
@@ -5,6 +5,6 @@
"disk_sets": {
"basic": 1
},
- "announce_text": "The ship's comms array detected an emergency evacuation signal from a Delta class research station owned by a private corporation. The message indicated that the station had collided with a large asteroid and was overrun with hostile lifeforms. As part of peacekeeping operations the ship is nearing the station to begin clearing operations. TGMC, get equipped and prepare for boarding action!",
+ "announce_text": "Корабельная система связи засекла сигнал о срочной эвакуации с исследовательской станции класса «Дельта», принадлежащей частной корпорации 'Вейланд-Ютани'. В сообщении говорилось, что станция столкнулась с крупным астероидом и захвачена враждебными формами жизни. В рамках миротворческих операций корабль приближается к станции, чтобы начать очистку. Товарищи, экипируйтесь и приготовьтесь к высадке!",
"armor": "prison"
}
diff --git a/_maps/desparity.json b/_maps/desparity.json
index 8dc84f0238b..de42c1a48db 100644
--- a/_maps/desparity.json
+++ b/_maps/desparity.json
@@ -6,7 +6,7 @@
"basic": 1
},
"armor": "jungle",
- "announce_text": "An emergency broadcast has been picked up by our scanners, triangulated to a jungle outpost near LV624, known as Desparity. Through use of bluespace drive tech, the ship has jumped within range of the colony. TGMC, gear up and get ready to respond!",
+ "announce_text": "Наши сканеры засекли экстренное сообщение, которое было триангулировано на аванпосте в джунглях возле LV624, известном как Деспарити. Товарищи, снаряжайтесь и готовьтесь к высадке!",
"traits":[{
"weather_acidrain": false
}]
diff --git a/_maps/gelida_iv.json b/_maps/gelida_iv.json
index 8d026a70860..a38651f2671 100644
--- a/_maps/gelida_iv.json
+++ b/_maps/gelida_iv.json
@@ -10,7 +10,7 @@
},
"armor": "ice",
"quickbuilds": 1600,
- "announce_text": "Our comms array has detected an automated emergency signal broadcasting over a frequency reserved for the highest level of emergencies. The message was traced to the northern reaches of the research colony Gelida IV. The ship is moving into the sector with thrusters at max throttle. TGMC, get briefed and then move out!",
+ "announce_text": "Наша система связи засекла автоматический аварийный сигнал, передаваемый на частоте, предназначенной для чрезвычайных ситуаций уровня биологических заражений. Сообщение было отслежено до северных районов исследовательской колонии Гелида IV. Корабль движется в сектор на максимальном ходу. Товарищи, пройдите инструктаж и выдвигайтесь!",
"traits":[{
"weather_snowstorm": true
}]
diff --git a/_maps/ice_colony_v2.json b/_maps/ice_colony_v2.json
index 110cac8134c..75dfe818586 100644
--- a/_maps/ice_colony_v2.json
+++ b/_maps/ice_colony_v2.json
@@ -10,7 +10,7 @@
},
"armor": "ice",
"quickbuilds": 1600,
- "announce_text": "A garbled, unintelligible communications message was broadcasted over a general frequency, and picked up by our comms relay. The message appears to have come from a second generation settlement, located on an ice cold planet. The ship is moving into the sector with thrusters at max throttle. TGMC, get briefed and then move out!",
+ "announce_text": "На общей частоте было передано запутанное, неразборчивое сообщение, которое принял наш ретранслятор. Судя по всему, сообщение пришло из поселения второго поколения, расположенного на ледяной планете. Корабль движется в сектор на максимальном ходу. Товарищи, пройдите инструктаж и выдвигайтесь!",
"traits":[{
"weather_snowstorm": true
}]
diff --git a/_maps/icy_caves.json b/_maps/icy_caves.json
index 5625b3abfe6..545fb5ae61a 100644
--- a/_maps/icy_caves.json
+++ b/_maps/icy_caves.json
@@ -10,7 +10,7 @@
},
"armor": "ice",
"quickbuilds": 1200,
- "announce_text": "A garbled, unintelligible communications message was broadcasted over a general frequency, and picked up by our comms relay. The message appears to have come from a mining outpost, located on an ice cold planet. The ship is moving into the sector with thrusters at max throttle. TGMC, get briefed and then move out!",
+ "announce_text": "На общей частоте было передано запутанное, неразборчивое сообщение, которое принял наш ретранслятор. Судя по всему, сообщение поступило с шахтерского форпоста, расположенного на ледяной планете. Корабль движется в сектор на максимальном ходу. Товарищи, пройдите инструктаж и выдвигайтесь!",
"traits":[{
"weather_snowstorm": true
}]
diff --git a/_maps/kutjevo.json b/_maps/kutjevo.json
index 153ec6279a2..764a44fe7b1 100644
--- a/_maps/kutjevo.json
+++ b/_maps/kutjevo.json
@@ -6,5 +6,5 @@
"basic": 1
},
"quickbuilds": 1800,
- "announce_text": "An automated distress signal has been received from Nanotrasen colony Kutjevo Refinery, known for botanical research, export, and raw materials processing and refinement. The ###SHIPNAME### has been dispatched to investigate."
+ "announce_text": "С нефтеперерабатывающего завода колонии НаноТрейзен в Кутьево, известного своими ботаническими исследованиями, экспортом и переработкой сырья, был получен автоматический сигнал бедствия. Для расследования было отправлено наше судно."
}
diff --git a/_maps/last_stand.json b/_maps/last_stand.json
index 430fe6cc852..65899b0ef61 100644
--- a/_maps/last_stand.json
+++ b/_maps/last_stand.json
@@ -2,5 +2,5 @@
"map_name": "Last Stand",
"map_path": "map_files/Last_Stand",
"map_file": "Last_Stand.dmm",
- "announce_text": "A faint distress signal has been picked up by our scanners, which have tracked the source to Batallion 140's Supreme Command Center. Through use of emergency bluespace drive tech, the ship has jumped within range of the outpost. Senior officers are present and will need to be evacuated in order to completely finish your mission. TGMC, gear up and get ready to respond!"
+ "announce_text": "Наши сканеры засекли слабый сигнал бедствия и отследили его источник до Высшего командного центра батальона 140. Используя блюспейс технологии, корабль прыгнул в пределы досягаемости аванпоста. Там находятся старшие офицеры, которых необходимо эвакуировать, чтобы полностью завершить вашу миссию. Товарищи, снарядитесь и приготовьтесь к высадке!"
}
diff --git a/_maps/lawanka.json b/_maps/lawanka.json
index 223f6f20ebb..a9f8659c8f9 100644
--- a/_maps/lawanka.json
+++ b/_maps/lawanka.json
@@ -6,5 +6,5 @@
"basic": 1
},
"quickbuilds": 1800,
- "announce_text": "An AI from a Nanotrasen sponsored Research Colony has been sending a distress signal, nonstop. Nanotrasen has hired us to reclaim the Colony in any form. TGMC, prepare to deploy!"
+ "announce_text": "ИИ из исследовательской колонии, спонсируемой НаноТрейзен, безостановочно посылает сигнал бедствия. Нанотрайзен нанял нас, чтобы мы вернули колонию в любом виде. Товарищи, приготовиться к высадке!"
}
diff --git a/_maps/lv624.json b/_maps/lv624.json
index ca8505f21b3..4d1715717ea 100644
--- a/_maps/lv624.json
+++ b/_maps/lv624.json
@@ -7,7 +7,7 @@
},
"armor": "jungle",
"quickbuilds": 1400,
- "announce_text": "A faint distress signal has been picked up by our scanners, which have tracked the source to a third generation colony, known as LV-624. Through use of bluespace drive tech, the ship has jumped within range of the colony. TGMC, gear up and get ready to respond!",
+ "announce_text": "Наши сканеры засекли слабый сигнал бедствия и определили, что его источником является колония третьего поколения, известная как LV-624. Используя блюспейс технологии, корабль прыгнул в зону досягаемости колонии. Товарищи, экипируйтесь и приготовьтесь к атаке!",
"traits":[{
"weather_acidrain": true
}]
diff --git a/_maps/magmoor_digsite_iv.json b/_maps/magmoor_digsite_iv.json
index 0a531926dbd..625284d3172 100644
--- a/_maps/magmoor_digsite_iv.json
+++ b/_maps/magmoor_digsite_iv.json
@@ -6,5 +6,5 @@
"basic": 1
},
"quickbuilds": 1800,
- "announce_text": "A faint distress signal has been picked up by our scanners, which have tracked the source to a mining and archaeological site, known as Magmoor Digsite IV. Through use of bluespace drive tech, the ship has jumped within range of the colony. TGMC, gear up and get ready to respond!"
+ "announce_text": "Наши сканеры засекли слабый сигнал бедствия и определили, что его источник находится в месте добычи полезных ископаемых и археологических раскопок, известном как Точка Раскопок Магмура IV. Используя блюспейс технологии, корабль прыгнул в зону досягаемости колонии. Товарищи, приготовьтесь к высадке!"
}
diff --git a/_maps/map_files/Talos/TGS_Talos.dmm b/_maps/map_files/Talos/TGS_Talos.dmm
index f0adc348b91..a2cab25d1ee 100644
--- a/_maps/map_files/Talos/TGS_Talos.dmm
+++ b/_maps/map_files/Talos/TGS_Talos.dmm
@@ -326,12 +326,12 @@
/area/mainship/hallways/port_hallway)
"ahQ" = (
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/wood,
/area/mainship/living/bridgebunks)
@@ -399,8 +399,8 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/siding/metal,
/obj/structure/sign/semiotic/cryo{
- pixel_y = -32;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -32
},
/turf/open/floor/mainship/metal,
/area/mainship/hallways/port_hallway)
@@ -516,9 +516,9 @@
"anQ" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/purple{
layer = 3.2
@@ -551,8 +551,8 @@
dir = 4
},
/obj/structure/sign/semiotic/storage{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/obj/effect/turf_decal/warning_stripes/fulltile,
/turf/open/floor/mainship/metal/full,
@@ -587,9 +587,9 @@
"aoA" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/purple{
layer = 3.2
@@ -759,9 +759,9 @@
"arx" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/purple{
layer = 3.2
@@ -1091,8 +1091,8 @@
/obj/structure/table/fancywoodentable,
/obj/item/radio/intercom/general,
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/obj/item/flashlight/lamp,
/turf/open/floor/wood,
@@ -1185,8 +1185,8 @@
dir = 1
},
/obj/structure/sign/semiotic/storage{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal/full,
/area/mainship/engineering/engineering_workshop)
@@ -1355,8 +1355,8 @@
/area/mainship/hallways/bow_hallway)
"aEs" = (
/obj/structure/sign/semiotic/high_voltage{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/obj/effect/turf_decal/siding/metal{
dir = 9
@@ -1383,8 +1383,8 @@
"aEC" = (
/obj/structure/reagent_dispensers/watertank,
/obj/structure/sign/semiotic/water{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/plating,
/area/mainship/hull/port_hull)
@@ -1562,9 +1562,9 @@
"aLe" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/red{
layer = 3.2
@@ -1675,8 +1675,8 @@
"aQS" = (
/obj/machinery/vending/coffee,
/obj/structure/sign/semiotic/coffee{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal,
/area/mainship/squads/bravo)
@@ -1900,8 +1900,8 @@
/area/mainship/living/cafeteria)
"bca" = (
/obj/structure/mirror{
- pixel_y = -15;
- dir = 1
+ dir = 1;
+ pixel_y = -15
},
/turf/open/floor/wood,
/area/mainship/living/pilotbunks)
@@ -1940,8 +1940,8 @@
/obj/machinery/disposal,
/obj/structure/disposalpipe/trunk,
/obj/structure/sign/semiotic/bathwomens{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal/lino,
/area/mainship/living/starboard_emb)
@@ -2068,9 +2068,9 @@
"bhE" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/purple{
layer = 3.2
@@ -2517,8 +2517,8 @@
"buA" = (
/obj/machinery/vending/marineFood,
/obj/structure/sign/semiotic/food_storage{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/wood,
/area/mainship/medical/surgery_hallway)
@@ -2650,12 +2650,12 @@
"byf" = (
/obj/structure/table/black,
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/mainship/orange/full,
/area/mainship/command/cic)
@@ -2737,12 +2737,12 @@
"bAn" = (
/obj/structure/table/black,
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/mainship/red/full,
/area/mainship/command/cic)
@@ -2858,9 +2858,9 @@
"bFB" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/yellow{
layer = 3.2
@@ -3004,8 +3004,8 @@
"bIW" = (
/obj/structure/reagent_dispensers/watertank,
/obj/structure/sign/semiotic/water{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/plating,
/area/mainship/hull/starboard_hull)
@@ -3098,9 +3098,9 @@
"bLZ" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/yellow{
layer = 3.2
@@ -3732,9 +3732,9 @@
"cdc" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/blue{
layer = 3.2
@@ -3805,8 +3805,8 @@
/area/mainship/hallways/starboard_hallway)
"ceH" = (
/obj/structure/sign/semiotic/north{
- pixel_y = 7;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 7
},
/obj/structure/sign/semiotic/landingzone{
pixel_x = -17;
@@ -3917,8 +3917,8 @@
dir = 1
},
/obj/structure/sign/semiotic/east{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/obj/structure/sign/semiotic/high_voltage{
pixel_y = 24
@@ -3928,9 +3928,9 @@
"chQ" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/red{
layer = 3.2
@@ -4085,8 +4085,8 @@
/area/mainship/living/pilotbunks)
"clZ" = (
/obj/structure/mirror{
- pixel_y = 10;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 10
},
/obj/structure/sink/bathroom,
/turf/open/floor/plating/plating_catwalk/dark,
@@ -4238,6 +4238,9 @@
/area/mainship/living/basketball)
"cqy" = (
/obj/machinery/loadout_vendor,
+/obj/structure/window{
+ dir = 4
+ },
/turf/open/floor/mainship/red{
dir = 1
},
@@ -4281,9 +4284,9 @@
"csB" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/blue{
layer = 3.2
@@ -4476,9 +4479,9 @@
"cyW" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/purple{
layer = 3.2
@@ -4644,12 +4647,12 @@
dir = 1
},
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal,
/area/mainship/hallways/bow_hallway)
@@ -4769,13 +4772,17 @@
/area/mainship/squads/alpha)
"cHf" = (
/obj/machinery/vending/uniform_supply,
+/obj/machinery/keycard_auth{
+ dir = 8;
+ pixel_x = 30
+ },
/turf/open/floor/wood,
/area/mainship/living/pilotbunks)
"cHi" = (
/obj/machinery/vending/marineFood,
/obj/structure/sign/semiotic/food_storage{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/wood,
/area/mainship/medical/upper_medical)
@@ -5008,9 +5015,9 @@
"cQd" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/yellow{
layer = 3.2
@@ -5393,8 +5400,8 @@
pixel_y = -25
},
/obj/structure/sign/semiotic/escapepod{
- pixel_y = -25;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = -25
},
/obj/effect/turf_decal/siding/metal,
/turf/open/floor/mainship/metal,
@@ -6055,9 +6062,9 @@
"dvE" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/blue{
layer = 3.2
@@ -6271,8 +6278,8 @@
"dCu" = (
/obj/effect/turf_decal/siding/metal,
/obj/structure/sign/semiotic/high_voltage{
- pixel_y = -25;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = -25
},
/obj/structure/sign/semiotic/electronics{
pixel_y = -25
@@ -6646,6 +6653,9 @@
/area/mainship/living/basketball)
"dNS" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1/alt,
+/obj/machinery/keycard_auth{
+ pixel_y = 30
+ },
/turf/open/floor/wood,
/area/mainship/command/corporateliaison)
"dNU" = (
@@ -6677,6 +6687,12 @@
},
/turf/open/floor/prison/cleanmarked,
/area/mainship/hallways/hangar/droppod)
+"dOs" = (
+/obj/machinery/keycard_auth{
+ pixel_y = 30
+ },
+/turf/open/floor/mainship/tcomms,
+/area/mainship/command/telecomms)
"dOt" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
dir = 1
@@ -7074,8 +7090,8 @@
dir = 1
},
/obj/structure/mirror{
- pixel_y = -15;
- dir = 1
+ dir = 1;
+ pixel_y = -15
},
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1/alt{
dir = 4
@@ -7206,8 +7222,8 @@
/obj/structure/cable,
/obj/item/radio/intercom/general{
dir = 1;
- pixel_y = -19;
- pixel_x = -8
+ pixel_x = -8;
+ pixel_y = -19
},
/turf/open/floor/plating/plating_catwalk/dark,
/area/mainship/hallways/hangar)
@@ -7548,9 +7564,9 @@
"eqT" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/blue{
layer = 3.2
@@ -7600,8 +7616,8 @@
},
/obj/structure/sink/bathroom,
/obj/structure/mirror{
- pixel_y = 10;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 10
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/bravo)
@@ -7724,8 +7740,8 @@
"ewv" = (
/obj/structure/sink/bathroom,
/obj/structure/mirror{
- pixel_y = 10;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 10
},
/obj/machinery/light/mainship{
dir = 4
@@ -7771,8 +7787,8 @@
dir = 1
},
/obj/structure/sign/semiotic/east{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/obj/structure/sign/semiotic/high_voltage{
pixel_y = 24
@@ -7983,9 +7999,9 @@
"eEt" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/purple{
layer = 3.2
@@ -8143,8 +8159,8 @@
dir = 1
},
/obj/structure/mirror{
- pixel_y = -15;
- dir = 1
+ dir = 1;
+ pixel_y = -15
},
/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer1{
dir = 9
@@ -8472,16 +8488,16 @@
"eRD" = (
/obj/item/radio/intercom/general{
dir = 1;
- pixel_y = -19;
- pixel_x = -8
+ pixel_x = -8;
+ pixel_y = -19
},
/turf/open/floor/plating/plating_catwalk/dark,
/area/mainship/hallways/hangar)
"eRE" = (
/obj/structure/reagent_dispensers/watertank,
/obj/structure/sign/semiotic/water{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/plating,
/area/mainship/hull/upper_hull)
@@ -8540,9 +8556,9 @@
"eUa" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/blue{
layer = 3.2
@@ -8566,8 +8582,8 @@
/area/mainship/hallways/hangar)
"eUl" = (
/obj/machinery/door/airlock/multi_tile/mainship/blackgeneric/glass{
- name = "\improper Pilot's Office";
dir = 2;
+ name = "\improper Pilot's Office";
req_one_access = list(44)
},
/obj/structure/cable,
@@ -8645,9 +8661,9 @@
"eVY" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/yellow{
layer = 3.2
@@ -8746,12 +8762,12 @@
"eYL" = (
/obj/machinery/computer/cryopod,
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/obj/structure/sign/semiotic/terminal{
pixel_x = 32
@@ -8940,8 +8956,8 @@
dir = 4
},
/obj/structure/mirror{
- pixel_y = 10;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 10
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/alpha)
@@ -9056,8 +9072,8 @@
dir = 1
},
/obj/structure/mirror{
- pixel_y = -15;
- dir = 1
+ dir = 1;
+ pixel_y = -15
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/alpha)
@@ -9180,8 +9196,8 @@
/area/mainship/hallways/port_hallway)
"fjo" = (
/obj/structure/sign/semiotic/storage{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal/full,
/area/mainship/command/cic)
@@ -9324,8 +9340,8 @@
"foF" = (
/obj/structure/reagent_dispensers/watertank,
/obj/structure/sign/semiotic/water{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/plating,
/area/mainship/hull/port_hull)
@@ -9364,6 +9380,9 @@
/obj/effect/turf_decal/woodsiding{
dir = 10
},
+/obj/machinery/keycard_auth{
+ pixel_x = -30
+ },
/turf/open/floor/carpet,
/area/mainship/living/numbertwobunks)
"fpE" = (
@@ -9586,6 +9605,15 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/mainship/hull/port_hull)
+"fuK" = (
+/obj/structure/window{
+ dir = 8
+ },
+/obj/machinery/quick_vendor/beginner,
+/turf/open/floor/mainship/orange{
+ dir = 1
+ },
+/area/mainship/squads/bravo)
"fuL" = (
/obj/effect/turf_decal/siding/metal,
/obj/machinery/camera/autoname{
@@ -9648,9 +9676,9 @@
"fxC" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/purple{
layer = 3.2
@@ -9845,8 +9873,8 @@
"fEc" = (
/obj/structure/reagent_dispensers/watertank,
/obj/structure/sign/semiotic/water{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal/green,
/area/mainship/medical/upper_medical)
@@ -9868,8 +9896,8 @@
/obj/structure/sink/bathroom,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/alt,
/obj/structure/mirror{
- pixel_y = 10;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 10
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/alpha)
@@ -9952,7 +9980,10 @@
/turf/open/floor/mainship/metal,
/area/mainship/hallways/hangar)
"fKa" = (
-/obj/machinery/loadout_vendor,
+/obj/machinery/quick_vendor/beginner,
+/obj/structure/window{
+ dir = 8
+ },
/turf/open/floor/mainship/emerald{
dir = 6
},
@@ -10031,8 +10062,8 @@
pixel_y = -17
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 7;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 7
},
/turf/open/floor/mainship/metal/lino,
/area/mainship/living/cafeteria)
@@ -10214,8 +10245,8 @@
dir = 1
},
/obj/structure/sign/semiotic/escapepod{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/obj/structure/sign/semiotic/west{
pixel_y = 24
@@ -10336,8 +10367,8 @@
/area/mainship/hull/port_hull)
"fVX" = (
/obj/structure/sign/semiotic/food_storage{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/obj/machinery/vending/snack,
/turf/open/floor/mainship/metal,
@@ -10345,9 +10376,9 @@
"fWu" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/blue{
layer = 3.2
@@ -10638,9 +10669,9 @@
"glD" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/red{
layer = 3.2
@@ -12303,8 +12334,8 @@
"htq" = (
/obj/structure/sink/bathroom,
/obj/structure/mirror{
- pixel_y = 10;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 10
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/delta)
@@ -12391,8 +12422,8 @@
/obj/structure/sink/bathroom,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/alt,
/obj/structure/mirror{
- pixel_y = 10;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 10
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/bravo)
@@ -12403,6 +12434,7 @@
/obj/structure/sign/semiotic/medical{
pixel_x = 32
},
+/obj/machinery/recharger,
/turf/open/floor/mainship/metal/green,
/area/mainship/medical/upper_medical)
"hwU" = (
@@ -12419,8 +12451,8 @@
/obj/structure/largecrate/supply/supplies/mre,
/obj/effect/turf_decal/warning_stripes/cargo,
/obj/structure/sign/semiotic/water{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal,
/area/mainship/hallways/hangar)
@@ -12639,8 +12671,8 @@
pixel_y = 24
},
/obj/structure/sign/semiotic/escapepod{
- pixel_y = 39;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 39
},
/obj/structure/sign/semiotic/west{
pixel_y = 31
@@ -12780,8 +12812,8 @@
"hIQ" = (
/obj/machinery/vending/marineFood,
/obj/structure/sign/semiotic/food_storage{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/charlie)
@@ -12908,12 +12940,12 @@
dir = 5
},
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/carpet,
/area/mainship/command/corporateliaison)
@@ -13016,8 +13048,8 @@
pixel_y = 6
},
/obj/item/toy/prize/phazon{
- pixel_y = 14;
- pixel_x = 11
+ pixel_x = 11;
+ pixel_y = 14
},
/turf/open/floor/plating,
/area/mainship/hull/starboard_hull)
@@ -13910,13 +13942,13 @@
/area/mainship/hallways/hangar)
"ixd" = (
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/effect/landmark/start/latejoin_squad/alpha,
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/plating/plating_catwalk/dark,
/area/mainship/squads/alpha)
@@ -14114,8 +14146,8 @@
pixel_y = 32
},
/obj/structure/sign/semiotic/ref_chem_storage{
- pixel_y = 32;
- pixel_x = -14
+ pixel_x = -14;
+ pixel_y = 32
},
/turf/open/floor/mainship/metal/green,
/area/mainship/medical/lounge)
@@ -14203,8 +14235,8 @@
dir = 1
},
/obj/structure/sign/semiotic/fire_haz{
- pixel_y = 32;
- pixel_x = -18
+ pixel_x = -18;
+ pixel_y = 32
},
/turf/open/floor/mainship/metal/green,
/area/mainship/medical/lounge)
@@ -14624,9 +14656,9 @@
"iSG" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/purple{
layer = 3.2
@@ -14687,8 +14719,8 @@
dir = 1
},
/obj/structure/mirror{
- pixel_y = -15;
- dir = 1
+ dir = 1;
+ pixel_y = -15
},
/obj/machinery/light/mainship{
dir = 4
@@ -14858,8 +14890,8 @@
"jag" = (
/obj/machinery/vending/snack,
/obj/structure/sign/semiotic/food_storage{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal,
/area/mainship/command/cic)
@@ -14881,9 +14913,9 @@
"jap" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/red{
layer = 3.2
@@ -15074,8 +15106,8 @@
},
/obj/effect/landmark/start/latejoin_squad/bravo,
/obj/structure/sign/semiotic/intercom{
- pixel_y = 7;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 7
},
/turf/open/floor/plating/plating_catwalk/dark,
/area/mainship/squads/bravo)
@@ -15169,8 +15201,8 @@
"jiX" = (
/obj/machinery/vending/coffee,
/obj/structure/sign/semiotic/coffee{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal,
/area/mainship/squads/delta)
@@ -15451,8 +15483,8 @@
dir = 4
},
/obj/structure/sign/semiotic/north{
- pixel_y = 7;
- pixel_x = 32
+ pixel_x = 32;
+ pixel_y = 7
},
/obj/structure/sign/semiotic/bridge{
pixel_x = 32;
@@ -15462,6 +15494,9 @@
/area/mainship/hallways/bow_hallway)
"jsH" = (
/obj/machinery/loadout_vendor,
+/obj/structure/window{
+ dir = 4
+ },
/turf/open/floor/mainship/emerald,
/area/mainship/squads/charlie)
"jsI" = (
@@ -15542,12 +15577,12 @@
},
/obj/machinery/camera/autoname,
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/alt,
/turf/open/floor/mainship/metal,
@@ -15596,8 +15631,8 @@
dir = 1
},
/obj/structure/sign/semiotic/east{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/obj/structure/sign/semiotic/high_voltage{
pixel_y = 24
@@ -15613,13 +15648,13 @@
/area/mainship/medical/surgery_hallway)
"jwO" = (
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/bed/chair/comfy/alpha,
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/mainship/red/full,
/area/mainship/hallways/hangar)
@@ -16040,8 +16075,8 @@
/area/mainship/hallways/aft_hallway)
"jMS" = (
/obj/structure/sign/semiotic/coffee{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/obj/machinery/vending/coffee,
/turf/open/floor/mainship/metal,
@@ -16468,8 +16503,8 @@
},
/obj/effect/turf_decal/warning_stripes/fulltile,
/obj/structure/sign/semiotic/north{
- pixel_y = 7;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 7
},
/obj/structure/sign/semiotic/escapepod{
pixel_x = -17;
@@ -16642,8 +16677,8 @@
/area/mainship/hallways/starboard_umbilical)
"kgK" = (
/obj/structure/mirror{
- pixel_y = 10;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 10
},
/obj/structure/sink/bathroom,
/turf/open/floor/plating/plating_catwalk/dark,
@@ -16692,9 +16727,9 @@
"khT" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/blue{
layer = 3.2
@@ -16961,11 +16996,12 @@
/turf/open/floor/mainship/metal/full,
/area/mainship/hallways/bow_hallway)
"koH" = (
+/obj/machinery/floor_warn_light/self_destruct,
/obj/item/defibrillator,
/obj/item/defibrillator,
/obj/item/defibrillator,
/obj/structure/table/mainship,
-/obj/machinery/floor_warn_light/self_destruct,
+/obj/machinery/recharger,
/turf/open/floor/mainship/metal/green,
/area/mainship/medical/lounge)
"kpR" = (
@@ -16983,8 +17019,8 @@
/area/mainship/hallways/port_hallway)
"kqo" = (
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/plating/plating_catwalk/dark,
/area/mainship/hallways/hangar)
@@ -17406,7 +17442,10 @@
/turf/open/floor/mainship/blue/full,
/area/mainship/hallways/hangar)
"kCI" = (
-/obj/machinery/loadout_vendor,
+/obj/machinery/quick_vendor/beginner,
+/obj/structure/window{
+ dir = 8
+ },
/turf/open/floor/mainship/red{
dir = 5
},
@@ -17526,8 +17565,8 @@
"kHo" = (
/obj/machinery/vending/marineFood,
/obj/structure/sign/semiotic/food_storage{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal/full,
/area/mainship/hallways/aft_hallway)
@@ -17606,8 +17645,8 @@
"kJi" = (
/obj/item/radio/intercom/general{
dir = 1;
- pixel_y = -19;
- pixel_x = -8
+ pixel_x = -8;
+ pixel_y = -19
},
/obj/structure/bed/chair/comfy/delta{
dir = 1
@@ -18036,9 +18075,9 @@
"kUp" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/red{
layer = 3.2
@@ -18084,9 +18123,9 @@
"kVF" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/red{
layer = 3.2
@@ -18137,8 +18176,8 @@
pixel_y = -25
},
/obj/structure/sign/semiotic/escapepod{
- pixel_y = -25;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal,
/area/mainship/hallways/starboard_hallway)
@@ -18251,8 +18290,8 @@
},
/obj/structure/window/reinforced,
/obj/structure/sign/semiotic/galley{
- pixel_y = 29;
- pixel_x = 7
+ pixel_x = 7;
+ pixel_y = 29
},
/turf/open/floor/grass,
/area/mainship/hallways/aft_hallway)
@@ -18579,8 +18618,8 @@
pixel_y = 24
},
/obj/structure/sign/semiotic/escapepod{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal,
/area/mainship/hallways/port_hallway)
@@ -18692,8 +18731,8 @@
dir = 1
},
/obj/machinery/door/airlock/mainship/generic{
- name = "Kitchen";
- dir = 1
+ dir = 1;
+ name = "Kitchen"
},
/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer1,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
@@ -18759,8 +18798,8 @@
/obj/effect/decal/cleanable/dirt,
/obj/structure/reagent_dispensers/watertank,
/obj/structure/sign/semiotic/water{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/plating,
/area/mainship/hull/upper_hull)
@@ -18816,8 +18855,8 @@
},
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1/alt,
/obj/structure/sign/semiotic/intercom{
- pixel_y = 7;
- pixel_x = 32
+ pixel_x = 32;
+ pixel_y = 7
},
/turf/open/floor/wood,
/area/mainship/squads/charlie)
@@ -18830,8 +18869,8 @@
/obj/effect/decal/cleanable/cobweb,
/obj/structure/reagent_dispensers/watertank,
/obj/structure/sign/semiotic/water{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/plating,
/area/mainship/hull/upper_hull)
@@ -18870,8 +18909,8 @@
/area/mainship/engineering/port_atmos)
"lsJ" = (
/obj/structure/sign/semiotic/food_storage{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/obj/machinery/vending/cigarette,
/turf/open/floor/mainship/metal,
@@ -18943,8 +18982,8 @@
dir = 1
},
/obj/structure/sign/semiotic/water{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/plating,
/area/mainship/hull/upper_hull)
@@ -19068,9 +19107,9 @@
"lvY" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/blue{
layer = 3.2
@@ -19207,8 +19246,8 @@
dir = 4
},
/obj/structure/sign/semiotic/north{
- pixel_y = 7;
- pixel_x = 32
+ pixel_x = 32;
+ pixel_y = 7
},
/obj/structure/sign/semiotic/bridge{
pixel_x = 32;
@@ -19244,9 +19283,9 @@
/area/mainship/squads/alpha)
"lzz" = (
/obj/structure/window/framed/mainship/hull/canterbury{
- name = "empty space";
+ hit_sound = null;
invisibility = 100;
- hit_sound = null
+ name = "empty space"
},
/obj/effect/turf_decal/siding/metal{
dir = 8
@@ -19286,8 +19325,8 @@
pixel_y = 8
},
/obj/structure/sign/semiotic/flightcontrol{
- pixel_y = 8;
- pixel_x = -18
+ pixel_x = -18;
+ pixel_y = 8
},
/turf/open/floor/mainship/metal,
/area/mainship/hallways/bow_hallway)
@@ -19404,9 +19443,9 @@
"lEC" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/yellow{
layer = 3.2
@@ -19421,12 +19460,12 @@
"lEO" = (
/obj/structure/bedsheetbin,
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal,
/area/mainship/squads/delta)
@@ -19801,9 +19840,9 @@
/area/mainship/hallways/hangar/droppod)
"lNm" = (
/obj/structure/window/framed/mainship/hull/canterbury{
- name = "empty space";
+ hit_sound = null;
invisibility = 100;
- hit_sound = null
+ name = "empty space"
},
/turf/open/floor/stairs/dark/right,
/area/mainship/hull/port_hull)
@@ -20087,8 +20126,8 @@
pixel_y = -25
},
/obj/structure/sign/semiotic/escapepod{
- pixel_y = -25;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal,
/area/mainship/hallways/port_hallway)
@@ -20329,8 +20368,8 @@
dir = 4
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/obj/item/radio/intercom/general,
/turf/open/floor/mainship/metal,
@@ -20375,12 +20414,12 @@
"mgh" = (
/obj/effect/turf_decal/warning_stripes/cargo/yellow,
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal,
/area/mainship/squads/charlie)
@@ -20589,8 +20628,8 @@
},
/obj/structure/cable,
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/plating/plating_catwalk/dark,
/area/mainship/hallways/hangar)
@@ -20623,6 +20662,10 @@
dir = 8
},
/obj/machinery/computer/crew,
+/obj/machinery/keycard_auth{
+ dir = 8;
+ pixel_x = 30
+ },
/turf/open/floor/wood,
/area/mainship/medical/lower_medical)
"mpD" = (
@@ -20958,12 +21001,12 @@
/area/mainship/hull/starboard_hull)
"mye" = (
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/mainship/tcomms,
/area/mainship/command/telecomms)
@@ -20983,8 +21026,8 @@
/obj/effect/spawner/random/misc/folder,
/obj/item/eftpos{
eftpos_name = "Cargo Bay EFTPOS scanner";
- pixel_y = 1;
- pixel_x = 4
+ pixel_x = 4;
+ pixel_y = 1
},
/obj/item/tool/hand_labeler{
pixel_x = -4
@@ -21066,8 +21109,8 @@
pixel_y = -8
},
/obj/structure/sign/semiotic/north{
- pixel_y = 7;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 7
},
/turf/open/floor/mainship/metal,
/area/mainship/hallways/aft_hallway)
@@ -21245,8 +21288,8 @@
dir = 1
},
/obj/structure/sign/semiotic/high_voltage{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/obj/structure/sign/semiotic/electronics{
pixel_y = 24
@@ -21595,8 +21638,8 @@
"mOq" = (
/obj/machinery/vending/coffee,
/obj/structure/sign/semiotic/coffee{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/wood,
/area/mainship/medical/surgery_hallway)
@@ -21707,12 +21750,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3,
/turf/open/floor/plating,
/area/mainship/hull/starboard_hull)
-"mSl" = (
-/obj/structure/window{
- dir = 8
- },
-/turf/open/floor/mainship/blue,
-/area/mainship/squads/delta)
"mSt" = (
/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer1{
dir = 9
@@ -21990,9 +22027,9 @@
"mYr" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/yellow{
layer = 3.2
@@ -22049,8 +22086,8 @@
},
/obj/structure/reagent_dispensers/watertank,
/obj/structure/sign/semiotic/water{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/plating,
/area/mainship/hull/port_hull)
@@ -22217,9 +22254,9 @@
/area/space)
"ngt" = (
/obj/structure/window/framed/mainship/hull/canterbury{
- name = "empty space";
+ hit_sound = null;
invisibility = 100;
- hit_sound = null
+ name = "empty space"
},
/obj/effect/turf_decal/siding/metal{
dir = 4
@@ -22468,9 +22505,9 @@
"nnX" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/red{
layer = 3.2
@@ -22745,8 +22782,8 @@
pixel_y = -17
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 7;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 7
},
/turf/open/floor/mainship/metal/full,
/area/mainship/engineering/engineering_workshop)
@@ -23133,8 +23170,8 @@
/obj/effect/turf_decal/warning_stripes/cargo/yellow,
/obj/item/radio/intercom/general{
dir = 1;
- pixel_y = -19;
- pixel_x = -8
+ pixel_x = -8;
+ pixel_y = -19
},
/obj/structure/sign/semiotic/intercom{
pixel_y = -25
@@ -23144,9 +23181,9 @@
"nJt" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/blue{
layer = 3.2
@@ -23650,9 +23687,9 @@
/area/mainship/hallways/starboard_hallway)
"nUR" = (
/obj/structure/window/framed/mainship/hull/canterbury{
- name = "empty space";
+ hit_sound = null;
invisibility = 100;
- hit_sound = null
+ name = "empty space"
},
/turf/open/floor/stairs/dark/left,
/area/mainship/hull/port_hull)
@@ -23701,9 +23738,9 @@
"nVN" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/red{
layer = 3.2
@@ -23966,9 +24003,9 @@
/area/mainship/squads/req)
"oex" = (
/obj/structure/window/framed/mainship/hull/canterbury{
- name = "empty space";
+ hit_sound = null;
invisibility = 100;
- hit_sound = null
+ name = "empty space"
},
/obj/machinery/camera/autoname{
dir = 4
@@ -24554,9 +24591,9 @@
"oxS" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/red{
layer = 3.2
@@ -24619,9 +24656,9 @@
"oBC" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/yellow{
layer = 3.2
@@ -24656,8 +24693,8 @@
dir = 1
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 7;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 7
},
/turf/open/floor/mainship/metal/lino,
/area/mainship/living/cafeteria)
@@ -24668,8 +24705,8 @@
},
/obj/effect/landmark/start/latejoin_squad/bravo,
/obj/structure/sign/semiotic/intercom{
- pixel_y = 7;
- pixel_x = 32
+ pixel_x = 32;
+ pixel_y = 7
},
/turf/open/floor/plating/plating_catwalk/dark,
/area/mainship/squads/bravo)
@@ -24932,12 +24969,12 @@
/area/mainship/squads/req)
"oJM" = (
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/obj/effect/turf_decal/woodsiding{
dir = 5
@@ -24980,9 +25017,6 @@
/obj/item/attachable/suppressor,
/obj/item/armor_module/storage/uniform/holster,
/obj/item/portable_vendor/corporate,
-/obj/machinery/keycard_auth{
- pixel_x = -30
- },
/obj/effect/turf_decal/woodsiding{
dir = 9
},
@@ -24990,13 +25024,13 @@
/area/mainship/command/corporateliaison)
"oLY" = (
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/bed/chair/comfy/bravo,
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/mainship/orange/full,
/area/mainship/hallways/hangar)
@@ -25042,8 +25076,8 @@
},
/obj/effect/spawner/random/misc/plant,
/obj/structure/sign/semiotic/intercom{
- pixel_y = 7;
- pixel_x = 32
+ pixel_x = 32;
+ pixel_y = 7
},
/turf/open/floor/mainship/metal/lino,
/area/mainship/living/cafeteria)
@@ -25397,8 +25431,8 @@
dir = 4
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 7;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 7
},
/turf/open/floor/carpet,
/area/mainship/living/numbertwobunks)
@@ -25412,12 +25446,12 @@
"paw" = (
/obj/effect/turf_decal/warning_stripes/cargo/yellow,
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal,
/area/mainship/squads/delta)
@@ -25568,12 +25602,12 @@
/area/mainship/living/numbertwobunks)
"per" = (
/obj/structure/sign/semiotic/ammunition{
- pixel_y = 1;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 1
},
/obj/structure/sign/semiotic/laser{
- pixel_y = 15;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 15
},
/obj/effect/turf_decal/siding/dark{
dir = 8
@@ -25676,9 +25710,9 @@
/area/mainship/hallways/bow_hallway)
"phy" = (
/obj/structure/window/framed/mainship/hull/canterbury{
- name = "empty space";
+ hit_sound = null;
invisibility = 100;
- hit_sound = null
+ name = "empty space"
},
/obj/machinery/camera/autoname{
dir = 8
@@ -26001,8 +26035,8 @@
dir = 1
},
/obj/structure/mirror{
- pixel_y = -15;
- dir = 1
+ dir = 1;
+ pixel_y = -15
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/charlie)
@@ -26095,9 +26129,9 @@
"psl" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/red{
layer = 3.2
@@ -26212,8 +26246,8 @@
dir = 4
},
/obj/structure/mirror{
- pixel_y = 10;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 10
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/delta)
@@ -26226,8 +26260,8 @@
pixel_y = -17
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 7;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 7
},
/turf/open/floor/mainship/metal/lino,
/area/mainship/living/cafeteria)
@@ -26248,8 +26282,8 @@
/area/mainship/engineering/ce_room)
"pvW" = (
/obj/structure/sign/semiotic/south{
- pixel_y = -8;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = -8
},
/obj/structure/sign/semiotic/landingzone{
pixel_x = -17;
@@ -26420,9 +26454,9 @@
"pAq" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/red{
layer = 3.2
@@ -26604,8 +26638,8 @@
"pFV" = (
/obj/machinery/light/mainship,
/obj/structure/sign/semiotic/conference_room{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal/lino,
/area/mainship/hallways/bow_hallway)
@@ -26766,8 +26800,8 @@
dir = 1
},
/obj/structure/mirror{
- pixel_y = -15;
- dir = 1
+ dir = 1;
+ pixel_y = -15
},
/obj/effect/ai_node,
/turf/open/floor/plating/plating_catwalk/dark,
@@ -26775,8 +26809,8 @@
"pLD" = (
/obj/machinery/vending/marineFood,
/obj/structure/sign/semiotic/food_storage{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal/lino,
/area/mainship/living/cafeteria)
@@ -26789,8 +26823,8 @@
},
/obj/machinery/camera/autoname,
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/turf/open/floor/carpet,
/area/mainship/living/numbertwobunks)
@@ -26813,8 +26847,8 @@
"pMR" = (
/obj/machinery/vending/snack,
/obj/structure/sign/semiotic/food_storage{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/alpha)
@@ -26993,8 +27027,8 @@
/area/mainship/squads/req)
"pQZ" = (
/obj/structure/sign/semiotic/exhaust{
- pixel_y = -21;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = -21
},
/obj/structure/sign/semiotic/fire_haz{
pixel_x = -17;
@@ -27014,9 +27048,9 @@
"pRM" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/blue{
layer = 3.2
@@ -27154,14 +27188,6 @@
/obj/structure/closet/firecloset,
/turf/open/floor/plating,
/area/mainship/hull/starboard_hull)
-"pWv" = (
-/obj/structure/window{
- dir = 8
- },
-/turf/open/floor/mainship/orange{
- dir = 1
- },
-/area/mainship/squads/bravo)
"pWN" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{
dir = 1
@@ -27229,8 +27255,8 @@
dir = 1
},
/obj/structure/mirror{
- pixel_y = -15;
- dir = 1
+ dir = 1;
+ pixel_y = -15
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/delta)
@@ -27274,6 +27300,13 @@
/obj/structure/bedsheetbin,
/turf/open/floor/mainship/metal,
/area/mainship/squads/alpha)
+"qak" = (
+/obj/machinery/keycard_auth{
+ dir = 8;
+ pixel_x = 30
+ },
+/turf/open/floor/wood,
+/area/mainship/living/commandbunks)
"qas" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer1{
@@ -27296,8 +27329,8 @@
dir = 1
},
/obj/structure/sign/semiotic/cryo{
- pixel_y = 32;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 32
},
/turf/open/floor/mainship/metal,
/area/mainship/hallways/starboard_hallway)
@@ -27545,12 +27578,12 @@
/obj/machinery/disposal,
/obj/structure/disposalpipe/trunk,
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal/lino,
/area/mainship/living/commandbunks)
@@ -28018,8 +28051,8 @@
dir = 4
},
/obj/structure/sign/semiotic/water{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/plating,
/area/mainship/hull/starboard_hull)
@@ -28339,9 +28372,9 @@
"qER" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/purple{
layer = 3.2
@@ -28367,9 +28400,9 @@
},
/obj/effect/turf_decal/siding/metal,
/obj/machinery/door_control{
+ dir = 1;
id = "Brig Lockdown";
name = "Brig Lockdown";
- dir = 1;
pixel_x = -6;
pixel_y = -16
},
@@ -29294,6 +29327,9 @@
/obj/structure/closet/secure_closet/req_officer,
/obj/item/whistle,
/obj/item/megaphone,
+/obj/machinery/keycard_auth{
+ pixel_x = -30
+ },
/turf/open/floor/carpet,
/area/mainship/squads/req)
"ril" = (
@@ -29444,9 +29480,6 @@
/turf/open/floor/mainship/metal,
/area/mainship/engineering/engineering_workshop)
"rpb" = (
-/obj/machinery/keycard_auth{
- pixel_x = -30
- },
/obj/effect/turf_decal/woodsiding{
dir = 4
},
@@ -29473,8 +29506,8 @@
pixel_y = -25
},
/obj/structure/sign/semiotic/escapepod{
- pixel_y = -25;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal,
/area/mainship/hallways/starboard_hallway)
@@ -29644,8 +29677,8 @@
"rwf" = (
/obj/structure/reagent_dispensers/watertank,
/obj/structure/sign/semiotic/water{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/plating,
/area/mainship/living/numbertwobunks)
@@ -29679,13 +29712,13 @@
/area/mainship/living/grunt_rnr)
"rxt" = (
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/effect/landmark/start/latejoin_squad/charlie,
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/plating/plating_catwalk/dark,
/area/mainship/squads/charlie)
@@ -29711,8 +29744,8 @@
"ryd" = (
/obj/machinery/vending/marineFood,
/obj/structure/sign/semiotic/food_storage{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal/lino,
/area/mainship/living/cafeteria)
@@ -30040,8 +30073,8 @@
dir = 1
},
/obj/structure/mirror{
- pixel_y = -15;
- dir = 1
+ dir = 1;
+ pixel_y = -15
},
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1/alt{
dir = 1
@@ -30115,9 +30148,9 @@
"rIX" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/red{
layer = 3.2
@@ -30820,9 +30853,9 @@
"sfi" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/purple{
layer = 3.2
@@ -31131,6 +31164,9 @@
/area/mainship/hallways/hangar)
"snY" = (
/obj/machinery/loadout_vendor,
+/obj/structure/window{
+ dir = 4
+ },
/turf/open/floor/mainship/blue,
/area/mainship/squads/delta)
"soq" = (
@@ -31282,8 +31318,8 @@
"ssL" = (
/obj/structure/sink/bathroom,
/obj/structure/mirror{
- pixel_y = 10;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 10
},
/obj/machinery/light/mainship{
dir = 4
@@ -31391,12 +31427,12 @@
dir = 1
},
/obj/structure/mirror{
- pixel_y = -15;
- dir = 1
+ dir = 1;
+ pixel_y = -15
},
/obj/item/tool/wet_sign{
- pixel_y = 20;
- pixel_x = -6
+ pixel_x = -6;
+ pixel_y = 20
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/bravo)
@@ -31472,12 +31508,6 @@
/obj/structure/prop/mainship/sensor_computer1,
/turf/open/floor/mainship/black/full,
/area/mainship/command/cic)
-"sAK" = (
-/obj/machinery/loadout_vendor,
-/turf/open/floor/mainship/orange{
- dir = 1
- },
-/area/mainship/squads/bravo)
"sAW" = (
/obj/structure/table/reinforced,
/obj/machinery/computer/operating,
@@ -31959,9 +31989,9 @@
/area/mainship/engineering/port_atmos)
"sOW" = (
/obj/structure/window/framed/mainship/hull/canterbury{
- name = "empty space";
+ hit_sound = null;
invisibility = 100;
- hit_sound = null
+ name = "empty space"
},
/obj/machinery/light/mainship{
dir = 8
@@ -32229,8 +32259,8 @@
pixel_y = 1
},
/obj/structure/sign/semiotic/waterhazard{
- pixel_y = 18;
- pixel_x = 32
+ pixel_x = 32;
+ pixel_y = 18
},
/turf/open/floor/prison/whitepurple{
dir = 5
@@ -32241,8 +32271,8 @@
/obj/effect/turf_decal/woodsiding,
/obj/item/ashtray/glass,
/obj/item/storage/fancy/cigarettes/kpack{
- pixel_y = 10;
- pixel_x = 13
+ pixel_x = 13;
+ pixel_y = 10
},
/obj/item/clothing/mask/cigarette,
/turf/open/floor/carpet,
@@ -32268,9 +32298,9 @@
"sYF" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/yellow{
layer = 3.2
@@ -33331,9 +33361,9 @@
/area/mainship/living/starboard_garden)
"tJx" = (
/obj/structure/window/framed/mainship/hull/canterbury{
- name = "empty space";
+ hit_sound = null;
invisibility = 100;
- hit_sound = null
+ name = "empty space"
},
/turf/open/floor/stairs/dark/left{
dir = 1
@@ -33348,9 +33378,9 @@
/area/mainship/hull/upper_hull)
"tJG" = (
/obj/structure/window/framed/mainship/hull/canterbury{
- name = "empty space";
+ hit_sound = null;
invisibility = 100;
- hit_sound = null
+ name = "empty space"
},
/obj/machinery/light/mainship{
dir = 4
@@ -33485,9 +33515,9 @@
"tQf" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/blue{
layer = 3.2
@@ -33608,8 +33638,8 @@
"tUh" = (
/obj/structure/reagent_dispensers/watertank,
/obj/structure/sign/semiotic/water{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/plating,
/area/mainship/hull/starboard_hull)
@@ -33678,8 +33708,8 @@
"tWw" = (
/obj/item/radio/intercom/general{
dir = 1;
- pixel_y = -19;
- pixel_x = -8
+ pixel_x = -8;
+ pixel_y = -19
},
/obj/structure/table/black,
/obj/structure/sign/semiotic/intercom{
@@ -33696,8 +33726,8 @@
/area/mainship/squads/alpha)
"tWH" = (
/obj/structure/sign/semiotic/north{
- pixel_y = 7;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 7
},
/obj/structure/sign/semiotic/bridge{
pixel_x = -17;
@@ -33752,8 +33782,8 @@
"tYC" = (
/obj/item/radio/intercom/general{
dir = 1;
- pixel_y = -19;
- pixel_x = -8
+ pixel_x = -8;
+ pixel_y = -19
},
/obj/structure/table/black,
/obj/structure/sign/semiotic/intercom{
@@ -33763,8 +33793,8 @@
/area/mainship/command/cic)
"tYD" = (
/obj/structure/mirror{
- pixel_y = 10;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 10
},
/obj/structure/sink/bathroom,
/turf/open/floor/plating/plating_catwalk/dark,
@@ -34293,8 +34323,8 @@
/area/mainship/squads/alpha)
"uou" = (
/obj/structure/largecrate/random/case{
- pixel_y = 5;
- pixel_x = 4
+ pixel_x = 4;
+ pixel_y = 5
},
/turf/open/floor/mainship/red,
/area/mainship/squads/alpha)
@@ -34338,8 +34368,8 @@
/area/mainship/command/cic)
"upJ" = (
/obj/structure/sign/semiotic/food_storage{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/obj/machinery/vending/marineFood,
/turf/open/floor/mainship/metal,
@@ -34377,9 +34407,9 @@
"uqU" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/yellow{
layer = 3.2
@@ -34686,19 +34716,19 @@
/area/mainship/living/grunt_rnr)
"uAy" = (
/obj/machinery/light/mainship,
-/obj/machinery/loadout_vendor,
/obj/structure/window{
- dir = 4
+ dir = 8
},
+/obj/machinery/quick_vendor/beginner,
/turf/open/floor/mainship/blue,
/area/mainship/squads/delta)
"uBb" = (
/obj/structure/paper_bin,
/obj/item/tool/pen,
/obj/machinery/door_control/mainship/cic{
+ dir = 8;
id = "CIC Checkpoint Shutters";
- name = "CIC Checkpoint Shutters";
- dir = 8
+ name = "CIC Checkpoint Shutters"
},
/obj/item/tool/pen,
/obj/structure/table/black,
@@ -34739,8 +34769,8 @@
},
/obj/structure/sink/bathroom,
/obj/structure/mirror{
- pixel_y = 10;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 10
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/charlie)
@@ -34874,8 +34904,8 @@
"uGs" = (
/obj/structure/sink/bathroom,
/obj/structure/mirror{
- pixel_y = 10;
- pixel_x = -1
+ pixel_x = -1;
+ pixel_y = 10
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/bravo)
@@ -34920,6 +34950,9 @@
/obj/effect/turf_decal/woodsiding{
dir = 10
},
+/obj/machinery/keycard_auth{
+ pixel_x = -30
+ },
/turf/open/floor/carpet,
/area/mainship/engineering/ce_room)
"uIu" = (
@@ -35226,12 +35259,12 @@
"uSa" = (
/obj/structure/table/fancywoodentable,
/obj/item/camera_film{
- pixel_y = 3;
- pixel_x = -4
+ pixel_x = -4;
+ pixel_y = 3
},
/obj/item/camera{
- pixel_y = 3;
- pixel_x = -5
+ pixel_x = -5;
+ pixel_y = 3
},
/obj/item/flashlight/lamp/green{
pixel_x = 7
@@ -35531,8 +35564,8 @@
pixel_y = 24
},
/obj/structure/sign/semiotic/escapepod{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal/lino,
/area/mainship/hallways/aft_hallway)
@@ -35555,8 +35588,8 @@
/area/mainship/hull/upper_hull)
"vcY" = (
/obj/machinery/vending/nanomed{
- pixel_y = 4;
- pixel_x = -6
+ pixel_x = -6;
+ pixel_y = 4
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/delta)
@@ -35641,8 +35674,8 @@
dir = 8
},
/obj/item/toy/plush/moth{
- name = "scared moth plush";
- desc = "A plushie depicting a scared moth. It was trying to eat in peace, but you ruined it!"
+ desc = "A plushie depicting a scared moth. It was trying to eat in peace, but you ruined it!";
+ name = "scared moth plush"
},
/turf/open/floor/mainship/tcomms,
/area/mainship/command/self_destruct)
@@ -36035,8 +36068,8 @@
"vtN" = (
/obj/machinery/vending/marineFood,
/obj/structure/sign/semiotic/food_storage{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/req)
@@ -36184,8 +36217,8 @@
pixel_y = -25
},
/obj/structure/sign/semiotic/high_voltage{
- pixel_y = -25;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal,
/area/mainship/hallways/port_hallway)
@@ -36215,8 +36248,8 @@
"vAb" = (
/obj/item/radio/intercom/general{
dir = 1;
- pixel_y = -19;
- pixel_x = -8
+ pixel_x = -8;
+ pixel_y = -19
},
/obj/structure/bed/chair/comfy/charlie{
dir = 1
@@ -36378,8 +36411,8 @@
dir = 1
},
/obj/structure/mirror{
- pixel_y = -15;
- dir = 1
+ dir = 1;
+ pixel_y = -15
},
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1/alt{
dir = 1
@@ -36428,8 +36461,8 @@
},
/obj/structure/bed/chair/wood,
/obj/structure/sign/semiotic/intercom{
- pixel_y = 7;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 7
},
/turf/open/floor/mainship/metal/lino,
/area/mainship/living/cafeteria)
@@ -37037,8 +37070,8 @@
},
/obj/structure/cable,
/obj/machinery/door/airlock/multi_tile/mainship/blackgeneric/glass{
- name = "\improper Vehicle Crew Office";
dir = 2;
+ name = "\improper Vehicle Crew Office";
req_one_access = list(49)
},
/obj/machinery/door/firedoor,
@@ -37091,8 +37124,8 @@
pixel_y = 24
},
/obj/structure/sign/semiotic/escapepod{
- pixel_y = 39;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 39
},
/turf/open/floor/mainship/metal,
/area/mainship/hallways/aft_hallway)
@@ -37151,6 +37184,13 @@
/obj/structure/cable,
/turf/open/floor/plating/plating_catwalk/dark,
/area/mainship/hallways/hangar)
+"wbo" = (
+/obj/structure/table/mainship,
+/obj/machinery/recharger,
+/turf/open/floor/prison/whitepurple{
+ dir = 6
+ },
+/area/mainship/medical/medical_science)
"wbu" = (
/obj/structure/rack,
/obj/effect/spawner/random/misc/table_lighting,
@@ -37337,13 +37377,13 @@
/area/mainship/squads/bravo)
"whB" = (
/obj/item/radio/intercom/general{
- pixel_y = -20;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = -20
},
/obj/effect/landmark/start/latejoin_squad/delta,
/obj/structure/sign/semiotic/intercom{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/plating/plating_catwalk/dark,
/area/mainship/squads/delta)
@@ -37575,8 +37615,8 @@
/obj/effect/turf_decal/warning_stripes/cargo/yellow,
/obj/item/radio/intercom/general{
dir = 1;
- pixel_y = -19;
- pixel_x = -8
+ pixel_x = -8;
+ pixel_y = -19
},
/obj/structure/sign/semiotic/intercom{
pixel_y = -25
@@ -37710,8 +37750,8 @@
pixel_y = -25
},
/obj/structure/sign/semiotic/distribution_pipes{
- pixel_y = -25;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = -25
},
/turf/open/floor/plating,
/area/mainship/hull/starboard_hull)
@@ -38000,12 +38040,12 @@
dir = 4
},
/obj/structure/sign/semiotic/suit_storage{
- pixel_y = 39;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 39
},
/obj/structure/sign/semiotic/distribution_pipes{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/obj/structure/sign/semiotic/electronics{
pixel_y = 24
@@ -38059,9 +38099,9 @@
layer = 3.2
},
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/red{
pixel_y = 13
@@ -38239,9 +38279,9 @@
"wNm" = (
/obj/effect/ai_node,
/obj/structure/window/framed/mainship/hull/canterbury{
- name = "empty space";
+ hit_sound = null;
invisibility = 100;
- hit_sound = null
+ name = "empty space"
},
/obj/effect/turf_decal/siding/metal{
dir = 6
@@ -38470,9 +38510,9 @@
"wUQ" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/purple{
layer = 3.2
@@ -38554,8 +38594,8 @@
/area/mainship/living/cafeteria)
"wXi" = (
/obj/structure/sign/semiotic/exhaust{
- pixel_y = -21;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = -21
},
/obj/structure/sign/semiotic/fire_haz{
pixel_x = -17;
@@ -38612,8 +38652,8 @@
/obj/machinery/light/mainship,
/obj/effect/ai_node,
/obj/structure/sign/semiotic/east{
- pixel_y = -25;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = -25
},
/obj/structure/sign/semiotic/high_voltage{
pixel_y = -25
@@ -38754,8 +38794,8 @@
pixel_y = 24
},
/obj/structure/sign/semiotic/ref_bio_storage{
- pixel_y = 24;
- pixel_x = 15
+ pixel_x = 15;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal/gray,
/area/mainship/medical/surgery_hallway)
@@ -38971,8 +39011,8 @@
"xjK" = (
/obj/machinery/light/floor,
/obj/structure/sign/semiotic/bathmens{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal/lino,
/area/mainship/living/starboard_emb)
@@ -39229,8 +39269,8 @@
"xsE" = (
/obj/machinery/vending/marineFood,
/obj/structure/sign/semiotic/food_storage{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/alpha)
@@ -39391,8 +39431,8 @@
pixel_y = -18
},
/obj/structure/sign/semiotic/intercom{
- pixel_y = 7;
- pixel_x = 32
+ pixel_x = 32;
+ pixel_y = 7
},
/turf/open/floor/wood,
/area/mainship/squads/alpha)
@@ -39532,8 +39572,8 @@
"xBI" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/sign/semiotic/south{
- pixel_y = -8;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = -8
},
/obj/structure/sign/semiotic/elevator{
pixel_x = -17;
@@ -39597,8 +39637,8 @@
},
/obj/structure/reagent_dispensers/watertank,
/obj/structure/sign/semiotic/water{
- pixel_y = -25;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -25
},
/obj/structure/disposalpipe/segment{
dir = 4
@@ -39967,9 +40007,9 @@
"xNa" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/blue{
layer = 3.2
@@ -40053,9 +40093,9 @@
"xQZ" = (
/obj/structure/bed,
/obj/structure/bed{
- pixel_y = 13;
layer = 3.5;
- max_buckled_mobs = 13
+ max_buckled_mobs = 13;
+ pixel_y = 13
},
/obj/item/bedsheet/yellow{
layer = 3.2
@@ -40196,9 +40236,9 @@
/area/mainship/hull/upper_hull)
"xWl" = (
/obj/structure/window/framed/mainship/hull/canterbury{
- name = "empty space";
+ hit_sound = null;
invisibility = 100;
- hit_sound = null
+ name = "empty space"
},
/turf/open/floor/stairs/dark/right{
dir = 1
@@ -40325,8 +40365,8 @@
"xZX" = (
/obj/structure/cable,
/obj/structure/sign/semiotic/cryo{
- pixel_y = -32;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = -32
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
dir = 8
@@ -40380,9 +40420,9 @@
"ybg" = (
/obj/effect/ai_node,
/obj/structure/window/framed/mainship/hull/canterbury{
- name = "empty space";
+ hit_sound = null;
invisibility = 100;
- hit_sound = null
+ name = "empty space"
},
/obj/effect/turf_decal/siding/metal{
dir = 10
@@ -40408,8 +40448,8 @@
dir = 4
},
/obj/structure/sign/semiotic/coffee{
- pixel_y = 24;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 24
},
/turf/open/floor/mainship/metal/full,
/area/mainship/squads/charlie)
@@ -61111,7 +61151,7 @@ lhv
uSU
mVy
lay
-lxr
+wbo
oYi
uHQ
lhv
@@ -67558,7 +67598,7 @@ pQT
pQT
pQT
pQT
-xXP
+pdB
pdB
pdB
pdB
@@ -68430,7 +68470,7 @@ xzH
qQI
uNE
uJU
-qPr
+qak
toq
lSw
rEU
@@ -69985,7 +70025,7 @@ cEa
hjM
xzH
xPw
-vfY
+dOs
wgv
viz
rqA
@@ -82160,7 +82200,7 @@ hwt
sRd
pTc
xhq
-sAK
+iqo
xZI
fNK
hFG
@@ -82417,7 +82457,7 @@ qvh
dNU
nJh
xhq
-iqo
+fuK
sEf
lYT
dme
@@ -82674,7 +82714,7 @@ nYl
eDk
pTc
xhq
-pWv
+oZG
sXV
sFX
nju
@@ -82719,7 +82759,7 @@ eWU
bny
aDy
knz
-mSl
+igP
tkN
eDY
bli
diff --git a/_maps/map_files/generic/Admin_Level.dmm b/_maps/map_files/generic/Admin_Level.dmm
index 4641989b3ba..de030817734 100644
--- a/_maps/map_files/generic/Admin_Level.dmm
+++ b/_maps/map_files/generic/Admin_Level.dmm
@@ -648,10 +648,10 @@
/turf/closed/mineral/smooth/indestructible,
/area/centcom/valhalla)
"jvi" = (
-/obj/machinery/marine_selector/clothes/valhalla,
/obj/effect/turf_decal/warning_stripes/thick{
dir = 6
},
+/obj/machinery/quick_vendor/beginner,
/turf/open/floor/iron/dark/textured,
/area/centcom/valhalla)
"jvR" = (
@@ -1011,13 +1011,13 @@
/turf/open/floor/mainship/rubber,
/area/centcom/valhalla)
"nKg" = (
-/obj/machinery/marine_selector/clothes/valhalla,
/obj/effect/turf_decal/warning_stripes/thick{
dir = 6
},
/obj/effect/turf_decal/warning_stripes/thick{
dir = 8
},
+/obj/machinery/quick_vendor/beginner,
/turf/open/floor/iron/dark/textured,
/area/centcom/valhalla)
"nOQ" = (
diff --git a/_maps/orion_outpost.json b/_maps/orion_outpost.json
index 9ee302832db..f5b63c5c375 100644
--- a/_maps/orion_outpost.json
+++ b/_maps/orion_outpost.json
@@ -7,5 +7,5 @@
},
"armor": "jungle",
"quickbuilds": 1000,
- "announce_text": "The automatic emergency beacon has activated at the Orion Military Outpost on the moon of Trivonus IV, a xenomorph infestation is likely. TGMC, get prepared and ready for a fight!"
+ "announce_text": "На военном форпосте Ориона на луне Тривонус IV сработал автоматический аварийный маяк, вероятно нашествие ксеноморфов. Товарищи, приготовиться к бою!"
}
diff --git a/_maps/oscar_outpost.json b/_maps/oscar_outpost.json
index c8adba1b1b1..3616d22b434 100644
--- a/_maps/oscar_outpost.json
+++ b/_maps/oscar_outpost.json
@@ -2,5 +2,5 @@
"map_name": "Oscar Outpost",
"map_path": "map_files/oscar_outpost",
"map_file": "oscar_outpost.dmm",
- "announce_text": "A faint distress signal has been picked up by our scanners, which have tracked the source to Batallion 167's Supreme Command Center. Through use of emergency bluespace drive tech, the ship has jumped within range of the outpost. Senior officers are present and will need to be evacuated in order to completely finish your mission. TGMC, gear up and get ready to respond!"
+ "announce_text": "Наши сканеры засекли слабый сигнал бедствия и отследили его источник до Высшего командного центра батальона 167. Используя блюспейс технологии, корабль прыгнул в пределы досягаемости аванпоста. Там находятся старшие офицеры, которых необходимо эвакуировать, чтобы полностью завершить вашу миссию. Товарищи, снарядитесь и приготовьтесь к высадке!"
}
diff --git a/_maps/prison_station_fop.json b/_maps/prison_station_fop.json
index b7e4a741f39..5c770d7395f 100644
--- a/_maps/prison_station_fop.json
+++ b/_maps/prison_station_fop.json
@@ -7,5 +7,5 @@
},
"armor": "prison",
"quickbuilds": 1200,
- "announce_text": "A Nanotrasen maximum security prison has activated its distress signal. The ship is swiftly cruising through space, and nearing the vicinity of the prison station. TGMC, get moving!"
+ "announce_text": "Тюрьма строгого режима НаноТрейзен активировала сигнал бедствия. Корабль стремительно несется по космосу и приближается к тюремной станции. Товарищи, выдвигаемся!"
}
diff --git a/_maps/research_outpost.json b/_maps/research_outpost.json
index 7ef6172481b..f770cda6035 100644
--- a/_maps/research_outpost.json
+++ b/_maps/research_outpost.json
@@ -6,5 +6,5 @@
"basic": 1
},
"quickbuilds": 1000,
- "announce_text": "A research outpost has had a beacon transmitting the same signal, nonstop. Attempts to hail the colony over comms have proved futile. Because the ship was at a nearby drydock, it has been dispatched to figure out what's wrong. TGMC, prepare to deploy!"
+ "announce_text": "На исследовательском форпосте появился маяк, безостановочно передающий один и тот же сигнал. Попытки связаться с колонией по связи оказались тщетными. Поскольку ваш корабль находился ближе всего, мы отправили вас выяснить в чем дело. Товарищи, приготовиться к высадке!"
}
diff --git a/_maps/shuttles/tgs_bigbury.dmm b/_maps/shuttles/tgs_bigbury.dmm
index 2933690aedd..2265863c7f3 100644
--- a/_maps/shuttles/tgs_bigbury.dmm
+++ b/_maps/shuttles/tgs_bigbury.dmm
@@ -1013,6 +1013,10 @@
},
/turf/open/floor/mainship/blue,
/area/shuttle/canterbury/cic)
+"Uc" = (
+/obj/machinery/quick_vendor/beginner,
+/turf/open/floor/mainship/mono,
+/area/shuttle/canterbury)
"Ui" = (
/obj/structure/window/reinforced{
dir = 4
@@ -1517,7 +1521,7 @@ an
ac
FQ
Fl
-Fl
+Uc
bG
an
ma
@@ -1590,7 +1594,7 @@ ab
bG
UO
aO
-Fl
+Uc
bA
bA
yp
diff --git a/_maps/shuttles/tgs_canterbury.dmm b/_maps/shuttles/tgs_canterbury.dmm
index 6938ea9f984..907f024dd2a 100644
--- a/_maps/shuttles/tgs_canterbury.dmm
+++ b/_maps/shuttles/tgs_canterbury.dmm
@@ -816,7 +816,7 @@
/obj/structure/window/reinforced/toughened{
dir = 4
},
-/obj/machinery/loadout_vendor/crash,
+/obj/machinery/quick_vendor/beginner,
/turf/open/floor/mainship/cargo,
/area/shuttle/canterbury)
"KE" = (
diff --git a/_maps/slumbridge.json b/_maps/slumbridge.json
index 6228d03ca71..6fa73229dbf 100644
--- a/_maps/slumbridge.json
+++ b/_maps/slumbridge.json
@@ -6,5 +6,5 @@
"basic": 1
},
"quickbuilds": 2000,
- "announce_text": "We've received not one, but four distress signals at once coming from the same location. Ground-penetrating scanners and sensors show an unusual arrangement of a segmented asteroid with artificial gravity online. Not only that, but the four segments look nothing alike. TGMC, prepare for deployment and expect the worst."
+ "announce_text": "Мы получили не один, а сразу четыре сигнала бедствия из одного и того же места. Наземные сканеры и сенсоры показывают необычное расположение сегментированного астероида с включенной искусственной гравитацией. Мало того, четыре сегмента совершенно не похожи друг на друга. Товарищи, приготовьтесь к высадке и ожидайте худшего."
}
diff --git a/_maps/vapor_processing.json b/_maps/vapor_processing.json
index 0a5a7e531b5..38d75d5c8d1 100644
--- a/_maps/vapor_processing.json
+++ b/_maps/vapor_processing.json
@@ -5,5 +5,5 @@
"disk_sets": {
"basic": 1
},
- "announce_text": "A faint distress signal has been picked up by our scanners, which have tracked the source to a Vapor Processing colony, known as LV-984. Through use of bluespace drive tech, the ship has jumped within range of the colony. TGMC, gear up and get ready to respond!"
+ "announce_text": "Наши сканеры засекли слабый сигнал бедствия и определили, что его источником является колония по парообработке, известная как LV-984. Используя блюспейс технологии, корабль прыгнул в пределы досягаемости аванпоста. Товарищи, снарядитесь и приготовьтесь к высадке!"
}
diff --git a/_maps/whiskey_outpost_v2.json b/_maps/whiskey_outpost_v2.json
index 5373edafb46..dba854869a0 100644
--- a/_maps/whiskey_outpost_v2.json
+++ b/_maps/whiskey_outpost_v2.json
@@ -2,5 +2,5 @@
"map_name": "Whiskey Outpost",
"map_path": "map_files/Whiskey_Outpost",
"map_file": "Whiskey_Outpost_v2.dmm",
- "announce_text": "A faint distress signal has been picked up by our scanners, which have tracked the source to Batallion 140's Supreme Command Center. Through use of emergency bluespace drive tech, the ship has jumped within range of the outpost. Senior officers are present and will need to be evacuated in order to completely finish your mission. TGMC, gear up and get ready to respond!"
+ "announce_text": "Наши сканеры засекли слабый сигнал бедствия и отследили его источник до Высшего командного центра батальона 140. Используя блюспейс технологии, корабль прыгнул в пределы досягаемости колонии. Товарищи, снаряжайтесь и готовьтесь к высадке!"
}
diff --git a/code/__DEFINES/calibers.dm b/code/__DEFINES/calibers.dm
index 24a49d1842b..d8a6479dc75 100644
--- a/code/__DEFINES/calibers.dm
+++ b/code/__DEFINES/calibers.dm
@@ -19,7 +19,7 @@
#define CALIBER_357 ".357 Magnum"
#define CALIBER_454 ".454 Casull" //Mateba
#define CALIBER_762X38 "7.62x38mm Rimmed" //UPP
-#define CALIBER_12x7 "12.7 Magnum"
+#define CALIBER_12X7 "12.7 Magnum"
#define CALIBER_44LS ".44 Long Special"
#define CALIBER_500 ".500 Nigro Express"
@@ -33,8 +33,8 @@
// --- Rifles ---
#define CALIBER_10X24_CASELESS "10x24mm caseless"
#define CALIBER_10X25_CASELESS "10x25mm caseless"
-#define CALIBER_10x27_CASELESS "10x27mm caseless"
-#define CALIBER_10x265_CASELESS "10x26.5mm caseless"
+#define CALIBER_10X27_CASELESS "10x27mm caseless"
+#define CALIBER_10X265_CASELESS "10x26.5mm caseless"
#define CALIBER_762X39 "7.62x39mm"
#define CALIBER_556X45 "5.56x45mm"
#define CALIBER_16G "16 gauge" //Autoshotty, but coded like a rifle so eeh
@@ -44,7 +44,7 @@
#define CALIBER_10X28_CASELESS "10x28mm caseless" //Spec scout and OG Smartgun
#define CALIBER_762X51 "7.62x51mm" //Minigun
#define CALIBER_10X27_INCENDIARY_CASELESS "10x27mm incendiary caseless"
-#define CALIBER_10x26_CASELESS "10x26mm caseless" //MG-60 and SG
+#define CALIBER_10X26_CASELESS "10x26mm caseless" //MG-60 and SG
#define CALIBER_ALIEN "alien alloy"
// --- Shotguns ---
diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm
index 17b451f71fe..95634570355 100644
--- a/code/__DEFINES/cooldowns.dm
+++ b/code/__DEFINES/cooldowns.dm
@@ -27,6 +27,7 @@
#define COOLDOWN_RACK_BOLT "rack_bolt"
#define COOLDOWN_LIGHT "cooldown_light"
#define COOLDOWN_JETPACK "jetpack"
+#define COOLDOWN_SKILL_ORDERS "skill_orders"
#define COOLDOWN_CIC_ORDERS "cic_orders"
#define COOLDOWN_HUD_ORDER "hud_order"
#define COOLDOWN_CLOAK_IMPLANT "cloak_implant"
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index ca8bfd87804..ec035c4e288 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -802,6 +802,9 @@
#define COMSIG_XENOABILITY_REGENERATE_SKIN "xenoability_regenerate_skin"
#define COMSIG_XENOABILITY_CENTRIFUGAL_FORCE "xenoability_centrifugal_force"
+#define COMSIG_XENOABILITY_STEELCREST_HEADBUTT "xenoability_steelcrest_bodyswap_headbutt"
+#define COMSIG_XENOABILITY_STEELCREST_SOAK "xenoability_steelcrest_soak"
+
#define COMSIG_XENOABILITY_EMIT_NEUROGAS "xenoability_emit_neurogas"
#define COMSIG_XENOABILITY_SELECT_REAGENT "xenoability_select_reagent"
#define COMSIG_XENOABILITY_RADIAL_SELECT_REAGENT "xenoability_radial_select_reagent"
@@ -1012,7 +1015,11 @@
//Signals for CIC orders
#define COMSIG_ORDER_SELECTED "order_selected"
-#define COMSIG_ORDER_SENT "order_updated"
+#define COMSIG_CIC_ORDER_SENT "order_updated"
+#define COMSIG_CIC_ORDER_OFF_CD "order_off_cd"
+
+#define COMSIG_SKILL_ORDER_SENT "skill_order_updated"
+#define COMSIG_SKILL_ORDER_OFF_CD "skill_order_off_cd"
//Signals for automatic fire at component
#define COMSIG_AUTOMATIC_SHOOTER_START_SHOOTING_AT "start_shooting_at"
diff --git a/code/__DEFINES/equipment.dm b/code/__DEFINES/equipment.dm
index 6e74a31bb58..326b4d295cf 100644
--- a/code/__DEFINES/equipment.dm
+++ b/code/__DEFINES/equipment.dm
@@ -117,6 +117,12 @@
///If a storage container can be restocked into a vendor
#define BYPASS_VENDOR_CHECK (1<<0)
+//flags_id
+///If you can get buy a loadout
+#define CAN_BUY_LOADOUT (1<<0)
+///If you have used the GHMME
+#define USED_GHMME (1<<1)
+
//==========================================================================================
//flags_inv_hide
diff --git a/code/__DEFINES/greyscale_guns.dm b/code/__DEFINES/greyscale_guns.dm
index fcfeb35e883..648f85338c8 100644
--- a/code/__DEFINES/greyscale_guns.dm
+++ b/code/__DEFINES/greyscale_guns.dm
@@ -5,6 +5,7 @@
#define AMMO_BAND_COLOR_INCENDIARY "#9C2219"
#define AMMO_BAND_COLOR_EXPLOSIVE "#3f1111"
#define AMMO_BAND_COLOR_SABOT "#663618"
+#define AMMO_BAND_COLOR_IMPACT "#0052CC"
#define GUN_PALETTE_TAN "#3F382E#61574A#807360#978872"
#define GUN_PALETTE_RED "#421010#601e1e#762525#9b3a28"
diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm
index dff605b19ae..efd176e83bd 100644
--- a/code/__DEFINES/jobs.dm
+++ b/code/__DEFINES/jobs.dm
@@ -159,14 +159,3 @@ GLOBAL_LIST_INIT(jobs_fallen_marine, typecacheof(list(/datum/job/fallen/marine),
#define SILO_ORIGIN "xenos from silo generation"
#define SQUAD_MAX_POSITIONS(total_positions) CEILING(total_positions / length(SSjob.active_squads), 1)
-
-/// How many points a marine can spend in job specific vendors by default
-#define DEFAULT_TOTAL_BUY_POINTS 45
-/// How many points a medic can spend on pills
-#define MEDIC_TOTAL_BUY_POINTS 45
-/// How many points an engineer can spend
-#define ENGINEER_TOTAL_BUY_POINTS 75
-/// How many points the field commander can spend
-#define COMMANDER_TOTAL_BUY_POINTS 45
-/// How many points the synthetic can spend
-#define SYNTH_TOTAL_BUY_POINTS 50
diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm
index 7bc87cc508f..93397daaae6 100644
--- a/code/__DEFINES/loadout.dm
+++ b/code/__DEFINES/loadout.dm
@@ -16,6 +16,10 @@
#define CAT_MOD "JAEGER STORAGE MODULES"
#define CAT_ARMMOD "JAEGER ARMOR MODULES"
+// Synth Special Categories
+#define CAT_SMR "SUITS AND ARMOR" // Synth's suits
+#define CAT_SHN "HATS" // Synth's non-protective hats
+
#define CAT_MEDSUP "MEDICAL SUPPLIES"
#define CAT_ENGSUP "ENGINEERING SUPPLIES"
#define CAT_LEDSUP "LEADER SUPPLIES"
@@ -26,9 +30,34 @@
#define CAT_ROBOT "COMBAT ROBOT SUPPLIES"
#define CAT_LOAD "LOADOUT"
-// Synth Special Categories
-#define CAT_SMR "SUITS AND ARMOR" // Synth's suits
-#define CAT_SHN "HATS" // Synth's non-protective hats
+/// How many points a marine can spend by default
+#define MARINE_TOTAL_BUY_POINTS 45
+/// How many points the robot can spend
+#define ROBOT_TOTAL_BUY_POINTS 45
+/// How many points the leader can spend
+#define LEADER_TOTAL_BUY_POINTS 45
+/// How many points the leader can spend
+#define SMARTGUNNER_TOTAL_BUY_POINTS 45
+/// How many points a medic can spend on pills
+#define MEDIC_TOTAL_BUY_POINTS 45
+/// How many points an engineer can spend
+#define ENGINEER_TOTAL_BUY_POINTS 75
+/// How many points the field commander can spend
+#define COMMANDER_TOTAL_BUY_POINTS 45
+/// How many points the synthetic can spend
+#define SYNTH_TOTAL_BUY_POINTS 50
+
+GLOBAL_LIST_INIT(default_marine_points, list(
+ CAT_MARINE = MARINE_TOTAL_BUY_POINTS,
+ CAT_ROBOT = ROBOT_TOTAL_BUY_POINTS,
+ CAT_SGSUP = SMARTGUNNER_TOTAL_BUY_POINTS,
+ CAT_ENGSUP = ENGINEER_TOTAL_BUY_POINTS,
+ CAT_LEDSUP = LEADER_TOTAL_BUY_POINTS,
+ CAT_MEDSUP = MEDIC_TOTAL_BUY_POINTS,
+ CAT_FCSUP = COMMANDER_TOTAL_BUY_POINTS,
+ CAT_SYNTH = SYNTH_TOTAL_BUY_POINTS,
+))
+
#define VENDOR_FACTION_NEUTRAL "Neutral"
#define VENDOR_FACTION_CRASH "Crash"
@@ -74,7 +103,7 @@ GLOBAL_LIST_INIT(marine_gear_listed_products, list(
/obj/structure/closet/crate/mortar_ammo/howitzer_kit = list(CAT_MARINE, "Howitzer kit", 35, "orange3"),
/obj/structure/closet/crate/mortar_ammo/mlrs_kit = list(CAT_MARINE, "MLRS kit", 35, "orange3"),
/obj/item/reagent_containers/hypospray/autoinjector/oxycodone = list(CAT_MARINE, "Oxycodone autoinjector", 5, "cyan"),
- /obj/item/reagent_containers/hypospray/autoinjector/russian_red = list(CAT_MARINE, "Emergency autoinjecto", 10, "cyan"),
+ /obj/item/reagent_containers/hypospray/autoinjector/russian_red = list(CAT_MARINE, "Emergency autoinjector", 10, "cyan"),
/obj/item/reagent_containers/hypospray/autoinjector/synaptizine = list(CAT_MARINE, "Synaptizine autoinjector", 8, "cyan"),
/obj/vehicle/ridden/motorbike = list(CAT_MARINE, "Bike", 30, "blue"),
/obj/item/sidecar = list(CAT_MARINE, "Bike sidecar", 8, "blue"),
@@ -685,7 +714,7 @@ GLOBAL_LIST_INIT(medic_clothes_listed_products, list(
/obj/item/armor_module/storage/uniform/holster = list(CAT_WEB, "Shoulder handgun holster", 0, "black"),
/obj/item/storage/belt/lifesaver/full = list(CAT_BEL, "Lifesaver belt", 0, "orange"),
/obj/item/storage/belt/rig/medical = list(CAT_BEL, "Rig belt", 0, "black"),
- /obj/item/storage/belt/hypospraybelt = list(CAT_BEL, "Hypospray belt", 0, "black"),
+ /obj/item/storage/belt/hypospraybelt/full = list(CAT_BEL, "Hypospray belt", 0, "black"),
/obj/item/armor_module/module/welding = list(CAT_HEL, "Jaeger welding module", 0, "orange"),
/obj/item/armor_module/module/binoculars = list(CAT_HEL, "Jaeger binoculars module", 0, "orange"),
/obj/item/armor_module/module/artemis = list(CAT_HEL, "Jaeger Freyr module", 0, "orange"),
@@ -909,7 +938,7 @@ GLOBAL_LIST_INIT(synthetic_clothes_listed_products, list(
/obj/item/clothing/gloves/white = list(CAT_GLO, "White gloves", 0, "black"),
/obj/item/storage/belt/lifesaver/full = list(CAT_BEL, "Lifesaver belt", 0, "orange", "synth-attachable"),
/obj/item/storage/belt/rig/medical = list(CAT_BEL, "Rig belt", 0, "black"),
- /obj/item/storage/belt/hypospraybelt = list(CAT_BEL, "Hypospray belt", 0, "black"),
+ /obj/item/storage/belt/hypospraybelt/full = list(CAT_BEL, "Hypospray belt", 0, "black"),
/obj/item/clothing/shoes/marine = list(CAT_SHO, "Marine combat boots", 0, "synth-rcmarmor"),
/obj/item/clothing/shoes/white = list(CAT_SHO, "White shoes", 0, "synth-armor"),
/obj/item/clothing/shoes/brown = list(CAT_SHO, "Brown shoes", 0, "synth-armor"),
diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm
index 12a9a9eae0d..a8e4d99fb85 100644
--- a/code/__DEFINES/movespeed_modification.dm
+++ b/code/__DEFINES/movespeed_modification.dm
@@ -30,6 +30,7 @@
#define MOVESPEED_ID_XENO_CHARGE "XENO_CHARGE_MODIFIER"
#define MOVESPEED_ID_ENHANCEMENT "ENHANCEMENT"
#define MOVESPEED_ID_CRESTDEFENSE "CRESTDEFENSE"
+#define MOVESPEED_ID_FORTIFY "FORTIFY"
#define MOVESPEED_ID_WARRIOR_AGILITY "WARRIOR_AGILITY"
#define MOVESPEED_ID_FRENZY_AURA "FRENZY_AURA"
#define MOVESPEED_ID_XENO_HEMODILE "XENO_HEMODILE"
diff --git a/code/__DEFINES/objects.dm b/code/__DEFINES/objects.dm
index 4865b3da080..920be09f9da 100644
--- a/code/__DEFINES/objects.dm
+++ b/code/__DEFINES/objects.dm
@@ -206,11 +206,6 @@ GLOBAL_LIST_INIT(restricted_camera_networks, list( //Those networks can only be
#define NIGHTFALL_IMMUNE 3
#define NO_LIGHT_STATE_CHANGE 4
-//Xeno turrets define
-#define TURRET_SCAN_RANGE 25
-#define TURRET_SCAN_FREQUENCY 10 SECONDS
-#define TURRET_HEALTH_REGEN 8
-
//Unmanned vehicle define
#define OVERLAY_TURRET (1<<0)
#define HAS_HEADLIGHTS (1<<1)
diff --git a/code/__DEFINES/overwatch.dm b/code/__DEFINES/overwatch.dm
index 884335f68a9..ca375ca1702 100644
--- a/code/__DEFINES/overwatch.dm
+++ b/code/__DEFINES/overwatch.dm
@@ -1,3 +1,5 @@
-#define ORDER_DURATION 30 SECONDS
-#define ORDER_COOLDOWN 30 SECONDS
-#define RALLY_ORDER_DURATION 30 SECONDS
+#define CIC_ORDER_DURATION 30 SECONDS
+#define CIC_ORDER_COOLDOWN 30 SECONDS
+
+#define SKILL_ORDER_DURATION 30 SECONDS
+#define SKILL_ORDER_COOLDOWN 45 SECONDS
diff --git a/code/__DEFINES/progress_display.dm b/code/__DEFINES/progress_display.dm
index 7de391c9333..bd07f54e878 100644
--- a/code/__DEFINES/progress_display.dm
+++ b/code/__DEFINES/progress_display.dm
@@ -39,3 +39,4 @@
#define BUSY_ICON_BAR /image/progdisplay/bar
#define BUSY_ICON_UNSKILLED /image/progdisplay/unskilled
#define BUSY_ICON_ENERGY /image/progdisplay/energy
+#define BUSY_ICON_FACEHUGGER /image/progdisplay/facehugger
diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm
index 6b6ee730ee1..7d2feb02846 100644
--- a/code/__DEFINES/xeno.dm
+++ b/code/__DEFINES/xeno.dm
@@ -1,8 +1,7 @@
//Xeno structure flags
#define IGNORE_WEED_REMOVAL (1<<0)
-#define HAS_OVERLAY (1<<1)
-#define CRITICAL_STRUCTURE (1<<2)
-#define DEPART_DESTRUCTION_IMMUNE (1<<3)
+#define CRITICAL_STRUCTURE (1<<1)
+#define DEPART_DESTRUCTION_IMMUNE (1<<2)
//Weeds defines
#define WEED "weed sac"
@@ -10,9 +9,6 @@
#define RESTING_WEED "resting weed sac"
#define AUTOMATIC_WEEDING "repeating"
-#define XENO_TURRET_ACID_ICONSTATE "acid_turret"
-#define XENO_TURRET_STICKY_ICONSTATE "resin_turret"
-
//Plant defines
#define HEAL_PLANT "life fruit"
#define ARMOR_PLANT "hard fruit"
@@ -219,10 +215,7 @@ GLOBAL_LIST_INIT(xeno_utility_upgrades, list(
/datum/status_effect/upgrade_trail,
))
-#define XENO_UPGRADE_BIOMASS_COST_T1 10
-#define XENO_UPGRADE_BIOMASS_COST_T2 15
-#define XENO_UPGRADE_BIOMASS_COST_T3 20
-#define XENO_UPGRADE_BIOMASS_COST_T4 25
+#define XENO_UPGRADE_COST 25
#define CHARGE_SPEED(charger) (min(charger.valid_steps_taken, charger.max_steps_buildup) * charger.speed_per_step)
#define CHARGE_MAX_SPEED (speed_per_step * max_steps_buildup)
diff --git a/code/__HELPERS/ai.dm b/code/__HELPERS/ai.dm
index 6e9b16d1e4e..bee07945d03 100644
--- a/code/__HELPERS/ai.dm
+++ b/code/__HELPERS/ai.dm
@@ -63,6 +63,7 @@
if(get_dist(source, nearby_illusion) > distance)
continue
. += nearby_illusion
+
///Returns a list of vehicles via get_dist and same z level method, very cheap compared to range()
/proc/cheap_get_tanks_near(atom/movable/source, distance)
. = list()
@@ -81,6 +82,21 @@
continue
. += nearby_tank
+///Returns a list of unmanned vehicles via get_dist and same z level method, very cheap compared to range()
+/proc/cheap_get_unmanned_vehicles_near(atom/movable/source, distance)
+ . = list()
+ var/turf/source_turf = get_turf(source)
+ if(!source_turf)
+ return
+ for(var/obj/vehicle/unmanned/nearby_unmanned_vehicle AS in GLOB.unmanned_vehicles)
+ if(isnull(nearby_unmanned_vehicle))
+ continue
+ if(source_turf.z != nearby_unmanned_vehicle.z)
+ continue
+ if(get_dist(source_turf, nearby_unmanned_vehicle) > distance)
+ continue
+ . += nearby_unmanned_vehicle
+
///Returns the nearest target that has the right target flag
/proc/get_nearest_target(atom/source, distance, target_flags, attacker_faction, attacker_hive)
if(!source)
diff --git a/code/__HELPERS/announce.dm b/code/__HELPERS/announce.dm
index 555e8140388..58d9994f550 100644
--- a/code/__HELPERS/announce.dm
+++ b/code/__HELPERS/announce.dm
@@ -35,7 +35,6 @@
/proc/assemble_alert(title, subtitle, message, color_override, minor = FALSE)
if(!title || !message)
return
-
var/list/alert_strings = list()
var/header
var/finalized_alert
@@ -70,7 +69,7 @@
*/
/proc/priority_announce(
message,
- title = "Announcement",
+ title = "Оповещение",
subtitle = "",
type = ANNOUNCEMENT_REGULAR,
sound = 'sound/misc/notice2.ogg',
@@ -91,12 +90,12 @@
assembly_header = title
if(ANNOUNCEMENT_PRIORITY)
- assembly_header = "Priority Announcement"
+ assembly_header = "Приоритетное Оповещение"
if(length(title) > 0)
assembly_subtitle = title
if(ANNOUNCEMENT_COMMAND)
- assembly_header = "Command Announcement"
+ assembly_header = "Оповещение Экипажу"
if(subtitle && type != ANNOUNCEMENT_PRIORITY)
assembly_subtitle = subtitle
@@ -125,7 +124,7 @@
SEND_SOUND(M, s)
-/proc/print_command_report(papermessage, papertitle = "paper", announcemessage = "A report has been downloaded and printed out at all communications consoles.", announcetitle = "Incoming Classified Message", announce = TRUE)
+/proc/print_command_report(papermessage, papertitle = "paper", announcemessage = "Отчет был загружен и распечатан на всех консолях связи.", announcetitle = "Входящее зашифрованное сообщение", announce = TRUE)
if(announce)
priority_announce(announcemessage, announcetitle, sound = 'sound/AI/commandreport.ogg')
@@ -147,7 +146,7 @@
* * alert - optional, alert or notice?
* * receivers - a list of all players to send the message to
*/
-/proc/minor_announce(message, title = "Attention:", alert, list/receivers = GLOB.alive_human_list)
+/proc/minor_announce(message, title = "Внимание:", alert, list/receivers = GLOB.alive_human_list)
if(!message)
return
diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index e4a6884d5ee..57404802845 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -683,208 +683,191 @@ ColorTone(rgb, tone)
return BlendRGB(tone, "#ffffff", (gray - tone_gray) / ((255 - tone_gray) || 1))
-/// Creates a single icon from a given /atom or /image. Only the first argument is required.
-/proc/getFlatIcon(image/A, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE)
- //Define... defines.
+/// Create a single [/icon] from a given [/atom] or [/image].
+///
+/// Very low-performance. Should usually only be used for HTML, where BYOND's
+/// appearance system (overlays/underlays, etc.) is not available.
+///
+/// Only the first argument is required.
+/proc/getFlatIcon(image/appearance, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE)
+ // Loop through the underlays, then overlays, sorting them into the layers list
+ #define PROCESS_OVERLAYS_OR_UNDERLAYS(flat, process, base_layer) \
+ for(var/i in 1 to process.len) { \
+ var/image/current = process[i]; \
+ if (!current) { \
+ continue; \
+ } \
+ if (current.plane != FLOAT_PLANE && current.plane != appearance.plane) { \
+ continue; \
+ } \
+ var/current_layer = current.layer; \
+ if (current_layer < 0) { \
+ if (current_layer <= -1000) { \
+ return flat; \
+ } \
+ current_layer = base_layer + appearance.layer + current_layer / 1000; \
+ } \
+ for (var/index_to_compare_to in 1 to layers.len) { \
+ var/compare_to = layers[index_to_compare_to]; \
+ if (current_layer < layers[compare_to]) { \
+ layers.Insert(index_to_compare_to, current); \
+ break; \
+ } \
+ } \
+ layers[current] = current_layer; \
+ }
+
var/static/icon/flat_template = icon('icons/effects/effects.dmi', "nothing")
+ var/icon/flat = icon(flat_template)
+
+ if(!appearance || appearance.alpha <= 0)
+ return flat
- #define BLANK icon(flat_template)
- #define SET_SELF(SETVAR) do { \
- var/icon/SELF_ICON = icon(icon(curicon, curstate, base_icon_dir), "", SOUTH, no_anim ? 1 : null); \
- if(A.alpha < 255) { \
- SELF_ICON.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY);\
- } \
- if(A.color) { \
- if(islist(A.color)){ \
- SELF_ICON.MapColors(arglist(A.color))} \
- else{ \
- SELF_ICON.Blend(A.color, ICON_MULTIPLY)} \
- } \
- ##SETVAR=SELF_ICON;\
- } while (0)
- #define INDEX_X_LOW 1
- #define INDEX_X_HIGH 2
- #define INDEX_Y_LOW 3
- #define INDEX_Y_HIGH 4
-
- #define flatX1 flat_size[INDEX_X_LOW]
- #define flatX2 flat_size[INDEX_X_HIGH]
- #define flatY1 flat_size[INDEX_Y_LOW]
- #define flatY2 flat_size[INDEX_Y_HIGH]
- #define addX1 add_size[INDEX_X_LOW]
- #define addX2 add_size[INDEX_X_HIGH]
- #define addY1 add_size[INDEX_Y_LOW]
- #define addY2 add_size[INDEX_Y_HIGH]
-
- if(!A || A.alpha <= 0)
- return BLANK
-
- var/noIcon = FALSE
if(start)
if(!defdir)
- defdir = A.dir
+ defdir = appearance.dir
if(!deficon)
- deficon = A.icon
+ deficon = appearance.icon
if(!defstate)
- defstate = A.icon_state
+ defstate = appearance.icon_state
if(!defblend)
- defblend = A.blend_mode
+ defblend = appearance.blend_mode
- var/curicon = A.icon || deficon
- var/curstate = A.icon_state || defstate
+ var/curicon = appearance.icon || deficon
+ var/curstate = appearance.icon_state || defstate
+ var/curdir = (!appearance.dir || appearance.dir == SOUTH) ? defdir : appearance.dir
- if(!((noIcon = (!curicon))))
+ var/render_icon = curicon
+
+ if(render_icon)
var/curstates = icon_states(curicon)
if(!(curstate in curstates))
if("" in curstates)
curstate = ""
else
- noIcon = TRUE // Do not render this object.
+ render_icon = FALSE
- var/curdir
var/base_icon_dir //We'll use this to get the icon state to display if not null BUT NOT pass it to overlays as the dir we have
- //These should use the parent's direction (most likely)
- if(!A.dir || A.dir == SOUTH)
- curdir = defdir
- else
- curdir = A.dir
-
- //Try to remove/optimize this section ASAP, CPU hog.
- //Determines if there's directionals.
- if(!noIcon && curdir != SOUTH)
- var/exist = FALSE
- var/static/list/checkdirs = list(NORTH, EAST, WEST)
- for(var/i in checkdirs) //Not using GLOB for a reason.
- if(length(icon_states(icon(curicon, curstate, i))))
- exist = TRUE
- break
- if(!exist)
- base_icon_dir = SOUTH
- //
+ if(render_icon)
+ //Try to remove/optimize this section if you can, it's a CPU hog.
+ //Determines if there're directionals.
+ if(curdir != SOUTH)
+ // icon states either have 1, 4 or 8 dirs. We only have to check
+ // one of NORTH, EAST or WEST to know that this isn't a 1-dir icon_state since they just have SOUTH.
+ if(!length(icon_states(icon(curicon, curstate, NORTH))))
+ base_icon_dir = SOUTH
+
+ var/list/icon_dimensions = get_icon_dimensions(curicon)
+ var/icon_width = icon_dimensions["width"]
+ var/icon_height = icon_dimensions["height"]
+ if(icon_width != 32 || icon_height != 32)
+ flat.Scale(icon_width, icon_height)
if(!base_icon_dir)
base_icon_dir = curdir
ASSERT(!BLEND_DEFAULT) //I might just be stupid but lets make sure this define is 0.
- var/curblend = A.blend_mode || defblend
+ var/curblend = appearance.blend_mode || defblend
- if(length(A.overlays) || length(A.underlays))
- var/icon/flat = BLANK
+ if(length(appearance.overlays) || length(appearance.underlays))
// Layers will be a sorted list of icons/overlays, based on the order in which they are displayed
var/list/layers = list()
var/image/copy
// Add the atom's icon itself, without pixel_x/y offsets.
- if(!noIcon)
- copy = image(icon = curicon, icon_state = curstate, layer = A.layer, dir = base_icon_dir)
- copy.color = A.color
- copy.alpha = A.alpha
+ if(render_icon)
+ copy = image(icon = curicon, icon_state = curstate, layer = appearance.layer, dir = base_icon_dir)
+ copy.color = appearance.color
+ copy.alpha = appearance.alpha
copy.blend_mode = curblend
- layers[copy] = A.layer
-
- // Loop through the underlays, then overlays, sorting them into the layers list
- for(var/process_set in 0 to 1)
- var/list/process = process_set ? A.overlays : A.underlays
- for(var/i in 1 to length(process))
- var/image/current = process[i]
- if(!current)
- continue
- if(current.plane != FLOAT_PLANE && current.plane != A.plane)
- continue
- var/current_layer = current.layer
- if(current_layer < 0)
- if(current_layer <= -1000)
- return flat
- current_layer = process_set + A.layer + current_layer * 0.001
-
- for(var/p in 1 to length(layers))
- var/image/cmp = layers[p]
- if(current_layer < layers[cmp])
- layers.Insert(p, current)
- break
- layers[current] = current_layer
-
- //sortTim(layers, GLOBAL_PROC_REF(cmp_image_layer_asc))
+ layers[copy] = appearance.layer
+
+ PROCESS_OVERLAYS_OR_UNDERLAYS(flat, appearance.underlays, 0)
+ PROCESS_OVERLAYS_OR_UNDERLAYS(flat, appearance.overlays, 1)
var/icon/add // Icon of overlay being added
- // Current dimensions of flattened icon
- var/list/flat_size = list(1, flat.Width(), 1, flat.Height())
- // Dimensions of overlay being added
- var/list/add_size[4]
+ var/flatX1 = 1
+ var/flatX2 = flat.Width()
+ var/flatY1 = 1
+ var/flatY2 = flat.Height()
+
+ var/addX1 = 0
+ var/addX2 = 0
+ var/addY1 = 0
+ var/addY2 = 0
- for(var/V in layers)
- var/image/I = V
- if(I.alpha == 0)
+ for(var/image/layer_image as anything in layers)
+ if(layer_image.alpha == 0)
continue
- if(I == copy) // 'I' is an /image based on the object being flattened.
+ if(layer_image ) // 'layer_image ' is an /image based on the object being flattened.
curblend = BLEND_OVERLAY
- add = icon(I.icon, I.icon_state, base_icon_dir)
+ add = icon(layer_image.icon, layer_image.icon_state, base_icon_dir)
else // 'I' is an appearance object.
- add = getFlatIcon(image(I), curdir, curicon, curstate, curblend, FALSE, no_anim)
+ add = getFlatIcon(image(layer_image ), curdir, curicon, curstate, curblend, FALSE, no_anim)
if(!add)
continue
+
// Find the new dimensions of the flat icon to fit the added overlay
- add_size = list(
- min(flatX1, I.pixel_x+1),
- max(flatX2, I.pixel_x+add.Width()),
- min(flatY1, I.pixel_y+1),
- max(flatY2, I.pixel_y+add.Height())
+ addX1 = min(flatX1, layer_image.pixel_x + 1)
+ addX2 = max(flatX2, layer_image.pixel_x + add.Width())
+ addY1 = min(flatY1, layer_image.pixel_y + 1)
+ addY2 = max(flatY2, layer_image.pixel_y + add.Height())
+
+ if(
+ addX1 != flatX1 \
+ && addX2 != flatX2 \
+ && addY1 != flatY1 \
+ && addY2 != flatY2 \
)
-
- if(flat_size ~! add_size)
// Resize the flattened icon so the new icon fits
flat.Crop(
- addX1 - flatX1 + 1,
- addY1 - flatY1 + 1,
- addX2 - flatX1 + 1,
- addY2 - flatY1 + 1
+ addX1 - flatX1 + 1,
+ addY1 - flatY1 + 1,
+ addX2 - flatX1 + 1,
+ addY2 - flatY1 + 1
)
- flat_size = add_size.Copy()
+ flatX1 = addX1
+ flatX2 = addY1
+ flatY1 = addX2
+ flatY2 = addY2
// Blend the overlay into the flattened icon
- flat.Blend(add, blendMode2iconMode(curblend), I.pixel_x + 2 - flatX1, I.pixel_y + 2 - flatY1)
+ flat.Blend(add, blendMode2iconMode(curblend), layer_image.pixel_x + 2 - flatX1, layer_image.pixel_y + 2 - flatY1)
- if(A.color)
- if(islist(A.color))
- flat.MapColors(arglist(A.color))
+ if(appearance.color)
+ if(islist(appearance.color))
+ flat.MapColors(arglist(appearance.color))
else
- flat.Blend(A.color, ICON_MULTIPLY)
+ flat.Blend(appearance.color, ICON_MULTIPLY)
- if(A.alpha < 255)
- flat.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY)
+ if(appearance.alpha < 255)
+ flat.Blend(rgb(255, 255, 255, appearance.alpha), ICON_MULTIPLY)
if(no_anim)
//Clean up repeated frames
var/icon/cleaned = new /icon()
cleaned.Insert(flat, "", SOUTH, 1, 0)
- . = cleaned
+ return cleaned
else
- . = icon(flat, "", SOUTH)
- else //There's no overlays.
- if(!noIcon)
- SET_SELF(.)
-
- //Clear defines
- #undef flatX1
- #undef flatX2
- #undef flatY1
- #undef flatY2
- #undef addX1
- #undef addX2
- #undef addY1
- #undef addY2
-
- #undef INDEX_X_LOW
- #undef INDEX_X_HIGH
- #undef INDEX_Y_LOW
- #undef INDEX_Y_HIGH
-
- #undef BLANK
- #undef SET_SELF
+ return icon(flat, "", SOUTH)
+ else if (render_icon) // There's no overlays.
+ var/icon/final_icon = icon(icon(curicon, curstate, base_icon_dir), "", SOUTH, no_anim ? TRUE : null)
+ if (appearance.alpha < 255)
+ final_icon.Blend(rgb(255,255,255, appearance.alpha), ICON_MULTIPLY)
+
+ if (appearance.color)
+ if (islist(appearance.color))
+ final_icon.MapColors(arglist(appearance.color))
+ else
+ final_icon.Blend(appearance.color, ICON_MULTIPLY)
+
+ return final_icon
+
+ #undef PROCESS_OVERLAYS_OR_UNDERLAYS
/proc/getHologramIcon(icon/A, safety = TRUE)//If safety is on, a new icon is not created.
var/icon/flat_icon = safety ? A : new(A)//Has to be a new icon to not constantly change the same icon.
@@ -1276,3 +1259,10 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects)
image_to_center.pixel_y = y_offset
return image_to_center
+
+/// Returns a list containing the width and height of an icon file
+/proc/get_icon_dimensions(icon_path)
+ if (isnull(GLOB.icon_dimensions[icon_path]))
+ var/icon/my_icon = icon(icon_path)
+ GLOB.icon_dimensions[icon_path] = list("width" = my_icon.Width(), "height" = my_icon.Height())
+ return GLOB.icon_dimensions[icon_path]
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index e9784de76da..f1b19ad81a2 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -116,6 +116,24 @@
if(SOUTHWEST)
return "southwest"
+/proc/dir2rutext(direction)
+ switch(direction)
+ if(NORTH)
+ return "север"
+ if(SOUTH)
+ return "юг"
+ if(EAST)
+ return "восток"
+ if(WEST)
+ return "запад"
+ if(NORTHEAST)
+ return "северо-восток"
+ if(SOUTHEAST)
+ return "юго-восток"
+ if(NORTHWEST)
+ return "северо-запад"
+ if(SOUTHWEST)
+ return "юго-запад"
//Turns a direction into text
/proc/dir2text_short(direction)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 8733730f816..1cfd6b3674d 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1077,9 +1077,9 @@ will handle it, but:
var/pixel_y_offset = AM.pixel_y + M.get_y_shift()
//Irregular objects
- var/icon/AMicon = icon(AM.icon, AM.icon_state)
- var/AMiconheight = AMicon.Height()
- var/AMiconwidth = AMicon.Width()
+ var/list/icon_dimensions = get_icon_dimensions(AM.icon)
+ var/AMiconheight = icon_dimensions["height"]
+ var/AMiconwidth = icon_dimensions["width"]
if(AMiconheight != world.icon_size || AMiconwidth != world.icon_size)
pixel_x_offset += ((AMiconwidth/world.icon_size)-1)*(world.icon_size*0.5)
pixel_y_offset += ((AMiconheight/world.icon_size)-1)*(world.icon_size*0.5)
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index a3828b13965..34c33c11cf0 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -481,6 +481,10 @@ GLOBAL_LIST_INIT(bitfields, list(
"flags_storage" = list(
"BYPASS_VENDOR_CHECK" = BYPASS_VENDOR_CHECK,
),
+ "flags_id" = list(
+ "CAN_BUY_LOADOUT" = CAN_BUY_LOADOUT,
+ "USED_GHMME" = USED_GHMME,
+ ),
"ghost_hud" = list(
"GHOST_HUD_MED" = GHOST_HUD_MED,
"GHOST_HUD_SEC" = GHOST_HUD_SEC,
diff --git a/code/_globalvars/lists/icons.dm b/code/_globalvars/lists/icons.dm
new file mode 100644
index 00000000000..ff60e6bc8d9
--- /dev/null
+++ b/code/_globalvars/lists/icons.dm
@@ -0,0 +1,2 @@
+/// Cache of the width and height of icon files, to avoid repeating the same expensive operation
+GLOBAL_LIST_EMPTY(icon_dimensions)
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index 49af82f6f4e..bee4e1f738c 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -224,7 +224,7 @@
/obj/structure/xeno/silo/AIMiddleClick(mob/living/silicon/ai/user)
user.ai_ping(src, COOLDOWN_AI_PING_EXTRA_LOW)
-/obj/structure/xeno/xeno_turret/AIMiddleClick(mob/living/silicon/ai/user)
+/obj/structure/xeno/turret/AIMiddleClick(mob/living/silicon/ai/user)
user.ai_ping(src, COOLDOWN_AI_PING_EXTRA_LOW)
/obj/structure/xeno/evotower/AIMiddleClick(mob/living/silicon/ai/user)
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index ff080acd59d..0ed74e9c7ee 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -410,8 +410,13 @@ if(selected_ability.target_flags & flagname && !istype(A, typepath)){\
/mob/living/carbon/human/ShiftClickOn(atom/A)
if(client.prefs.toggles_gameplay & MIDDLESHIFTCLICKING)
return ..()
- var/obj/item/held_thing = get_active_held_item()
+ if(selected_ability)
+ A = ability_target(A)
+ if(selected_ability.can_use_ability(A))
+ selected_ability.use_ability(A)
+ return TRUE
+ var/obj/item/held_thing = get_active_held_item()
if(held_thing && SEND_SIGNAL(held_thing, COMSIG_ITEM_SHIFTCLICKON, A, src) & COMPONENT_ITEM_CLICKON_BYPASS)
return FALSE
return ..()
diff --git a/code/_onclick/hud/screen_objects/menu_text_objects.dm b/code/_onclick/hud/screen_objects/menu_text_objects.dm
index f73bdc8a3c5..59ad66e0ee6 100644
--- a/code/_onclick/hud/screen_objects/menu_text_objects.dm
+++ b/code/_onclick/hud/screen_objects/menu_text_objects.dm
@@ -88,11 +88,11 @@
update_text()
/atom/movable/screen/text/lobby/clickable/join_game/update_text()
- var/mob/new_player/player = hud.mymob
if(SSticker?.current_state > GAME_STATE_PREGAME)
maptext = "ПРИСОЕДИНИТЬСЯ"
icon_state = "join"
return
+ var/mob/new_player/player = hud.mymob
maptext = "ВЫ: [player.ready ? "" : "НЕ "]ГОТОВЫ"
icon_state = player.ready ? "ready" : "unready"
diff --git a/code/_onclick/hud/screen_objects/screen_objects.dm b/code/_onclick/hud/screen_objects/screen_objects.dm
index 8b46ebdf282..13a5e3e75a5 100644
--- a/code/_onclick/hud/screen_objects/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects/screen_objects.dm
@@ -796,17 +796,17 @@
/atom/movable/screen/arrow/attack_order_arrow
name = "attack order arrow"
icon_state = "Attack_arrow"
- duration = ORDER_DURATION
+ duration = CIC_ORDER_DURATION
/atom/movable/screen/arrow/rally_order_arrow
name = "Rally order arrow"
icon_state = "Rally_arrow"
- duration = RALLY_ORDER_DURATION
+ duration = CIC_ORDER_DURATION
/atom/movable/screen/arrow/defend_order_arrow
name = "Defend order arrow"
icon_state = "Defend_arrow"
- duration = ORDER_DURATION
+ duration = CIC_ORDER_DURATION
/atom/movable/screen/arrow/hunter_mark_arrow
name = "hunter mark arrow"
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index 15baa335184..cf6f0cde388 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -19,9 +19,6 @@
/datum/config_entry/keyed_list/min_pop/ValidateListEntry(key_name, key_value)
return key_name in config.modes
-/datum/config_entry/string/alert_delta
- config_entry_value = "Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill."
-
/datum/config_entry/number/revival_brain_life
config_entry_value = -1
integer = FALSE
diff --git a/code/controllers/subsystem/evacuation.dm b/code/controllers/subsystem/evacuation.dm
index 27db35ff841..afa0ff8028d 100644
--- a/code/controllers/subsystem/evacuation.dm
+++ b/code/controllers/subsystem/evacuation.dm
@@ -86,7 +86,7 @@ SUBSYSTEM_DEF(evacuation)
evac_time = world.time
evac_status = EVACUATION_STATUS_INITIATING
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_EVACUATION_STARTED)
- priority_announce("Emergency evacuation has been triggered. Please proceed to the escape pods. Evacuation in [EVACUATION_AUTOMATIC_DEPARTURE/600] minutes.", title = "Emergency Evacuation", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/evacuate.ogg', color_override = "orange")
+ priority_announce("Процесс экстренной эвакуации был запущен. Пожалуйста, проследуйте к спасательным капсулам. Запуск капсул состоится через [EVACUATION_AUTOMATIC_DEPARTURE/600] минут.", title = "Экстренная Эвакуация", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/evacuate.ogg', color_override = "orange")
xeno_message("A wave of adrenaline ripples through the hive. The fleshy creatures are trying to escape!")
pod_list = SSshuttle.escape_pods.Copy()
for(var/obj/docking_port/mobile/escape_pod/pod AS in pod_list)
@@ -98,7 +98,7 @@ SUBSYSTEM_DEF(evacuation)
if(evac_status != EVACUATION_STATUS_INITIATING)
return FALSE
evac_status = EVACUATION_STATUS_IN_PROGRESS
- priority_announce("WARNING: Evacuation order confirmed. Launching escape pods.", title = "Emergency Evacuation", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/evacuation_confirmed.ogg', color_override = "orange")
+ priority_announce("Приказ об эвакуации подтвержден. Запуск спасательных капсул.", title = "Экстренная Активация", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/evacuation_confirmed.ogg', color_override = "orange")
return TRUE
@@ -108,7 +108,7 @@ SUBSYSTEM_DEF(evacuation)
GLOB.enter_allowed = TRUE
evac_time = null
evac_status = EVACUATION_STATUS_STANDING_BY
- priority_announce("Evacuation has been cancelled.", title = "Emergency Evacuation", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/evacuate_cancelled.ogg', color_override = "orange")
+ priority_announce("Процесс эвакуации был отменен. Произвожу восстановление первичных систем...", title = "Экстренная Эвакуация", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/evacuate_cancelled.ogg', color_override = "orange")
for(var/obj/docking_port/mobile/escape_pod/pod AS in pod_list)
pod.unprep_for_launch()
return TRUE
@@ -123,7 +123,7 @@ SUBSYSTEM_DEF(evacuation)
. = "NOW"
/datum/controller/subsystem/evacuation/proc/announce_evac_completion()
- priority_announce("ATTENTION: Evacuation complete.", title = "Emergency Evacuation", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/evacuation_complete.ogg', color_override = "orange")
+ priority_announce("Эвакуация завершена. Оставшемуся экипажу требуется завершить миссию.", title = "Эвакуация Завершена", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/evacuation_complete.ogg', color_override = "orange")
evac_status = EVACUATION_STATUS_COMPLETE
@@ -158,7 +158,7 @@ SUBSYSTEM_DEF(evacuation)
I.toggle(TRUE)
dest_master.toggle(TRUE)
dest_index = 1
- priority_announce("The emergency destruct system has been deactivated.", title = "Self Destruct System", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/selfdestruct_deactivated.ogg', color_override = "purple")
+ priority_announce("Протокол самоуничтожения деактивирован. Перезапуск систем.", title = "Протокол Самоуничтожения", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/selfdestruct_deactivated.ogg', color_override = "purple")
if(evac_status == EVACUATION_STATUS_STANDING_BY)
GLOB.marine_main_ship.set_security_level(SEC_LEVEL_RED, TRUE)
for(var/obj/machinery/floor_warn_light/self_destruct/light AS in alarm_lights)
@@ -177,7 +177,7 @@ SUBSYSTEM_DEF(evacuation)
dest_master.visible_message(span_warning("WARNING: Unable to trigger detonation. Please arm all control rods."))
return FALSE
- priority_announce("DANGER. DANGER. Self destruct system activated. DANGER. DANGER. Self destruct in progress. DANGER. DANGER.", title = "Self Destruct System", type = ANNOUNCEMENT_PRIORITY, color_override = "purple")
+ priority_announce("ТРЕВОГА. ТРЕВОГА. ПРОТОКОЛ САМОУНИЧТОЖЕНИЯ ЗАВЕРШЕН. ТРЕВОГА. ТРЕВОГА. ДЕТОНАЦИЯ.", title = "Протокол Самоуничтожения", type = ANNOUNCEMENT_PRIORITY, color_override = "purple")
GLOB.enter_allowed = FALSE
dest_status = NUKE_EXPLOSION_IN_PROGRESS
playsound(dest_master, 'sound/machines/alarm.ogg', 75, 0, 30)
diff --git a/code/datums/actions/action.dm b/code/datums/actions/action.dm
index 3c350c1fe53..788b28fd68a 100644
--- a/code/datums/actions/action.dm
+++ b/code/datums/actions/action.dm
@@ -26,6 +26,8 @@ KEYBINDINGS
var/action_type = ACTION_CLICK
///Used for keeping track of the addition of the selected/active frames
var/toggled = FALSE
+ ///Is this action explicitly hidden from the owner
+ var/hidden = FALSE
/datum/action/New(Target)
target = Target
@@ -66,8 +68,9 @@ KEYBINDINGS
SHOULD_CALL_PARENT(TRUE)
qdel(src)
+///Whether the owner can see this action
/datum/action/proc/should_show()
- return TRUE
+ return !hidden
///Depending on the action type , toggles the selected/active frame to show without allowing stacking multiple overlays
/datum/action/proc/set_toggle(value)
@@ -186,7 +189,6 @@ KEYBINDINGS
owner.actions += src
if(owner.client)
owner.client.screen += button
- owner.update_action_buttons()
owner.actions_by_path[type] = src
for(var/type in keybinding_signals)
var/signal = keybinding_signals[type]
@@ -197,6 +199,7 @@ KEYBINDINGS
update_map_text(our_kb.get_keys_formatted(M.client), signal)
SEND_SIGNAL(M, ACTION_GIVEN)
+ owner.update_action_buttons()
/datum/action/proc/remove_action(mob/M)
for(var/type in keybinding_signals)
@@ -207,9 +210,9 @@ KEYBINDINGS
M.client.screen -= button
M.actions_by_path[type] = null
M.actions -= src
- M.update_action_buttons()
owner = null
SEND_SIGNAL(M, ACTION_REMOVED)
+ M.update_action_buttons()
///Should a AI element occasionally see if this ability should be used?
/datum/action/proc/ai_should_start_consider()
diff --git a/code/datums/actions/innate.dm b/code/datums/actions/innate.dm
index 7deb8d282ef..3a8b59aad03 100644
--- a/code/datums/actions/innate.dm
+++ b/code/datums/actions/innate.dm
@@ -12,12 +12,6 @@
Deactivate()
return TRUE
-
-/datum/action/innate/give_action()
- . = ..()
- update_button_icon()
-
-
/datum/action/innate/proc/Activate()
return
diff --git a/code/datums/actions/item_action.dm b/code/datums/actions/item_action.dm
index cc7d21e3928..5a4dbe99115 100644
--- a/code/datums/actions/item_action.dm
+++ b/code/datums/actions/item_action.dm
@@ -59,6 +59,10 @@
. = ..()
set_toggle(!toggled)
+/datum/action/item_action/toggle/remove_action(mob/M)
+ deselect()
+ return ..()
+
/datum/action/item_action/toggle/suit_toggle
keybinding_signals = list(KEYBINDING_NORMAL = COMSIG_KB_SUITLIGHT)
@@ -79,7 +83,6 @@
/datum/action/item_action/firemode/New()
. = ..()
holder_gun = holder_item
- update_button_icon()
/datum/action/item_action/firemode/update_button_icon()
diff --git a/code/datums/actions/item_toggles.dm b/code/datums/actions/item_toggles.dm
index 9804364b421..3d2b5bc30af 100644
--- a/code/datums/actions/item_toggles.dm
+++ b/code/datums/actions/item_toggles.dm
@@ -38,3 +38,7 @@
else
visual_references[VREF_MUTABLE_LINKED_OBJ] = null
return ..()
+
+/datum/action/ability/activable/item_toggle/remove_action(mob/M)
+ deselect()
+ return ..()
diff --git a/code/datums/actions/observer_action.dm b/code/datums/actions/observer_action.dm
index 238007007e8..5b32fa278e6 100644
--- a/code/datums/actions/observer_action.dm
+++ b/code/datums/actions/observer_action.dm
@@ -122,6 +122,22 @@
var/list/area_namecounts = list()
var/name
+ for(var/obj/structure/xeno/turret/potential_turret AS in GLOB.xeno_resin_turrets_by_hive[XENO_HIVE_NORMAL])
+ if(dead_owner.z != potential_turret.z)
+ continue
+ if(!istype(potential_turret, /obj/structure/xeno/turret/facehugger))
+ continue
+ var/area/area = get_area(potential_turret)
+ if(area in area_names)
+ area_namecounts[area]++
+ name = "[potential_turret.name] at [area] ([area_namecounts[area]])"
+ else
+ area_names.Add(area)
+ area_namecounts[area] = 1
+ name = "[potential_turret.name] at [get_area(potential_turret)]"
+
+ spawn_point[name] = potential_turret
+
for(var/mob/living/carbon/xenomorph/potential_xeno AS in GLOB.alive_xeno_list)
if(dead_owner.z != potential_xeno.z)
continue
diff --git a/code/datums/actions/order_action.dm b/code/datums/actions/order_action.dm
index 47d49aa0808..887c5bd9a36 100644
--- a/code/datums/actions/order_action.dm
+++ b/code/datums/actions/order_action.dm
@@ -13,11 +13,11 @@
/datum/action/innate/order/give_action(mob/M)
. = ..()
- RegisterSignal(M, COMSIG_ORDER_SENT, PROC_REF(update_button_icon))
+ RegisterSignals(M, list(COMSIG_CIC_ORDER_SENT, COMSIG_CIC_ORDER_OFF_CD), PROC_REF(update_button_icon))
/datum/action/innate/order/remove_action(mob/M)
. = ..()
- UnregisterSignal(M, COMSIG_ORDER_SENT)
+ UnregisterSignal(M, list(COMSIG_CIC_ORDER_SENT, COMSIG_CIC_ORDER_OFF_CD))
/datum/action/innate/order/Activate()
active = TRUE
@@ -48,14 +48,14 @@
/datum/action/innate/order/proc/send_order(atom/target, datum/squad/squad, faction = FACTION_TERRAGOV)
if(!can_use_action())
return
- to_chat(owner ,span_ordercic("You ordered marines to [verb_name] [get_area(target.loc)]!"))
+ to_chat(owner ,span_ordercic("Вы приказали морпехам [verb_name] [get_area(target.loc)]!"))
owner.playsound_local(owner, "sound/effects/CIC_order.ogg", 10, 1)
if(visual_type)
target = get_turf(target)
new visual_type(target, faction)
- TIMER_COOLDOWN_START(owner, COOLDOWN_CIC_ORDERS, ORDER_COOLDOWN)
- SEND_SIGNAL(owner, COMSIG_ORDER_SENT)
- addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob, update_all_icons_orders)), ORDER_COOLDOWN)
+ TIMER_COOLDOWN_START(owner, COOLDOWN_CIC_ORDERS, CIC_ORDER_COOLDOWN)
+ SEND_SIGNAL(owner, COMSIG_CIC_ORDER_SENT)
+ addtimer(CALLBACK(src, PROC_REF(on_cooldown_finish)), CIC_ORDER_COOLDOWN + 1)
if(squad)
for(var/mob/living/carbon/human/marine AS in squad.marines_list)
marine.receive_order(target, arrow_type, verb_name, faction)
@@ -65,11 +65,9 @@
human.receive_order(target, arrow_type, verb_name, faction)
return TRUE
-///Update all icons of orders action of the mob
-/mob/proc/update_all_icons_orders()
- for(var/datum/action/action AS in actions)
- if(istype(action, /datum/action/innate/order))
- action.update_button_icon()
+///Lets any other orders know when we're off CD
+/datum/action/innate/order/proc/on_cooldown_finish()
+ SEND_SIGNAL(owner, COMSIG_CIC_ORDER_OFF_CD, src)
/**
* Proc to give a marine an order
@@ -98,12 +96,12 @@
var/atom/movable/screen/arrow/arrow_hud = new arrow_type
arrow_hud.add_hud(src, target)
playsound_local(src, "sound/effects/CIC_order.ogg", 20, 1)
- to_chat(src,span_ordercic("Command is urging you to [verb_name] [get_area(get_turf(target))]!"))
+ to_chat(src,span_ordercic("Командование приказывает вам [verb_name] [get_area(get_turf(target))]!"))
/datum/action/innate/order/attack_order
name = "Send Attack Order"
action_icon_state = "attack"
- verb_name = "attack the enemy at"
+ verb_name = "АТАКОВАТЬ"
arrow_type = /atom/movable/screen/arrow/attack_order_arrow
visual_type = /obj/effect/temp_visual/order/attack_order
@@ -114,6 +112,9 @@
)
/datum/action/innate/order/attack_order/personal/should_show()
+ . = ..()
+ if(!.)
+ return
return owner.skills.getRating(skill_name) >= skill_min
/datum/action/innate/order/attack_order/personal/action_activate()
@@ -125,7 +126,7 @@
/datum/action/innate/order/defend_order
name = "Send Defend Order"
action_icon_state = "defend"
- verb_name = "defend our position in"
+ verb_name = "ОБОРОНЯТЬ"
arrow_type = /atom/movable/screen/arrow/defend_order_arrow
visual_type = /obj/effect/temp_visual/order/defend_order
@@ -135,6 +136,9 @@
)
/datum/action/innate/order/defend_order/personal/should_show()
+ . = ..()
+ if(!.)
+ return
return owner.skills.getRating(skill_name) >= skill_min
/datum/action/innate/order/defend_order/personal/action_activate()
@@ -146,7 +150,7 @@
/datum/action/innate/order/retreat_order
name = "Send Retreat Order"
action_icon_state = "retreat"
- verb_name = "retreat from"
+ verb_name = "ОТСТУПАТЬ из"
visual_type = /obj/effect/temp_visual/order/retreat_order
/datum/action/innate/order/retreat_order/personal
@@ -155,6 +159,9 @@
)
/datum/action/innate/order/retreat_order/personal/should_show()
+ . = ..()
+ if(!.)
+ return
return owner.skills.getRating(skill_name) >= skill_min
/datum/action/innate/order/retreat_order/personal/action_activate()
@@ -166,7 +173,7 @@
/datum/action/innate/order/rally_order
name = "Send Rally Order"
action_icon_state = "rally"
- verb_name = "rally to"
+ verb_name = "СОБРАТЬСЯ в"
arrow_type = /atom/movable/screen/arrow/rally_order_arrow
visual_type = /obj/effect/temp_visual/order/rally_order
@@ -176,6 +183,9 @@
)
/datum/action/innate/order/rally_order/personal/should_show()
+ . = ..()
+ if(!.)
+ return
return owner.skills.getRating(skill_name) >= skill_min
/datum/action/innate/order/rally_order/personal/action_activate()
diff --git a/code/datums/actions/skill.dm b/code/datums/actions/skill.dm
index d0c1433e4c6..cc20ca9215d 100644
--- a/code/datums/actions/skill.dm
+++ b/code/datums/actions/skill.dm
@@ -3,7 +3,10 @@
var/skill_min
/datum/action/skill/should_show()
- return can_use_action()
+ . = ..()
+ if(!.)
+ return
+ return owner.skills.getRating(skill_name) >= skill_min
/datum/action/skill/can_use_action()
return owner.skills.getRating(skill_name) >= skill_min
diff --git a/code/datums/actions/species_actions/robot_action.dm b/code/datums/actions/species_actions/robot_action.dm
new file mode 100644
index 00000000000..e3ef5ac6b4e
--- /dev/null
+++ b/code/datums/actions/species_actions/robot_action.dm
@@ -0,0 +1,21 @@
+///Lets a robot repair itself over time at the cost of being stunned and blind
+/datum/action/repair_self
+ name = "Activate autorepair"
+ action_icon_state = "suit_configure"
+ keybinding_signals = list(
+ KEYBINDING_NORMAL = COMSIG_KB_ROBOT_AUTOREPAIR,
+ )
+
+/datum/action/repair_self/can_use_action()
+ . = ..()
+ if(!.)
+ return
+ return !owner.incapacitated()
+
+/datum/action/repair_self/action_activate()
+ . = ..()
+ if(!. || !ishuman(owner))
+ return
+ var/mob/living/carbon/human/howner = owner
+ howner.apply_status_effect(STATUS_EFFECT_REPAIR_MODE, 10 SECONDS)
+ howner.balloon_alert_to_viewers("Repairing")
diff --git a/code/datums/components/deployable_item.dm b/code/datums/components/deployable_item.dm
index 25cab18ea7a..92992defdd1 100644
--- a/code/datums/components/deployable_item.dm
+++ b/code/datums/components/deployable_item.dm
@@ -63,7 +63,7 @@
var/obj/deployed_machine
if(user)
- if(!ishuman(user) || HAS_TRAIT(item_to_deploy, TRAIT_NODROP))
+ if(!ishuman(user) || HAS_TRAIT(item_to_deploy, TRAIT_NODROP) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))
return
if(LinkBlocked(get_turf(user), location))
@@ -145,11 +145,12 @@
if(!undeployed_item)
CRASH("[src] is missing it's internal item.")
-
if(!user)
CRASH("[source] has sent the signal COMSIG_ITEM_UNDEPLOY to [undeployed_item] without the arg 'user'")
if(!ishuman(user))
return
+ if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))
+ return
var/obj/machinery/deployable/mounted/sentry/sentry
if(issentry(deployed_machine))
sentry = deployed_machine
diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm
index 37210f1477a..37f2943a0f4 100644
--- a/code/datums/elements/strippable.dm
+++ b/code/datums/elements/strippable.dm
@@ -271,7 +271,10 @@
/// A utility function for `/datum/strippable_item`s to start unequipping an item from a mob.
/datum/strippable_item/proc/start_unequip_mob(obj/item/item, mob/source, mob/user, strip_delay)
- if(!do_after(user, strip_delay || item.strip_delay, NONE, source, BUSY_ICON_FRIENDLY))
+ var/display_icon = BUSY_ICON_GENERIC
+ if(istype(item, /obj/item/clothing/mask/facehugger))
+ display_icon = BUSY_ICON_FACEHUGGER
+ if(!do_after(user, strip_delay || item.strip_delay, NONE, source, display_icon))
return FALSE
return TRUE
diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm
index 9257815968d..db3973b4322 100644
--- a/code/datums/emergency_calls/emergency_call.dm
+++ b/code/datums/emergency_calls/emergency_call.dm
@@ -7,7 +7,7 @@
var/name = ""
var/mob_max = 10
var/mob_min = 1
- var/dispatch_message = "An encrypted signal has been received from a nearby vessel. Stand by." //Message displayed to marines once the signal is finalized.
+ var/dispatch_message = "Получен зашифрованный сигнал с ближайшего судна. Ожидайте подмогу." //Message displayed to marines once the signal is finalized.
var/objectives = "" //Objectives to display to the members.
var/list/datum/mind/members = list() //Currently-joined members.
var/list/datum/mind/candidates = list() //Potential candidates for enlisting.
@@ -78,8 +78,8 @@
for(var/i in GLOB.observer_list)
var/mob/dead/observer/M = i
- to_chat(M, "
[span_attack("An emergency beacon has been activated. Use the Ghost > Join Response Team verb to join!")]
")
- to_chat(M, "[span_attack("You cannot join if you have Ghosted before this message.")]
")
+ to_chat(M, "
[span_attack("Сигнал бедствия был активирован. Используйте Ghost > Join Response Team чтобы присоединиться!")]
")
+ to_chat(M, "[span_attack("Вы не можете присоединиться, если вы стали Призраком до появления этого сообщения.")]
")
/datum/game_mode/proc/activate_distress(datum/emergency_call/chosen_call)
@@ -101,27 +101,27 @@
var/datum/emergency_call/distress = SSticker?.mode?.picked_call //Just to simplify things a bit
if(is_banned_from(usr.ckey, ROLE_ERT))
- to_chat(usr, span_danger("You are jobbanned from the emergency reponse team!"))
+ to_chat(usr, span_danger("Вы были ограничены в этой роли!"))
return
if(!istype(distress) || !SSticker.mode.waiting_for_candidates || distress.mob_max < 1)
- to_chat(usr, span_warning("No distress beacons that need candidates are active. You will be notified if that changes."))
+ to_chat(usr, span_warning("Отсутствуют сигналы бедствия нуждающиеся в кандидатах. Вы будете оповещены, если что-то изменится."))
return
var/deathtime = world.time - GLOB.key_to_time_of_role_death[key]
if(deathtime < 600 && !check_other_rights(usr.client, R_ADMIN, FALSE)) //They have ghosted after the announcement.
- to_chat(usr, span_warning("You ghosted too recently. Try again later."))
+ to_chat(usr, span_warning("Вы слишком недавно стали призраком. Попробуйте еще раз позже."))
return
if(usr.mind in distress.candidates)
- to_chat(usr, span_warning("You are already a candidate for this emergency response team."))
+ to_chat(usr, span_warning("Вы уже один из кандидатов. Ждите высадки."))
return
if(distress.add_candidate(usr))
- to_chat(usr, span_boldnotice("You are now a candidate in the emergency response team! If there are enough candidates, you may be picked to be part of the team."))
+ to_chat(usr, span_boldnotice("Теперь вы кандидат в команду экстренного реагирования! Если кандидатов будет достаточно, вас могут выбрать в команду."))
else
- to_chat(usr, span_warning("Something went wrong while adding you into the candidate list!"))
+ to_chat(usr, span_warning("Что-то пошло не так при добавлении вас в список кандидатов!"))
/datum/emergency_call/proc/reset()
if(candidate_timer)
@@ -152,7 +152,7 @@
message_admins("Distress beacon: '[name]' activated. Looking for candidates.")
if(announce)
- priority_announce("A distress beacon has been launched from the [SSmapping.configs[SHIP_MAP].map_name].", title = "Distress Beacon", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/distressbeacon.ogg', color_override = "orange")
+ priority_announce("Сигнал бедствия запущен. Ожидание ответа...", title = "Сигнал Бедствия", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/distressbeacon.ogg', color_override = "orange")
SSticker.mode.on_distress_cooldown = TRUE
@@ -170,11 +170,11 @@
continue
if(M.current) //If they still have a body
if(!isaghost(M.current) && M.current.stat != DEAD) // and not dead or admin ghosting,
- to_chat(M.current, span_warning("You didn't get selected to join the distress team because you aren't dead."))
+ to_chat(M.current, span_warning("Вы не были выбраны в команду спасения, потому что вы не мертвы."))
continue
if(name == "Xenomorphs" && is_banned_from(ckey(M.key), ROLE_XENOMORPH))
if(M.current)
- to_chat(M, span_warning("You didn't get selected to join the distress team because you are jobbanned from Xenomorph."))
+ to_chat(M, span_warning("Вас не выбрали для участия в операции бедствия, потому что вам забанили роль Xenomorph."))
continue
valid_candidates += M
@@ -187,7 +187,7 @@
candidates.Cut()
if(announce)
- priority_announce("The distress signal has not received a response, the launch tubes are now recalibrating.", "Distress Beacon")
+ priority_announce("Ответа на сигнал бедствия не поступило. Системы запуска заняты перекалибровкой.", "Сигнал Бедствия", sound = 'sound/AI/distressbeacon_none.ogg')
SSticker.mode.picked_call = null
SSticker.mode.on_distress_cooldown = TRUE
@@ -204,14 +204,14 @@
for(var/datum/mind/M in valid_candidates)
if(M.current)
- to_chat(M.current, span_warning("You didn't get selected to join the distress team. Better luck next time!"))
+ to_chat(M.current, span_warning("Вас не выбрали в команду. Повезет в следующий раз!"))
message_admins("Distress beacon: [length(valid_candidates)] valid candidates were not selected.")
else
picked_candidates = valid_candidates // save some time
message_admins("Distress beacon: All valid candidates were selected.")
if(announce)
- priority_announce(dispatch_message, "Distress Beacon", sound = 'sound/AI/distressreceived.ogg')
+ priority_announce(dispatch_message, "Сигнал Бедствия", sound = 'sound/AI/distressreceived.ogg')
message_admins("Distress beacon: [name] finalized, starting spawns.")
diff --git a/code/datums/gamemodes/crash.dm b/code/datums/gamemodes/crash.dm
index dc2df2e9f2c..36629b372ed 100644
--- a/code/datums/gamemodes/crash.dm
+++ b/code/datums/gamemodes/crash.dm
@@ -121,14 +121,7 @@
/datum/game_mode/infestation/crash/announce()
to_chat(world, span_round_header("The current map is - [SSmapping.configs[GROUND_MAP].map_name]!"))
- priority_announce(
- message = "Scheduled for landing in T-10 Minutes. Prepare for landing. Known hostiles near LZ. Detonation Protocol Active, planet disposable. Marines disposable.",
- title = "Good morning, marines.",
- type = ANNOUNCEMENT_PRIORITY,
- color_override = "red"
- )
- playsound(shuttle, 'sound/machines/warning-buzzer.ogg', 75, 0, 30)
-
+ priority_announce("Высадка запланирована через 10 минут. Приготовьтесь к посадке. Предварительное сканирование показывает наличие агрессивных форм биологической жизни. Ваша следующая миссия - заполучить коды доступа и активировать ядерную боеголовку.", title = "Доброе утро, товарищи!", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/crash_start.ogg', color_override = "red")
/datum/game_mode/infestation/crash/process()
. = ..()
diff --git a/code/datums/gamemodes/infestation.dm b/code/datums/gamemodes/infestation.dm
index 3628fb64391..f78be8ff1be 100644
--- a/code/datums/gamemodes/infestation.dm
+++ b/code/datums/gamemodes/infestation.dm
@@ -28,12 +28,12 @@
new /obj/structure/mineral_door/resin(i)
for(var/i in GLOB.xeno_tunnel_spawn_turfs)
var/obj/structure/xeno/tunnel/new_tunnel = new /obj/structure/xeno/tunnel(i, XENO_HIVE_NORMAL)
- new_tunnel.name = "[get_area_name(new_tunnel)] tunnel"
+ new_tunnel.name = "[get_area_name(new_tunnel)] туннель"
new_tunnel.tunnel_desc = "["[get_area_name(new_tunnel)]"] (X: [new_tunnel.x], Y: [new_tunnel.y])"
for(var/i in GLOB.xeno_jelly_pod_turfs)
new /obj/structure/xeno/resin_jelly_pod(i, XENO_HIVE_NORMAL)
for(var/i in GLOB.xeno_turret_turfs)
- new /obj/structure/xeno/xeno_turret(i, XENO_HIVE_NORMAL)
+ new /obj/structure/xeno/turret(i, XENO_HIVE_NORMAL)
/datum/game_mode/infestation/process()
if(round_finished)
@@ -46,7 +46,7 @@
// make sure you don't turn 0 into a false positive
#define BIOSCAN_DELTA(count, delta) count ? max(0, count + rand(-delta, delta)) : 0
-#define BIOSCAN_LOCATION(show_locations, location) (show_locations && location ? ", including one in [hostLocationP]":"")
+#define BIOSCAN_LOCATION(show_locations, location) (show_locations && location ? ", включая одного в [hostLocationP]":"")
#define AI_SCAN_DELAY 15 SECONDS
@@ -57,10 +57,10 @@
#ifndef TESTING
var/mob/living/silicon/ai/bioscanning_ai = usr
if((bioscanning_ai.last_ai_bioscan + COOLDOWN_AI_BIOSCAN) > world.time)
- to_chat(bioscanning_ai, "Bioscan instruments are still recalibrating from their last use.")
+ to_chat(bioscanning_ai, "Приборы биосканирования все еще проходят перекалибровку с момента последнего использования.")
return
bioscanning_ai.last_ai_bioscan = world.time
- to_chat(bioscanning_ai, span_warning("Scanning for hostile lifeforms..."))
+ to_chat(bioscanning_ai, span_warning("Сканирование на предмет наличия враждебных форм жизни..."))
if(!do_after(usr, AI_SCAN_DELAY, NONE, usr, BUSY_ICON_GENERIC)) //initial windup time until firing begins
bioscanning_ai.last_ai_bioscan = 0
return
@@ -110,51 +110,51 @@
var/mob/M = i
SEND_SOUND(M, S)
to_chat(M, assemble_alert(
- title = "Queen Mother Report",
- subtitle = "The Queen Mother reaches into your mind...",
- message = "To my children and their Queen,
I sense [numHostsShipr ? "approximately [numHostsShipr]":"no"] host[numHostsShipr > 1 ? "s":""] in the metal hive[BIOSCAN_LOCATION(show_locations, hostLocationS)], [numHostsPlanet || "none"] scattered elsewhere[BIOSCAN_LOCATION(show_locations, hostLocationP)] and [numHostsTransitr ? "approximately [numHostsTransitr]":"no"] host[numHostsTransitr > 1 ? "s":""] on the metal bird in transit.",
+ title = "Сообщение от Главной Королевы",
+ subtitle = "Главная Королева проникает в ваш разум с расстояния в сотни миров...",
+ message = "Мои дети и их Королева, я [numHostsShipr ? "":"не"] чувствую [numHostsShipr ? "примерно [numHostsShipr]":""] потенциальных носителей в их металлическом улье [BIOSCAN_LOCATION(show_locations, hostLocationS)], за его пределами их ["всего [numHostsPlanet]" || "нет"] [BIOSCAN_LOCATION(show_locations, hostLocationP)] и [numHostsTransitr ? "примерно [numHostsTransitr]":"вообще нету"] на металлической птице.",
color_override = "purple"
))
- var/name = "[MAIN_AI_SYSTEM] Bioscan Status"
- var/input = {"Bioscan complete. Sensors indicate [numXenosShip || "no"] unknown lifeform signature[numXenosShip > 1 ? "s":""] present on the ship[BIOSCAN_LOCATION(show_locations, xenoLocationS)], [numXenosPlanetr ? "approximately [numXenosPlanetr]":"no"] signature[numXenosPlanetr > 1 ? "s":""] located elsewhere[BIOSCAN_LOCATION(show_locations, xenoLocationP)] and [numXenosTransit || "no"] unknown lifeform signature[numXenosTransit > 1 ? "s":""] in transit."}
- var/ai_name = "[usr] Bioscan Status"
+ var/name = "[MAIN_AI_SYSTEM]: Статус Биосканирования"
+ var/input = {"Биосканирование завершено. Датчики показывают [numXenosShip || "отсуствие"] неизвестных форм жизни на корабле[BIOSCAN_LOCATION(show_locations, xenoLocationS)], [numXenosPlanetr ? "примерно [numXenosPlanetr]":"отсуствие"] сигнатур на земле[BIOSCAN_LOCATION(show_locations, xenoLocationP)] и [numXenosTransit || "отсуствие"] неизвестных форм жизни на шаттлах."}
+ var/ai_name = "[usr]: Статус Биосканирования"
if(ai_operator)
priority_announce(input, ai_name, sound = 'sound/AI/bioscan.ogg', color_override = "grey", receivers = (GLOB.alive_human_list + GLOB.ai_list))
- log_game("Bioscan. Humans: [numHostsPlanet] on the planet[hostLocationP ? " Location:[hostLocationP]":""] and [numHostsShip] on the ship.[hostLocationS ? " Location: [hostLocationS].":""] Xenos: [numXenosPlanetr] on the planet and [numXenosShip] on the ship[xenoLocationP ? " Location:[xenoLocationP]":""] and [numXenosTransit] in transit.")
+ log_game("Биосканирование. Люди: [numHostsPlanet] на земле[hostLocationP ? " Место:[hostLocationP]":""] и [numHostsShip] на корабле.[hostLocationS ? " Место: [hostLocationS].":""] Ксеноморфы: [numXenosPlanetr] на земле и [numXenosShip] на корабле[xenoLocationP ? " Место:[xenoLocationP]":""] и [numXenosTransit] на перелётах.")
switch(GLOB.current_orbit)
if(1)
- to_chat(usr, span_warning("Signal analysis reveals excellent detail about hostile movements and numbers."))
+ to_chat(usr, span_warning("Анализ сигналов позволяет получить подробную информацию о передвижениях противника и его численности."))
return
if(3)
- to_chat(usr, span_warning("Minor corruption detected in our bioscan instruments due to ship elevation, some information about hostile activity may be incorrect."))
+ to_chat(usr, span_warning("В наших приборах биосканирования обнаружены незначительные ошибки из-за подъема судна, некоторая информация о враждебной активности может быть неверной."))
return
if(5)
- to_chat(usr, span_warning("Major corruption detected in our bioscan readings due to ship elevation, information heavily corrupted."))
+ to_chat(usr, span_warning("В наших показаниях биосканирования обнаружены серьезные ошибки из-за уровня орбиты корабля, информация может сильно отличаться от правды."))
return
if(announce_humans)
priority_announce(input, name, sound = 'sound/AI/bioscan.ogg', color_override = "grey", receivers = (GLOB.alive_human_list + GLOB.ai_list)) // Hide this from observers, they have their own detailed alert.
if(send_fax)
- var/fax_message = generate_templated_fax("Combat Information Center", "[MAIN_AI_SYSTEM] Bioscan Status", "", input, "", MAIN_AI_SYSTEM)
- send_fax(null, null, "Combat Information Center", "[MAIN_AI_SYSTEM] Bioscan Status", fax_message, FALSE)
+ var/fax_message = generate_templated_fax("Боевой Информационный Центр", "[MAIN_AI_SYSTEM]: Статус Биосканирования", "", input, "", MAIN_AI_SYSTEM)
+ send_fax(null, null, "Боевой Информационный Центр", "[MAIN_AI_SYSTEM]: Статус Биосканирования", fax_message, FALSE)
- log_game("Bioscan. Humans: [numHostsPlanet] on the planet[hostLocationP ? " Location:[hostLocationP]":""] and [numHostsShip] on the ship.[hostLocationS ? " Location: [hostLocationS].":""] Xenos: [numXenosPlanetr] on the planet and [numXenosShip] on the ship[xenoLocationP ? " Location:[xenoLocationP]":""] and [numXenosTransit] in transit.")
+ log_game("Биосканирование. Люди: [numHostsPlanet] на земле[hostLocationP ? " Место:[hostLocationP]":""] и [numHostsShip] на корабле.[hostLocationS ? " Место: [hostLocationS].":""] Ксеноморфы: [numXenosPlanetr] на земле и [numXenosShip] на корабле[xenoLocationP ? " Место:[xenoLocationP]":""] и [numXenosTransit] на перелётах.")
for(var/i in GLOB.observer_list)
var/mob/M = i
to_chat(M, assemble_alert(
- title = "Detailed Bioscan",
- message = {"[numXenosPlanet] xeno\s on the planet.
-[numXenosShip] xeno\s on the ship.
-[numXenosTransit] xeno\s in transit.
-
-[numHostsPlanet] human\s on the planet.
-[numHostsShip] human\s on the ship.
-[numHostsTransit] human\s in transit."},
+ title = "Детальная Информация",
+ message = {"[numXenosPlanet] ксеноморфов на земле.
+[numXenosShip] ксеноморфов на корабле.
+[numXenosTransit] ксеноморфов на перелётах.
+
+[numHostsPlanet] людей на земле.
+[numHostsShip] людей на корабле.
+[numHostsTransit] людей на перелётах."},
color_override = "purple"
))
@@ -178,37 +178,37 @@
var/num_humans_ship = living_player_list[3]
if(SSevacuation.dest_status == NUKE_EXPLOSION_FINISHED)
- message_admins("Round finished: [MODE_GENERIC_DRAW_NUKE]") //ship blows, no one wins
+ message_admins("Раунд завершен: [MODE_GENERIC_DRAW_NUKE]") //ship blows, no one wins
round_finished = MODE_GENERIC_DRAW_NUKE
return TRUE
if(round_stage == INFESTATION_DROPSHIP_CAPTURED_XENOS)
- message_admins("Round finished: [MODE_INFESTATION_X_MINOR]")
+ message_admins("Раунд завершен: [MODE_INFESTATION_X_MINOR]")
round_finished = MODE_INFESTATION_X_MINOR
return TRUE
if(!num_humans)
if(!num_xenos)
- message_admins("Round finished: [MODE_INFESTATION_DRAW_DEATH]") //everyone died at the same time, no one wins
+ message_admins("Раунд завершен: [MODE_INFESTATION_DRAW_DEATH]") //everyone died at the same time, no one wins
round_finished = MODE_INFESTATION_DRAW_DEATH
return TRUE
- message_admins("Round finished: [MODE_INFESTATION_X_MAJOR]") //xenos wiped out ALL the marines without hijacking, xeno major victory
+ message_admins("Раунд завершен: [MODE_INFESTATION_X_MAJOR]") //xenos wiped out ALL the marines without hijacking, xeno major victory
round_finished = MODE_INFESTATION_X_MAJOR
return TRUE
if(!num_xenos)
if(round_stage == INFESTATION_MARINE_CRASHING)
- message_admins("Round finished: [MODE_INFESTATION_M_MINOR]") //marines lost the ground operation but managed to wipe out Xenos on the ship at a greater cost, minor victory
+ message_admins("Раунд завершен: [MODE_INFESTATION_M_MINOR]") //marines lost the ground operation but managed to wipe out Xenos on the ship at a greater cost, minor victory
round_finished = MODE_INFESTATION_M_MINOR
return TRUE
- message_admins("Round finished: [MODE_INFESTATION_M_MAJOR]") //marines win big
+ message_admins("Раунд завершен: [MODE_INFESTATION_M_MAJOR]") //marines win big
round_finished = MODE_INFESTATION_M_MAJOR
return TRUE
if(round_stage == INFESTATION_MARINE_CRASHING && !num_humans_ship)
if(SSevacuation.human_escaped > SSevacuation.initial_human_on_ship * 0.5)
- message_admins("Round finished: [MODE_INFESTATION_X_MINOR]") //xenos have control of the ship, but most marines managed to flee
+ message_admins("Раунд завершен: [MODE_INFESTATION_X_MINOR]") //xenos have control of the ship, but most marines managed to flee
round_finished = MODE_INFESTATION_X_MINOR
return
- message_admins("Round finished: [MODE_INFESTATION_X_MAJOR]") //xenos wiped our marines, xeno major victory
+ message_admins("Раунд завершен: [MODE_INFESTATION_X_MAJOR]") //xenos wiped our marines, xeno major victory
round_finished = MODE_INFESTATION_X_MAJOR
return TRUE
return FALSE
@@ -279,7 +279,7 @@
SEND_SOUND(M, ghost_track)
- log_game("[round_finished]\nGame mode: [name]\nRound time: [duration2text()]\nEnd round player population: [length(GLOB.clients)]\nTotal xenos spawned: [GLOB.round_statistics.total_xenos_created]\nTotal humans spawned: [GLOB.round_statistics.total_humans_created]")
+ log_game("[round_finished]\nРежим: [name]\nВремя раунда: [duration2text()]\nКоличество игроков в конце раунда: [length(GLOB.clients)]\nРождено ксеноморфов: [GLOB.round_statistics.total_xenos_created]\nПроизведено людей: [GLOB.round_statistics.total_humans_created]")
/datum/game_mode/infestation/can_start(bypass_checks = FALSE)
. = ..()
@@ -296,7 +296,7 @@
xeno_candidate = TRUE
break
if(!xeno_candidate && !bypass_checks)
- to_chat(world, "Unable to start [name]. No xeno candidate found.")
+ to_chat(world, "Невозможно начать [name]. Кандидат в ксеносы не найден.")
return FALSE
/datum/game_mode/infestation/pre_setup()
@@ -309,9 +309,9 @@
return
priority_announce(
- title = "High Command Update",
- subtitle = "Good morning, marines.",
- message = "Cryosleep disengaged by TGMC High Command.
ATTN: [SSmapping.configs[SHIP_MAP].map_name].
[SSmapping.configs[GROUND_MAP].announce_text]",
+ title = "Оповещение Высшего Командования",
+ subtitle = "Доброе утро, товарищи!",
+ message = "Криосон отключен генштабом.
ATTN: [SSmapping.configs[SHIP_MAP].map_name].
[SSmapping.configs[GROUND_MAP].announce_text]",
color_override = "red"
)
@@ -330,7 +330,7 @@
/datum/game_mode/infestation/proc/on_nuclear_diffuse(obj/machinery/nuclearbomb/bomb, mob/living/carbon/xenomorph/X)
SIGNAL_HANDLER
- priority_announce("WARNING. WARNING. Planetary Nuke deactivated. WARNING. WARNING. Self destruct failed. WARNING. WARNING.", "Planetary Warhead Disengaged", type = ANNOUNCEMENT_PRIORITY)
+ priority_announce("ВНИМАНИЕ. ВНИМАНИЕ. Планетарная ядерная бомба деактивирована. ВНИМАНИЕ. ВНИМАНИЕ. Самоуничтожение не удалось. ВНИМАНИЕ. ВНИМАНИЕ.", type = ANNOUNCEMENT_PRIORITY)
/datum/game_mode/infestation/proc/on_nuclear_explosion(datum/source, z_level)
SIGNAL_HANDLER
@@ -341,12 +341,12 @@
SIGNAL_HANDLER
var/datum/hive_status/normal/HS = GLOB.hive_datums[XENO_HIVE_NORMAL]
var/area_name = get_area_name(nuke)
- HS.xeno_message("An overwhelming wave of dread ripples throughout the hive... A nuke has been activated[area_name ? " in [area_name]":""]!")
+ HS.xeno_message("Волна ужаса прокатывается по улью... Они активировали ядерную бомбу[area_name ? " в [area_name]":""]!")
HS.set_all_xeno_trackers(nuke)
/datum/game_mode/infestation/proc/play_cinematic(z_level)
GLOB.enter_allowed = FALSE
- priority_announce("DANGER. DANGER. Planetary Nuke Activated. DANGER. DANGER. Self destruct in progress. DANGER. DANGER.", "Planetary Warhead Detonation Confirmed", type = ANNOUNCEMENT_PRIORITY)
+ priority_announce("ТРЕВОГА. ТРЕВОГА. Активирована планетарная ядерная бомба. ТРЕВОГА. ТРЕВОГА. Идет самоуничтожение. ТРЕВОГА. ТРЕВОГА.", "Планетарная Боеголовка Успешно Запущена", type = ANNOUNCEMENT_PRIORITY)
var/sound/S = sound(pick('sound/theme/nuclear_detonation1.ogg','sound/theme/nuclear_detonation2.ogg'), channel = CHANNEL_CINEMATIC)
SEND_SOUND(world, S)
diff --git a/code/datums/greyscale/greyscale_configs.dm b/code/datums/greyscale/greyscale_configs.dm
index 4c00fbf565d..a340189aac0 100644
--- a/code/datums/greyscale/greyscale_configs.dm
+++ b/code/datums/greyscale/greyscale_configs.dm
@@ -255,7 +255,7 @@
///AMMO - for both bullets and magazines
/datum/greyscale_config/ammo
json_config = 'code/datums/greyscale/json_configs/ammo.json'
- icon_file = 'icons/obj/items/ammo.dmi'
+ icon_file = 'icons/obj/items/ammo/misc.dmi'
///PROJECTILES
/datum/greyscale_config/projectile
diff --git a/code/datums/jobs/job/clown.dm b/code/datums/jobs/job/clown.dm
index 82e737790e5..742d3881c37 100644
--- a/code/datums/jobs/job/clown.dm
+++ b/code/datums/jobs/job/clown.dm
@@ -4,7 +4,6 @@
/datum/skills/civilian/clown
name = CLOWN
cqc = SKILL_CQC_MASTER
- police = SKILL_CQC_DEFAULT
medical = SKILL_MEDICAL_UNTRAINED
firearms = SKILL_FIREARMS_UNTRAINED
melee_weapons = SKILL_MELEE_TRAINED
@@ -14,8 +13,43 @@
paygrade = "CLW"
comm_title = "CLW"
total_positions = 0
- access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CARGO, ACCESS_CIVILIAN_ENGINEERING, ACCESS_CIVILIAN_MEDICAL, ACCESS_CIVILIAN_RESEARCH)
- minimal_access = ALL_MARINE_ACCESS
+ access = list(
+ ACCESS_MARINE_ALPHA,
+ ACCESS_MARINE_BRAVO,
+ ACCESS_MARINE_CHARLIE,
+ ACCESS_MARINE_DELTA,
+ ACCESS_MARINE_PREP,
+ ACCESS_MARINE_ROBOT,
+ ACCESS_MARINE_ENGPREP,
+ ACCESS_MARINE_SMARTPREP,
+ ACCESS_MARINE_MEDPREP,
+ ACCESS_MARINE_MEDBAY,
+ ACCESS_MARINE_CHEMISTRY,
+ ACCESS_CIVILIAN_MEDICAL,
+ ACCESS_CIVILIAN_RESEARCH,
+ ACCESS_CIVILIAN_ENGINEERING,
+ ACCESS_MARINE_ENGINEERING,
+ ACCESS_MARINE_LEADER,
+ )
+ minimal_access = list(
+ ACCESS_MARINE_ALPHA,
+ ACCESS_MARINE_BRAVO,
+ ACCESS_MARINE_CHARLIE,
+ ACCESS_MARINE_DELTA,
+ ACCESS_MARINE_PREP,
+ ACCESS_MARINE_DROPSHIP,
+ ACCESS_MARINE_ROBOT,
+ ACCESS_MARINE_ENGPREP,
+ ACCESS_MARINE_SMARTPREP,
+ ACCESS_MARINE_MEDPREP,
+ ACCESS_MARINE_MEDBAY,
+ ACCESS_MARINE_CHEMISTRY,
+ ACCESS_CIVILIAN_MEDICAL,
+ ACCESS_CIVILIAN_RESEARCH,
+ ACCESS_CIVILIAN_ENGINEERING,
+ ACCESS_MARINE_ENGINEERING,
+ ACCESS_MARINE_LEADER,
+ )
skills_type = /datum/skills/civilian/clown
display_order = JOB_DISPLAY_ORDER_CLOWN
outfit = /datum/outfit/job/civilian/clown
diff --git a/code/datums/jobs/job/job.dm b/code/datums/jobs/job/job.dm
index 0d6d9437bb6..202deec3d26 100644
--- a/code/datums/jobs/job/job.dm
+++ b/code/datums/jobs/job/job.dm
@@ -181,18 +181,18 @@ GLOBAL_PROTECT(exp_specialmap)
/datum/outfit/job/proc/handle_id(mob/living/carbon/human/H, client/override_client)
var/datum/job/job = H.job ? H.job : SSjob.GetJobType(jobtype)
var/obj/item/card/id/id = H.wear_id
- if(istype(id))
- id.access = job.get_access()
- id.iff_signal = GLOB.faction_to_iff[job.faction]
- shuffle_inplace(id.access) // Shuffle access list to make NTNet passkeys less predictable
- id.registered_name = H.real_name
- id.assignment = job.title
- id.rank = job.title
- id.paygrade = job.paygrade
- id.update_label()
- if(H.mind?.initial_account) // In most cases they won't have a mind at this point.
- id.associated_account_number = H.mind.initial_account.account_number
- H.update_action_buttons()
+ if(!istype(id))
+ return
+ id.access = job.get_access()
+ id.iff_signal = GLOB.faction_to_iff[job.faction]
+ shuffle_inplace(id.access) // Shuffle access list to make NTNet passkeys less predictable
+ id.registered_name = H.real_name
+ id.assignment = job.title
+ id.rank = job.title
+ id.paygrade = job.paygrade
+ id.update_label()
+ if(H.mind?.initial_account) // In most cases they won't have a mind at this point.
+ id.associated_account_number = H.mind.initial_account.account_number
/datum/job/proc/get_special_name(client/preference_source)
return
@@ -222,8 +222,9 @@ GLOBAL_PROTECT(exp_specialmap)
var/datum/job/scaled_job = SSjob.GetJobType(index)
if(!(scaled_job in SSjob.active_joinable_occupations))
continue
- scaled_job.add_job_points(-jobworth[index])
+ scaled_job.remove_job_points(jobworth[index])
+///Adds to job points, adding a new slot if threshold reached
/datum/job/proc/add_job_points(amount)
job_points += amount
if(total_positions >= max_positions)
@@ -232,6 +233,17 @@ GLOBAL_PROTECT(exp_specialmap)
job_points -= job_points_needed
add_job_positions(1)
+///Removes job points, and if needed, job positions
+/datum/job/proc/remove_job_points(amount)
+ if(job_points_needed == INFINITY || total_positions == -1)
+ return
+ if(job_points >= amount)
+ job_points -= amount
+ return
+ var/job_slots_removed = ROUND_UP((amount - job_points) / job_points_needed)
+ remove_job_positions(job_slots_removed)
+ job_points += (job_slots_removed * job_points_needed) - amount
+
/datum/job/proc/add_job_positions(amount)
if(!(job_flags & (JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE)))
CRASH("add_job_positions called for a non-joinable job")
diff --git a/code/datums/jobs/job/militarypolice.dm b/code/datums/jobs/job/militarypolice.dm
index 2eb8aeabbce..5b3ca4f89a2 100644
--- a/code/datums/jobs/job/militarypolice.dm
+++ b/code/datums/jobs/job/militarypolice.dm
@@ -84,12 +84,6 @@ In addition, you are tasked with the security of high-ranking personnel, includi
wear_suit = /obj/item/clothing/suit/armor/bulletproof/mp
suit_store = /obj/item/weapon/gun/energy/taser
-/obj/item/radio/headset/mainship/mp
- icon = 'icons/obj/items/radio.dmi'
- name = "security radio headset"
- icon_state = "mp_headset"
- keyslot = /obj/item/encryptionkey/mcom
-
/obj/item/storage/pouch/pistol/laserpistol/Initialize()
. = ..()
new /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol/tactical(src)
diff --git a/code/datums/jobs/job/other.dm b/code/datums/jobs/job/other.dm
index f3cab152069..37d00fdcd2e 100644
--- a/code/datums/jobs/job/other.dm
+++ b/code/datums/jobs/job/other.dm
@@ -66,6 +66,7 @@
gloves = /obj/item/clothing/gloves/marine/officer/chief/sa
glasses = /obj/item/clothing/glasses/sunglasses/sa/nodrop
back = /obj/item/storage/backpack/marine/satchel
+ ears = /obj/item/radio/headset/mainship/spatial
/datum/job/spatial_agent/galaxy_red
outfit = /datum/outfit/job/other/spatial_agent/galaxy_red
diff --git a/code/datums/jobs/squads.dm b/code/datums/jobs/squads.dm
index 699fa9ffd34..b002e9f2910 100644
--- a/code/datums/jobs/squads.dm
+++ b/code/datums/jobs/squads.dm
@@ -108,7 +108,7 @@
CRASH("attempted to insert marine [new_squaddie] into squad while already having one")
if(!(new_squaddie.job.title in current_positions))
- CRASH("Attempted to insert [new_squaddie.job.title] into squad [name]")
+ return FALSE
current_positions[new_squaddie.job.title]++
@@ -144,7 +144,6 @@
marines_list += new_squaddie
new_squaddie.assigned_squad = src
new_squaddie.hud_set_job(faction)
- new_squaddie.update_action_buttons()
new_squaddie.update_inv_head()
new_squaddie.update_inv_wear_suit()
return TRUE
@@ -192,7 +191,6 @@
leaving_squaddie.assigned_squad = null
leaving_squaddie.hud_set_job(faction)
- leaving_squaddie.update_action_buttons()
leaving_squaddie.update_inv_head()
leaving_squaddie.update_inv_wear_suit()
return TRUE
@@ -222,7 +220,6 @@
to_chat(squad_leader, "You're no longer the Squad Leader for [src]!")
var/mob/living/carbon/human/H = squad_leader
squad_leader = null
- H.update_action_buttons()
H.hud_set_job(faction)
H.update_inv_head()
H.update_inv_wear_suit()
@@ -251,7 +248,6 @@
R.use_command = TRUE
squad_leader.hud_set_job(faction)
- squad_leader.update_action_buttons()
squad_leader.update_inv_head()
squad_leader.update_inv_wear_suit()
to_chat(squad_leader, "You're now the Squad Leader for [src]!")
diff --git a/code/datums/keybinding/living.dm b/code/datums/keybinding/living.dm
index 71bbcfc89fa..19ff5eb2114 100644
--- a/code/datums/keybinding/living.dm
+++ b/code/datums/keybinding/living.dm
@@ -19,7 +19,7 @@
return TRUE
/datum/keybinding/living/attempt_jump
- hotkey_keys = list("Space")
+ hotkey_keys = list("V")
name = "Jump"
full_name = "Jump"
description = "Jumps, if your mob is capable of doing so."
diff --git a/code/datums/keybinding/xeno.dm b/code/datums/keybinding/xeno.dm
index cf6a86e5dc7..b7d4c6b452b 100644
--- a/code/datums/keybinding/xeno.dm
+++ b/code/datums/keybinding/xeno.dm
@@ -378,6 +378,20 @@
keybind_signal = COMSIG_XENOABILITY_FORTIFY
hotkey_keys = list("Space")
+/datum/keybinding/xeno/headbutt
+ name = "headbutt"
+ full_name = "Steel Crest: Headbutt"
+ description = "Headbutts into the designated target."
+ keybind_signal = COMSIG_XENOABILITY_STEELCREST_HEADBUTT
+ hotkey_keys = list("F")
+
+/datum/keybinding/xeno/soak
+ name = "soak"
+ full_name = "Steel Crest: Soak"
+ description = "Healing after taking damage"
+ keybind_signal = COMSIG_XENOABILITY_STEELCREST_SOAK
+ hotkey_keys = list("E")
+
/datum/keybinding/xeno/regenerate_skin
name = "regenerate_skin"
full_name = "Defender: Regenerate Skin"
diff --git a/code/datums/marine_main_ship.dm b/code/datums/marine_main_ship.dm
index 9207b0ad5e7..1f7885d9c32 100644
--- a/code/datums/marine_main_ship.dm
+++ b/code/datums/marine_main_ship.dm
@@ -14,11 +14,11 @@ GLOBAL_DATUM_INIT(marine_main_ship, /datum/marine_main_ship, new)
/datum/marine_main_ship/proc/make_maint_all_access()
maint_all_access = TRUE
- priority_announce("The maintenance access requirement has been revoked on all airlocks.", "Attention!", "Shipside emergency declared.", sound = 'sound/misc/notice1.ogg', color_override = "grey")
+ priority_announce("Требование доступа для всех технических тоннелей отменено.", "Внимание!", "На корабле объявлена чрезвычайная ситуация.", sound = 'sound/misc/notice1.ogg', color_override = "grey")
/datum/marine_main_ship/proc/revoke_maint_all_access()
maint_all_access = FALSE
- priority_announce("The maintenance access requirement has been readded on all maintenance airlocks.", "Attention!", "Shipside emergency revoked.", sound = 'sound/misc/notice2.ogg', color_override = "grey")
+ priority_announce("Требование доступа для всех технических тоннелей было возвращено.", "Внимание!", "Отбой Тревоги.", sound = 'sound/misc/notice2.ogg', color_override = "grey")
/datum/marine_main_ship/proc/set_security_level(level, announce = TRUE)
switch(level)
@@ -79,7 +79,7 @@ GLOBAL_DATUM_INIT(marine_main_ship, /datum/marine_main_ship, new)
switch(level)
if(SEC_LEVEL_GREEN)
if(announce)
- priority_announce("Attention: Security level lowered to GREEN - all clear.", title = "Security Level Lowered", subtitle = "All Clear", sound = 'sound/AI/code_green.ogg', color_override = "green")
+ priority_announce("Всё стабильно.", title = "Код Зеленый", sound = 'sound/AI/code_green.ogg', color_override = "green")
security_level = SEC_LEVEL_GREEN
for(var/obj/machinery/status_display/SD in GLOB.machines)
if(is_mainship_level(SD.z))
@@ -87,10 +87,10 @@ GLOBAL_DATUM_INIT(marine_main_ship, /datum/marine_main_ship, new)
if(SEC_LEVEL_BLUE)
if(security_level < SEC_LEVEL_BLUE)
if(announce)
- priority_announce("Attention: Security level elevated to BLUE - potentially hostile activity on board.", title = "Security Level Elevated", sound = 'sound/AI/code_blue_elevated.ogg')
+ priority_announce("На борту потенциально враждебная деятельность. Требуются тщательные проверки.", title = "Код Синий", sound = 'sound/AI/code_blue_elevated.ogg')
else
if(announce)
- priority_announce("Attention: Security level lowered to BLUE - potentially hostile activity on board.", title = "Security Level Lowered", sound = 'sound/AI/code_blue_lowered.ogg')
+ priority_announce("Возможны остатки враждебной деятельности. Требуются тщательные проверки.", title = "Код Синий", sound = 'sound/AI/code_blue_lowered.ogg')
security_level = SEC_LEVEL_BLUE
for(var/obj/machinery/status_display/SD in GLOB.machines)
if(is_mainship_level(SD.z))
@@ -98,10 +98,10 @@ GLOBAL_DATUM_INIT(marine_main_ship, /datum/marine_main_ship, new)
if(SEC_LEVEL_RED)
if(security_level < SEC_LEVEL_RED)
if(announce)
- priority_announce("Attention: Security level elevated to RED - there is an immediate threat to the ship.", title = "Security Level Elevated", sound = 'sound/AI/code_red_elevated.ogg', color_override = "red")
+ priority_announce("Существует непосредственная угроза судну. Боеспособному персоналу надлежит организовать защиту экипажа.", title = "Код Красный", sound = 'sound/AI/code_red_elevated.ogg', color_override = "red")
else
if(announce)
- priority_announce("Attention: Security level lowered to RED - there is an immediate threat to the ship.", title = "Ship Destruction Averted", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/code_red_lowered.ogg', color_override = "red")
+ priority_announce("Существует непосредственная угроза судну. Боеспособному персоналу требуется разобраться с остальными проблемами.", title = "Код Красный", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/code_red_lowered.ogg', color_override = "red")
/*
var/area/A
for(var/obj/machinery/power/apc/O in machines)
@@ -119,8 +119,8 @@ GLOBAL_DATUM_INIT(marine_main_ship, /datum/marine_main_ship, new)
if(announce)
priority_announce(
type = ANNOUNCEMENT_PRIORITY,
- title = "Ship Destruction Imminent",
- message = "Attention! Delta security level reached! " + CONFIG_GET(string/alert_delta),
+ title = "Код Дельта",
+ message = "Контроль над ситуацией полностью потерян. Всему персоналу требуется сделать всё ради предотвращения распространения опасности на другие объекты.",
sound = 'sound/misc/airraid.ogg',
channel_override = SSsounds.random_available_channel(),
color_override = "purple"
diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm
index 933d263cf64..65bae3aad70 100644
--- a/code/datums/outfit.dm
+++ b/code/datums/outfit.dm
@@ -44,32 +44,32 @@
//Start with uniform,suit,backpack for additional slots
if(w_uniform)
- H.equip_to_slot_or_del(new w_uniform(H),SLOT_W_UNIFORM, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new w_uniform(H), SLOT_W_UNIFORM, override_nodrop = TRUE)
if(wear_suit)
- H.equip_to_slot_or_del(new wear_suit(H),SLOT_WEAR_SUIT, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new wear_suit(H), SLOT_WEAR_SUIT, override_nodrop = TRUE)
if(back)
- H.equip_to_slot_or_del(new back(H),SLOT_BACK, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new back(H), SLOT_BACK, override_nodrop = TRUE)
if(belt)
- H.equip_to_slot_or_del(new belt(H),SLOT_BELT, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new belt(H), SLOT_BELT, override_nodrop = TRUE)
if(gloves)
- H.equip_to_slot_or_del(new gloves(H),SLOT_GLOVES, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new gloves(H), SLOT_GLOVES, override_nodrop = TRUE)
if(shoes)
- H.equip_to_slot_or_del(new shoes(H),SLOT_SHOES, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new shoes(H), SLOT_SHOES, override_nodrop = TRUE)
if(head)
- H.equip_to_slot_or_del(new head(H),SLOT_HEAD, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new head(H), SLOT_HEAD, override_nodrop = TRUE)
if(mask)
- H.equip_to_slot_or_del(new mask(H),SLOT_WEAR_MASK, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new mask(H), SLOT_WEAR_MASK, override_nodrop = TRUE)
if(ears)
if(visualsOnly)
H.equip_to_slot_or_del(new /obj/item/radio/headset(H), SLOT_EARS, override_nodrop = TRUE) //We don't want marine cameras. For now they have the same item_state as the rest.
else
H.equip_to_slot_or_del(new ears(H), SLOT_EARS, override_nodrop = TRUE)
if(glasses)
- H.equip_to_slot_or_del(new glasses(H),SLOT_GLASSES, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new glasses(H), SLOT_GLASSES, override_nodrop = TRUE)
if(id)
- H.equip_to_slot_or_del(new id(H),SLOT_WEAR_ID, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new id(H), SLOT_WEAR_ID, override_nodrop = TRUE)
if(suit_store)
- H.equip_to_slot_or_del(new suit_store(H),SLOT_S_STORE, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new suit_store(H), SLOT_S_STORE, override_nodrop = TRUE)
if(l_hand)
H.put_in_l_hand(new l_hand(H))
if(r_hand)
@@ -77,9 +77,9 @@
if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon.
if(l_store)
- H.equip_to_slot_or_del(new l_store(H),SLOT_L_STORE, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new l_store(H), SLOT_L_STORE, override_nodrop = TRUE)
if(r_store)
- H.equip_to_slot_or_del(new r_store(H),SLOT_R_STORE, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new r_store(H), SLOT_R_STORE, override_nodrop = TRUE)
if(box)
if(!backpack_contents)
@@ -93,7 +93,7 @@
if(!isnum(number))//Default to 1
number = 1
for(var/i in 1 to number)
- H.equip_to_slot_or_del(new path(H),SLOT_IN_BACKPACK, override_nodrop = TRUE)
+ H.equip_to_slot_or_del(new path(H), SLOT_IN_BACKPACK, override_nodrop = TRUE)
post_equip(H, visualsOnly)
@@ -105,7 +105,6 @@
H.update_body()
return TRUE
-
/datum/outfit/proc/get_json_data()
. = list()
.["outfit_type"] = type
diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm
index 152bafcf868..c7c6391722c 100644
--- a/code/datums/progressbar.dm
+++ b/code/datums/progressbar.dm
@@ -260,3 +260,6 @@
/image/progdisplay/energy
icon_state = "busy_energy"
+
+/image/progdisplay/facehugger
+ icon_state = "busy_facehugger"
diff --git a/code/datums/quick_load/_quick_load.dm b/code/datums/quick_load/_quick_load.dm
new file mode 100644
index 00000000000..21ab939e25a
--- /dev/null
+++ b/code/datums/quick_load/_quick_load.dm
@@ -0,0 +1,83 @@
+/datum/outfit/quick
+ ///Description of the loadout
+ var/desc = "Description here"
+ ///How much of this loadout there is. infinite by default
+ var/quantity = -1
+ ///What job this loadout is associated with. Used for tabs and access.
+ var/jobtype = SQUAD_MARINE
+
+/datum/outfit/quick/equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/override_client)
+ pre_equip(H, visualsOnly, override_client)
+
+ //Start with uniform,suit,backpack for additional slots. Deletes any existing equipped item to avoid accidentally losing half your loadout. Not suitable for standard gamemodes!
+ if(w_uniform)
+ qdel(H.w_uniform)
+ H.equip_to_slot_or_del(new w_uniform(H), SLOT_W_UNIFORM, override_nodrop = TRUE)
+ if(wear_suit)
+ qdel(H.wear_suit)
+ H.equip_to_slot_or_del(new wear_suit(H), SLOT_WEAR_SUIT, override_nodrop = TRUE)
+ if(back)
+ qdel(H.back)
+ H.equip_to_slot_or_del(new back(H), SLOT_BACK, override_nodrop = TRUE)
+ if(belt)
+ qdel(H.belt)
+ H.equip_to_slot_or_del(new belt(H), SLOT_BELT, override_nodrop = TRUE)
+ if(gloves)
+ qdel(H.gloves)
+ H.equip_to_slot_or_del(new gloves(H), SLOT_GLOVES, override_nodrop = TRUE)
+ if(shoes)
+ qdel(H.shoes)
+ H.equip_to_slot_or_del(new shoes(H), SLOT_SHOES, override_nodrop = TRUE)
+ if(head)
+ qdel(H.head)
+ H.equip_to_slot_or_del(new head(H), SLOT_HEAD, override_nodrop = TRUE)
+ if(mask)
+ qdel(H.wear_mask)
+ H.equip_to_slot_or_del(new mask(H), SLOT_WEAR_MASK, override_nodrop = TRUE)
+ if(ears)
+ qdel(H.wear_ear)
+ if(visualsOnly)
+ H.equip_to_slot_or_del(new /obj/item/radio/headset(H), SLOT_EARS, override_nodrop = TRUE)
+ else
+ H.equip_to_slot_or_del(new ears(H, H.assigned_squad, H.job.type), SLOT_EARS, override_nodrop = TRUE)
+ if(glasses)
+ qdel(H.glasses)
+ H.equip_to_slot_or_del(new glasses(H), SLOT_GLASSES, override_nodrop = TRUE)
+ if(id)
+ H.equip_to_slot_or_del(new id(H), SLOT_WEAR_ID, override_nodrop = TRUE)
+ if(suit_store)
+ qdel(H.s_store)
+ H.equip_to_slot_or_del(new suit_store(H), SLOT_S_STORE, override_nodrop = TRUE)
+ if(l_hand)
+ qdel(H.l_hand)
+ H.put_in_l_hand(new l_hand(H))
+ if(r_hand)
+ qdel(H.r_hand)
+ H.put_in_r_hand(new r_hand(H))
+
+ if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon.
+ if(l_store)
+ qdel(H.l_store)
+ H.equip_to_slot_or_del(new l_store(H), SLOT_L_STORE, override_nodrop = TRUE)
+ if(r_store)
+ qdel(H.r_store)
+ H.equip_to_slot_or_del(new r_store(H), SLOT_R_STORE, override_nodrop = TRUE)
+
+ if(box)
+ if(!backpack_contents)
+ backpack_contents = list()
+ backpack_contents.Insert(1, box)
+ backpack_contents[box] = 1
+
+ if(backpack_contents)
+ for(var/path in backpack_contents)
+ var/number = backpack_contents[path]
+ if(!isnum(number))//Default to 1
+ number = 1
+ for(var/i in 1 to number)
+ H.equip_to_slot_or_del(new path(H), SLOT_IN_BACKPACK, override_nodrop = TRUE)
+
+ post_equip(H, visualsOnly)
+
+ H.update_body()
+ return TRUE
diff --git a/code/datums/quick_load/beginner/_beginner.dm b/code/datums/quick_load/beginner/_beginner.dm
new file mode 100644
index 00000000000..758a463c113
--- /dev/null
+++ b/code/datums/quick_load/beginner/_beginner.dm
@@ -0,0 +1,26 @@
+/*!
+ * Any loadout that is intended for the new player loadout vendor
+ */
+
+///When making new loadouts, remember to also add the typepath to the list under init_beginner_loadouts() or else it won't show up in the vendor
+
+/datum/outfit/quick/beginner
+ name = "Beginner loadout base"
+ desc = "The base loadout for beginners. You shouldn't be able to see this"
+ jobtype = SQUAD_MARINE
+
+ w_uniform = /obj/item/clothing/under/marine
+ shoes = /obj/item/clothing/shoes/marine/full
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten
+ gloves = /obj/item/clothing/gloves/marine
+ mask = /obj/item/clothing/mask/bandanna
+ head = /obj/item/clothing/head/modular/m10x
+ r_store = /obj/item/storage/pouch/medkit/firstaid
+ l_store = /obj/item/storage/holster/flarepouch/full
+ back = /obj/item/storage/backpack/marine/satchel
+ belt = /obj/item/storage/belt/marine
+ ears = /obj/item/radio/headset/mainship/marine
+
+/datum/outfit/quick/beginner/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ human.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BOOT)
diff --git a/code/datums/quick_load/beginner/corpsman.dm b/code/datums/quick_load/beginner/corpsman.dm
new file mode 100644
index 00000000000..9bdf2c98e44
--- /dev/null
+++ b/code/datums/quick_load/beginner/corpsman.dm
@@ -0,0 +1,92 @@
+/datum/outfit/quick/beginner/corpsman
+ jobtype = SQUAD_CORPSMAN
+
+ w_uniform = /obj/item/clothing/under/marine/corpsman/corpman_vest
+ glasses = /obj/item/clothing/glasses/hud/health
+ r_hand = /obj/item/medevac_beacon
+
+/datum/outfit/quick/beginner/corpsman/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_HEAD)
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_HEAD)
+
+/datum/outfit/quick/beginner/corpsman/lifesaver
+ name = "Standard Lifesaver"
+ desc = "Miracle in progress. \
+ Wields the bolt action Leicaster Repeater, and is equipped with a large variety of medicine for keeping the entire corps topped up and in the fight."
+
+ suit_store = /obj/item/weapon/gun/shotgun/pump/lever/repeater/beginner
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/mimirinjector
+ gloves = /obj/item/defibrillator/gloves
+ mask = /obj/item/clothing/mask/gas
+ head = /obj/item/clothing/head/modular/m10x/mimir
+ r_store = /obj/item/storage/pouch/medkit/medic
+ l_store = /obj/item/storage/pouch/shotgun
+ back = /obj/item/storage/backpack/marine/corpsman
+ belt = /obj/item/storage/belt/lifesaver/beginner
+ l_hand = /obj/item/paper/tutorial/lifesaver
+
+/datum/outfit/quick/beginner/corpsman/lifesaver/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ human.equip_to_slot_or_del(new /obj/item/roller, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/bodybag/cryobag, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/advanced/oxycodone, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/advanced/nanoblood, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/roller/medevac, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/tweezers, SLOT_IN_ACCESSORY)
+
+ for(var/i in 1 to 8)
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_SUIT)
+ for(var/i in 1 to 2)
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dexalinplus, SLOT_IN_SUIT)
+ for(var/i in 1 to 2)
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
+ for(var/i in 1 to 2)
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon, SLOT_IN_SUIT)
+
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_BACKPACK)
+
+ for(var/i in 1 to 7)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p4570, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
+
+ for(var/i in 1 to 7)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/repeater, SLOT_IN_L_POUCH)
+
+/datum/outfit/quick/beginner/corpsman/hypobelt
+ name = "Standard Hypobelt"
+ desc = "Putting the combat in combat medic. \
+ Wields the pump action SH-35 shotgun, and is equipped with a belt full of hyposprays for rapidly treating patients in bad condition."
+
+ suit_store = /obj/item/weapon/gun/shotgun/pump/t35/beginner
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/light/lightmedical
+ gloves = /obj/item/healthanalyzer/gloves
+ mask = /obj/item/clothing/mask/gas
+ head = /obj/item/clothing/head/modular/m10x/antenna
+ r_store = /obj/item/storage/pouch/medkit/medic
+ l_store = /obj/item/storage/pouch/shotgun
+ back = /obj/item/storage/backpack/marine/corpsman
+ belt = /obj/item/storage/belt/hypospraybelt/beginner
+ l_hand = /obj/item/paper/tutorial/hypobelt
+
+/datum/outfit/quick/beginner/corpsman/hypobelt/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ for(var/i in 1 to 6)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/splint, SLOT_IN_ACCESSORY)
+
+ human.equip_to_slot_or_del(new /obj/item/roller, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/bodybag/cryobag, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/advanced/oxycodone, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/roller/medevac, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/tweezers, SLOT_IN_SUIT)
+
+ for(var/i in 1 to 7)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/slug, SLOT_IN_L_POUCH)
+
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/defibrillator/advanced, SLOT_IN_BACKPACK)
+ for(var/i in 1 to 4)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/shotgun, SLOT_IN_BACKPACK)
diff --git a/code/datums/quick_load/beginner/engineer.dm b/code/datums/quick_load/beginner/engineer.dm
new file mode 100644
index 00000000000..b4d344d4972
--- /dev/null
+++ b/code/datums/quick_load/beginner/engineer.dm
@@ -0,0 +1,102 @@
+/datum/outfit/quick/beginner/engineer
+ jobtype = SQUAD_ENGINEER
+
+ w_uniform = /obj/item/clothing/under/marine/brown_vest
+ gloves = /obj/item/clothing/gloves/marine/insulated
+ l_store = /obj/item/storage/pouch/tools/engineer
+
+/datum/outfit/quick/beginner/engineer/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+
+ human.equip_to_slot_or_del(new /obj/item/explosive/grenade/chem_grenade/razorburn_smol, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/circuitboard/apc, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/tool/handheld_charger/hicapcell, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_ACCESSORY)
+
+ human.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/medium_stack, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack, SLOT_IN_SUIT)
+
+ human.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_HEAD)
+ human.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_HEAD)
+
+/datum/outfit/quick/beginner/engineer/builder
+ name = "Engineer Standard"
+ desc = "Born to build. Equipped with a metric ton of metal, you can be certain that a lack of barricades is not a possibility with you around."
+
+ suit_store = /obj/item/weapon/gun/smg/vector/beginner
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/mimirengi
+ mask = /obj/item/clothing/mask/gas/tactical
+ head = /obj/item/clothing/head/modular/m10x/mimir
+ back = /obj/item/storage/backpack/marine/radiopack
+ glasses = /obj/item/clothing/glasses/welding/superior
+ l_hand = /obj/item/paper/tutorial/builder
+
+/datum/outfit/quick/beginner/engineer/builder/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack, SLOT_IN_SUIT)
+
+ for(var/i in 1 to 7)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/vector, SLOT_IN_BELT)
+
+ human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/small_stack, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/stack/sandbags_empty/full, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/tool/shovel/etool, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/weapon/gun/sentry/basic, SLOT_IN_BACKPACK)
+ for(var/i in 1 to 4)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/acp, SLOT_IN_BACKPACK)
+
+/datum/outfit/quick/beginner/engineer/burnitall
+ name = "Flamethrower"
+ desc = "For those who truly love to watch the world burn. Equipped with a laser and a flamethrower, you can be certain that none of your enemies will be left un-burnt."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine/beginner
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/engineer
+ mask = /obj/item/clothing/mask/gas/tactical/coif
+ head = /obj/item/clothing/head/modular/m10x/superiorwelding
+ back = /obj/item/storage/holster/backholster/flamer
+ belt = /obj/item/storage/belt/marine/te_cells
+ glasses = /obj/item/clothing/glasses/meson
+ l_hand = /obj/item/paper/tutorial/flamer
+
+/datum/outfit/quick/beginner/engineer/burnitall/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/medium_stack, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/circuitboard/apc, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/tool/multitool, SLOT_IN_SUIT)
+
+ human.equip_to_slot_or_del(new /obj/item/weapon/gun/flamer/big_flamer/marinestandard/engineer/beginner(human), SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/explosive_mines/large, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/weapon/gun/sentry/basic, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/tool/shovel/etool, SLOT_IN_BACKPACK)
+
+/datum/outfit/quick/beginner/engineer/pcenjoyer
+ name = "Plasma Cutter"
+ desc = "For the open-air enjoyers. Equipped with a plasma cutter, you will be able to cut down all types of walls and obstacles that dare exist within your vicinity."
+
+ suit_store = /obj/item/tool/pickaxe/plasmacutter
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/engineer
+ mask = /obj/item/clothing/mask/gas
+ head = /obj/item/clothing/head/modular/m10x/superiorwelding
+ back = /obj/item/storage/backpack/marine/engineerpack
+ belt = /obj/item/belt_harness/marine
+ glasses = /obj/item/clothing/glasses/meson
+ l_hand = /obj/item/paper/tutorial/plasmacutter
+
+/datum/outfit/quick/beginner/engineer/pcenjoyer/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+
+ human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/small_stack, SLOT_IN_SUIT)
+
+ human.equip_to_slot_or_del(new /obj/item/weapon/gun/revolver/r44(human), SLOT_IN_BACKPACK)
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/r44, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/weapon/gun/sentry/basic, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/magnum, SLOT_IN_BACKPACK)
diff --git a/code/datums/quick_load/beginner/marine.dm b/code/datums/quick_load/beginner/marine.dm
new file mode 100644
index 00000000000..270ff63b38d
--- /dev/null
+++ b/code/datums/quick_load/beginner/marine.dm
@@ -0,0 +1,223 @@
+/datum/outfit/quick/beginner/marine/rifleman
+ name = "Rifleman"
+ desc = "A typical rifleman for the marines. \
+ Wields the AR-12, a versatile all-rounder assault rifle with a powerful underbarrel grenade launcher attached. \
+ Also carries the strong P-23 sidearm and a variety of flares, medical equipment, and more for every situation."
+
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/hodgrenades
+ head = /obj/item/clothing/head/modular/m10x/hod
+ w_uniform = /obj/item/clothing/under/marine/holster
+ suit_store = /obj/item/weapon/gun/rifle/ar12/medic
+ l_hand = /obj/item/paper/tutorial/beginner_rifleman
+
+/datum/outfit/quick/beginner/marine/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_HEAD)
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_HEAD)
+
+/datum/outfit/quick/beginner/marine/rifleman/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_BACKPACK)
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
+
+ for(var/i in 1 to 6)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_BELT)
+
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/beginner(human), SLOT_IN_ACCESSORY)
+
+ for(var/i in 1 to 6)
+ human.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_SUIT)
+
+/datum/outfit/quick/beginner/marine/machinegunner
+ name = "Machinegunner"
+ desc = "The king of suppressive fire. Uses the MG-60, a fully automatic 200 round machine gun with a bipod attached. \
+ Excels at denying large areas to the enemy and eliminating those who refuse to leave."
+
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/tyr_onegeneral
+ head = /obj/item/clothing/head/modular/m10x/tyr
+ w_uniform = /obj/item/clothing/under/marine/black_vest
+ back = /obj/item/storage/backpack/marine/standard
+ belt = /obj/item/storage/belt/sparepouch
+ suit_store = /obj/item/weapon/gun/rifle/mg60/beginner
+ mask = /obj/item/clothing/mask/rebreather
+ l_hand = /obj/item/paper/tutorial/beginner_machinegunner
+
+/datum/outfit/quick/beginner/marine/machinegunner/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ for(var/i in 1 to 8)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg60, SLOT_IN_BACKPACK)
+
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg60, SLOT_IN_BELT)
+
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_ACCESSORY)
+
+ human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/plasma_pistol, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_SUIT)
+
+/datum/outfit/quick/beginner/marine/marksman
+ name = "Marksman"
+ desc = "Quality over quantity. Equipped with the DMR-37, an accurate long-range designated marksman rifle with a scope attached. \
+ While subpar in close quarters, the precision of the DMR is unmatched, exceeding at taking out threats from afar."
+
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/lightmedical
+ head = /obj/item/clothing/head/modular/m10x/tyr
+ w_uniform = /obj/item/clothing/under/marine/holster
+ belt = /obj/item/belt_harness/marine
+ l_store = /obj/item/storage/pouch/magazine/large
+ r_store = /obj/item/storage/pouch/magazine/large
+ suit_store = /obj/item/weapon/gun/rifle/dmr37/beginner
+ mask = /obj/item/clothing/mask/breath
+ l_hand = /obj/item/paper/tutorial/beginner_marksman
+
+/datum/outfit/quick/beginner/marine/marksman/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_BACKPACK)
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x27mm, SLOT_IN_BACKPACK)
+
+ for(var/i in 1 to 6)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/dmr37, SLOT_IN_L_POUCH)
+
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/beginner(human), SLOT_IN_ACCESSORY)
+
+ human.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/bicaridine, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/kelotane, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/tricordrazine, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/tramadol, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/dylovene, SLOT_IN_SUIT)
+
+/datum/outfit/quick/beginner/marine/shotgunner
+ name = "Shotgunner"
+ desc = "Up close and personal. Wields the SH-39, a semi-automatic shotgun loaded with slugs. \
+ An absolute monster at short to mid range, the shotgun will do heavy damage to any target hit, as well as stunning them briefly, staggering them, and knocking them back."
+
+ w_uniform = /obj/item/clothing/under/marine/holster
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/lightgeneral
+ suit_store = /obj/item/weapon/gun/shotgun/combat/standardmarine/beginner
+ belt = /obj/item/storage/belt/shotgun
+ head = /obj/item/clothing/head/modular/m10x/freyr
+ gloves = /obj/item/clothing/gloves/marine/fingerless
+ mask = /obj/item/clothing/mask/gas/tactical/coif
+ l_hand = /obj/item/paper/tutorial/beginner_shotgunner
+
+/datum/outfit/quick/beginner/marine/shotgunner/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/shotgun, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/shotgun, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/inaprovaline, SLOT_IN_BACKPACK)
+
+ for(var/i in 1 to 14)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/slug, SLOT_IN_BELT)
+
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/plasma_pistol, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/plasma_pistol/beginner(human), SLOT_IN_ACCESSORY)
+
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_SUIT)
+
+/datum/outfit/quick/beginner/marine/shocktrooper
+ name = "Shocktrooper"
+ desc = "The bleeding edge of the corps. \
+ Equipped with the experimental battery-fed laser rifle, featuring four different modes that can be freely swapped between, with an underbarrel flamethrower for area denial and clearing mazes."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_rifle/medic
+ belt = /obj/item/storage/belt/marine/te_cells
+ glasses = /obj/item/clothing/glasses/sunglasses/fake/big
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/lightgeneral
+ head = /obj/item/clothing/head/modular/m10x/freyr
+ mask = /obj/item/clothing/mask/gas/tactical/coif
+ r_store = /obj/item/cell/lasgun/volkite/powerpack/marine
+ w_uniform = /obj/item/clothing/under/marine/corpman_vest
+ l_hand = /obj/item/paper/tutorial/beginner_shocktrooper
+
+/datum/outfit/quick/beginner/marine/shocktrooper/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ for(var/i in 1 to 5)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_BACKPACK)
+
+ human.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/powerpack/marine, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_SUIT)
+
+ human.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/bicaridine, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/kelotane, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/tricordrazine, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/tramadol, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/dylovene, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/inaprovaline, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/beginner/marine/hazmat
+ name = "Hazmat"
+ desc = "Designed for danger. \
+ Wields the Type 71 'GROZA', a powerful yet innacurate assault rifle that fires auto-bursts. \
+ Wears Mimir combat armor, rendering the user immune to the dangerous toxic gas possessed by many xenomorphs."
+
+ head = /obj/item/clothing/head/modular/m10x/mimir
+ suit_store = /obj/item/weapon/gun/rifle/type71/beginner
+ w_uniform = /obj/item/clothing/under/marine/black_vest
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/mimir
+ mask = /obj/item/clothing/mask/rebreather/scarf
+ l_hand = /obj/item/paper/tutorial/beginner_hazmat
+
+/datum/outfit/quick/beginner/marine/hazmat/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/groza, SLOT_IN_BACKPACK)
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_BACKPACK)
+
+ for(var/i in 1 to 6)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71, SLOT_IN_BELT)
+
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_ACCESSORY)
+
+ human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/plasma_pistol, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_SUIT)
+
+/datum/outfit/quick/beginner/marine/cqc
+ name = "CQC"
+ desc = "Swift and lethal. \
+ Equipped with the AR-18, a lightweight carbine with a rapid-fire burst mode. Designed for maximum mobility, soldiers are able to rush in, assault the enemy, and retreat before they can respond."
+
+ suit_store = /obj/item/weapon/gun/rifle/ar18/beginner
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/lightgeneral
+ w_uniform = /obj/item/clothing/under/marine/black_vest
+ head = /obj/item/clothing/head/modular/m10x/freyr
+ glasses = /obj/item/clothing/glasses/mgoggles
+ l_hand = /obj/item/paper/tutorial/beginner_cqc
+
+/datum/outfit/quick/beginner/marine/cqc/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ for(var/i in 1 to 6)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar18, SLOT_IN_BELT)
+
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_BACKPACK)
+
+ human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/plasma_pistol, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_SUIT)
+
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_ACCESSORY)
diff --git a/code/datums/quick_load/beginner/robot.dm b/code/datums/quick_load/beginner/robot.dm
new file mode 100644
index 00000000000..654acd9f737
--- /dev/null
+++ b/code/datums/quick_load/beginner/robot.dm
@@ -0,0 +1,78 @@
+/datum/outfit/quick/beginner/robot
+ jobtype = SQUAD_ROBOT
+
+ w_uniform = /obj/item/clothing/under/marine/robotic/black_vest
+ shoes = null
+ wear_suit = /obj/item/clothing/suit/modular/robot
+ gloves = null
+ mask = null
+ head = /obj/item/clothing/head/modular/robot
+ r_store = /obj/item/storage/pouch/tools/full
+
+/datum/outfit/quick/beginner/robot/post_equip(mob/living/carbon/human/robot, visualsOnly)
+ robot.equip_to_slot_or_del(new /obj/item/tool/surgery/solderingtool, SLOT_IN_ACCESSORY)
+ robot.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_ACCESSORY)
+ robot.equip_to_slot_or_del(new /obj/item/tool/weldingtool, SLOT_IN_ACCESSORY)
+ robot.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_ACCESSORY)
+ robot.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_ACCESSORY)
+
+ robot.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/inaprovaline, SLOT_IN_HEAD)
+ robot.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/inaprovaline, SLOT_IN_HEAD)
+
+/datum/outfit/quick/beginner/robot/laser_rifle
+ name = "Laser Rifleman"
+ desc = "A typycal robotic rifleman. Uses the Laser Rifle, often called as the TE-M by marines. Has multiple firemodes for tactical flexibility. Uses standard Terra Experimental (abbreviated as TE) power cells. \
+ As with all TE Laser weapons, they use a lightweight alloy combined without the need for bullets any longer decreases their weight and aiming speed quite some vs their ballistic counterparts."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_rifle/medic
+ belt = /obj/item/storage/belt/marine
+ head = /obj/item/clothing/head/modular/robot/motion_detector
+ wear_suit = /obj/item/clothing/suit/modular/robot/svalinn
+ l_hand = /obj/item/paper/tutorial/robot_laser_rifleman
+
+/datum/outfit/quick/beginner/robot/laser_rifle/post_equip(mob/living/carbon/human/robot, visualsOnly)
+ . = ..()
+ for(var/i in 1 to 3)
+ robot.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BELT)
+ for(var/i in 1 to 3)
+ robot.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle/recharger, SLOT_IN_BELT)
+
+ for(var/i in 1 to 6)
+ robot.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_BACKPACK)
+ robot.equip_to_slot_or_del(new /obj/item/weapon/powerfist/full, SLOT_IN_BACKPACK)
+
+ robot.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/powerpack/marine, SLOT_IN_SUIT)
+
+/datum/outfit/quick/beginner/robot/laser_machinegunner
+ name = "Laser Machinegunner"
+ desc = "The king of suppressive fire. Uses the Laser Machinegun, often called as the TE-M by marines. High efficiency modulators ensure the TE-M has an extremely high fire count, and multiple firemodes makes it a flexible infantry support gun. Uses standard Terra Experimental (abbreviated as TE) power cells. \
+ As with all TE Laser weapons, they use a lightweight alloy combined without the need for bullets any longer decreases their weight and aiming speed quite some vs their ballistic counterparts."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_mlaser/beginner
+ back = /obj/item/cell/lasgun/volkite/powerpack/marine_back
+ belt = /obj/item/belt_harness/marine
+ head = /obj/item/clothing/head/modular/robot/heavy/tyr
+ wear_suit = /obj/item/clothing/suit/modular/robot/heavy/tyr_onegeneral
+ l_hand = /obj/item/paper/tutorial/robot_laser_machinegunner
+
+/datum/outfit/quick/beginner/robot/laser_machinegunner/post_equip(mob/living/carbon/human/robot, visualsOnly)
+ . = ..()
+ robot.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_SUIT)
+ robot.equip_to_slot_or_del(new /obj/item/weapon/powerfist/full, SLOT_IN_SUIT)
+
+/datum/outfit/quick/beginner/robot/laser_sniper
+ name = "Laser Sniper"
+ desc = "The king of suppressive fire. Uses the Laser Sniper Rifle, it has an integrated charge selector for normal, heat, and overcharge settings. Uses standard Terra Experimental (abbreviated as TE) power cells. \
+ As with all TE Laser weapons, they use a lightweight alloy combined without the need for bullets any longer decreases their weight and aiming speed quite some vs their ballistic counterparts."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_sniper/beginner
+ back = /obj/item/cell/lasgun/volkite/powerpack/marine_back
+ belt = /obj/item/storage/holster/belt/pistol/laser
+ head = /obj/item/clothing/head/modular/robot/light/motion_detector
+ wear_suit = /obj/item/clothing/suit/modular/robot/light/baldur_general
+ l_hand = /obj/item/paper/tutorial/robot_laser_sniper
+
+/datum/outfit/quick/beginner/robot/laser_sniper/post_equip(mob/living/carbon/human/robot, visualsOnly)
+ . = ..()
+ robot.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_SUIT)
+ robot.equip_to_slot_or_del(new /obj/item/weapon/powerfist/full, SLOT_IN_SUIT)
diff --git a/code/datums/quick_load/beginner/smartgunner.dm b/code/datums/quick_load/beginner/smartgunner.dm
new file mode 100644
index 00000000000..2bec9cc7e06
--- /dev/null
+++ b/code/datums/quick_load/beginner/smartgunner.dm
@@ -0,0 +1,55 @@
+/datum/outfit/quick/beginner/smartgunner
+ jobtype = SQUAD_SMARTGUNNER
+
+ w_uniform = /obj/item/clothing/under/marine/black_vest
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/lightgeneral
+ mask = /obj/item/clothing/mask/gas
+ head = /obj/item/clothing/head/modular/m10x/antenna
+ belt = /obj/item/belt_harness/marine
+ glasses = /obj/item/clothing/glasses/night/m56_goggles
+
+/datum/outfit/quick/beginner/smartgunner/post_equip(mob/living/carbon/human/human, visualsOnly)
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/inaprovaline, SLOT_IN_HEAD)
+ human.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/inaprovaline, SLOT_IN_HEAD)
+
+/datum/outfit/quick/beginner/smartgunner/sg29
+ name = "Standard Smartmachinegun"
+ desc = "Tactical support fire. \
+ Uses the SG-29, a specialist light machine gun that will shoot through your allies, \
+ equipped with a tactical sensor to detect enemies through smoke, walls, and darkness."
+
+ suit_store = /obj/item/weapon/gun/rifle/sg29/pmc
+ l_hand = /obj/item/paper/tutorial/smartmachinegunner
+
+/datum/outfit/quick/beginner/smartgunner/sg29/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ human.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/plasma_pistol, SLOT_IN_SUIT)
+
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_ACCESSORY)
+
+ for(var/i in 1 to 4)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/sg29, SLOT_IN_BACKPACK)
+ human.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
+
+/datum/outfit/quick/beginner/smartgunner/sg85
+ name = "Standard Smartminigun"
+ desc = "Lead wall! Wields the SG-85, a specialist minigun that holds one thousand rounds and can shoot through your allies, \
+ equipped with a tactical sensor to detect enemies through smoke, walls, and darkness."
+
+ suit_store = /obj/item/weapon/gun/minigun/smart_minigun/motion_detector
+ back = /obj/item/ammo_magazine/minigun_powerpack/smartgun
+ l_hand = /obj/item/paper/tutorial/smartminigunner
+
+/datum/outfit/quick/beginner/smartgunner/sg85/post_equip(mob/living/carbon/human/human, visualsOnly)
+ . = ..()
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/smart_minigun, SLOT_IN_SUIT)
+ human.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/smart_minigun, SLOT_IN_SUIT)
+
+ for(var/i in 1 to 3)
+ human.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_ACCESSORY)
+ human.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_ACCESSORY)
diff --git a/code/datums/quick_load/som/_som.dm b/code/datums/quick_load/som/_som.dm
new file mode 100644
index 00000000000..a318ad50073
--- /dev/null
+++ b/code/datums/quick_load/som/_som.dm
@@ -0,0 +1,4 @@
+//Base SOM outfit
+/datum/outfit/quick/som
+ name = "SOM base"
+ desc = "This is the base typepath for all SOM quick vendor outfits. You shouldn't see this."
diff --git a/code/datums/quick_load/som/engineer.dm b/code/datums/quick_load/som/engineer.dm
new file mode 100644
index 00000000000..91d7956c0db
--- /dev/null
+++ b/code/datums/quick_load/som/engineer.dm
@@ -0,0 +1,178 @@
+//Base SOM engineer outfit
+/datum/outfit/quick/som/engineer
+ name = "SOM Squad Engineer"
+ jobtype = "SOM Squad Engineer"
+
+ ears = /obj/item/radio/headset/distress/som
+ w_uniform = /obj/item/clothing/under/som/webbing
+ shoes = /obj/item/clothing/shoes/marine/som/knife
+ wear_suit = /obj/item/clothing/suit/modular/som/engineer
+ gloves = /obj/item/clothing/gloves/marine/som/insulated
+ mask = /obj/item/clothing/mask/gas
+ head = /obj/item/clothing/head/modular/som/engineer
+ glasses = /obj/item/clothing/glasses/meson
+ r_store = /obj/item/storage/pouch/firstaid/som/combat_patrol
+ l_store = /obj/item/storage/pouch/tools/som/full
+ back = /obj/item/storage/backpack/lightpack/som
+
+/datum/outfit/quick/som/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_HEAD)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_HEAD)
+
+ H.equip_to_slot_or_del(new /obj/item/circuitboard/apc, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/cell/high, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/medium_stack, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/stack/barbed_wire/half_stack, SLOT_IN_SUIT)
+
+/datum/outfit/quick/som/engineer/standard_assaultrifle
+ name = "V-31 Engineer"
+ desc = "Battlefield engineer; building up and tearing down. Equipped with a V-31 assault rifle with integrated 'micro grenade' rail launcher, medium armor, a deployable COPE sentry and a selection of explosives. Has a variety of supplies and equipment to build, repair or apply demolitions in the field. A valuable support asset to a well rounded combat force. The rail launcher fires grenades that must arm mid flight, so are ineffective at close ranges, but add significant tactical options at medium range."
+
+ suit_store = /obj/item/weapon/gun/rifle/som/standard
+ belt = /obj/item/storage/belt/marine/som/som_rifle
+
+/datum/outfit/quick/som/engineer/standard_assaultrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/assembly/signaler, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/cope, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/engineer/mpi
+ name = "MPI-KM Engineer"
+ desc = "Battlefield engineer; building up and tearing down. Equipped with an MPI_KM assault rifle, medium armor, a deployable COPE sentry and a selection of explosives. Has a variety of supplies and equipment to build, repair or apply demolitions in the field. A valuable support asset to a well rounded combat force. An old weapon that was a common sight during the original Martian rebellion, the MPI's good stopping power, reliability and a healthy dose of nostalgia means it is still seen in use by some among the SOM despite its age."
+
+ suit_store = /obj/item/weapon/gun/rifle/mpi_km/black/magharness
+ belt = /obj/item/storage/belt/marine/som/mpi_black
+
+/datum/outfit/quick/som/engineer/mpi/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/assembly/signaler, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/cope, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/engineer/standard_carbine
+ name = "V-34 Engineer"
+ desc = "Battlefield engineer; building up and tearing down. Equipped with a V-34 carbine, medium armor, a deployable COPE sentry and a selection of explosives. Has a variety of supplies and equipment to build, repair or apply demolitions in the field. A valuable support asset to a well rounded combat force. The V-34 is a modern update of an old weapon that was a common sight during the original Martian rebellion. Very reliable and excellent stopping power in a small, lightweight package. Brought into service as a much cheaper alternative to the VX-32."
+
+ suit_store = /obj/item/weapon/gun/rifle/som_carbine/black/standard
+ belt = /obj/item/storage/belt/marine/som/carbine_black
+
+/datum/outfit/quick/som/engineer/standard_carbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/assembly/signaler, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/cope, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/engineer/standard_smg
+ name = "V-21 Engineer"
+ desc = "Battlefield engineer; building up and tearing down. Equipped with a V-21 submachine gun with variable firerate allowing for extreme rates of fire when properly wielded, medium armor, a deployable COPE sentry and a selection of explosives. Has a variety of supplies and equipment to build, repair or apply demolitions in the field. A valuable support asset to a well rounded combat force. "
+
+ suit_store = /obj/item/weapon/gun/smg/som/support
+ belt = /obj/item/storage/belt/marine/som/som_smg
+
+/datum/outfit/quick/som/engineer/standard_smg/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/assembly/signaler, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/cope, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/engineer/standard_shotgun
+ name = "V-51 Engineer"
+ desc = "Battlefield engineer; building up and tearing down. Equipped with a V-51 semi-automatic shotgun, medium armor, a deployable COPE sentry and a selection of explosives. Has a variety of supplies and equipment to build, repair or apply demolitions in the field. A valuable support asset to a well rounded combat force. "
+
+ belt = /obj/item/storage/belt/shotgun/som/flechette
+ suit_store = /obj/item/weapon/gun/shotgun/som/support
+
+/datum/outfit/quick/som/engineer/standard_shotgun/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/assembly/signaler, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/cope, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_ACCESSORY)
diff --git a/code/datums/quick_load/som/leader.dm b/code/datums/quick_load/som/leader.dm
new file mode 100644
index 00000000000..5fb40442f85
--- /dev/null
+++ b/code/datums/quick_load/som/leader.dm
@@ -0,0 +1,148 @@
+//Base SOM leader outfit
+/datum/outfit/quick/som/squad_leader
+ name = "SOM Squad Leader"
+ jobtype = "SOM Squad Leader"
+
+ ears = /obj/item/radio/headset/distress/som
+ w_uniform = /obj/item/clothing/under/som/leader/webbing
+ shoes = /obj/item/clothing/shoes/marine/som/knife
+ wear_suit = /obj/item/clothing/suit/modular/som/heavy/leader/valk
+ gloves = /obj/item/clothing/gloves/marine/som/veteran
+ mask = /obj/item/clothing/mask/gas
+ head = /obj/item/clothing/head/modular/som/leader
+ glasses = /obj/item/clothing/glasses/hud/health
+ r_store = /obj/item/storage/pouch/firstaid/som/combat_patrol_leader
+ l_store = /obj/item/storage/pouch/grenade/som/combat_patrol
+ back = /obj/item/storage/backpack/satchel/som
+
+/datum/outfit/quick/som/squad_leader/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_HEAD)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_HEAD)
+
+ H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_SUIT)
+
+/datum/outfit/quick/som/squad_leader/standard_assaultrifle
+ name = "V-31 Squad Leader"
+ desc = "Tactical utility. Equipped with a V-31 assault rifle with integrated 'micro grenade' rail launcher, Gorgon heavy armor with 'Valkyrie' autodoctor module, a large variety of grenades as well as AP ammunition. Excellent performance against heavily armored targets, while the plentiful grenade provide greater tactical flexibility."
+
+ back = /obj/item/storage/backpack/lightpack/som
+ suit_store = /obj/item/weapon/gun/rifle/som/veteran
+ belt = /obj/item/storage/belt/marine/som/som_rifle_ap
+
+/datum/outfit/quick/som/squad_leader/standard_assaultrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som/ap, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som/ap, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/smoke_burst, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/squad_leader/standard_smg
+ name = "V-21 Squad Leader"
+ desc = "Close range high damage, high speed. Equipped with a V-21 submachine gun with variable firerate allowing for extreme rates of fire when properly wielded, Gorgon heavy armor with 'Valkyrie' autodoctor module, a good variety of grenades and AP ammunition. Allows for excellent close to medium range firepower, especially against heavily armored targets, and is surprisingly mobile."
+
+ suit_store = /obj/item/weapon/gun/smg/som/veteran
+ belt = /obj/item/storage/belt/marine/som/som_smg_ap
+
+/datum/outfit/quick/som/squad_leader/standard_smg/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/ap, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/incendiary, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/incendiary, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/squad_leader/charger
+ name = "Charger Squad Leader"
+ desc = "For the leader that prefers to be up close and personal. Equipped with a volkite charger with motion sensor and gyrostabiliser for better one handed use, Gorgon heavy armor with 'Valkyrie' autodoctor module and a good variety of grenades. Allows for excellent close to medium range firepower, with first rate survivability. Very dangerous."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/charger/scout
+ belt = /obj/item/storage/belt/marine/som/volkite
+
+/datum/outfit/quick/som/squad_leader/charger/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/squad_leader/caliver
+ name = "Caliver Squad Leader"
+ desc = "Victory through superior firepower. Equipped with a volkite caliver and motion sensor, Gorgon heavy armor with 'Valkyrie' autodoctor module and a good variety of grenades. Allows for excellent damage at all ranges, with first rate survivability. Very dangerous."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/caliver/tacsensor
+ belt = /obj/item/storage/belt/marine/som/volkite
+
+/datum/outfit/quick/som/squad_leader/caliver/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/squad_leader/mpi
+ name = "MPI_KM Squad Leader"
+ desc = "For the leader with a taste for nostalgia. Equipped with an MPI_KM assault rifle, with under barrel grenade launcher, Gorgon heavy armor with 'Valkyrie' autodoctor module and a large supply of grenades. An old weapon that was a common sight during the original Martian rebellion, the MPI's good stopping power, reliability and a healthy dose of nostalgia means it is still seen in use by some among the SOM despite its age."
+
+ suit_store = /obj/item/weapon/gun/rifle/mpi_km/grenadier
+ belt = /obj/item/storage/belt/marine/som/mpi_plum
+
+/datum/outfit/quick/som/squad_leader/mpi/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/extended, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
diff --git a/code/datums/quick_load/som/marine.dm b/code/datums/quick_load/som/marine.dm
new file mode 100644
index 00000000000..f43e6f81559
--- /dev/null
+++ b/code/datums/quick_load/som/marine.dm
@@ -0,0 +1,289 @@
+//Base SOM marine outfit
+/datum/outfit/quick/som/marine
+ name = "SOM Squad Marine"
+ jobtype = "SOM Squad Standard"
+
+ ears = /obj/item/radio/headset/distress/som
+ w_uniform = /obj/item/clothing/under/som/webbing
+ shoes = /obj/item/clothing/shoes/marine/som/knife
+ wear_suit = /obj/item/clothing/suit/modular/som/shield
+ gloves = /obj/item/clothing/gloves/marine/som
+ mask = /obj/item/clothing/mask/gas
+ head = /obj/item/clothing/head/modular/som
+ r_store = /obj/item/storage/pouch/firstaid/som/combat_patrol
+ l_store = /obj/item/storage/pouch/grenade/som/combat_patrol
+ back = /obj/item/storage/backpack/satchel/som
+
+/datum/outfit/quick/som/marine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat, SLOT_IN_HEAD)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_HEAD)
+
+ H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_SUIT)
+
+/datum/outfit/quick/som/marine/standard_assaultrifle
+ name = "V-31 Infantryman"
+ desc = "The typical SOM infantryman. Equipped with a V-31 assault rifle with integrated 'micro grenade' rail launcher, medium armor and a good selection of grenades. The rail launcher fires grenades that must arm mid flight, so are ineffective at close ranges, but add significant tactical options at medium range."
+
+ suit_store = /obj/item/weapon/gun/rifle/som/standard
+ belt = /obj/item/storage/belt/marine/som/som_rifle
+
+/datum/outfit/quick/som/marine/standard_assaultrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/smoke_burst, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/marine/mpi
+ name = "MPI_KM Infantryman"
+ desc = "A call back to an earlier time. Equipped with an MPI_KM assault rifle, with under barrel grenade launcher and a large supply of grenades. An old weapon that was a common sight during the original Martian rebellion, the MPI's good stopping power, reliability and a healthy dose of nostalgia means it is still seen in use by some among the SOM despite its age."
+
+ suit_store = /obj/item/weapon/gun/rifle/mpi_km/black/grenadier
+ belt = /obj/item/storage/belt/marine/som/mpi_black
+
+/datum/outfit/quick/som/marine/mpi/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/marine/light_carbine
+ name = "V-34 Light Infantryman"
+ desc = "Mobile and dangerous. Equipped with a V-34 carbine, light armor with an 'Aegis' shield module and a large supply of grenades. The V-34 is a modern update of an old weapon that was a common sight during the original Martian rebellion. Very reliable and excellent stopping power in a small, lightweight package. Brought into service as a much cheaper alternative to the VX-32."
+
+ wear_suit = /obj/item/clothing/suit/modular/som/light/shield
+ suit_store = /obj/item/weapon/gun/rifle/som_carbine/black/standard
+ belt = /obj/item/storage/belt/marine/som/carbine_black
+
+/datum/outfit/quick/som/marine/light_carbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/marine/scout
+ name = "V-21 Light Infantryman"
+ desc = "Highly mobile scouting configuration. Equipped with a V-21 submachine gun with variable firerate allowing for extreme rates of fire when properly wielded, light armor with an 'Aegis' shield module and a good selection of grenades. Allows for exceptional mobility and blistering firepower, it will falter in extended engagements where low armor and the V-21's high rate of fire can become liabilities."
+
+ wear_suit = /obj/item/clothing/suit/modular/som/light/shield
+ suit_store = /obj/item/weapon/gun/smg/som/scout
+ belt = /obj/item/storage/belt/marine/som/som_smg
+
+/datum/outfit/quick/som/marine/scout/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/marine/shotgunner
+ name = "V-51 Pointman"
+ desc = "For close encounters. Equipped with a V-51 semi-automatic shotgun, light armor with an 'Aegis' shield module and a large selection of grenades. Allows for good mobility and dangerous CQC firepower."
+
+ belt = /obj/item/storage/belt/shotgun/som/mixed
+ wear_suit = /obj/item/clothing/suit/modular/som/light/shield
+ suit_store = /obj/item/weapon/gun/shotgun/som/standard
+
+/datum/outfit/quick/som/marine/shotgunner/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/marine/pyro
+ name = "V-62 Flamethrower Operator"
+ desc = "Smells like victory. Equipped with an V-62 incinerator and wide nozzle, V-11 equipped for rapid burst fire, heavy armor upgraded with a 'Hades' fireproof module, and a backtank of fuel. Has better than average range and can quickly burn down large areas. It suffers from significant slowdown, lacks an integrated extinguisher, and undisciplined use can result in rapidly consuming all available fuel."
+
+ head = /obj/item/clothing/head/modular/som/hades
+ wear_suit = /obj/item/clothing/suit/modular/som/heavy/pyro
+ belt = /obj/item/storage/holster/belt/pistol/m4a3/som
+ back = /obj/item/ammo_magazine/flamer_tank/backtank
+ suit_store = /obj/item/weapon/gun/flamer/som/mag_harness
+
+/datum/outfit/quick/som/marine/pyro/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/burst(H), SLOT_IN_HOLSTER)
+
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/marine/breacher
+ name = "V-21 Breacher"
+ desc = "Heavy armored breaching configuration. Equipped with a V-21 submachine gun with variable firerate allowing for extreme rates of fire when properly wielded, heavy armor, a boarding shield and a good selection of grenades. Offers outstanding protection although damage may be lacking, particular at longer range."
+
+ glasses = /obj/item/clothing/glasses/welding
+ wear_suit = /obj/item/clothing/suit/modular/som/heavy/shield
+ suit_store = /obj/item/weapon/gun/smg/som/one_handed
+ belt = /obj/item/storage/belt/marine/som/som_smg
+ r_hand = /obj/item/weapon/shield/riot/marine/som
+
+/datum/outfit/quick/som/marine/breacher/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/marine/breacher_melee
+ name = "CQC Breacher"
+ desc = "For when a complete lack of subtlety is required. Equipped with 'Lorica' enhanced heavy armor and armed with a monsterous two handed breaching axe, designed to cut through heavy armor. When properly wielded, it also provides a degree of protection."
+
+ head = /obj/item/clothing/head/modular/som/lorica
+ wear_suit = /obj/item/clothing/suit/modular/som/heavy/lorica
+ suit_store = /obj/item/weapon/twohanded/fireaxe/som
+ belt = /obj/item/storage/holster/belt/pistol/m4a3/som
+
+/datum/outfit/quick/som/marine/breacher_melee/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/synaptizine, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/burst(H), SLOT_IN_HOLSTER)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/marine/machine_gunner
+ name = "V-41 Machinegunner"
+ desc = "Heavy static firesupport. Equipped with a V-41 machine gun, burst fire V-11 sidearm and some basic building supplies. While often ill suited to the SOM's standard doctrine of mobility and aggression, the V-41 is typically seen in defensive positions or second line units where its poor mobility is a minor drawback compared to its sustained firepower."
+
+ suit_store = /obj/item/weapon/gun/rifle/som_mg/standard
+ belt = /obj/item/storage/holster/belt/pistol/m4a3/som
+ l_store = /obj/item/storage/pouch/construction/som
+
+/datum/outfit/quick/som/marine/machine_gunner/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/burst(H), SLOT_IN_HOLSTER)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/som_mg, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/som_mg, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/som_mg, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/som_mg, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
+
+ H.equip_to_slot_or_del(new /obj/item/tool/shovel/etool, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/stack/sandbags_empty/half, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/stack/sandbags/large_stack, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/stack/barbed_wire/half_stack, SLOT_IN_L_POUCH)
+
+/datum/outfit/quick/som/marine/charger
+ name = "Charger Infantryman"
+ desc = "The future infantryman of the SOM. Equipped with a volkite charger, medium armor and a good variety of grenades. Volkite weapons are exceptionally dangerous, especially against poorly armored or tightly grouped opponents. The charger is the SOM's premier close/medium range weapon, with good mobility, and can be used (with some difficulty) one handed when required."
+ quantity = 4
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/charger/magharness
+ belt = /obj/item/storage/belt/marine/som/volkite
+
+/datum/outfit/quick/som/marine/charger/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
diff --git a/code/datums/quick_load/som/medic.dm b/code/datums/quick_load/som/medic.dm
new file mode 100644
index 00000000000..da5b9eaf6ae
--- /dev/null
+++ b/code/datums/quick_load/som/medic.dm
@@ -0,0 +1,170 @@
+//Base SOM medic outfit
+/datum/outfit/quick/som/medic
+ name = "SOM Squad Medic"
+ jobtype = "SOM Squad Medic"
+
+ belt = /obj/item/storage/belt/lifesaver/som/quick
+ ears = /obj/item/radio/headset/distress/som
+ w_uniform = /obj/item/clothing/under/som/medic/vest
+ shoes = /obj/item/clothing/shoes/marine/som/knife
+ wear_suit = /obj/item/clothing/suit/modular/som/medic
+ gloves = /obj/item/clothing/gloves/marine/som
+ mask = /obj/item/clothing/mask/gas
+ head = /obj/item/clothing/head/modular/som
+ glasses = /obj/item/clothing/glasses/hud/health
+ r_store = /obj/item/storage/pouch/magazine/large/som
+ l_store = /obj/item/storage/pouch/grenade/som/combat_patrol
+ back = /obj/item/storage/backpack/lightpack/som
+
+/datum/outfit/quick/som/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_HEAD)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_HEAD)
+
+ H.equip_to_slot_or_del(new /obj/item/roller, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tweezers_advanced, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/spaceacillin, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/advanced/nanoblood, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/bodybag/cryobag, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/advanced/combat_advanced, SLOT_IN_ACCESSORY)
+
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/defibrillator, SLOT_IN_SUIT)
+
+/datum/outfit/quick/som/medic/standard_assaultrifle
+ name = "V-31 Medic"
+ desc = "Keeping your buddies alive and in the fight. Equipped with a V-31 assault rifle with integrated 'micro grenade' rail launcher, medium armor and a good selection of grenades. Packs a large amount of medical supplies, the squad medic is vital to maintaining combat viability. The rail launcher fires grenades that must arm mid flight, so are ineffective at close ranges, but add significant tactical options at medium range."
+
+ suit_store = /obj/item/weapon/gun/rifle/som/standard
+
+/datum/outfit/quick/som/medic/standard_assaultrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/smoke_burst, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/oxycodone, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_R_POUCH)
+
+/datum/outfit/quick/som/medic/mpi
+ name = "MPI_KM Medic"
+ desc = "Keeping your buddies alive and in the fight. Equipped with an MPI_KM assault rifle, medium armor and a good selection of grenades. Packs a large amount of medical supplies, the squad medic is vital to maintaining combat viability. An old weapon that was a common sight during the original Martian rebellion, the MPI's good stopping power, reliability and a healthy dose of nostalgia means it is still seen in use by some among the SOM despite its age."
+
+ suit_store = /obj/item/weapon/gun/rifle/mpi_km/black/magharness
+
+/datum/outfit/quick/som/medic/mpi/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/oxycodone, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_R_POUCH)
+
+/datum/outfit/quick/som/medic/standard_carbine
+ name = "V-34 Medic"
+ desc = "Keeping your buddies alive and in the fight. Equipped with an V-34 carbine, medium armor for massive firepower and mobility, but poor ammo economy and range. Packs a large amount of medical supplies, the squad medic is vital to maintaining combat viability. The V-34 is a modern update of an old weapon that was a common sight during the original Martian rebellion. Very reliable and excellent stopping power in a small, lightweight package. Brought into service as a much cheaper alternative to the VX-32."
+
+ suit_store = /obj/item/weapon/gun/rifle/som_carbine/black/standard
+
+/datum/outfit/quick/som/medic/standard_carbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/oxycodone, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_R_POUCH)
+
+/datum/outfit/quick/som/medic/standard_smg
+ name = "V-21 Medic"
+ desc = "Keeping your buddies alive and in the fight. Equipped with a V-21 submachine gun with variable firerate allowing for extreme rates of fire when properly wielded, medium armor and a good selection of grenades. Packs a large amount of medical supplies, the squad medic is vital to maintaining combat viability."
+
+ suit_store = /obj/item/weapon/gun/smg/som/support
+
+/datum/outfit/quick/som/medic/standard_smg/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/oxycodone, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_R_POUCH)
+
+/datum/outfit/quick/som/medic/standard_shotgun
+ name = "V-51 Medic"
+ desc = "Keeping your buddies alive and in the fight. Equipped with a V-51 semi-automatic shotgun, medium armor and a good selection of grenades. Packs a large amount of medical supplies, the squad medic is vital to maintaining combat viability."
+
+ r_store = /obj/item/storage/pouch/shotgun/som
+ suit_store = /obj/item/weapon/gun/shotgun/som/support
+
+/datum/outfit/quick/som/medic/standard_shotgun/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/oxycodone, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_R_POUCH)
diff --git a/code/datums/quick_load/som/veteran.dm b/code/datums/quick_load/som/veteran.dm
new file mode 100644
index 00000000000..c1e51db6611
--- /dev/null
+++ b/code/datums/quick_load/som/veteran.dm
@@ -0,0 +1,303 @@
+//Base SOM veteran outfit
+/datum/outfit/quick/som/veteran
+ name = "SOM Squad Veteran"
+ jobtype = "SOM Squad Veteran"
+
+ ears = /obj/item/radio/headset/distress/som
+ w_uniform = /obj/item/clothing/under/som/veteran/webbing
+ shoes = /obj/item/clothing/shoes/marine/som/knife
+ wear_suit = /obj/item/clothing/suit/modular/som/heavy/shield
+ gloves = /obj/item/clothing/gloves/marine/som/veteran
+ mask = /obj/item/clothing/mask/gas
+ head = /obj/item/clothing/head/modular/som/veteran
+ glasses = /obj/item/clothing/glasses/meson
+ r_store = /obj/item/storage/pouch/firstaid/som/combat_patrol
+ l_store = /obj/item/storage/pouch/grenade/som/combat_patrol
+ back = /obj/item/storage/backpack/satchel/som
+
+/datum/outfit/quick/som/veteran/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_HEAD)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_HEAD)
+
+ H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_SUIT)
+
+/datum/outfit/quick/som/veteran/standard_assaultrifle
+ name = "V-31 Veteran Infantryman"
+ desc = "Heavily armed and armored SOM elite. Equipped with a V-31 assault rifle with integrated 'micro grenade' rail launcher, heavy armor, a large variety of grenades as well as AP ammunition. Excellent performance against heavily armored targets, while the plentiful grenade provide greater tactical flexibility."
+
+ back = /obj/item/storage/backpack/lightpack/som
+ suit_store = /obj/item/weapon/gun/rifle/som/veteran
+ belt = /obj/item/storage/belt/marine/som/som_rifle_ap
+
+/datum/outfit/quick/som/veteran/standard_assaultrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som/ap, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som/ap, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/smoke_burst, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/veteran/standard_smg
+ name = "V-21 Veteran Infantryman"
+ desc = "Close range high damage, high speed. Equipped with a V-21 submachine gun with variable firerate allowing for extreme rates of fire when properly wielded, heavy armor, a good variety of grenades and AP ammunition. Allows for excellent close to medium range firepower, especially against heavily armored targets, and is surprisingly mobile."
+
+ suit_store = /obj/item/weapon/gun/smg/som/veteran
+ belt = /obj/item/storage/belt/marine/som/som_smg_ap
+
+/datum/outfit/quick/som/veteran/standard_smg/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/ap, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/ap, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/ap, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/veteran/breacher
+ name = "Charger Veteran Breacher"
+ desc = "Heavy armored breaching configuration. Equipped with a volkite charger configured for better one handed use, heavy armor upgraded with 'Lorica' armor reinforcements, a boarding shield and a good selection of grenades. Premier protection and deadly close range firepower."
+
+ head = /obj/item/clothing/head/modular/som/lorica
+ glasses = /obj/item/clothing/glasses/welding
+ wear_suit = /obj/item/clothing/suit/modular/som/heavy/lorica
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/charger/somvet
+ belt = /obj/item/storage/belt/marine/som/volkite
+ r_hand = /obj/item/weapon/shield/riot/marine/som
+
+/datum/outfit/quick/som/veteran/breacher/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/veteran/charger
+ name = "Charger Veteran Infantryman"
+ desc = "Heavily armed and armored SOM elite. Equipped with a volkite charger with motion sensor and gyrostabiliser for better one handed use, heavy armor and a good variety of grenades. Volkite weapons are exceptionally dangerous, especially against poorly armored or tightly grouped opponents. The charger is the SOM's premier close/medium range weapon, with good mobility, and can be used (with some difficulty) one handed."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/charger/scout
+ belt = /obj/item/storage/belt/marine/som/volkite
+
+/datum/outfit/quick/som/veteran/charger/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/veteran/caliver
+ name = "Caliver Veteran Infantryman"
+ desc = "Heavily armed and armored SOM elite. Equipped with a volkite caliver, heavy armor and a good variety of grenades. Volkite weapons are exceptionally dangerous, especially against poorly armored or tightly grouped opponents. The caliver provides deadly firepower at all ranges. Approach with caution."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/caliver/standard
+ belt = /obj/item/storage/belt/marine/som/volkite
+
+/datum/outfit/quick/som/veteran/caliver/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/veteran/caliver_pack
+ name = "Caliver Veteran Rifleman"
+ desc = "Heavily armed and armored SOM elite. Equipped with a volkite caliver with motion sensor, heavy armor, plenty of grenades and a back mounted self charging power supply. Volkite weapons are exceptionally dangerous, especially against poorly armored or tightly grouped opponents. The caliver provides deadly firepower at all ranges, and the power pack allows for sustained period of fire, although over extended periods of time the recharge may struggle to keep up with the demands of the weapon."
+ quantity = 2
+
+ belt = /obj/item/storage/belt/grenade/som
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/caliver/tacsensor
+ l_store = /obj/item/storage/pouch/pistol/som
+ back = /obj/item/cell/lasgun/volkite/powerpack
+
+/datum/outfit/quick/som/veteran/caliver_pack/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_BELT)
+
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_L_POUCH)
+
+/datum/outfit/quick/som/veteran/mpi
+ name = "MPI_KM Veteran Infantryman"
+ desc = "Heavily armed and armored SOM elite, with a taste for nostalgia. Equipped with an MPI_KM assault rifle, with under barrel grenade launcher and a large supply of grenades. An old weapon that was a common sight during the original Martian rebellion, the MPI's good stopping power, reliability and a healthy dose of nostalgia means it is still seen in use by some among the SOM despite its age."
+
+ suit_store = /obj/item/weapon/gun/rifle/mpi_km/grenadier
+ belt = /obj/item/storage/belt/marine/som/mpi_plum
+
+/datum/outfit/quick/som/veteran/mpi/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/extended, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/veteran/carbine
+ name = "V-34 Veteran Infantryman"
+ desc = "Heavily armed and armored SOM elite, with a taste for nostalgia. Equipped with an heirloom V-34 carbine, and a large supply of grenades. An old weapon that saw extensive use during the original Martian rebellion, this one has been preserved and passed down the generations. The V-34 is largely surpassed by the VX-32, however with its high calibre rounds and good rate of fire, it cannot be underestimated."
+
+ suit_store = /obj/item/weapon/gun/rifle/som_carbine/mag_harness
+ belt = /obj/item/storage/belt/marine/som/carbine
+
+/datum/outfit/quick/som/veteran/carbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/veteran/culverin
+ name = "Culverin Veteran Machinegunner"
+ desc = "Heavily armored heavy firesupport. Equipped with a volkite culverin and self charging backpack power unit, and a shotgun sidearm. The culverin is the most powerful man portable weapon the SOM have been seen to field. Capabable of laying down a tremendous barrage of firepower for extended periods of time. Although the back-mounted powerpack is self charging, it cannot keep up with the immense power requirements of the gun, so sustained, prolonged use can degrade the weapon's effectiveness greatly."
+ quantity = 2
+
+ belt = /obj/item/weapon/gun/shotgun/double/sawn
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/culverin/magharness
+ back = /obj/item/cell/lasgun/volkite/powerpack
+
+/datum/outfit/quick/som/veteran/culverin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/veteran/rocket_man
+ name = "V-71 Rocket Veteran"
+ desc = "War crimes have never been so easy. Equipped with a V-71 RPG and both incendiary and rad warheads, as well as a V-21 submachine gun with radioactive ammunition, heavy armor with a 'Mithridatius' environmental protection system, and rad grenades. Designed to inspire fear in the enemy and cripple them with deadly incendiary and radiological effects, providing excellent anti infantry support."
+ quantity = 2
+
+ head = /obj/item/clothing/head/modular/som/bio
+ wear_suit = /obj/item/clothing/suit/modular/som/heavy/mithridatius
+ suit_store = /obj/item/weapon/gun/smg/som/support
+ belt = /obj/item/storage/belt/marine/som
+ back = /obj/item/storage/holster/backholster/rpg/som/war_crimes
+ l_store = /obj/item/storage/pouch/grenade/som
+
+/datum/outfit/quick/som/veteran/rocket_man/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/rad, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/rad, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/rad, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/rad, SLOT_IN_BELT)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/rad, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/rad, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/rad, SLOT_IN_L_POUCH)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x20mm, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/incendiary, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/som/veteran/blinker
+ name = "Blink Assault Veteran"
+ desc = "Shock melee assault class. Equipped with a blink drive and energy sword, light armor and a backup burstfire V-11. The blink drive allows for short range teleports at some risk to the user, but allows them to effortless close the distance to cut down enemies when used correctly."
+ quantity = 2
+
+ wear_suit = /obj/item/clothing/suit/modular/som/light/shield
+ belt = /obj/item/storage/holster/belt/pistol/m4a3/som
+ suit_store = /obj/item/weapon/energy/sword/som
+ back = /obj/item/blink_drive
+
+/datum/outfit/quick/som/veteran/blinker/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/burst(H), SLOT_IN_HOLSTER)
diff --git a/code/datums/quick_load/tgmc/_tgmc.dm b/code/datums/quick_load/tgmc/_tgmc.dm
new file mode 100644
index 00000000000..584d5e6849f
--- /dev/null
+++ b/code/datums/quick_load/tgmc/_tgmc.dm
@@ -0,0 +1,31 @@
+//Base TGMC outfit
+/datum/outfit/quick/tgmc
+ name = "TGMC base"
+ desc = "This is the base typepath for all TGMC quick vendor outfits. You shouldn't see this."
+
+//Base TGMC marine outfit
+/datum/outfit/quick/tgmc/marine
+ name = "TGMC Squad Marine"
+ jobtype = SQUAD_MARINE
+
+ ears = /obj/item/radio/headset/mainship/marine
+ w_uniform = /obj/item/clothing/under/marine/black_vest
+ shoes = /obj/item/clothing/shoes/marine/full
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/shield
+ gloves = /obj/item/clothing/gloves/marine
+ mask = /obj/item/clothing/mask/gas
+ head = /obj/item/clothing/head/modular/m10x
+ r_store = /obj/item/storage/pouch/firstaid/combat_patrol
+ l_store = /obj/item/storage/pouch/grenade/combat_patrol
+ back = /obj/item/storage/backpack/marine/satchel
+
+/datum/outfit/quick/tgmc/marine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat, SLOT_IN_HEAD)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_HEAD)
+
+ H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_SUIT)
diff --git a/code/datums/quick_load/tgmc/corpsman.dm b/code/datums/quick_load/tgmc/corpsman.dm
new file mode 100644
index 00000000000..560538ff605
--- /dev/null
+++ b/code/datums/quick_load/tgmc/corpsman.dm
@@ -0,0 +1,187 @@
+//Base TGMC corpsman outfit
+/datum/outfit/quick/tgmc/corpsman
+ name = "TGMC Squad Corpsman"
+ jobtype = SQUAD_CORPSMAN
+
+ belt = /obj/item/storage/belt/lifesaver/quick
+ ears = /obj/item/radio/headset/mainship/marine
+ glasses = /obj/item/clothing/glasses/hud/health
+ w_uniform = /obj/item/clothing/under/marine/corpsman/corpman_vest
+ shoes = /obj/item/clothing/shoes/marine/full
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/mimir
+ gloves = /obj/item/clothing/gloves/marine
+ mask = /obj/item/clothing/mask/gas
+ head = /obj/item/clothing/head/modular/m10x/mimir
+ r_store = /obj/item/storage/pouch/magazine/large
+ l_store = /obj/item/storage/pouch/grenade/combat_patrol
+ back = /obj/item/storage/backpack/marine/corpsman
+
+/datum/outfit/quick/tgmc/corpsman/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/bodybag/cryobag, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/roller, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tweezers_advanced, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/advanced/nanoblood, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/spaceacillin, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/advanced/combat_advanced, SLOT_IN_ACCESSORY)
+
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/defibrillator, SLOT_IN_SUIT)
+
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_HEAD)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/neuraline, SLOT_IN_HEAD)
+
+/datum/outfit/quick/tgmc/corpsman/ar12
+ name = "AR-12 Corpsman"
+ desc = "Keeping everone else in the fight. Armed with an AR-12 assault rifle with underbarrel grenade launcher, an impressive array of tools for healing your team, and a 'Mimir' biological protection module to allow you to continue operating in hazardous environments. With medivacs out of the question, you are the only thing standing between your buddies and an early grave."
+
+ suit_store = /obj/item/weapon/gun/rifle/ar12/medic
+
+/datum/outfit/quick/tgmc/corpsman/ar12/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_R_POUCH)
+
+/datum/outfit/quick/tgmc/corpsman/smg90
+ name = "SMG-90 Corpsman"
+ desc = "Keeping everone else in the fight. Armed with an SMG-90 submachine gun to maintain good mobility, an impressive array of tools for healing your team, and a 'Mimir' biological protection module to allow you to continue operating in hazardous environments. With medivacs out of the question, you are the only thing standing between your buddies and an early grave."
+
+ suit_store = /obj/item/weapon/gun/smg/smg90/tactical
+
+/datum/outfit/quick/tgmc/corpsman/smg90/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x20mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_R_POUCH)
+
+/datum/outfit/quick/tgmc/corpsman/ar21
+ name = "AR-21 Corpsman"
+ desc = "Keeping everone else in the fight. Armed with an AR-21 skirmish rifle with underbarrel grenade launcher, an impressive array of tools for healing your team, and a 'Mimir' biological protection module to allow you to continue operating in hazardous environments. With medivacs out of the question, you are the only thing standing between your buddies and an early grave."
+
+ suit_store = /obj/item/weapon/gun/rifle/ar21/standard
+
+/datum/outfit/quick/tgmc/corpsman/ar21/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x25mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar21, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar21, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar21, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar21, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar21, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar21, SLOT_IN_R_POUCH)
+
+/datum/outfit/quick/tgmc/corpsman/auto_shotgun
+ name = "SH-15 Corpsman"
+ desc = "Keeping everone else in the fight. Armed with a SH-15 auto shotgun with underbarrel grenade launcher, an impressive array of tools for healing your team, and a 'Mimir' biological protection module to allow you to continue operating in hazardous environments. With medivacs out of the question, you are the only thing standing between your buddies and an early grave."
+
+ suit_store = /obj/item/weapon/gun/rifle/sh15/engineer
+
+/datum/outfit/quick/tgmc/corpsman/auto_shotgun/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_slug, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_slug, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_flechette, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_flechette, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_flechette, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_slug, SLOT_IN_R_POUCH)
+
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
+
+/datum/outfit/quick/tgmc/corpsman/laser_medic
+ name = "Laser Rifle Corpsman"
+ desc = "Keeping everone else in the fight. Armed with an laser rifle with miniflamer, an impressive array of tools for healing your team, and a 'Mimir' biological protection module to allow you to continue operating in hazardous environments. With medivacs out of the question, you are the only thing standing between your buddies and an early grave."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_rifle/medic
+
+/datum/outfit/quick/tgmc/corpsman/laser_medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
+
+/datum/outfit/quick/tgmc/corpsman/laser_carbine
+ name = "Laser Carbine Corpsman"
+ desc = "Keeping everone else in the fight. Armed with an laser carbine with underbarrel grenade launcher, an impressive array of tools for healing your team, and a 'Mimir' biological protection module to allow you to continue operating in hazardous environments. With medivacs out of the question, you are the only thing standing between your buddies and an early grave."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine/scout
+
+/datum/outfit/quick/tgmc/corpsman/laser_carbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
diff --git a/code/datums/quick_load/tgmc/engineer.dm b/code/datums/quick_load/tgmc/engineer.dm
new file mode 100644
index 00000000000..e8afb80253c
--- /dev/null
+++ b/code/datums/quick_load/tgmc/engineer.dm
@@ -0,0 +1,97 @@
+//Base TGMC engineer outfit
+/datum/outfit/quick/tgmc/engineer
+ name = "TGMC Squad Engineer"
+ jobtype = SQUAD_ENGINEER
+
+ ears = /obj/item/radio/headset/mainship/marine
+ glasses = /obj/item/clothing/glasses/meson
+ w_uniform = /obj/item/clothing/under/marine/engineer/black_vest
+ shoes = /obj/item/clothing/shoes/marine/full
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/engineer
+ gloves = /obj/item/clothing/gloves/marine/insulated
+ mask = /obj/item/clothing/mask/gas
+ head = /obj/item/clothing/head/modular/m10x/welding
+ r_store = /obj/item/storage/pouch/firstaid/combat_patrol
+ l_store = /obj/item/storage/pouch/tools/full
+ back = /obj/item/storage/backpack/marine/engineerpack
+
+/datum/outfit/quick/tgmc/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_HEAD)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_HEAD)
+
+ H.equip_to_slot_or_del(new /obj/item/circuitboard/apc, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/cell/high, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/medium_stack, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/stack/barbed_wire/half_stack, SLOT_IN_SUIT)
+
+/datum/outfit/quick/tgmc/engineer/rrengineer
+ name = "Rocket Specialist"
+ desc = "Bringing the big guns. Equipped with a AR-18 carbine and RL-160 along with the standard engineer kit. Excellent against groups of enemy infantry or light armor, but only has limited ammunition."
+ quantity = 2
+
+ suit_store = /obj/item/weapon/gun/rifle/ar18/engineer
+ back = /obj/item/storage/holster/backholster/rpg/low_impact
+ belt = /obj/item/storage/belt/marine/ar18
+
+/datum/outfit/quick/tgmc/engineer/rrengineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/chem_grenade/razorburn_large, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/engineer/sentry
+ name = "Sentry Technician"
+ desc = "Firing more guns than you have hands. Equipped with a AR-12 assault rifle with miniflamer, and two minisentries along with the standard engineer kit. Allows the user to quickly setup strong points and lock areas down, with some sensible placement."
+
+ suit_store = /obj/item/weapon/gun/rifle/ar12/engineer
+ belt = /obj/item/storage/belt/marine/ar12
+
+/datum/outfit/quick/tgmc/engineer/sentry/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/sentry/mini/combat_patrol, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/sentry/mini/combat_patrol, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/minisentry, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/minisentry, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/chem_grenade/razorburn_large, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/engineer/demolition
+ name = "Demolition Specialist"
+ desc = "Boom boom, shake the room. Equipped with a SH-15 auto shotgun and UGL and an impressive array of mines, detpacks and grenades, along with the standard engineer kit. Excellent for blasting through any obstacle, and mining areas to restrict enemy movement."
+
+ suit_store = /obj/item/weapon/gun/rifle/sh15/engineer
+ back = /obj/item/storage/backpack/marine/tech
+ belt = /obj/item/storage/belt/marine/auto_shotgun
+
+/datum/outfit/quick/tgmc/engineer/demolition/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/minelayer, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/explosive_mines/large, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/explosive_mines, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/assembly/signaler, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
diff --git a/code/datums/quick_load/tgmc/leader.dm b/code/datums/quick_load/tgmc/leader.dm
new file mode 100644
index 00000000000..a76b712f4f0
--- /dev/null
+++ b/code/datums/quick_load/tgmc/leader.dm
@@ -0,0 +1,219 @@
+//Base TGMC leader outfit
+/datum/outfit/quick/tgmc/leader
+ name = "TGMC Squad Leader"
+ jobtype = SQUAD_LEADER
+ ears = /obj/item/radio/headset/mainship/marine
+ glasses = /obj/item/clothing/glasses/hud/health
+ w_uniform = /obj/item/clothing/under/marine/black_vest
+ shoes = /obj/item/clothing/shoes/marine/full
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/leader
+ gloves = /obj/item/clothing/gloves/marine
+ mask = /obj/item/clothing/mask/gas
+ head = /obj/item/clothing/head/modular/m10x/leader
+ r_store = /obj/item/storage/pouch/firstaid/combat_patrol_leader
+ l_store = /obj/item/storage/pouch/grenade/combat_patrol
+ back = /obj/item/storage/backpack/lightpack
+
+/datum/outfit/quick/tgmc/leader/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat, SLOT_IN_HEAD)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_HEAD)
+
+ H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_SUIT)
+
+/datum/outfit/quick/tgmc/leader/ar12
+ name = "AR-12 Patrol Leader"
+ desc = "Gives the orders. Equipped with an AR-12 assault rifle with UGL, plenty of grenades, some support kit such as deployable cameras, as well as heavy armor with a 'valkyrie' autodoc module. You can provide excellent support to your squad thanks to your kit and order shouting talents."
+
+ suit_store = /obj/item/weapon/gun/rifle/ar12/rifleman
+ belt = /obj/item/storage/belt/marine/ar12
+
+/datum/outfit/quick/tgmc/leader/ar12/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/deployable_camera, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/hud_tablet(H, /datum/job/terragov/squad/leader, H.assigned_squad), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/leader/ar18
+ name = "AR-18 Patrol Leader"
+ desc = "Gives the orders. Equipped with an AR-18 carbine with plasma pistol attachment, plenty of grenades, as well as heavy armor with a 'valkyrie' autodoc module. You can provide excellent support to your squad thanks to your kit and order shouting talents, while unleashing excellent damage at medium range."
+
+ suit_store = /obj/item/weapon/gun/rifle/ar18/plasma_pistol
+ belt = /obj/item/storage/belt/marine/ar18
+
+/datum/outfit/quick/tgmc/leader/ar18/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/plasma_pistol, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/plasma_pistol, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/plasma_pistol, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/leader/combat_rifle
+ name = "AR-11 Patrol Leader"
+ desc = "Gives the orders. Equipped with an AR-11 combat rifle, plenty of grenades, as well as heavy armor with a 'valkyrie' autodoc module. You can provide excellent support to your squad thanks to your kit and order shouting talents, with excellent damage at all ranges."
+
+ suit_store = /obj/item/weapon/gun/rifle/ar11/standard
+ belt = /obj/item/storage/belt/marine/combat_rifle
+
+/datum/outfit/quick/tgmc/leader/combat_rifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/deployable_camera, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/deployable_camera, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/hud_tablet(H, /datum/job/terragov/squad/leader, H.assigned_squad), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p492x34mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/leader/br64
+ name = "BR-64 Patrol Leader"
+ desc = "Gives the orders. Equipped with an BR-64 battle rifle with UGL, plenty of grenades, as well as heavy armor with a 'valkyrie' autodoc module. The battle rifle offers improved damage and penetration compared to more common rifles, but still retains a grenade launcher that the AR-11 lacks."
+
+ suit_store = /obj/item/weapon/gun/rifle/br64/standard
+ belt = /obj/item/storage/belt/marine/br64
+
+/datum/outfit/quick/tgmc/leader/br64/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x265mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x265mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/leader/auto_shotgun
+ name = "SH-15 Patrol Leader"
+ desc = "Gives the orders. Equipped with an SH-15 auto shotgun, plenty of grenades, as well as heavy armor with a 'valkyrie' autodoc module. You can provide excellent support to your squad thanks to your kit and order shouting talents, with strong damage and control."
+
+ suit_store = /obj/item/weapon/gun/rifle/sh15/plasma_pistol
+ belt = /obj/item/storage/belt/marine/auto_shotgun
+
+/datum/outfit/quick/tgmc/leader/auto_shotgun/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_slug, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_flechette, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/plasma_pistol, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/plasma_pistol, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/plasma_pistol, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/leader/standard_laserrifle
+ name = "Laser Rifle Patrol Leader"
+ desc = "Gives the orders. Equipped with a laser rifle with UGL for better armor penetration against SOM, some support kit such as deployable cameras, as well as heavy armor with a 'valkyrie' autodoc module. You can provide excellent support to your squad thanks to your kit and order shouting talents."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_rifle/rifleman
+ belt = /obj/item/storage/belt/marine/te_cells
+
+/datum/outfit/quick/tgmc/leader/standard_laserrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/deployable_camera, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/deployable_camera, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/hud_tablet(H, /datum/job/terragov/squad/leader, H.assigned_squad), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/leader/oicw
+ name = "AR-55 Patrol Leader"
+ desc = "Gives the orders. Equipped with an AR-55 OICW with plenty of grenades for its integrated grenade launcher, some support kit such as deployable cameras, as well as heavy armor with a 'valkyrie' autodoc module. You can provide excellent support to your squad thanks to your kit and order shouting talents."
+ quantity = 2
+
+ suit_store = /obj/item/weapon/gun/rifle/tx55/combat_patrol
+ belt = /obj/item/storage/belt/marine/oicw
+
+/datum/outfit/quick/tgmc/leader/oicw/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/tx54, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/tx54, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
diff --git a/code/datums/quick_load/tgmc/marine.dm b/code/datums/quick_load/tgmc/marine.dm
new file mode 100644
index 00000000000..d048d533143
--- /dev/null
+++ b/code/datums/quick_load/tgmc/marine.dm
@@ -0,0 +1,403 @@
+/datum/outfit/quick/tgmc/marine/ar12
+ name = "AR-12 rifleman"
+ desc = "The classic line rifleman. Equipped with an AR-12 assault rifle with UGL, heavy armor, and plenty of grenades and ammunition. A solid all-rounder."
+
+ suit_store = /obj/item/weapon/gun/rifle/ar12/rifleman
+ belt = /obj/item/storage/belt/marine/ar12
+
+/datum/outfit/quick/tgmc/marine/ar12/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/weapon/shield/riot/marine/deployable, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/standard_laserrifle
+ name = "Laser Rifleman"
+ desc = "For when bullets don't cut the mustard. Laser rifle with miniflamer and heavy armor. Lasers are more effective against SOM armor, but cannot break bones and damage organs."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_rifle/rifleman
+ belt = /obj/item/storage/belt/marine/te_cells
+
+/datum/outfit/quick/tgmc/marine/standard_laserrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/ar18
+ name = "AR-18 Rifleman"
+ desc = "The modern line rifleman. Equipped with an AR-18 carbine with UGL, heavy armor, and plenty of grenades and ammunition. Boasts better mobility and damage output than the AR-12, but suffers with a smaller magazine and worse performance at longer ranges."
+
+ suit_store = /obj/item/weapon/gun/rifle/ar18/standard
+ belt = /obj/item/storage/belt/marine/ar18
+
+/datum/outfit/quick/tgmc/marine/ar18/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar18, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/combat_rifle
+ name = "AR-11 Rifleman"
+ desc = "The old rifleman. Equipped with an AR-11 combat rifle with heavy armor, and plenty of grenades and ammunition. Has a large capacity with deadly damage output at all ranges, but lacks many attachment options of more modern weapons and somewhat more cumbersome to handle."
+
+ suit_store = /obj/item/weapon/gun/rifle/ar11/standard
+ belt = /obj/item/storage/belt/marine/combat_rifle
+
+/datum/outfit/quick/tgmc/marine/combat_rifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p492x34mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p492x34mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/br64
+ name = "BR-64 Rifleman"
+ desc = "Heavier firepower for the discerning rifleman. Equipped with an BR-64 battle rifle with UGL, heavy armor, and plenty of grenades and ammunition. Higher damage and penetration, at the cost of a more bulky weapon."
+
+ suit_store = /obj/item/weapon/gun/rifle/br64/standard
+ belt = /obj/item/storage/belt/marine/br64
+
+/datum/outfit/quick/tgmc/marine/br64/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/weapon/shield/riot/marine/deployable, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x265mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/ar21
+ name = "AR-21 Rifleman"
+ desc = "Better stopping power at the cost of lower rate of fire. Equipped with an AR-21 skirmish rifle with UGL, heavy armor, and plenty of grenades and ammunition. Rewards good aim with its heavy rounds."
+
+ suit_store = /obj/item/weapon/gun/rifle/ar21/standard
+ belt = /obj/item/storage/belt/marine/ar21
+
+/datum/outfit/quick/tgmc/marine/ar21/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/weapon/shield/riot/marine/deployable, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x25mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/alf_shocktrooper
+ name = "ALF-51B Shocktrooper"
+ desc = "Shock assault loadout. Equipped with an ALF-51B machinecarbine, heavy armor reinforced with a Mk.II 'Tyr' module, and plenty of grenades and ammunition. Offers excellent damage output and superior protection, however the ALF-51B's cutdown size means it suffers from severe damage falloff. Best used up close."
+
+ head = /obj/item/clothing/head/modular/m10x/tyr
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/tyr_two
+ suit_store = /obj/item/weapon/gun/rifle/alf_machinecarbine/assault
+ belt = /obj/item/storage/belt/marine/alf_machinecarbine
+
+/datum/outfit/quick/tgmc/marine/alf_shocktrooper/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/alf_machinecarbine, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/alf_machinecarbine, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/mg60
+ name = "MG-60 Machinegunner"
+ desc = "The old reliable workhorse of the TGMC. Equipped with an MG-60 machinegun with bipod, heavy armor and some basic construction supplies. Good for holding ground and providing firesupport, and the cost of some mobility."
+
+ belt = /obj/item/storage/belt/sparepouch
+ suit_store = /obj/item/weapon/gun/rifle/mg60/machinegunner
+ l_store = /obj/item/storage/pouch/construction
+
+/datum/outfit/quick/tgmc/marine/mg60/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/weapon/shield/riot/marine/deployable, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg60, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg60, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg60, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg60, SLOT_IN_BELT)
+
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
+
+ H.equip_to_slot_or_del(new /obj/item/tool/shovel/etool, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/stack/sandbags_empty/half, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/stack/sandbags/large_stack, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/stack/barbed_wire/half_stack, SLOT_IN_L_POUCH)
+
+/datum/outfit/quick/tgmc/marine/mg27
+ name = "MG-27 Machinegunner"
+ desc = "For when you need the biggest gun you can carry. Equipped with an MG-27 machinegun and miniscope and a MR-25 SMG as a side arm, as well as medium armor and a small amount of construction supplies. Allows for devestating, albeit static firepower."
+
+ belt = /obj/item/storage/holster/m25
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/shield
+ suit_store = /obj/item/weapon/gun/mg27/machinegunner
+ l_store = /obj/item/storage/pouch/construction
+ glasses = /obj/item/clothing/glasses/mgoggles
+
+/datum/outfit/quick/tgmc/marine/mg27/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg27, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg27, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg27, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/m25/holstered(H), SLOT_IN_HOLSTER)
+
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
+
+ H.equip_to_slot_or_del(new /obj/item/tool/shovel/etool, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/stack/sandbags_empty/half, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/stack/sandbags/large_stack, SLOT_IN_L_POUCH)
+ H.equip_to_slot_or_del(new /obj/item/stack/barbed_wire/half_stack, SLOT_IN_L_POUCH)
+
+/datum/outfit/quick/tgmc/marine/standard_lasermg
+ name = "Laser Machinegunner"
+ desc = "Mess free fire superiority. Laser machinegun with underbarrel grenade launcher and heavy armor. Comparatively light for a machinegun, with variable firemodes makes this weapon a flexible and dangerous weapon. Lasers are more effective against SOM armor, but cannot break bones and damage organs."
+
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_mlaser/patrol
+ belt = /obj/item/storage/belt/marine/te_cells
+
+/datum/outfit/quick/tgmc/marine/standard_lasermg/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/pyro
+ name = "FL-84 Flamethrower Operator"
+ desc = "For burning enemies, and sometimes friends. Equipped with an FL-84 flamethrower and wide nozzle, SMG-25 secondary weapon, heavy armor upgraded with a 'Surt' fireproof module, and a backtank of fuel. Can burn down large areas extremely quickly both to flush out the enemy and to cover flanks. Is very slow however, ineffective at long range, and can expend all available fuel quickly if used excessively."
+
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/surt
+ mask = /obj/item/clothing/mask/gas/tactical
+ head = /obj/item/clothing/head/modular/m10x/surt
+ belt = /obj/item/storage/holster/m25
+ back = /obj/item/ammo_magazine/flamer_tank/backtank
+ suit_store = /obj/item/weapon/gun/flamer/big_flamer/marinestandard/wide
+
+/datum/outfit/quick/tgmc/marine/pyro/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/m25/holstered(H), SLOT_IN_HOLSTER)
+
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25/extended, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25/extended, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25/extended, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x20mm, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/standard_shotgun
+ name = "SH-35 Scout"
+ desc = "For getting too close for comfort. Equipped with a SH-35 shotgun with buckshot and flechette rounds, a MP-19 sidearm, a good amount of grenades and light armor with a cutting edge 'svallin' shield module. Provides for excellent mobility and devestating close range firepower, but will falter against sustained firepower."
+
+ belt = /obj/item/storage/belt/shotgun
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/light/shield
+ suit_store = /obj/item/weapon/gun/shotgun/pump/t35/standard
+ belt = /obj/item/storage/belt/shotgun/mixed
+
+/datum/outfit/quick/tgmc/marine/standard_shotgun/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x20mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/synaptizine, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/mp19/compact(H), SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/standard_lasercarbine
+ name = "Laser Carbine Scout"
+ desc = "Highly mobile light infantry. Equipped with a laser carbine with UGL and a laser pistol sidearm, plenty of grenades and light armor with a cutting edge 'svallin' shield module. Excellent mobility, but not suited for sustained combat."
+
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/light/shield
+ suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine/scout
+ belt = /obj/item/storage/belt/marine/te_cells
+
+/datum/outfit/quick/tgmc/marine/standard_lasercarbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/synaptizine, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/light_carbine
+ name = "AR-18 Scout"
+ desc = "High damage and high speed. Equipped with an AR-18 carbine with UGL, light armor with a cutting edge 'svallin' shield module, and plenty of grenades and ammunition. Great mobility and damage output, but low magazine capacity and weak armor without the shield active means this loadout is best suited to hit and run tactics."
+
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/light/shield
+ suit_store = /obj/item/weapon/gun/rifle/ar18/scout
+ belt = /obj/item/storage/belt/marine/ar18
+
+/datum/outfit/quick/tgmc/marine/light_carbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar18, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/shield_tank
+ name = "SMG-25 Guardian"
+ desc = "Professional bullet catcher. Equipped with an SMG-25 submachine gun, a TL-172 defensive shield and heavy armor reinforced with a 'Tyr' module. Designed to absorb as much incoming damage as possible to protect your squishier comrades, however your mobility and damage output are notably diminished. Also of note: the excellent thermal mass of the TL-172 means it is unusually effective against the SOM's volkite weaponry."
+
+ head = /obj/item/clothing/head/modular/m10x/tyr
+ glasses = /obj/item/clothing/glasses/welding
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/tyr_two
+ suit_store = /obj/item/weapon/gun/smg/m25/magharness
+ belt = /obj/item/storage/belt/marine/secondary
+ r_hand = /obj/item/weapon/shield/riot/marine
+
+/datum/outfit/quick/tgmc/marine/shield_tank/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25/extended, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x20mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x20mm, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/machete
+ name = "Assault Marine"
+ desc = "This doesn't look standard issue... Equipped with a SMG-25 submachine gun, machete and heavy lift jetpack, along with light armor upgraded with a 'svallin' shield module. It's not clear why this is here, nevertheless it has excellent mobility, and would likely be devastating against anyone you manage to actually reach."
+
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/light/shield
+ back = /obj/item/jetpack_marine/heavy
+ belt = /obj/item/storage/holster/blade/machete/full
+ suit_store = /obj/item/weapon/gun/smg/m25/magharness
+
+/datum/outfit/quick/tgmc/marine/machete/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25/extended, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25/extended, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/marine/scout
+ name = "BR-8 Scout"
+ desc = "IFF scout. Equipped with a BR-8 with a good amount of grenades and light armor with a cutting edge 'svallin' shield module. Provides for good mobility and powerful IFF damage, but the BR-8 is difficult to bring to bear at close range, and light armor wilts under sustained fire."
+ quantity = 2
+
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/light/shield
+ suit_store = /obj/item/weapon/gun/rifle/tx8/scout
+ belt = /obj/item/storage/belt/marine/tx8
+
+/datum/outfit/quick/tgmc/marine/scout/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/mp19/scanner(H), SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/tx8, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/tx8, SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
diff --git a/code/datums/quick_load/tgmc/smartgunner.dm b/code/datums/quick_load/tgmc/smartgunner.dm
new file mode 100644
index 00000000000..10d49a38b08
--- /dev/null
+++ b/code/datums/quick_load/tgmc/smartgunner.dm
@@ -0,0 +1,94 @@
+//Base TGMC smartgunner outfit
+/datum/outfit/quick/tgmc/smartgunner
+ name = "TGMC Squad Smartgunner"
+ jobtype = SQUAD_SMARTGUNNER
+
+ belt = /obj/item/belt_harness/marine
+ ears = /obj/item/radio/headset/mainship/marine
+ glasses = /obj/item/clothing/glasses/night/m56_goggles
+ w_uniform = /obj/item/clothing/under/marine/black_vest
+ shoes = /obj/item/clothing/shoes/marine/full
+ wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/tyr_two
+ gloves = /obj/item/clothing/gloves/marine
+ mask = /obj/item/clothing/mask/gas/tactical
+ head = /obj/item/clothing/head/modular/m10x/tyr
+ r_store = /obj/item/storage/pouch/firstaid/combat_patrol
+ l_store = /obj/item/storage/pouch/grenade/combat_patrol
+ back = /obj/item/storage/backpack/marine/satchel
+
+/datum/outfit/quick/tgmc/smartgunner/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat, SLOT_IN_HEAD)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_HEAD)
+
+ H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_SUIT)
+
+/datum/outfit/quick/tgmc/smartgunner/sg29
+ name = "SG29 Smart Machinegunner"
+ desc = "A gun smarter than the average bear, or marine. Equipped with an SG-29 smart machine gun and heavy armor upgraded with a 'Tyr' extra armor mdule, the SG is responsible for providing mobile, accurate firesupport thanks to your IFF ammunition."
+
+ suit_store = /obj/item/weapon/gun/rifle/sg29/patrol
+
+/datum/outfit/quick/tgmc/smartgunner/sg29/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/sg29, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/sg29, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/sg29, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/sg29, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
+
+/datum/outfit/quick/tgmc/smartgunner/minigun_sg
+ name = "SG85 Smart Machinegunner"
+ desc = "More bullets than sense. Equipped with an SG-85 smart gatling gun, an MP-19 sidearm, heavy armor upgraded with a 'Tyr' extra armor mdule and a whole lot of bullets. For when you want to unleash a firehose of firepower. Try not to run out of ammo."
+
+ belt = /obj/item/storage/belt/sparepouch
+ suit_store = /obj/item/weapon/gun/minigun/smart_minigun/motion_detector
+ back = /obj/item/ammo_magazine/minigun_powerpack/smartgun
+
+/datum/outfit/quick/tgmc/smartgunner/minigun_sg/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_ACCESSORY)
+
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/smart_minigun, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/smart_minigun, SLOT_IN_BELT)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/mp19/compact(H), SLOT_IN_BELT)
+
+/datum/outfit/quick/tgmc/smartgunner/sg62
+ name = "SG62 Smart Machinegunner"
+ desc = "Flexibility and precision. Equipped with an SG-62 smart target rifle and heavy armor upgraded with a 'Tyr' extra armor mdule. The integrated spotting rifle comes with a variety of flexible ammo types, which combined with high damage, penetration and IFF, makes for a dangerous support loadout."
+
+ belt = /obj/item/storage/belt/marine/sg62
+ suit_store = /obj/item/weapon/gun/rifle/sg62/motion
+
+/datum/outfit/quick/tgmc/smartgunner/sg62/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/incendiary, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/incendiary, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/tungsten, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/tungsten, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
+ H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
+
+ H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/highimpact, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/highimpact, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/highimpact, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/highimpact, SLOT_IN_ACCESSORY)
diff --git a/code/datums/quick_load_outfits.dm b/code/datums/quick_load_outfits.dm
deleted file mode 100644
index 8269b69524e..00000000000
--- a/code/datums/quick_load_outfits.dm
+++ /dev/null
@@ -1,2225 +0,0 @@
-/datum/outfit/quick
- ///Description of the loadout
- var/desc = "Description here"
- ///How much of this loadout there is. infinite by default
- var/quantity = -1
- ///What job this loadout is associated with. Used for tabs and access.
- var/jobtype = "Squad Marine"
-
-
-/datum/outfit/quick/equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/override_client)
- pre_equip(H, visualsOnly, override_client)
-
- //Start with uniform,suit,backpack for additional slots. Deletes any existing equipped item to avoid accidentally losing half your loadout. Not suitable for standard gamemodes!
- if(w_uniform)
- qdel(H.w_uniform)
- H.equip_to_slot_or_del(new w_uniform(H),SLOT_W_UNIFORM, override_nodrop = TRUE)
- if(wear_suit)
- qdel(H.wear_suit)
- H.equip_to_slot_or_del(new wear_suit(H),SLOT_WEAR_SUIT, override_nodrop = TRUE)
- if(back)
- qdel(H.back)
- H.equip_to_slot_or_del(new back(H),SLOT_BACK, override_nodrop = TRUE)
- if(belt)
- qdel(H.belt)
- H.equip_to_slot_or_del(new belt(H),SLOT_BELT, override_nodrop = TRUE)
- if(gloves)
- qdel(H.gloves)
- H.equip_to_slot_or_del(new gloves(H),SLOT_GLOVES, override_nodrop = TRUE)
- if(shoes)
- qdel(H.shoes)
- H.equip_to_slot_or_del(new shoes(H),SLOT_SHOES, override_nodrop = TRUE)
- if(head)
- qdel(H.head)
- H.equip_to_slot_or_del(new head(H),SLOT_HEAD, override_nodrop = TRUE)
- if(mask)
- qdel(H.wear_mask)
- H.equip_to_slot_or_del(new mask(H),SLOT_WEAR_MASK, override_nodrop = TRUE)
- if(ears)
- qdel(H.wear_ear)
- if(visualsOnly)
- H.equip_to_slot_or_del(new /obj/item/radio/headset(H), SLOT_EARS, override_nodrop = TRUE)
- else
- H.equip_to_slot_or_del(new ears(H, H.assigned_squad, H.job.type), SLOT_EARS, override_nodrop = TRUE)
- if(glasses)
- qdel(H.glasses)
- H.equip_to_slot_or_del(new glasses(H),SLOT_GLASSES, override_nodrop = TRUE)
- if(id)
- H.equip_to_slot_or_del(new id(H),SLOT_WEAR_ID, override_nodrop = TRUE)
- if(suit_store)
- qdel(H.s_store)
- H.equip_to_slot_or_del(new suit_store(H),SLOT_S_STORE, override_nodrop = TRUE)
- if(l_hand)
- qdel(H.l_hand)
- H.put_in_l_hand(new l_hand(H))
- if(r_hand)
- qdel(H.r_hand)
- H.put_in_r_hand(new r_hand(H))
-
- if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon.
- if(l_store)
- qdel(H.l_store)
- H.equip_to_slot_or_del(new l_store(H),SLOT_L_STORE, override_nodrop = TRUE)
- if(r_store)
- qdel(H.r_store)
- H.equip_to_slot_or_del(new r_store(H),SLOT_R_STORE, override_nodrop = TRUE)
-
- if(box)
- if(!backpack_contents)
- backpack_contents = list()
- backpack_contents.Insert(1, box)
- backpack_contents[box] = 1
-
- if(backpack_contents)
- for(var/path in backpack_contents)
- var/number = backpack_contents[path]
- if(!isnum(number))//Default to 1
- number = 1
- for(var/i in 1 to number)
- H.equip_to_slot_or_del(new path(H),SLOT_IN_BACKPACK, override_nodrop = TRUE)
-
- post_equip(H, visualsOnly)
-
- H.update_body()
- return TRUE
-
-////TGMC/////
-
-//Base TGMC outfit
-/datum/outfit/quick/tgmc
- name = "TGMC base"
- desc = "This is the base typepath for all TGMC quick vendor outfits. You shouldn't see this."
-
-//Base TGMC marine outfit
-/datum/outfit/quick/tgmc/marine
- name = "TGMC Squad Marine"
- jobtype = "Squad Marine"
-
- ears = /obj/item/radio/headset/mainship/marine
- w_uniform = /obj/item/clothing/under/marine/black_vest
- shoes = /obj/item/clothing/shoes/marine/full
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/shield
- gloves = /obj/item/clothing/gloves/marine
- mask = /obj/item/clothing/mask/gas
- head = /obj/item/clothing/head/modular/m10x
- r_store = /obj/item/storage/pouch/firstaid/combat_patrol
- l_store = /obj/item/storage/pouch/grenade/combat_patrol
- back = /obj/item/storage/backpack/marine/satchel
-
-/datum/outfit/quick/tgmc/marine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat, SLOT_IN_HEAD)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_HEAD)
-
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_SUIT)
-
-/datum/outfit/quick/tgmc/marine/ar12
- name = "AR-12 rifleman"
- desc = "The classic line rifleman. Equipped with an AR-12 assault rifle with UGL, heavy armor, and plenty of grenades and ammunition. A solid all-rounder."
-
- suit_store = /obj/item/weapon/gun/rifle/ar12/rifleman
- belt = /obj/item/storage/belt/marine/ar12
-
-/datum/outfit/quick/tgmc/marine/ar12/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/weapon/shield/riot/marine/deployable, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/standard_laserrifle
- name = "Laser Rifleman"
- desc = "For when bullets don't cut the mustard. Laser rifle with miniflamer and heavy armor. Lasers are more effective against SOM armor, but cannot break bones and damage organs."
-
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_rifle/rifleman
- belt = /obj/item/storage/belt/marine/te_cells
-
-/datum/outfit/quick/tgmc/marine/standard_laserrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/ar18
- name = "AR-18 Rifleman"
- desc = "The modern line rifleman. Equipped with an AR-18 carbine with UGL, heavy armor, and plenty of grenades and ammunition. Boasts better mobility and damage output than the AR-12, but suffers with a smaller magazine and worse performance at longer ranges."
-
- suit_store = /obj/item/weapon/gun/rifle/ar18/standard
- belt = /obj/item/storage/belt/marine/ar18
-
-/datum/outfit/quick/tgmc/marine/ar18/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar18, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/combat_rifle
- name = "AR-11 Rifleman"
- desc = "The old rifleman. Equipped with an AR-11 combat rifle with heavy armor, and plenty of grenades and ammunition. Has a large capacity with deadly damage output at all ranges, but lacks many attachment options of more modern weapons and somewhat more cumbersome to handle."
-
- suit_store = /obj/item/weapon/gun/rifle/ar11/standard
- belt = /obj/item/storage/belt/marine/combat_rifle
-
-/datum/outfit/quick/tgmc/marine/combat_rifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p492x34mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p492x34mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/br64
- name = "BR-64 Rifleman"
- desc = "Heavier firepower for the discerning rifleman. Equipped with an BR-64 battle rifle with UGL, heavy armor, and plenty of grenades and ammunition. Higher damage and penetration, at the cost of a more bulky weapon."
-
- suit_store = /obj/item/weapon/gun/rifle/br64/standard
- belt = /obj/item/storage/belt/marine/br64
-
-/datum/outfit/quick/tgmc/marine/br64/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/weapon/shield/riot/marine/deployable, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x265mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/ar21
- name = "AR-21 Rifleman"
- desc = "Better stopping power at the cost of lower rate of fire. Equipped with an AR-21 skirmish rifle with UGL, heavy armor, and plenty of grenades and ammunition. Rewards good aim with its heavy rounds."
-
- suit_store = /obj/item/weapon/gun/rifle/ar21/standard
- belt = /obj/item/storage/belt/marine/ar21
-
-/datum/outfit/quick/tgmc/marine/ar21/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/weapon/shield/riot/marine/deployable, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x25mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/alf_shocktrooper
- name = "ALF-51B Shocktrooper"
- desc = "Shock assault loadout. Equipped with an ALF-51B machinecarbine, heavy armor reinforced with a Mk.II 'Tyr' module, and plenty of grenades and ammunition. Offers excellent damage output and superior protection, however the ALF-51B's cutdown size means it suffers from severe damage falloff. Best used up close."
-
- head = /obj/item/clothing/head/modular/m10x/tyr
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/tyr_two
- suit_store = /obj/item/weapon/gun/rifle/alf_machinecarbine/assault
- belt = /obj/item/storage/belt/marine/alf_machinecarbine
-
-/datum/outfit/quick/tgmc/marine/alf_shocktrooper/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/alf_machinecarbine, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/alf_machinecarbine, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/mg60
- name = "MG-60 Machinegunner"
- desc = "The old reliable workhorse of the TGMC. Equipped with an MG-60 machinegun with bipod, heavy armor and some basic construction supplies. Good for holding ground and providing firesupport, and the cost of some mobility."
-
- belt = /obj/item/storage/belt/sparepouch
- suit_store = /obj/item/weapon/gun/rifle/mg60/machinegunner
- l_store = /obj/item/storage/pouch/construction
-
-/datum/outfit/quick/tgmc/marine/mg60/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/weapon/shield/riot/marine/deployable, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg60, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg60, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg60, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg60, SLOT_IN_BELT)
-
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
-
- H.equip_to_slot_or_del(new /obj/item/tool/shovel/etool, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/stack/sandbags_empty/half, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/stack/sandbags/large_stack, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/stack/barbed_wire/half_stack, SLOT_IN_L_POUCH)
-
-/datum/outfit/quick/tgmc/marine/mg27
- name = "MG-27 Machinegunner"
- desc = "For when you need the biggest gun you can carry. Equipped with an MG-27 machinegun and miniscope and a MR-25 SMG as a side arm, as well as medium armor and a small amount of construction supplies. Allows for devestating, albeit static firepower."
-
- belt = /obj/item/storage/holster/m25
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/shield
- suit_store = /obj/item/weapon/gun/mg27/machinegunner
- l_store = /obj/item/storage/pouch/construction
- glasses = /obj/item/clothing/glasses/mgoggles
-
-/datum/outfit/quick/tgmc/marine/mg27/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg27, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg27, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/mg27, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/m25/holstered(H), SLOT_IN_HOLSTER)
-
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
-
- H.equip_to_slot_or_del(new /obj/item/tool/shovel/etool, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/stack/sandbags_empty/half, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/stack/sandbags/large_stack, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/stack/barbed_wire/half_stack, SLOT_IN_L_POUCH)
-
-/datum/outfit/quick/tgmc/marine/standard_lasermg
- name = "Laser Machinegunner"
- desc = "Mess free fire superiority. Laser machinegun with underbarrel grenade launcher and heavy armor. Comparatively light for a machinegun, with variable firemodes makes this weapon a flexible and dangerous weapon. Lasers are more effective against SOM armor, but cannot break bones and damage organs."
-
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_mlaser/patrol
- belt = /obj/item/storage/belt/marine/te_cells
-
-/datum/outfit/quick/tgmc/marine/standard_lasermg/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/pyro
- name = "FL-84 Flamethrower Operator"
- desc = "For burning enemies, and sometimes friends. Equipped with an FL-84 flamethrower and wide nozzle, SMG-25 secondary weapon, heavy armor upgraded with a 'Surt' fireproof module, and a backtank of fuel. Can burn down large areas extremely quickly both to flush out the enemy and to cover flanks. Is very slow however, ineffective at long range, and can expend all available fuel quickly if used excessively."
-
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/surt
- mask = /obj/item/clothing/mask/gas/tactical
- head = /obj/item/clothing/head/modular/m10x/surt
- belt = /obj/item/storage/holster/m25
- back = /obj/item/ammo_magazine/flamer_tank/backtank
- suit_store = /obj/item/weapon/gun/flamer/big_flamer/marinestandard/wide
-
-/datum/outfit/quick/tgmc/marine/pyro/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/m25/holstered(H), SLOT_IN_HOLSTER)
-
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25/extended, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25/extended, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25/extended, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x20mm, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/standard_shotgun
- name = "SH-35 Scout"
- desc = "For getting too close for comfort. Equipped with a SH-35 shotgun with buckshot and flechette rounds, a MP-19 sidearm, a good amount of grenades and light armor with a cutting edge 'svallin' shield module. Provides for excellent mobility and devestating close range firepower, but will falter against sustained firepower."
-
- belt = /obj/item/storage/belt/shotgun
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/light/shield
- suit_store = /obj/item/weapon/gun/shotgun/pump/t35/standard
- belt = /obj/item/storage/belt/shotgun/mixed
-
-/datum/outfit/quick/tgmc/marine/standard_shotgun/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x20mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/synaptizine, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/mp19/compact(H), SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/standard_lasercarbine
- name = "Laser Carbine Scout"
- desc = "Highly mobile light infantry. Equipped with a laser carbine with UGL and a laser pistol sidearm, plenty of grenades and light armor with a cutting edge 'svallin' shield module. Excellent mobility, but not suited for sustained combat."
-
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/light/shield
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine/scout
- belt = /obj/item/storage/belt/marine/te_cells
-
-/datum/outfit/quick/tgmc/marine/standard_lasercarbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/synaptizine, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/light_carbine
- name = "AR-18 Scout"
- desc = "High damage and high speed. Equipped with an AR-18 carbine with UGL, light armor with a cutting edge 'svallin' shield module, and plenty of grenades and ammunition. Great mobility and damage output, but low magazine capacity and weak armor without the shield active means this loadout is best suited to hit and run tactics."
-
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/light/shield
- suit_store = /obj/item/weapon/gun/rifle/ar18/scout
- belt = /obj/item/storage/belt/marine/ar18
-
-/datum/outfit/quick/tgmc/marine/light_carbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar18, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/p23/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/p23, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/shield_tank
- name = "SMG-25 Guardian"
- desc = "Professional bullet catcher. Equipped with an SMG-25 submachine gun, a TL-172 defensive shield and heavy armor reinforced with a 'Tyr' module. Designed to absorb as much incoming damage as possible to protect your squishier comrades, however your mobility and damage output are notably diminished. Also of note: the excellent thermal mass of the TL-172 means it is unusually effective against the SOM's volkite weaponry."
-
- head = /obj/item/clothing/head/modular/m10x/tyr
- glasses = /obj/item/clothing/glasses/welding
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/tyr_two
- suit_store = /obj/item/weapon/gun/smg/m25/magharness
- belt = /obj/item/storage/belt/marine/secondary
- r_hand = /obj/item/weapon/shield/riot/marine
-
-/datum/outfit/quick/tgmc/marine/shield_tank/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x20mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x20mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/machete
- name = "Assault Marine"
- desc = "This doesn't look standard issue... Equipped with a SMG-25 submachine gun, machete and heavy lift jetpack, along with light armor upgraded with a 'svallin' shield module. It's not clear why this is here, nevertheless it has excellent mobility, and would likely be devastating against anyone you manage to actually reach."
-
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/light/shield
- back = /obj/item/jetpack_marine/heavy
- belt = /obj/item/storage/holster/blade/machete/full
- suit_store = /obj/item/weapon/gun/smg/m25/magharness
-
-/datum/outfit/quick/tgmc/marine/machete/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25/extended, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25/extended, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m25, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/marine/scout
- name = "BR-8 Scout"
- desc = "IFF scout. Equipped with a BR-8 with a good amount of grenades and light armor with a cutting edge 'svallin' shield module. Provides for good mobility and powerful IFF damage, but the BR-8 is difficult to bring to bear at close range, and light armor wilts under sustained fire."
- quantity = 2
-
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/light/shield
- suit_store = /obj/item/weapon/gun/rifle/tx8/scout
- belt = /obj/item/storage/belt/marine/tx8
-
-/datum/outfit/quick/tgmc/marine/scout/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/mp19/scanner(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/tx8, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/tx8, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
-
-
-//Base TGMC engineer outfit
-/datum/outfit/quick/tgmc/engineer
- name = "TGMC Squad Engineer"
- jobtype = "Squad Engineer"
-
- ears = /obj/item/radio/headset/mainship/marine
- glasses = /obj/item/clothing/glasses/meson
- w_uniform = /obj/item/clothing/under/marine/engineer/black_vest
- shoes = /obj/item/clothing/shoes/marine/full
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/engineer
- gloves = /obj/item/clothing/gloves/marine/insulated
- mask = /obj/item/clothing/mask/gas
- head = /obj/item/clothing/head/modular/m10x/welding
- r_store = /obj/item/storage/pouch/firstaid/combat_patrol
- l_store = /obj/item/storage/pouch/tools/full
- back = /obj/item/storage/backpack/marine/engineerpack
-
-/datum/outfit/quick/tgmc/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_HEAD)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_HEAD)
-
- H.equip_to_slot_or_del(new /obj/item/circuitboard/apc, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/cell/high, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/medium_stack, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/barbed_wire/half_stack, SLOT_IN_SUIT)
-
-/datum/outfit/quick/tgmc/engineer/rrengineer
- name = "Rocket Specialist"
- desc = "Bringing the big guns. Equipped with a AR-18 carbine and RL-160 along with the standard engineer kit. Excellent against groups of enemy infantry or light armor, but only has limited ammunition."
- quantity = 2
-
- suit_store = /obj/item/weapon/gun/rifle/ar18/engineer
- back = /obj/item/storage/holster/backholster/rpg/low_impact
- belt = /obj/item/storage/belt/marine/ar18
-
-/datum/outfit/quick/tgmc/engineer/rrengineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/chem_grenade/razorburn_large, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/engineer/sentry
- name = "Sentry Technician"
- desc = "Firing more guns than you have hands. Equipped with a AR-12 assault rifle with miniflamer, and two minisentries along with the standard engineer kit. Allows the user to quickly setup strong points and lock areas down, with some sensible placement."
-
- suit_store = /obj/item/weapon/gun/rifle/ar12/engineer
- belt = /obj/item/storage/belt/marine/ar12
-
-/datum/outfit/quick/tgmc/engineer/sentry/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/sentry/mini/combat_patrol, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/sentry/mini/combat_patrol, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/minisentry, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/minisentry, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/chem_grenade/razorburn_large, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/engineer/demolition
- name = "Demolition Specialist"
- desc = "Boom boom, shake the room. Equipped with a SH-15 auto shotgun and UGL and an impressive array of mines, detpacks and grenades, along with the standard engineer kit. Excellent for blasting through any obstacle, and mining areas to restrict enemy movement."
-
- suit_store = /obj/item/weapon/gun/rifle/sh15/engineer
- back = /obj/item/storage/backpack/marine/tech
- belt = /obj/item/storage/belt/marine/auto_shotgun
-
-/datum/outfit/quick/tgmc/engineer/demolition/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/minelayer, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/explosive_mines/large, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/explosive_mines, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/assembly/signaler, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
-
-//Base TGMC corpsman outfit
-/datum/outfit/quick/tgmc/corpsman
- name = "TGMC Squad Corpsman"
- jobtype = "Squad Corpsman"
-
- belt = /obj/item/storage/belt/lifesaver/quick
- ears = /obj/item/radio/headset/mainship/marine
- glasses = /obj/item/clothing/glasses/hud/health
- w_uniform = /obj/item/clothing/under/marine/corpsman/corpman_vest
- shoes = /obj/item/clothing/shoes/marine/full
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/mimir
- gloves = /obj/item/clothing/gloves/marine
- mask = /obj/item/clothing/mask/gas
- head = /obj/item/clothing/head/modular/m10x/mimir
- r_store = /obj/item/storage/pouch/magazine/large
- l_store = /obj/item/storage/pouch/grenade/combat_patrol
- back = /obj/item/storage/backpack/marine/corpsman
-
-/datum/outfit/quick/tgmc/corpsman/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/bodybag/cryobag, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/roller, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tweezers_advanced, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/advanced/nanoblood, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/spaceacillin, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/advanced/combat_advanced, SLOT_IN_ACCESSORY)
-
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/defibrillator, SLOT_IN_SUIT)
-
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_HEAD)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/neuraline, SLOT_IN_HEAD)
-
-/datum/outfit/quick/tgmc/corpsman/ar12
- name = "AR-12 Corpsman"
- desc = "Keeping everone else in the fight. Armed with an AR-12 assault rifle with underbarrel grenade launcher, an impressive array of tools for healing your team, and a 'Mimir' biological protection module to allow you to continue operating in hazardous environments. With medivacs out of the question, you are the only thing standing between your buddies and an early grave."
-
- suit_store = /obj/item/weapon/gun/rifle/ar12/medic
-
-/datum/outfit/quick/tgmc/corpsman/ar12/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_R_POUCH)
-
-/datum/outfit/quick/tgmc/corpsman/smg90
- name = "SMG-90 Corpsman"
- desc = "Keeping everone else in the fight. Armed with an SMG-90 submachine gun to maintain good mobility, an impressive array of tools for healing your team, and a 'Mimir' biological protection module to allow you to continue operating in hazardous environments. With medivacs out of the question, you are the only thing standing between your buddies and an early grave."
-
- suit_store = /obj/item/weapon/gun/smg/smg90/tactical
-
-/datum/outfit/quick/tgmc/corpsman/smg90/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x20mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/smg90, SLOT_IN_R_POUCH)
-
-/datum/outfit/quick/tgmc/corpsman/ar21
- name = "AR-21 Corpsman"
- desc = "Keeping everone else in the fight. Armed with an AR-21 skirmish rifle with underbarrel grenade launcher, an impressive array of tools for healing your team, and a 'Mimir' biological protection module to allow you to continue operating in hazardous environments. With medivacs out of the question, you are the only thing standing between your buddies and an early grave."
-
- suit_store = /obj/item/weapon/gun/rifle/ar21/standard
-
-/datum/outfit/quick/tgmc/corpsman/ar21/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x25mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar21, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar21, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar21, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar21, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar21, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar21, SLOT_IN_R_POUCH)
-
-/datum/outfit/quick/tgmc/corpsman/auto_shotgun
- name = "SH-15 Corpsman"
- desc = "Keeping everone else in the fight. Armed with a SH-15 auto shotgun with underbarrel grenade launcher, an impressive array of tools for healing your team, and a 'Mimir' biological protection module to allow you to continue operating in hazardous environments. With medivacs out of the question, you are the only thing standing between your buddies and an early grave."
-
- suit_store = /obj/item/weapon/gun/rifle/sh15/engineer
-
-/datum/outfit/quick/tgmc/corpsman/auto_shotgun/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_slug, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_slug, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_flechette, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_flechette, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_flechette, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_slug, SLOT_IN_R_POUCH)
-
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
-
-/datum/outfit/quick/tgmc/corpsman/laser_medic
- name = "Laser Rifle Corpsman"
- desc = "Keeping everone else in the fight. Armed with an laser rifle with miniflamer, an impressive array of tools for healing your team, and a 'Mimir' biological protection module to allow you to continue operating in hazardous environments. With medivacs out of the question, you are the only thing standing between your buddies and an early grave."
-
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_rifle/medic
-
-/datum/outfit/quick/tgmc/corpsman/laser_medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
-
-/datum/outfit/quick/tgmc/corpsman/laser_carbine
- name = "Laser Carbine Corpsman"
- desc = "Keeping everone else in the fight. Armed with an laser carbine with underbarrel grenade launcher, an impressive array of tools for healing your team, and a 'Mimir' biological protection module to allow you to continue operating in hazardous environments. With medivacs out of the question, you are the only thing standing between your buddies and an early grave."
-
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine/scout
-
-/datum/outfit/quick/tgmc/corpsman/laser_carbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
-
-//Base TGMC smartgunner outfit
-/datum/outfit/quick/tgmc/smartgunner
- name = "TGMC Squad Smartgunner"
- jobtype = "Squad Smartgunner"
-
- belt = /obj/item/belt_harness/marine
- ears = /obj/item/radio/headset/mainship/marine
- glasses = /obj/item/clothing/glasses/night/m56_goggles
- w_uniform = /obj/item/clothing/under/marine/black_vest
- shoes = /obj/item/clothing/shoes/marine/full
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/tyr_two
- gloves = /obj/item/clothing/gloves/marine
- mask = /obj/item/clothing/mask/gas/tactical
- head = /obj/item/clothing/head/modular/m10x/tyr
- r_store = /obj/item/storage/pouch/firstaid/combat_patrol
- l_store = /obj/item/storage/pouch/grenade/combat_patrol
- back = /obj/item/storage/backpack/marine/satchel
-
-/datum/outfit/quick/tgmc/smartgunner/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat, SLOT_IN_HEAD)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_HEAD)
-
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_SUIT)
-
-/datum/outfit/quick/tgmc/smartgunner/sg29
- name = "SG29 Smart Machinegunner"
- desc = "A gun smarter than the average bear, or marine. Equipped with an SG-29 smart machine gun and heavy armor upgraded with a 'Tyr' extra armor mdule, the SG is responsible for providing mobile, accurate firesupport thanks to your IFF ammunition."
-
- suit_store = /obj/item/weapon/gun/rifle/sg29/patrol
-
-/datum/outfit/quick/tgmc/smartgunner/sg29/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/sg29, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/sg29, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/sg29, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/sg29, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/smartgunner/minigun_sg
- name = "SG85 Smart Machinegunner"
- desc = "More bullets than sense. Equipped with an SG-85 smart gatling gun, an MP-19 sidearm, heavy armor upgraded with a 'Tyr' extra armor mdule and a whole lot of bullets. For when you want to unleash a firehose of firepower. Try not to run out of ammo."
-
- belt = /obj/item/storage/belt/sparepouch
- suit_store = /obj/item/weapon/gun/minigun/smart_minigun/motion_detector
- back = /obj/item/ammo_magazine/minigun_powerpack/smartgun
-
-/datum/outfit/quick/tgmc/smartgunner/minigun_sg/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp19, SLOT_IN_ACCESSORY)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/smart_minigun, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/smart_minigun, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/mp19/compact(H), SLOT_IN_BELT)
-
-/datum/outfit/quick/tgmc/smartgunner/sg62
- name = "SG62 Smart Machinegunner"
- desc = "Flexibility and precision. Equipped with an SG-62 smart target rifle and heavy armor upgraded with a 'Tyr' extra armor mdule. The integrated spotting rifle comes with a variety of flexible ammo types, which combined with high damage, penetration and IFF, makes for a dangerous support loadout."
-
- belt = /obj/item/storage/belt/marine/sg62
- suit_store = /obj/item/weapon/gun/rifle/sg62/motion
-
-/datum/outfit/quick/tgmc/smartgunner/sg62/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/incendiary, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/incendiary, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/tungsten, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/tungsten, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/highimpact, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/highimpact, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/highimpact, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sg153/highimpact, SLOT_IN_ACCESSORY)
-
-//Base TGMC leader outfit
-/datum/outfit/quick/tgmc/leader
- name = "TGMC Squad Leader"
- jobtype = "Squad Leader"
-
- ears = /obj/item/radio/headset/mainship/marine
- glasses = /obj/item/clothing/glasses/hud/health
- w_uniform = /obj/item/clothing/under/marine/black_vest
- shoes = /obj/item/clothing/shoes/marine/full
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/heavy/leader
- gloves = /obj/item/clothing/gloves/marine
- mask = /obj/item/clothing/mask/gas
- head = /obj/item/clothing/head/modular/m10x/leader
- r_store = /obj/item/storage/pouch/firstaid/combat_patrol_leader
- l_store = /obj/item/storage/pouch/grenade/combat_patrol
- back = /obj/item/storage/backpack/lightpack
-
-/datum/outfit/quick/tgmc/leader/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat, SLOT_IN_HEAD)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_HEAD)
-
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_SUIT)
-
-/datum/outfit/quick/tgmc/leader/ar12
- name = "AR-12 Patrol Leader"
- desc = "Gives the orders. Equipped with an AR-12 assault rifle with UGL, plenty of grenades, some support kit such as deployable cameras, as well as heavy armor with a 'valkyrie' autodoc module. You can provide excellent support to your squad thanks to your kit and order shouting talents."
-
- suit_store = /obj/item/weapon/gun/rifle/ar12/rifleman
- belt = /obj/item/storage/belt/marine/ar12
-
-/datum/outfit/quick/tgmc/leader/ar12/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/deployable_camera, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/hud_tablet(H, /datum/job/terragov/squad/leader, H.assigned_squad), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/leader/ar18
- name = "AR-18 Patrol Leader"
- desc = "Gives the orders. Equipped with an AR-18 carbine with plasma pistol attachment, plenty of grenades, as well as heavy armor with a 'valkyrie' autodoc module. You can provide excellent support to your squad thanks to your kit and order shouting talents, while unleashing excellent damage at medium range."
-
- suit_store = /obj/item/weapon/gun/rifle/ar18/plasma_pistol
- belt = /obj/item/storage/belt/marine/ar18
-
-/datum/outfit/quick/tgmc/leader/ar18/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/plasma_pistol, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/plasma_pistol, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/plasma_pistol, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/leader/combat_rifle
- name = "AR-11 Patrol Leader"
- desc = "Gives the orders. Equipped with an AR-11 combat rifle, plenty of grenades, as well as heavy armor with a 'valkyrie' autodoc module. You can provide excellent support to your squad thanks to your kit and order shouting talents, with excellent damage at all ranges."
-
- suit_store = /obj/item/weapon/gun/rifle/ar11/standard
- belt = /obj/item/storage/belt/marine/combat_rifle
-
-/datum/outfit/quick/tgmc/leader/combat_rifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/deployable_camera, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/deployable_camera, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/hud_tablet(H, /datum/job/terragov/squad/leader, H.assigned_squad), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p492x34mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/leader/br64
- name = "BR-64 Patrol Leader"
- desc = "Gives the orders. Equipped with an BR-64 battle rifle with UGL, plenty of grenades, as well as heavy armor with a 'valkyrie' autodoc module. The battle rifle offers improved damage and penetration compared to more common rifles, but still retains a grenade launcher that the AR-11 lacks."
-
- suit_store = /obj/item/weapon/gun/rifle/br64/standard
- belt = /obj/item/storage/belt/marine/br64
-
-/datum/outfit/quick/tgmc/leader/br64/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x265mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x265mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/leader/auto_shotgun
- name = "SH-15 Patrol Leader"
- desc = "Gives the orders. Equipped with an SH-15 auto shotgun, plenty of grenades, as well as heavy armor with a 'valkyrie' autodoc module. You can provide excellent support to your squad thanks to your kit and order shouting talents, with strong damage and control."
-
- suit_store = /obj/item/weapon/gun/rifle/sh15/plasma_pistol
- belt = /obj/item/storage/belt/marine/auto_shotgun
-
-/datum/outfit/quick/tgmc/leader/auto_shotgun/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_slug, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/sh15_flechette, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/plasma_pistol, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/plasma_pistol, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/plasma_pistol, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/leader/standard_laserrifle
- name = "Laser Rifle Patrol Leader"
- desc = "Gives the orders. Equipped with a laser rifle with UGL for better armor penetration against SOM, some support kit such as deployable cameras, as well as heavy armor with a 'valkyrie' autodoc module. You can provide excellent support to your squad thanks to your kit and order shouting talents."
-
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_rifle/rifleman
- belt = /obj/item/storage/belt/marine/te_cells
-
-/datum/outfit/quick/tgmc/leader/standard_laserrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/deployable_camera, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/deployable_camera, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/hud_tablet(H, /datum/job/terragov/squad/leader, H.assigned_squad), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/tgmc/leader/oicw
- name = "AR-55 Patrol Leader"
- desc = "Gives the orders. Equipped with an AR-55 OICW with plenty of grenades for its integrated grenade launcher, some support kit such as deployable cameras, as well as heavy armor with a 'valkyrie' autodoc module. You can provide excellent support to your squad thanks to your kit and order shouting talents."
- quantity = 2
-
- suit_store = /obj/item/weapon/gun/rifle/tx55/combat_patrol
- belt = /obj/item/storage/belt/marine/oicw
-
-/datum/outfit/quick/tgmc/leader/oicw/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x24mm, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ar12, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/tx54, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/tx54, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
-
-//// SOM loadouts ////
-
-//Base SOM outfit
-/datum/outfit/quick/som
- name = "SOM base"
- desc = "This is the base typepath for all SOM quick vendor outfits. You shouldn't see this."
-
-//Base SOM marine outfit
-/datum/outfit/quick/som/marine
- name = "SOM Squad Marine"
- jobtype = "SOM Squad Standard"
-
- ears = /obj/item/radio/headset/distress/som
- w_uniform = /obj/item/clothing/under/som/webbing
- shoes = /obj/item/clothing/shoes/marine/som/knife
- wear_suit = /obj/item/clothing/suit/modular/som/shield
- gloves = /obj/item/clothing/gloves/marine/som
- mask = /obj/item/clothing/mask/gas
- head = /obj/item/clothing/head/modular/som
- r_store = /obj/item/storage/pouch/firstaid/som/combat_patrol
- l_store = /obj/item/storage/pouch/grenade/som/combat_patrol
- back = /obj/item/storage/backpack/satchel/som
-
-/datum/outfit/quick/som/marine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat, SLOT_IN_HEAD)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_HEAD)
-
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_SUIT)
-
-/datum/outfit/quick/som/marine/standard_assaultrifle
- name = "V-31 Infantryman"
- desc = "The typical SOM infantryman. Equipped with a V-31 assault rifle with integrated 'micro grenade' rail launcher, medium armor and a good selection of grenades. The rail launcher fires grenades that must arm mid flight, so are ineffective at close ranges, but add significant tactical options at medium range."
-
- suit_store = /obj/item/weapon/gun/rifle/som/standard
- belt = /obj/item/storage/belt/marine/som/som_rifle
-
-/datum/outfit/quick/som/marine/standard_assaultrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/smoke_burst, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/marine/mpi
- name = "MPI_KM Infantryman"
- desc = "A call back to an earlier time. Equipped with an MPI_KM assault rifle, with under barrel grenade launcher and a large supply of grenades. An old weapon that was a common sight during the original Martian rebellion, the MPI's good stopping power, reliability and a healthy dose of nostalgia means it is still seen in use by some among the SOM despite its age."
-
- suit_store = /obj/item/weapon/gun/rifle/mpi_km/black/grenadier
- belt = /obj/item/storage/belt/marine/som/mpi_black
-
-/datum/outfit/quick/som/marine/mpi/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/marine/light_carbine
- name = "V-34 Light Infantryman"
- desc = "Mobile and dangerous. Equipped with a V-34 carbine, light armor with an 'Aegis' shield module and a large supply of grenades. The V-34 is a modern update of an old weapon that was a common sight during the original Martian rebellion. Very reliable and excellent stopping power in a small, lightweight package. Brought into service as a much cheaper alternative to the VX-32."
-
- wear_suit = /obj/item/clothing/suit/modular/som/light/shield
- suit_store = /obj/item/weapon/gun/rifle/som_carbine/black/standard
- belt = /obj/item/storage/belt/marine/som/carbine_black
-
-/datum/outfit/quick/som/marine/light_carbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/marine/scout
- name = "V-21 Light Infantryman"
- desc = "Highly mobile scouting configuration. Equipped with a V-21 submachine gun with variable firerate allowing for extreme rates of fire when properly wielded, light armor with an 'Aegis' shield module and a good selection of grenades. Allows for exceptional mobility and blistering firepower, it will falter in extended engagements where low armor and the V-21's high rate of fire can become liabilities."
-
- wear_suit = /obj/item/clothing/suit/modular/som/light/shield
- suit_store = /obj/item/weapon/gun/smg/som/scout
- belt = /obj/item/storage/belt/marine/som/som_smg
-
-/datum/outfit/quick/som/marine/scout/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/marine/shotgunner
- name = "V-51 Pointman"
- desc = "For close encounters. Equipped with a V-51 semi-automatic shotgun, light armor with an 'Aegis' shield module and a large selection of grenades. Allows for good mobility and dangerous CQC firepower."
-
- belt = /obj/item/storage/belt/shotgun/som/mixed
- wear_suit = /obj/item/clothing/suit/modular/som/light/shield
- suit_store = /obj/item/weapon/gun/shotgun/som/standard
-
-/datum/outfit/quick/som/marine/shotgunner/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/marine/pyro
- name = "V-62 Flamethrower Operator"
- desc = "Smells like victory. Equipped with an V-62 incinerator and wide nozzle, V-11 equipped for rapid burst fire, heavy armor upgraded with a 'Hades' fireproof module, and a backtank of fuel. Has better than average range and can quickly burn down large areas. It suffers from significant slowdown, lacks an integrated extinguisher, and undisciplined use can result in rapidly consuming all available fuel."
-
- head = /obj/item/clothing/head/modular/som/hades
- wear_suit = /obj/item/clothing/suit/modular/som/heavy/pyro
- belt = /obj/item/storage/holster/belt/pistol/m4a3/som
- back = /obj/item/ammo_magazine/flamer_tank/backtank
- suit_store = /obj/item/weapon/gun/flamer/som/mag_harness
-
-/datum/outfit/quick/som/marine/pyro/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/burst(H), SLOT_IN_HOLSTER)
-
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/marine/breacher
- name = "V-21 Breacher"
- desc = "Heavy armored breaching configuration. Equipped with a V-21 submachine gun with variable firerate allowing for extreme rates of fire when properly wielded, heavy armor, a boarding shield and a good selection of grenades. Offers outstanding protection although damage may be lacking, particular at longer range."
-
- glasses = /obj/item/clothing/glasses/welding
- wear_suit = /obj/item/clothing/suit/modular/som/heavy/shield
- suit_store = /obj/item/weapon/gun/smg/som/one_handed
- belt = /obj/item/storage/belt/marine/som/som_smg
- r_hand = /obj/item/weapon/shield/riot/marine/som
-
-/datum/outfit/quick/som/marine/breacher/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/marine/breacher_melee
- name = "CQC Breacher"
- desc = "For when a complete lack of subtlety is required. Equipped with 'Lorica' enhanced heavy armor and armed with a monsterous two handed breaching axe, designed to cut through heavy armor. When properly wielded, it also provides a degree of protection."
-
- head = /obj/item/clothing/head/modular/som/lorica
- wear_suit = /obj/item/clothing/suit/modular/som/heavy/lorica
- suit_store = /obj/item/weapon/twohanded/fireaxe/som
- belt = /obj/item/storage/holster/belt/pistol/m4a3/som
-
-/datum/outfit/quick/som/marine/breacher_melee/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/synaptizine, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/burst(H), SLOT_IN_HOLSTER)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/marine/machine_gunner
- name = "V-41 Machinegunner"
- desc = "Heavy static firesupport. Equipped with a V-41 machine gun, burst fire V-11 sidearm and some basic building supplies. While often ill suited to the SOM's standard doctrine of mobility and aggression, the V-41 is typically seen in defensive positions or second line units where its poor mobility is a minor drawback compared to its sustained firepower."
-
- suit_store = /obj/item/weapon/gun/rifle/som_mg/standard
- belt = /obj/item/storage/holster/belt/pistol/m4a3/som
- l_store = /obj/item/storage/pouch/construction/som
-
-/datum/outfit/quick/som/marine/machine_gunner/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/burst(H), SLOT_IN_HOLSTER)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/som_mg, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/som_mg, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/som_mg, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/som_mg, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
-
- H.equip_to_slot_or_del(new /obj/item/tool/shovel/etool, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/stack/sandbags_empty/half, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/stack/sandbags/large_stack, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/stack/barbed_wire/half_stack, SLOT_IN_L_POUCH)
-
-/datum/outfit/quick/som/marine/charger
- name = "Charger Infantryman"
- desc = "The future infantryman of the SOM. Equipped with a volkite charger, medium armor and a good variety of grenades. Volkite weapons are exceptionally dangerous, especially against poorly armored or tightly grouped opponents. The charger is the SOM's premier close/medium range weapon, with good mobility, and can be used (with some difficulty) one handed when required."
- quantity = 4
-
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/charger/magharness
- belt = /obj/item/storage/belt/marine/som/volkite
-
-/datum/outfit/quick/som/marine/charger/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
-
-//Base SOM engineer outfit
-/datum/outfit/quick/som/engineer
- name = "SOM Squad Engineer"
- jobtype = "SOM Squad Engineer"
-
- ears = /obj/item/radio/headset/distress/som
- w_uniform = /obj/item/clothing/under/som/webbing
- shoes = /obj/item/clothing/shoes/marine/som/knife
- wear_suit = /obj/item/clothing/suit/modular/som/engineer
- gloves = /obj/item/clothing/gloves/marine/som/insulated
- mask = /obj/item/clothing/mask/gas
- head = /obj/item/clothing/head/modular/som/engineer
- glasses = /obj/item/clothing/glasses/meson
- r_store = /obj/item/storage/pouch/firstaid/som/combat_patrol
- l_store = /obj/item/storage/pouch/tools/som/full
- back = /obj/item/storage/backpack/lightpack/som
-
-/datum/outfit/quick/som/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_HEAD)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_HEAD)
-
- H.equip_to_slot_or_del(new /obj/item/circuitboard/apc, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/cell/high, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/medium_stack, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/barbed_wire/half_stack, SLOT_IN_SUIT)
-
-/datum/outfit/quick/som/engineer/standard_assaultrifle
- name = "V-31 Engineer"
- desc = "Battlefield engineer; building up and tearing down. Equipped with a V-31 assault rifle with integrated 'micro grenade' rail launcher, medium armor, a deployable COPE sentry and a selection of explosives. Has a variety of supplies and equipment to build, repair or apply demolitions in the field. A valuable support asset to a well rounded combat force. The rail launcher fires grenades that must arm mid flight, so are ineffective at close ranges, but add significant tactical options at medium range."
-
- suit_store = /obj/item/weapon/gun/rifle/som/standard
- belt = /obj/item/storage/belt/marine/som/som_rifle
-
-/datum/outfit/quick/som/engineer/standard_assaultrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/assembly/signaler, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/cope, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/engineer/mpi
- name = "MPI-KM Engineer"
- desc = "Battlefield engineer; building up and tearing down. Equipped with an MPI_KM assault rifle, medium armor, a deployable COPE sentry and a selection of explosives. Has a variety of supplies and equipment to build, repair or apply demolitions in the field. A valuable support asset to a well rounded combat force. An old weapon that was a common sight during the original Martian rebellion, the MPI's good stopping power, reliability and a healthy dose of nostalgia means it is still seen in use by some among the SOM despite its age."
-
- suit_store = /obj/item/weapon/gun/rifle/mpi_km/black/magharness
- belt = /obj/item/storage/belt/marine/som/mpi_black
-
-/datum/outfit/quick/som/engineer/mpi/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/assembly/signaler, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/cope, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/engineer/standard_carbine
- name = "V-34 Engineer"
- desc = "Battlefield engineer; building up and tearing down. Equipped with a V-34 carbine, medium armor, a deployable COPE sentry and a selection of explosives. Has a variety of supplies and equipment to build, repair or apply demolitions in the field. A valuable support asset to a well rounded combat force. The V-34 is a modern update of an old weapon that was a common sight during the original Martian rebellion. Very reliable and excellent stopping power in a small, lightweight package. Brought into service as a much cheaper alternative to the VX-32."
-
- suit_store = /obj/item/weapon/gun/rifle/som_carbine/black/standard
- belt = /obj/item/storage/belt/marine/som/carbine_black
-
-/datum/outfit/quick/som/engineer/standard_carbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/assembly/signaler, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/cope, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/engineer/standard_smg
- name = "V-21 Engineer"
- desc = "Battlefield engineer; building up and tearing down. Equipped with a V-21 submachine gun with variable firerate allowing for extreme rates of fire when properly wielded, medium armor, a deployable COPE sentry and a selection of explosives. Has a variety of supplies and equipment to build, repair or apply demolitions in the field. A valuable support asset to a well rounded combat force. "
-
- suit_store = /obj/item/weapon/gun/smg/som/support
- belt = /obj/item/storage/belt/marine/som/som_smg
-
-/datum/outfit/quick/som/engineer/standard_smg/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/assembly/signaler, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/cope, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/engineer/standard_shotgun
- name = "V-51 Engineer"
- desc = "Battlefield engineer; building up and tearing down. Equipped with a V-51 semi-automatic shotgun, medium armor, a deployable COPE sentry and a selection of explosives. Has a variety of supplies and equipment to build, repair or apply demolitions in the field. A valuable support asset to a well rounded combat force. "
-
- belt = /obj/item/storage/belt/shotgun/som/flechette
- suit_store = /obj/item/weapon/gun/shotgun/som/support
-
-/datum/outfit/quick/som/engineer/standard_shotgun/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/assembly/signaler, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/detpack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/cope, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_ACCESSORY)
-
-//Base SOM medic outfit
-/datum/outfit/quick/som/medic
- name = "SOM Squad Medic"
- jobtype = "SOM Squad Medic"
-
- belt = /obj/item/storage/belt/lifesaver/som/quick
- ears = /obj/item/radio/headset/distress/som
- w_uniform = /obj/item/clothing/under/som/medic/vest
- shoes = /obj/item/clothing/shoes/marine/som/knife
- wear_suit = /obj/item/clothing/suit/modular/som/medic
- gloves = /obj/item/clothing/gloves/marine/som
- mask = /obj/item/clothing/mask/gas
- head = /obj/item/clothing/head/modular/som
- glasses = /obj/item/clothing/glasses/hud/health
- r_store = /obj/item/storage/pouch/magazine/large/som
- l_store = /obj/item/storage/pouch/grenade/som/combat_patrol
- back = /obj/item/storage/backpack/lightpack/som
-
-/datum/outfit/quick/som/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_HEAD)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_HEAD)
-
- H.equip_to_slot_or_del(new /obj/item/roller, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tweezers_advanced, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/spaceacillin, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/advanced/nanoblood, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/bodybag/cryobag, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/advanced/combat_advanced, SLOT_IN_ACCESSORY)
-
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/defibrillator, SLOT_IN_SUIT)
-
-/datum/outfit/quick/som/medic/standard_assaultrifle
- name = "V-31 Medic"
- desc = "Keeping your buddies alive and in the fight. Equipped with a V-31 assault rifle with integrated 'micro grenade' rail launcher, medium armor and a good selection of grenades. Packs a large amount of medical supplies, the squad medic is vital to maintaining combat viability. The rail launcher fires grenades that must arm mid flight, so are ineffective at close ranges, but add significant tactical options at medium range."
-
- suit_store = /obj/item/weapon/gun/rifle/som/standard
-
-/datum/outfit/quick/som/medic/standard_assaultrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/smoke_burst, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/oxycodone, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_R_POUCH)
-
-/datum/outfit/quick/som/medic/mpi
- name = "MPI_KM Medic"
- desc = "Keeping your buddies alive and in the fight. Equipped with an MPI_KM assault rifle, medium armor and a good selection of grenades. Packs a large amount of medical supplies, the squad medic is vital to maintaining combat viability. An old weapon that was a common sight during the original Martian rebellion, the MPI's good stopping power, reliability and a healthy dose of nostalgia means it is still seen in use by some among the SOM despite its age."
-
- suit_store = /obj/item/weapon/gun/rifle/mpi_km/black/magharness
-
-/datum/outfit/quick/som/medic/mpi/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/oxycodone, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_R_POUCH)
-
-/datum/outfit/quick/som/medic/standard_carbine
- name = "V-34 Medic"
- desc = "Keeping your buddies alive and in the fight. Equipped with an V-34 carbine, medium armor for massive firepower and mobility, but poor ammo economy and range. Packs a large amount of medical supplies, the squad medic is vital to maintaining combat viability. The V-34 is a modern update of an old weapon that was a common sight during the original Martian rebellion. Very reliable and excellent stopping power in a small, lightweight package. Brought into service as a much cheaper alternative to the VX-32."
-
- suit_store = /obj/item/weapon/gun/rifle/som_carbine/black/standard
-
-/datum/outfit/quick/som/medic/standard_carbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/oxycodone, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black, SLOT_IN_R_POUCH)
-
-/datum/outfit/quick/som/medic/standard_smg
- name = "V-21 Medic"
- desc = "Keeping your buddies alive and in the fight. Equipped with a V-21 submachine gun with variable firerate allowing for extreme rates of fire when properly wielded, medium armor and a good selection of grenades. Packs a large amount of medical supplies, the squad medic is vital to maintaining combat viability."
-
- suit_store = /obj/item/weapon/gun/smg/som/support
-
-/datum/outfit/quick/som/medic/standard_smg/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/oxycodone, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_R_POUCH)
-
-/datum/outfit/quick/som/medic/standard_shotgun
- name = "V-51 Medic"
- desc = "Keeping your buddies alive and in the fight. Equipped with a V-51 semi-automatic shotgun, medium armor and a good selection of grenades. Packs a large amount of medical supplies, the squad medic is vital to maintaining combat viability."
-
- r_store = /obj/item/storage/pouch/shotgun/som
- suit_store = /obj/item/weapon/gun/shotgun/som/support
-
-/datum/outfit/quick/som/medic/standard_shotgun/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/oxycodone, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_R_POUCH)
-
-//Base SOM veteran outfit
-/datum/outfit/quick/som/veteran
- name = "SOM Squad Veteran"
- jobtype = "SOM Squad Veteran"
-
- ears = /obj/item/radio/headset/distress/som
- w_uniform = /obj/item/clothing/under/som/veteran/webbing
- shoes = /obj/item/clothing/shoes/marine/som/knife
- wear_suit = /obj/item/clothing/suit/modular/som/heavy/shield
- gloves = /obj/item/clothing/gloves/marine/som/veteran
- mask = /obj/item/clothing/mask/gas
- head = /obj/item/clothing/head/modular/som/veteran
- glasses = /obj/item/clothing/glasses/meson
- r_store = /obj/item/storage/pouch/firstaid/som/combat_patrol
- l_store = /obj/item/storage/pouch/grenade/som/combat_patrol
- back = /obj/item/storage/backpack/satchel/som
-
-/datum/outfit/quick/som/veteran/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_HEAD)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_HEAD)
-
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_SUIT)
-
-/datum/outfit/quick/som/veteran/standard_assaultrifle
- name = "V-31 Veteran Infantryman"
- desc = "Heavily armed and armored SOM elite. Equipped with a V-31 assault rifle with integrated 'micro grenade' rail launcher, heavy armor, a large variety of grenades as well as AP ammunition. Excellent performance against heavily armored targets, while the plentiful grenade provide greater tactical flexibility."
-
- back = /obj/item/storage/backpack/lightpack/som
- suit_store = /obj/item/weapon/gun/rifle/som/veteran
- belt = /obj/item/storage/belt/marine/som/som_rifle_ap
-
-/datum/outfit/quick/som/veteran/standard_assaultrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som/ap, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som/ap, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/smoke_burst, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/veteran/standard_smg
- name = "V-21 Veteran Infantryman"
- desc = "Close range high damage, high speed. Equipped with a V-21 submachine gun with variable firerate allowing for extreme rates of fire when properly wielded, heavy armor, a good variety of grenades and AP ammunition. Allows for excellent close to medium range firepower, especially against heavily armored targets, and is surprisingly mobile."
-
- suit_store = /obj/item/weapon/gun/smg/som/veteran
- belt = /obj/item/storage/belt/marine/som/som_smg_ap
-
-/datum/outfit/quick/som/veteran/standard_smg/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/ap, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/ap, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/ap, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/veteran/breacher
- name = "Charger Veteran Breacher"
- desc = "Heavy armored breaching configuration. Equipped with a volkite charger configured for better one handed use, heavy armor upgraded with 'Lorica' armor reinforcements, a boarding shield and a good selection of grenades. Premier protection and deadly close range firepower."
-
- head = /obj/item/clothing/head/modular/som/lorica
- glasses = /obj/item/clothing/glasses/welding
- wear_suit = /obj/item/clothing/suit/modular/som/heavy/lorica
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/charger/somvet
- belt = /obj/item/storage/belt/marine/som/volkite
- r_hand = /obj/item/weapon/shield/riot/marine/som
-
-/datum/outfit/quick/som/veteran/breacher/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/veteran/charger
- name = "Charger Veteran Infantryman"
- desc = "Heavily armed and armored SOM elite. Equipped with a volkite charger with motion sensor and gyrostabiliser for better one handed use, heavy armor and a good variety of grenades. Volkite weapons are exceptionally dangerous, especially against poorly armored or tightly grouped opponents. The charger is the SOM's premier close/medium range weapon, with good mobility, and can be used (with some difficulty) one handed."
-
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/charger/scout
- belt = /obj/item/storage/belt/marine/som/volkite
-
-/datum/outfit/quick/som/veteran/charger/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/veteran/caliver
- name = "Caliver Veteran Infantryman"
- desc = "Heavily armed and armored SOM elite. Equipped with a volkite caliver, heavy armor and a good variety of grenades. Volkite weapons are exceptionally dangerous, especially against poorly armored or tightly grouped opponents. The caliver provides deadly firepower at all ranges. Approach with caution."
-
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/caliver/standard
- belt = /obj/item/storage/belt/marine/som/volkite
-
-/datum/outfit/quick/som/veteran/caliver/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/veteran/caliver_pack
- name = "Caliver Veteran Rifleman"
- desc = "Heavily armed and armored SOM elite. Equipped with a volkite caliver with motion sensor, heavy armor, plenty of grenades and a back mounted self charging power supply. Volkite weapons are exceptionally dangerous, especially against poorly armored or tightly grouped opponents. The caliver provides deadly firepower at all ranges, and the power pack allows for sustained period of fire, although over extended periods of time the recharge may struggle to keep up with the demands of the weapon."
- quantity = 2
-
- belt = /obj/item/storage/belt/grenade/som
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/caliver/tacsensor
- l_store = /obj/item/storage/pouch/pistol/som
- back = /obj/item/cell/lasgun/volkite/powerpack
-
-/datum/outfit/quick/som/veteran/caliver_pack/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_BELT)
-
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_L_POUCH)
-
-/datum/outfit/quick/som/veteran/mpi
- name = "MPI_KM Veteran Infantryman"
- desc = "Heavily armed and armored SOM elite, with a taste for nostalgia. Equipped with an MPI_KM assault rifle, with under barrel grenade launcher and a large supply of grenades. An old weapon that was a common sight during the original Martian rebellion, the MPI's good stopping power, reliability and a healthy dose of nostalgia means it is still seen in use by some among the SOM despite its age."
-
- suit_store = /obj/item/weapon/gun/rifle/mpi_km/grenadier
- belt = /obj/item/storage/belt/marine/som/mpi_plum
-
-/datum/outfit/quick/som/veteran/mpi/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/veteran/carbine
- name = "V-34 Veteran Infantryman"
- desc = "Heavily armed and armored SOM elite, with a taste for nostalgia. Equipped with an heirloom V-34 carbine, and a large supply of grenades. An old weapon that saw extensive use during the original Martian rebellion, this one has been preserved and passed down the generations. The V-34 is largely surpassed by the VX-32, however with its high calibre rounds and good rate of fire, it cannot be underestimated."
-
- suit_store = /obj/item/weapon/gun/rifle/som_carbine/mag_harness
- belt = /obj/item/storage/belt/marine/som/carbine
-
-/datum/outfit/quick/som/veteran/carbine/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/standard(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/carbine, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/veteran/culverin
- name = "Culverin Veteran Machinegunner"
- desc = "Heavily armored heavy firesupport. Equipped with a volkite culverin and self charging backpack power unit, and a shotgun sidearm. The culverin is the most powerful man portable weapon the SOM have been seen to field. Capabable of laying down a tremendous barrage of firepower for extended periods of time. Although the back-mounted powerpack is self charging, it cannot keep up with the immense power requirements of the gun, so sustained, prolonged use can degrade the weapon's effectiveness greatly."
- quantity = 2
-
- belt = /obj/item/weapon/gun/shotgun/double/sawn
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/culverin/magharness
- back = /obj/item/cell/lasgun/volkite/powerpack
-
-/datum/outfit/quick/som/veteran/culverin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/veteran/rocket_man
- name = "V-71 Rocket Veteran"
- desc = "War crimes have never been so easy. Equipped with a V-71 RPG and both incendiary and rad warheads, as well as a V-21 submachine gun with radioactive ammunition, heavy armor with a 'Mithridatius' environmental protection system, and rad grenades. Designed to inspire fear in the enemy and cripple them with deadly incendiary and radiological effects, providing excellent anti infantry support."
- quantity = 2
-
- head = /obj/item/clothing/head/modular/som/bio
- wear_suit = /obj/item/clothing/suit/modular/som/heavy/mithridatius
- suit_store = /obj/item/weapon/gun/smg/som/support
- belt = /obj/item/storage/belt/marine/som
- back = /obj/item/storage/holster/backholster/rpg/som/war_crimes
- l_store = /obj/item/storage/pouch/grenade/som
-
-/datum/outfit/quick/som/veteran/rocket_man/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/rad, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/rad, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/rad, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/rad, SLOT_IN_BELT)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/satrapine, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/rad, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/rad, SLOT_IN_L_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/rad, SLOT_IN_L_POUCH)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/packet/p10x20mm, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/incendiary, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/veteran/blinker
- name = "Blink Assault Veteran"
- desc = "Shock melee assault class. Equipped with a blink drive and energy sword, light armor and a backup burstfire V-11. The blink drive allows for short range teleports at some risk to the user, but allows them to effortless close the distance to cut down enemies when used correctly."
- quantity = 2
-
- wear_suit = /obj/item/clothing/suit/modular/som/light/shield
- belt = /obj/item/storage/holster/belt/pistol/m4a3/som
- suit_store = /obj/item/weapon/energy/sword/som
- back = /obj/item/blink_drive
-
-/datum/outfit/quick/som/veteran/blinker/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/som/extended, SLOT_IN_HOLSTER)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/som/burst(H), SLOT_IN_HOLSTER)
-
-//Base SOM leader outfit
-/datum/outfit/quick/som/squad_leader
- name = "SOM Squad Leader"
- jobtype = "SOM Squad Leader"
-
- ears = /obj/item/radio/headset/distress/som
- w_uniform = /obj/item/clothing/under/som/leader/webbing
- shoes = /obj/item/clothing/shoes/marine/som/knife
- wear_suit = /obj/item/clothing/suit/modular/som/heavy/leader/valk
- gloves = /obj/item/clothing/gloves/marine/som/veteran
- mask = /obj/item/clothing/mask/gas
- head = /obj/item/clothing/head/modular/som/leader
- glasses = /obj/item/clothing/glasses/hud/health
- r_store = /obj/item/storage/pouch/firstaid/som/combat_patrol_leader
- l_store = /obj/item/storage/pouch/grenade/som/combat_patrol
- back = /obj/item/storage/backpack/satchel/som
-
-/datum/outfit/quick/som/squad_leader/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_HEAD)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_HEAD)
-
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_SUIT)
-
-/datum/outfit/quick/som/squad_leader/standard_assaultrifle
- name = "V-31 Squad Leader"
- desc = "Tactical utility. Equipped with a V-31 assault rifle with integrated 'micro grenade' rail launcher, Gorgon heavy armor with 'Valkyrie' autodoctor module, a large variety of grenades as well as AP ammunition. Excellent performance against heavily armored targets, while the plentiful grenade provide greater tactical flexibility."
-
- back = /obj/item/storage/backpack/lightpack/som
- suit_store = /obj/item/weapon/gun/rifle/som/veteran
- belt = /obj/item/storage/belt/marine/som/som_rifle_ap
-
-/datum/outfit/quick/som/squad_leader/standard_assaultrifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som/ap, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som/ap, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/smoke_burst, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/squad_leader/standard_smg
- name = "V-21 Squad Leader"
- desc = "Close range high damage, high speed. Equipped with a V-21 submachine gun with variable firerate allowing for extreme rates of fire when properly wielded, Gorgon heavy armor with 'Valkyrie' autodoctor module, a good variety of grenades and AP ammunition. Allows for excellent close to medium range firepower, especially against heavily armored targets, and is surprisingly mobile."
-
- suit_store = /obj/item/weapon/gun/smg/som/veteran
- belt = /obj/item/storage/belt/marine/som/som_smg_ap
-
-/datum/outfit/quick/som/squad_leader/standard_smg/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/ap, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/incendiary, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som/incendiary, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/squad_leader/charger
- name = "Charger Squad Leader"
- desc = "For the leader that prefers to be up close and personal. Equipped with a volkite charger with motion sensor and gyrostabiliser for better one handed use, Gorgon heavy armor with 'Valkyrie' autodoctor module and a good variety of grenades. Allows for excellent close to medium range firepower, with first rate survivability. Very dangerous."
-
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/charger/scout
- belt = /obj/item/storage/belt/marine/som/volkite
-
-/datum/outfit/quick/som/squad_leader/charger/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/squad_leader/caliver
- name = "Caliver Squad Leader"
- desc = "Victory through superior firepower. Equipped with a volkite caliver and motion sensor, Gorgon heavy armor with 'Valkyrie' autodoctor module and a good variety of grenades. Allows for excellent damage at all ranges, with first rate survivability. Very dangerous."
-
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/caliver/tacsensor
- belt = /obj/item/storage/belt/marine/som/volkite
-
-/datum/outfit/quick/som/squad_leader/caliver/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
-
-/datum/outfit/quick/som/squad_leader/mpi
- name = "MPI_KM Squad Leader"
- desc = "For the leader with a taste for nostalgia. Equipped with an MPI_KM assault rifle, with under barrel grenade launcher, Gorgon heavy armor with 'Valkyrie' autodoctor module and a large supply of grenades. An old weapon that was a common sight during the original Martian rebellion, the MPI's good stopping power, reliability and a healthy dose of nostalgia means it is still seen in use by some among the SOM despite its age."
-
- suit_store = /obj/item/weapon/gun/rifle/mpi_km/grenadier
- belt = /obj/item/storage/belt/marine/som/mpi_plum
-
-/datum/outfit/quick/som/squad_leader/mpi/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
diff --git a/code/datums/status_effects/xeno_buffs.dm b/code/datums/status_effects/xeno_buffs.dm
index eec57534341..f2c4b73dc51 100644
--- a/code/datums/status_effects/xeno_buffs.dm
+++ b/code/datums/status_effects/xeno_buffs.dm
@@ -1371,7 +1371,7 @@
/datum/status_effect/upgrade_trail/proc/do_acid_trail()
SIGNAL_HANDLER
- if(buff_owner.incapacitated(TRUE))
+ if(buff_owner.incapacitated(TRUE) || buff_owner.status_flags & INCORPOREAL || buff_owner.is_ventcrawling)
return
if(prob(base_chance + chance_per_chamber * chamber_scaling))
var/turf/T = get_turf(buff_owner)
diff --git a/code/game/objects/effects/landmarks/landmarks.dm b/code/game/objects/effects/landmarks/landmarks.dm
index 129a4de7528..7ead8c0d094 100644
--- a/code/game/objects/effects/landmarks/landmarks.dm
+++ b/code/game/objects/effects/landmarks/landmarks.dm
@@ -172,7 +172,7 @@
/obj/effect/landmark/xeno_resin_wall/Initialize(mapload)
GLOB.xeno_resin_wall_turfs += loc
- ..()
+ . = ..()
return INITIALIZE_HINT_QDEL
/obj/effect/landmark/xeno_silo_spawn
@@ -192,7 +192,7 @@
/obj/effect/landmark/xeno_tunnel_spawn/Initialize(mapload)
GLOB.xeno_tunnel_spawn_turfs += loc
- ..()
+ . = ..()
return INITIALIZE_HINT_QDEL
/obj/effect/landmark/resin_jelly_pod
@@ -202,17 +202,17 @@
/obj/effect/landmark/resin_jelly_pod/Initialize(mapload)
GLOB.xeno_jelly_pod_turfs += loc
- ..()
+ . = ..()
return INITIALIZE_HINT_QDEL
/obj/effect/landmark/xeno_turret
name = "xeno turret landmark"
icon = 'icons/Xeno/acidturret.dmi'
- icon_state = XENO_TURRET_ACID_ICONSTATE
+ icon_state = "acid_turret"
/obj/effect/landmark/xeno_turret/Initialize(mapload)
GLOB.xeno_turret_turfs += loc
- ..()
+ . = ..()
return INITIALIZE_HINT_QDEL
/obj/effect/landmark/nuke_spawn
@@ -229,7 +229,7 @@
/obj/effect/landmark/dropship_start_location/Initialize(mapload)
GLOB.minidropship_start_loc = loc
- ..()
+ . = ..()
return INITIALIZE_HINT_QDEL
/obj/effect/landmark/weapon_spawn
@@ -464,10 +464,11 @@
/obj/effect/landmark/weapon_spawn/tier6_weapon_spawn
name = "Tier meme Weapon Spawn"
icon_state = "weapon6"
- weapon_list = list( /obj/item/weapon/gun/pistol/chimp,
- /obj/item/weapon/banhammer,
- /obj/item/weapon/chainsword,
- )
+ weapon_list = list(
+ /obj/item/weapon/gun/pistol/chimp,
+ /obj/item/weapon/banhammer,
+ /obj/item/weapon/chainsword,
+ )
/obj/effect/landmark/sensor_tower
name = "Sensor tower"
@@ -475,7 +476,7 @@
icon_state = "sensor_loyalist"
/obj/effect/landmark/sensor_tower/Initialize(mapload)
- ..()
+ . = ..()
GLOB.sensor_towers += loc
return INITIALIZE_HINT_QDEL
@@ -516,7 +517,7 @@
icon_state = "pinonfar"
/obj/effect/landmark/xenoden_docking_port/Initialize(mapload)
- ..()
+ . = ..()
GLOB.xenoden_docking_ports_locs += loc
return INITIALIZE_HINT_QDEL
@@ -526,7 +527,7 @@
icon_state = "weed_silo"
/obj/effect/landmark/xenoden_core/Initialize(mapload)
- ..()
+ . = ..()
GLOB.xenoden_cores_locs += loc
return INITIALIZE_HINT_QDEL
@@ -536,7 +537,7 @@
icon_state = "sensor"
/obj/effect/landmark/sensor_tower_infestation_ground/Initialize(mapload)
- ..()
+ . = ..()
GLOB.sensor_towers_infestation_ground += loc
return INITIALIZE_HINT_QDEL
@@ -546,7 +547,7 @@
icon_state = "sensor"
/obj/effect/landmark/sensor_tower_infestation_caves/Initialize(mapload)
- ..()
+ . = ..()
GLOB.sensor_towers_infestation_caves += loc
return INITIALIZE_HINT_QDEL
@@ -556,7 +557,7 @@
icon_state = "comm_tower"
/obj/effect/landmark/tower_relay/Initialize(mapload)
- ..()
+ . = ..()
GLOB.tower_relay_locs += loc
return INITIALIZE_HINT_QDEL
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 527fd5fce96..b2122619c6a 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -155,7 +155,7 @@ GLOBAL_LIST_EMPTY(blood_particles)
icon = 'icons/Marine/marine-items.dmi'
var/icon_state_on
hud_possible = list(SQUAD_HUD_TERRAGOV, SQUAD_HUD_SOM)
- duration = ORDER_DURATION
+ duration = CIC_ORDER_DURATION
layer = TURF_LAYER
/obj/effect/temp_visual/order/Initialize(mapload, faction)
@@ -186,7 +186,7 @@ GLOBAL_LIST_EMPTY(blood_particles)
/obj/effect/temp_visual/order/rally_order
name = "rally order"
icon_state_on = "rally"
- duration = RALLY_ORDER_DURATION
+ duration = CIC_ORDER_DURATION
///Set visuals for the hud
/obj/effect/temp_visual/order/proc/set_visuals(faction)
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 6144b76f955..b6be203bda1 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -26,16 +26,16 @@
var/access = list()
/// The name registered_name on the card
var/registered_name = "Unknown"
+ ///Miscelaneous ID flags
+ var/flags_id = CAN_BUY_LOADOUT
///Blood type of the person that has it.
var/blood_type = "\[UNSET\]"
///How many points you can use to buy items
var/marine_points = list()
- ///What category of items can you buy - used for armor and poucehs
+ ///What category of items can you buy - used for armor and pouches
var/marine_buy_choices = list()
- ///Used for quick vendor, to restrict buying loadout more than once
- var/can_buy_loadout = TRUE
//alt titles are handled a bit weirdly in order to unobtrusively integrate into existing ID system
var/assignment = null //can be alt title or the actual job
@@ -202,7 +202,7 @@
icon_state = "dogtag"
item_state = "dogtag"
iff_signal = TGMC_LOYALIST_IFF
- marine_points = list(CAT_MARINE = DEFAULT_TOTAL_BUY_POINTS)
+ marine_points = list(CAT_MARINE = MARINE_TOTAL_BUY_POINTS)
var/dogtag_taken = FALSE
/obj/item/card/id/dogtag/update_icon_state()
@@ -242,16 +242,16 @@
// Vendor points for job override
/obj/item/card/id/dogtag/smartgun
- marine_points = list(CAT_SGSUP = DEFAULT_TOTAL_BUY_POINTS)
+ marine_points = list(CAT_SGSUP = SMARTGUNNER_TOTAL_BUY_POINTS)
/obj/item/card/id/dogtag/robot
- marine_points = list(CAT_ROBOT = DEFAULT_TOTAL_BUY_POINTS)
+ marine_points = list(CAT_ROBOT = ROBOT_TOTAL_BUY_POINTS)
/obj/item/card/id/dogtag/engineer
marine_points = list(CAT_ENGSUP = ENGINEER_TOTAL_BUY_POINTS)
/obj/item/card/id/dogtag/leader
- marine_points = list(CAT_LEDSUP = DEFAULT_TOTAL_BUY_POINTS)
+ marine_points = list(CAT_LEDSUP = LEADER_TOTAL_BUY_POINTS)
/obj/item/card/id/dogtag/corpsman
marine_points = list(CAT_MEDSUP = MEDIC_TOTAL_BUY_POINTS)
@@ -261,14 +261,14 @@
/obj/item/card/id/dogtag/full
marine_points = list(
- CAT_MARINE = DEFAULT_TOTAL_BUY_POINTS,
- CAT_SGSUP = DEFAULT_TOTAL_BUY_POINTS,
+ CAT_MARINE = MARINE_TOTAL_BUY_POINTS,
+ CAT_SGSUP = SMARTGUNNER_TOTAL_BUY_POINTS,
CAT_ENGSUP = ENGINEER_TOTAL_BUY_POINTS,
- CAT_LEDSUP = DEFAULT_TOTAL_BUY_POINTS,
+ CAT_LEDSUP = LEADER_TOTAL_BUY_POINTS,
CAT_MEDSUP = MEDIC_TOTAL_BUY_POINTS,
CAT_FCSUP = COMMANDER_TOTAL_BUY_POINTS,
CAT_SYNTH = SYNTH_TOTAL_BUY_POINTS,
- CAT_ROBOT = DEFAULT_TOTAL_BUY_POINTS, //necessary to correctly show max points
+ CAT_ROBOT = ROBOT_TOTAL_BUY_POINTS, //necessary to correctly show max points
)
/obj/item/card/id/dogtag/som
diff --git a/code/game/objects/items/radio/headset.dm b/code/game/objects/items/radio/headset.dm
index 3722a2a11ce..0df5bb7e19b 100644
--- a/code/game/objects/items/radio/headset.dm
+++ b/code/game/objects/items/radio/headset.dm
@@ -488,6 +488,16 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "silicon radio"
keyslot = /obj/item/encryptionkey/mcom/ai
+/obj/item/radio/headset/mainship/mp
+ name = "security radio headset"
+ icon_state = "mp_headset"
+ keyslot = /obj/item/encryptionkey/mcom
+
+/obj/item/radio/headset/mainship/spatial
+ name = "spatial agent headset"
+ icon_state = "headset_marine_generic"
+ keyslot = /obj/item/encryptionkey/mcom/ai
+
/obj/item/radio/headset/mainship/marine
keyslot = /obj/item/encryptionkey/general
diff --git a/code/game/objects/items/rcd.dm b/code/game/objects/items/rcd.dm
index ef0ba36e357..693d0b1f310 100644
--- a/code/game/objects/items/rcd.dm
+++ b/code/game/objects/items/rcd.dm
@@ -17,7 +17,7 @@
/obj/item/ammo_rcd
name = "compressed matter cartridge"
desc = "Highly compressed matter for the RCD."
- icon = 'icons/obj/items/ammo.dmi'
+ icon = 'icons/obj/items/ammo/misc.dmi'
icon_state = "rcd"
item_icons = list(
slot_l_hand_str = 'icons/mob/inhands/equipment/tools_left.dmi',
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index b460360eed7..b2c7d6ba664 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -843,3 +843,56 @@
name = "\improper Modello/190"
desc = "A small lightweight buttpack made for use in a wide variety of operations, made with a synthetic black fibre."
icon_state = "icc_bag_guard"
+
+/obj/item/storage/backpack/marine/radiopack
+ name = "\improper TGMC radio operator backpack"
+ desc = "A backpack that resembles the ones old-age radio operator marines would use. It has a supply ordering console installed on it, and a retractable antenna to receive supply drops."
+ icon_state = "radiopack"
+ item_state = "radiopack"
+ ///Var for the window pop-up
+ var/datum/supply_ui/requests/supply_interface
+ /// Reference to the datum used by the supply drop console
+ var/datum/supply_beacon/beacon_datum
+
+/obj/item/storage/backpack/marine/radiopack/Destroy()
+ if(beacon_datum)
+ UnregisterSignal(beacon_datum, COMSIG_QDELETING)
+ QDEL_NULL(beacon_datum)
+ return ..()
+
+/obj/item/storage/backpack/marine/radiopack/examine(mob/user)
+ . = ..()
+ . += span_notice("Right-Click with empty hand to open requisitions interface.")
+ . += span_notice("Activate in hand to create a supply beacon signal.")
+
+/obj/item/storage/backpack/marine/radiopack/attack_hand_alternate(mob/living/user)
+ if(!allowed(user))
+ return ..()
+ if(!supply_interface)
+ supply_interface = new(src)
+ return supply_interface.interact(user)
+
+/obj/item/storage/backpack/marine/radiopack/attack_self(mob/living/user)
+ if(beacon_datum)
+ UnregisterSignal(beacon_datum, COMSIG_QDELETING)
+ QDEL_NULL(beacon_datum)
+ user.show_message(span_warning("The [src] beeps and states, \"Your last position is no longer accessible by the supply console"), EMOTE_AUDIBLE, span_notice("The [src] vibrates but you can not hear it!"))
+ return
+ if(!is_ground_level(user.z))
+ to_chat(user, span_warning("You have to be on the planet to use this or it won't transmit."))
+ return FALSE
+ var/turf/location = get_turf(src)
+ beacon_datum = new /datum/supply_beacon(user.name, user.loc, user.faction, 4 MINUTES)
+ RegisterSignal(beacon_datum, COMSIG_QDELETING, PROC_REF(clean_beacon_datum))
+ user.show_message(span_notice("The [src] beeps and states, \"Your current coordinates were registered by the supply console. LONGITUDE [location.x]. LATITUDE [location.y]. Area ID: [get_area(src)]\""), EMOTE_AUDIBLE, span_notice("The [src] vibrates but you can not hear it!"))
+ addtimer(CALLBACK(src, PROC_REF(update_beacon_location)), 5 SECONDS)
+
+/obj/item/storage/backpack/marine/radiopack/proc/update_beacon_location()
+ if(beacon_datum)
+ beacon_datum.drop_location = get_turf(src)
+ addtimer(CALLBACK(src, PROC_REF(update_beacon_location), beacon_datum), 5 SECONDS)
+
+/// Signal handler to nullify beacon datum
+/obj/item/storage/backpack/marine/radiopack/proc/clean_beacon_datum()
+ SIGNAL_HANDLER
+ beacon_datum = null
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 35305327f8a..e2cc49f4463 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -1,5 +1,3 @@
-
-
/obj/item/storage/belt
name = "belt"
desc = "Can hold various things."
@@ -12,19 +10,17 @@
w_class = WEIGHT_CLASS_BULKY
allow_drawing_method = TRUE
-
-
/obj/item/storage/belt/equipped(mob/user, slot)
if(slot == SLOT_BELT)
mouse_opacity = 2 //so it's easier to click when properly equipped.
- ..()
+ return ..()
/obj/item/storage/belt/dropped(mob/user)
mouse_opacity = initial(mouse_opacity)
- ..()
+ return ..()
/obj/item/storage/belt/vendor_equip(mob/user)
- ..()
+ . = ..()
return user.equip_to_appropriate_slot(src)
/obj/item/storage/belt/champion
@@ -63,19 +59,17 @@
/obj/item/tool/surgery/solderingtool,
)
-/obj/item/storage/belt/utility/full/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/utility/full/PopulateContents()
new /obj/item/tool/screwdriver (src)
new /obj/item/tool/wirecutters (src)
new /obj/item/tool/weldingtool (src)
new /obj/item/tool/wrench (src)
new /obj/item/tool/crowbar (src)
- new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
+ new /obj/item/stack/cable_coil(src, 30, pick("red", "yellow", "orange"))
new /obj/item/tool/multitool(src)
-/obj/item/storage/belt/utility/atmostech/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/utility/atmostech/PopulateContents()
new /obj/item/tool/screwdriver(src)
new /obj/item/tool/wrench(src)
new /obj/item/tool/weldingtool(src)
@@ -129,8 +123,7 @@
/obj/item/tweezers_advanced,
)
-/obj/item/storage/belt/lifesaver/full/Initialize(mapload) //The belt, with all it's magic inside!
- . = ..()
+/obj/item/storage/belt/lifesaver/full/PopulateContents() //The belt, with all it's magic inside!
new /obj/item/storage/pill_bottle/bicaridine(src)
new /obj/item/storage/pill_bottle/kelotane(src)
new /obj/item/storage/pill_bottle/tramadol(src)
@@ -153,8 +146,7 @@
new /obj/item/stack/medical/heal_pack/advanced/bruise_pack(src)
new /obj/item/healthanalyzer(src)
-/obj/item/storage/belt/lifesaver/quick/Initialize(mapload) //quick load for combat patrol
- . = ..()
+/obj/item/storage/belt/lifesaver/quick/PopulateContents() //quick load for combat patrol
new /obj/item/stack/medical/heal_pack/advanced/bruise_pack(src)
new /obj/item/stack/medical/heal_pack/advanced/bruise_pack(src)
new /obj/item/stack/medical/heal_pack/advanced/burn_pack(src)
@@ -169,14 +161,36 @@
new /obj/item/storage/pill_bottle/tricordrazine(src)
new /obj/item/storage/pill_bottle/inaprovaline(src)
new /obj/item/storage/pill_bottle/quickclot(src)
- new /obj/item/storage/pill_bottle/alkysine(src)
- new /obj/item/storage/pill_bottle/imidazoline(src)
+ new /obj/item/storage/pill_bottle/imialky(src)
new /obj/item/storage/pill_bottle/meralyne(src)
new /obj/item/storage/pill_bottle/dermaline(src)
new /obj/item/storage/pill_bottle/hypervene(src)
new /obj/item/reagent_containers/hypospray/autoinjector/dexalinplus(src)
new /obj/item/healthanalyzer(src)
+/obj/item/storage/belt/lifesaver/beginner/PopulateContents() //For beginner vendor
+ new /obj/item/storage/pill_bottle/bicaridine(src)
+ new /obj/item/storage/pill_bottle/meralyne(src)
+ new /obj/item/storage/pill_bottle/kelotane(src)
+ new /obj/item/storage/pill_bottle/dermaline(src)
+ new /obj/item/storage/pill_bottle/tramadol(src)
+ new /obj/item/storage/pill_bottle/tricordrazine(src)
+ new /obj/item/storage/pill_bottle/dylovene(src)
+ new /obj/item/storage/pill_bottle/inaprovaline(src)
+ new /obj/item/storage/pill_bottle/isotonic(src)
+ new /obj/item/storage/pill_bottle/spaceacillin(src)
+ new /obj/item/storage/pill_bottle/imialky(src)
+ new /obj/item/storage/pill_bottle/hypervene(src)
+ new /obj/item/stack/medical/splint(src)
+ new /obj/item/stack/medical/splint(src)
+ new /obj/item/stack/medical/splint(src)
+ new /obj/item/stack/medical/splint(src)
+ new /obj/item/stack/medical/splint(src)
+ new /obj/item/stack/medical/splint(src)
+ new /obj/item/stack/medical/heal_pack/advanced/burn_pack(src)
+ new /obj/item/stack/medical/heal_pack/advanced/bruise_pack(src)
+ new /obj/item/healthanalyzer(src)
+
/obj/item/storage/belt/lifesaver/full/upp
name ="\improper Type 41 pattern lifesaver bag"
desc = "The Type 41 load rig is the standard-issue LBE of the UPP military. This configuration mounts a satchel filled with a range of injectors and light medical supplies, common among medics and partisans."
@@ -190,8 +204,7 @@
icon_state = "medicbag_som"
item_state = "medicbag_som"
-/obj/item/storage/belt/lifesaver/som/ert/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/lifesaver/som/ert/PopulateContents()
new /obj/item/storage/pill_bottle/bicaridine(src)
new /obj/item/storage/pill_bottle/kelotane(src)
new /obj/item/storage/pill_bottle/tramadol(src)
@@ -214,8 +227,7 @@
new /obj/item/stack/medical/heal_pack/advanced/bruise_pack(src)
new /obj/item/healthanalyzer(src)
-/obj/item/storage/belt/lifesaver/som/quick/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/lifesaver/som/quick/PopulateContents()
new /obj/item/storage/pill_bottle/bicaridine(src)
new /obj/item/storage/pill_bottle/kelotane(src)
new /obj/item/storage/pill_bottle/tramadol(src)
@@ -223,8 +235,7 @@
new /obj/item/storage/pill_bottle/dylovene(src)
new /obj/item/storage/pill_bottle/inaprovaline(src)
new /obj/item/storage/pill_bottle/quickclot(src)
- new /obj/item/storage/pill_bottle/alkysine(src)
- new /obj/item/storage/pill_bottle/imidazoline(src)
+ new /obj/item/storage/pill_bottle/imialky(src)
new /obj/item/storage/pill_bottle/hypervene(src)
new /obj/item/storage/pill_bottle/meralyne(src)
new /obj/item/storage/pill_bottle/dermaline(src)
@@ -244,8 +255,7 @@
icon_state = "medicbag_icc"
item_state = "medicbag_icc"
-/obj/item/storage/belt/lifesaver/icc/ert/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/lifesaver/icc/ert/PopulateContents()
new /obj/item/storage/pill_bottle/bicaridine(src)
new /obj/item/storage/pill_bottle/kelotane(src)
new /obj/item/storage/pill_bottle/tramadol(src)
@@ -296,8 +306,7 @@
/obj/item/tweezers_advanced,
)
-/obj/item/storage/belt/rig/medical/Initialize(mapload) //The belt, with all it's magic inside!
- . = ..()
+/obj/item/storage/belt/rig/medical/PopulateContents()
new /obj/item/storage/pill_bottle/bicaridine(src)
new /obj/item/storage/pill_bottle/kelotane(src)
new /obj/item/storage/pill_bottle/tramadol(src)
@@ -314,8 +323,7 @@
new /obj/item/defibrillator(src)
new /obj/item/healthanalyzer(src)
-/obj/item/storage/belt/rig/research/Initialize(mapload) //The belt, with all it's magic inside!
- . = ..()
+/obj/item/storage/belt/rig/research/PopulateContents()
new /obj/item/storage/pill_bottle/bicaridine(src)
new /obj/item/storage/pill_bottle/kelotane(src)
new /obj/item/storage/pill_bottle/tramadol(src)
@@ -349,8 +357,7 @@
/obj/item/storage/syringe_case,
)
-/obj/item/storage/belt/hypospraybelt/Initialize(mapload) //The belt, with all it's magic inside!
- . = ..()
+/obj/item/storage/belt/hypospraybelt/full/PopulateContents()
new /obj/item/reagent_containers/glass/bottle/bicaridine(src)
new /obj/item/reagent_containers/glass/bottle/kelotane(src)
new /obj/item/reagent_containers/glass/bottle/tramadol(src)
@@ -369,6 +376,29 @@
new /obj/item/reagent_containers/hypospray/advanced/hypervene(src)
new /obj/item/healthanalyzer(src)
+/obj/item/storage/belt/hypospraybelt/beginner/PopulateContents()
+ new /obj/item/reagent_containers/glass/bottle/bicaridine(src)
+ new /obj/item/reagent_containers/glass/bottle/kelotane(src)
+ new /obj/item/reagent_containers/glass/bottle/tramadol(src)
+ new /obj/item/reagent_containers/glass/bottle/tricordrazine(src)
+ new /obj/item/reagent_containers/hypospray/advanced/big/bicaridine(src)
+ new /obj/item/reagent_containers/hypospray/advanced/big/kelotane(src)
+ new /obj/item/reagent_containers/hypospray/advanced/big/tramadol(src)
+ new /obj/item/reagent_containers/hypospray/advanced/big/tricordrazine(src)
+ new /obj/item/reagent_containers/hypospray/advanced/big/combatmix(src)
+ new /obj/item/reagent_containers/hypospray/advanced/big/dylovene(src)
+ new /obj/item/reagent_containers/hypospray/advanced/big/inaprovaline(src)
+ new /obj/item/reagent_containers/hypospray/advanced/big/isotonic(src)
+ new /obj/item/reagent_containers/hypospray/advanced/big/spaceacillin(src)
+ new /obj/item/reagent_containers/hypospray/advanced/big/quickclot(src)
+ new /obj/item/reagent_containers/hypospray/advanced/imialky(src)
+ new /obj/item/reagent_containers/hypospray/advanced/hypervene(src)
+ new /obj/item/reagent_containers/hypospray/advanced/peridaxon(src)
+ new /obj/item/reagent_containers/hypospray/advanced/quickclot(src)
+ new /obj/item/storage/syringe_case/meraderm(src)
+ new /obj/item/storage/syringe_case/meraderm(src)
+ new /obj/item/reagent_containers/hypospray/advanced/meraderm(src)
+
/obj/item/storage/belt/security
name = "\improper M276 pattern security rig"
desc = "The M276 is the standard load-bearing equipment of the TGMC. It consists of a modular belt with various clips. This configuration is commonly seen among TGMC Military Police and peacekeepers, though it can hold some light munitions."
@@ -450,17 +480,7 @@
AddComponent(/datum/component/magazine_catcher)
AddComponent(/datum/component/easy_restock)
-/obj/item/storage/belt/marine/ar18/Initialize(mapload)
- . = ..()
- new /obj/item/ammo_magazine/rifle/ar18(src)
- new /obj/item/ammo_magazine/rifle/ar18(src)
- new /obj/item/ammo_magazine/rifle/ar18(src)
- new /obj/item/ammo_magazine/rifle/ar18(src)
- new /obj/item/ammo_magazine/rifle/ar18(src)
- new /obj/item/ammo_magazine/rifle/ar18(src)
-
-/obj/item/storage/belt/marine/ar12/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/ar12/PopulateContents()
new /obj/item/ammo_magazine/rifle/ar12(src)
new /obj/item/ammo_magazine/rifle/ar12(src)
new /obj/item/ammo_magazine/rifle/ar12(src)
@@ -468,8 +488,15 @@
new /obj/item/ammo_magazine/rifle/ar12(src)
new /obj/item/ammo_magazine/rifle/ar12(src)
-/obj/item/storage/belt/marine/ar21/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/ar18/PopulateContents()
+ new /obj/item/ammo_magazine/rifle/ar18(src)
+ new /obj/item/ammo_magazine/rifle/ar18(src)
+ new /obj/item/ammo_magazine/rifle/ar18(src)
+ new /obj/item/ammo_magazine/rifle/ar18(src)
+ new /obj/item/ammo_magazine/rifle/ar18(src)
+ new /obj/item/ammo_magazine/rifle/ar18(src)
+
+/obj/item/storage/belt/marine/ar21/PopulateContents()
new /obj/item/ammo_magazine/rifle/ar21(src)
new /obj/item/ammo_magazine/rifle/ar21(src)
new /obj/item/ammo_magazine/rifle/ar21(src)
@@ -477,8 +504,7 @@
new /obj/item/ammo_magazine/rifle/ar21(src)
new /obj/item/ammo_magazine/rifle/ar21(src)
-/obj/item/storage/belt/marine/br64/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/br64/PopulateContents()
new /obj/item/ammo_magazine/rifle/br64(src)
new /obj/item/ammo_magazine/rifle/br64(src)
new /obj/item/ammo_magazine/rifle/br64(src)
@@ -486,8 +512,7 @@
new /obj/item/ammo_magazine/rifle/br64(src)
new /obj/item/ammo_magazine/rifle/br64(src)
-/obj/item/storage/belt/marine/t90/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/t90/PopulateContents()
new /obj/item/ammo_magazine/smg/smg90(src)
new /obj/item/ammo_magazine/smg/smg90(src)
new /obj/item/ammo_magazine/smg/smg90(src)
@@ -495,8 +520,7 @@
new /obj/item/ammo_magazine/smg/smg90(src)
new /obj/item/ammo_magazine/smg/smg90(src)
-/obj/item/storage/belt/marine/secondary/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/secondary/PopulateContents()
new /obj/item/ammo_magazine/smg/m25(src)
new /obj/item/ammo_magazine/smg/m25(src)
new /obj/item/ammo_magazine/smg/m25(src)
@@ -504,8 +528,7 @@
new /obj/item/ammo_magazine/smg/m25(src)
new /obj/item/ammo_magazine/smg/m25(src)
-/obj/item/storage/belt/marine/antimaterial/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/antimaterial/PopulateContents()
new /obj/item/ammo_magazine/sniper/flak(src)
new /obj/item/ammo_magazine/sniper/flak(src)
new /obj/item/ammo_magazine/sniper/incendiary(src)
@@ -513,8 +536,7 @@
new /obj/item/ammo_magazine/sniper(src)
new /obj/item/ammo_magazine/sniper(src)
-/obj/item/storage/belt/marine/tx8/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/tx8/PopulateContents()
new /obj/item/ammo_magazine/rifle/tx8/impact(src)
new /obj/item/ammo_magazine/rifle/tx8/impact(src)
new /obj/item/ammo_magazine/rifle/tx8/incendiary(src)
@@ -522,8 +544,7 @@
new /obj/item/ammo_magazine/rifle/tx8(src)
new /obj/item/ammo_magazine/rifle/tx8(src)
-/obj/item/storage/belt/marine/combat_rifle/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/combat_rifle/PopulateContents()
new /obj/item/ammo_magazine/rifle/ar11(src)
new /obj/item/ammo_magazine/rifle/ar11(src)
new /obj/item/ammo_magazine/rifle/ar11(src)
@@ -531,8 +552,7 @@
new /obj/item/ammo_magazine/rifle/ar11(src)
new /obj/item/ammo_magazine/rifle/ar11(src)
-/obj/item/storage/belt/marine/alf_machinecarbine/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/alf_machinecarbine/PopulateContents()
new /obj/item/ammo_magazine/rifle/alf_machinecarbine(src)
new /obj/item/ammo_magazine/rifle/alf_machinecarbine(src)
new /obj/item/ammo_magazine/rifle/alf_machinecarbine(src)
@@ -540,8 +560,7 @@
new /obj/item/ammo_magazine/rifle/alf_machinecarbine(src)
new /obj/item/ammo_magazine/rifle/alf_machinecarbine(src)
-/obj/item/storage/belt/marine/auto_shotgun/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/auto_shotgun/PopulateContents()
new /obj/item/ammo_magazine/rifle/sh15_slug(src)
new /obj/item/ammo_magazine/rifle/sh15_slug(src)
new /obj/item/ammo_magazine/rifle/sh15_slug(src)
@@ -549,8 +568,7 @@
new /obj/item/ammo_magazine/rifle/sh15_flechette(src)
new /obj/item/ammo_magazine/rifle/sh15_flechette(src)
-/obj/item/storage/belt/marine/te_cells/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/te_cells/PopulateContents()
new /obj/item/cell/lasgun/lasrifle(src)
new /obj/item/cell/lasgun/lasrifle(src)
new /obj/item/cell/lasgun/lasrifle(src)
@@ -558,8 +576,7 @@
new /obj/item/cell/lasgun/lasrifle(src)
new /obj/item/cell/lasgun/lasrifle(src)
-/obj/item/storage/belt/marine/oicw/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/oicw/PopulateContents()
new /obj/item/ammo_magazine/rifle/ar12(src)
new /obj/item/ammo_magazine/rifle/ar12(src)
new /obj/item/ammo_magazine/rifle/tx54/incendiary(src)
@@ -567,8 +584,7 @@
new /obj/item/ammo_magazine/rifle/tx54(src)
new /obj/item/ammo_magazine/rifle/tx54(src)
-/obj/item/storage/belt/marine/smartgun/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/smartgun/PopulateContents()
new /obj/item/ammo_magazine/sg29(src)
new /obj/item/ammo_magazine/sg29(src)
new /obj/item/ammo_magazine/sg29(src)
@@ -576,8 +592,7 @@
new /obj/item/ammo_magazine/sg29(src)
new /obj/item/ammo_magazine/sg29(src)
-/obj/item/storage/belt/marine/sg62/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/sg62/PopulateContents()
new /obj/item/ammo_magazine/rifle/sg62(src)
new /obj/item/ammo_magazine/rifle/sg62(src)
new /obj/item/ammo_magazine/rifle/sg62(src)
@@ -592,8 +607,7 @@
item_state = "upp_belt"
//version full of type 71 mags
-/obj/item/storage/belt/marine/upp/full/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/upp/full/PopulateContents()
new /obj/item/ammo_magazine/rifle/type71(src)
new /obj/item/ammo_magazine/rifle/type71(src)
new /obj/item/ammo_magazine/rifle/type71(src)
@@ -607,8 +621,7 @@
icon_state = "som_belt"
item_state = "som_belt"
-/obj/item/storage/belt/marine/som/som_rifle/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/som/som_rifle/PopulateContents()
new /obj/item/ammo_magazine/rifle/som(src)
new /obj/item/ammo_magazine/rifle/som(src)
new /obj/item/ammo_magazine/rifle/som(src)
@@ -616,8 +629,7 @@
new /obj/item/ammo_magazine/rifle/som(src)
new /obj/item/ammo_magazine/rifle/som(src)
-/obj/item/storage/belt/marine/som/som_rifle_ap/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/som/som_rifle_ap/PopulateContents()
new /obj/item/ammo_magazine/rifle/som/ap(src)
new /obj/item/ammo_magazine/rifle/som/ap(src)
new /obj/item/ammo_magazine/rifle/som/ap(src)
@@ -625,8 +637,7 @@
new /obj/item/ammo_magazine/rifle/som/ap(src)
new /obj/item/ammo_magazine/rifle/som/ap(src)
-/obj/item/storage/belt/marine/som/som_smg/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/som/som_smg/PopulateContents()
new /obj/item/ammo_magazine/smg/som(src)
new /obj/item/ammo_magazine/smg/som(src)
new /obj/item/ammo_magazine/smg/som(src)
@@ -634,8 +645,7 @@
new /obj/item/ammo_magazine/smg/som(src)
new /obj/item/ammo_magazine/smg/som(src)
-/obj/item/storage/belt/marine/som/som_smg_ap/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/som/som_smg_ap/PopulateContents()
new /obj/item/ammo_magazine/smg/som/ap(src)
new /obj/item/ammo_magazine/smg/som/ap(src)
new /obj/item/ammo_magazine/smg/som/ap(src)
@@ -643,8 +653,7 @@
new /obj/item/ammo_magazine/smg/som/ap(src)
new /obj/item/ammo_magazine/smg/som/ap(src)
-/obj/item/storage/belt/marine/som/volkite/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/som/volkite/PopulateContents()
new /obj/item/cell/lasgun/volkite(src)
new /obj/item/cell/lasgun/volkite(src)
new /obj/item/cell/lasgun/volkite(src)
@@ -652,8 +661,7 @@
new /obj/item/cell/lasgun/volkite(src)
new /obj/item/cell/lasgun/volkite(src)
-/obj/item/storage/belt/marine/som/mpi_plum/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/som/mpi_plum/PopulateContents()
new /obj/item/ammo_magazine/rifle/mpi_km/plum(src)
new /obj/item/ammo_magazine/rifle/mpi_km/plum(src)
new /obj/item/ammo_magazine/rifle/mpi_km/plum(src)
@@ -661,8 +669,7 @@
new /obj/item/ammo_magazine/rifle/mpi_km/plum(src)
new /obj/item/ammo_magazine/rifle/mpi_km/plum(src)
-/obj/item/storage/belt/marine/som/mpi_black/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/som/mpi_black/PopulateContents()
new /obj/item/ammo_magazine/rifle/mpi_km/black(src)
new /obj/item/ammo_magazine/rifle/mpi_km/black(src)
new /obj/item/ammo_magazine/rifle/mpi_km/black(src)
@@ -670,8 +677,7 @@
new /obj/item/ammo_magazine/rifle/mpi_km/black(src)
new /obj/item/ammo_magazine/rifle/mpi_km/black(src)
-/obj/item/storage/belt/marine/som/carbine/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/som/carbine/PopulateContents()
new /obj/item/ammo_magazine/rifle/mpi_km/carbine(src)
new /obj/item/ammo_magazine/rifle/mpi_km/carbine(src)
new /obj/item/ammo_magazine/rifle/mpi_km/carbine(src)
@@ -679,8 +685,7 @@
new /obj/item/ammo_magazine/rifle/mpi_km/carbine(src)
new /obj/item/ammo_magazine/rifle/mpi_km/carbine(src)
-/obj/item/storage/belt/marine/som/carbine_black/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/marine/som/carbine_black/PopulateContents()
new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black(src)
new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black(src)
new /obj/item/ammo_magazine/rifle/mpi_km/carbine/black(src)
@@ -732,9 +737,7 @@
max_storage_space = 28
can_hold = list(/obj/item/ammo_magazine/handful)
-
/obj/item/storage/belt/shotgun/attackby(obj/item/I, mob/user, params)
-
if(istype(I, /obj/item/ammo_magazine))
var/obj/item/ammo_magazine/M = I
if(CHECK_BITFIELD(M.flags_magazine, MAGAZINE_HANDFUL))
@@ -764,8 +767,7 @@
return ..()
-/obj/item/storage/belt/shotgun/flechette/Initialize(mapload, ...)
- . = ..()
+/obj/item/storage/belt/shotgun/flechette/PopulateContents()
new /obj/item/ammo_magazine/handful/flechette(src)
new /obj/item/ammo_magazine/handful/flechette(src)
new /obj/item/ammo_magazine/handful/flechette(src)
@@ -781,8 +783,7 @@
new /obj/item/ammo_magazine/handful/flechette(src)
new /obj/item/ammo_magazine/handful/flechette(src)
-/obj/item/storage/belt/shotgun/mixed/Initialize(mapload, ...)
- . = ..()
+/obj/item/storage/belt/shotgun/mixed/PopulateContents()
new /obj/item/ammo_magazine/handful/buckshot(src)
new /obj/item/ammo_magazine/handful/buckshot(src)
new /obj/item/ammo_magazine/handful/buckshot(src)
@@ -802,8 +803,7 @@
desc = "An ammunition belt designed to hold shotgun shells or individual bullets. Made with traditional SOM leather."
icon_state = "shotgunbelt_som"
-/obj/item/storage/belt/shotgun/som/flechette/Initialize(mapload, ...)
- . = ..()
+/obj/item/storage/belt/shotgun/som/flechette/PopulateContents()
new /obj/item/ammo_magazine/handful/flechette(src)
new /obj/item/ammo_magazine/handful/flechette(src)
new /obj/item/ammo_magazine/handful/flechette(src)
@@ -819,8 +819,7 @@
new /obj/item/ammo_magazine/handful/flechette(src)
new /obj/item/ammo_magazine/handful/flechette(src)
-/obj/item/storage/belt/shotgun/som/mixed/Initialize(mapload, ...)
- . = ..()
+/obj/item/storage/belt/shotgun/som/mixed/PopulateContents()
new /obj/item/ammo_magazine/handful/buckshot(src)
new /obj/item/ammo_magazine/handful/buckshot(src)
new /obj/item/ammo_magazine/handful/buckshot(src)
@@ -841,8 +840,7 @@
desc = "An ammunition belt designed to hold shotgun shells or individual bullets, made with a synthetic tan fibre."
icon_state = "shotgunbelt_icc"
-/obj/item/storage/belt/shotgun/icc/flechette/Initialize(mapload, ...)
- . = ..()
+/obj/item/storage/belt/shotgun/icc/flechette/PopulateContents()
new /obj/item/ammo_magazine/handful/flechette(src)
new /obj/item/ammo_magazine/handful/flechette(src)
new /obj/item/ammo_magazine/handful/flechette(src)
@@ -858,8 +856,7 @@
new /obj/item/ammo_magazine/handful/flechette(src)
new /obj/item/ammo_magazine/handful/flechette(src)
-/obj/item/storage/belt/shotgun/icc/mixed/Initialize(mapload, ...)
- . = ..()
+/obj/item/storage/belt/shotgun/icc/mixed/PopulateContents()
new /obj/item/ammo_magazine/handful/buckshot(src)
new /obj/item/ammo_magazine/handful/buckshot(src)
new /obj/item/ammo_magazine/handful/buckshot(src)
@@ -886,7 +883,7 @@
flags_atom = DIRLOCK
-/obj/item/storage/belt/shotgun/martini/Initialize(mapload, ...)
+/obj/item/storage/belt/shotgun/martini/Initialize(mapload)
. = ..()
update_icon()
@@ -937,8 +934,7 @@
draw_mode = TRUE
can_hold = list(/obj/item/stack/throwing_knife)
-/obj/item/storage/belt/knifepouch/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/knifepouch/PopulateContents()
new /obj/item/stack/throwing_knife(src)
new /obj/item/stack/throwing_knife(src)
new /obj/item/stack/throwing_knife(src)
@@ -961,8 +957,7 @@
. = ..()
AddComponent(/datum/component/tac_reload_storage)
-/obj/item/storage/belt/grenade/standard/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/grenade/standard/PopulateContents()
new /obj/item/explosive/grenade/incendiary(src)
new /obj/item/explosive/grenade/incendiary(src)
new /obj/item/explosive/grenade(src)
@@ -977,8 +972,7 @@
desc = "A simple harness system available in many configurations. This version is designed to carry bulk quantities of grenades."
icon_state = "grenadebelt_som"
-/obj/item/storage/belt/grenade/som/standard/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/grenade/som/standard/PopulateContents()
new /obj/item/explosive/grenade/incendiary/som(src)
new /obj/item/explosive/grenade/incendiary/som(src)
new /obj/item/explosive/grenade/som(src)
@@ -996,8 +990,7 @@
max_storage_space = 48
can_hold = list(/obj/item/explosive/grenade)
-/obj/item/storage/belt/grenade/b17/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/grenade/b17/PopulateContents()
new /obj/item/explosive/grenade/incendiary(src)
new /obj/item/explosive/grenade/incendiary(src)
new /obj/item/explosive/grenade/incendiary(src)
@@ -1042,8 +1035,7 @@
can_hold = list(/obj/item/reagent_containers/food/snacks/protein_pack)
sprite_slots = 4
-/obj/item/storage/belt/protein_pack/Initialize(mapload)
- . = ..()
+/obj/item/storage/belt/protein_pack/PopulateContents()
for(var/i in 1 to storage_slots)
new /obj/item/reagent_containers/food/snacks/protein_pack(src)
@@ -1071,7 +1063,6 @@
/obj/item/binoculars,
)
-/obj/item/storage/belt/mortar_belt/full/Initialize()
- . = ..()
+/obj/item/storage/belt/mortar_belt/full/PopulateContents()
new /obj/item/mortar_kit/knee(src)
new /obj/item/binoculars/tactical/range(src)
diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm
index 30c99425162..842827d2f2e 100644
--- a/code/game/objects/items/storage/holsters.dm
+++ b/code/game/objects/items/storage/holsters.dm
@@ -566,6 +566,7 @@
/obj/item/weapon/gun/pistol,
/obj/item/ammo_magazine/pistol,
/obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol,
+ /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol,
/obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta,
/obj/item/cell/lasgun/lasrifle,
/obj/item/cell/lasgun/volkite/small,
@@ -1050,3 +1051,10 @@
. = ..()
var/obj/item/new_item = new /obj/item/weapon/claymore/tomahawk/classic(src)
INVOKE_ASYNC(src, PROC_REF(handle_item_insertion), new_item)
+
+/obj/item/storage/holster/belt/pistol/laser/Initialize(mapload)
+ . = ..()
+ for(var/i in 1 to 5)
+ new /obj/item/cell/lasgun/lasrifle(src)
+ var/obj/item/weapon/gun/new_gun = new /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol/tactical(src)
+ INVOKE_ASYNC(src, PROC_REF(handle_item_insertion), new_gun)
diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm
index d0b8b162cde..f081a50b630 100644
--- a/code/game/objects/items/storage/pouch.dm
+++ b/code/game/objects/items/storage/pouch.dm
@@ -802,14 +802,21 @@
/obj/item/tool/shovel/etool,
)
-/obj/item/storage/pouch/tools/full/Initialize(mapload)
- . = ..()
+/obj/item/storage/pouch/tools/full/PopulateContents()
new /obj/item/tool/screwdriver (src)
new /obj/item/tool/wirecutters (src)
new /obj/item/tool/weldingtool (src)
new /obj/item/tool/wrench (src)
new /obj/item/tool/crowbar (src)
+
+/obj/item/storage/pouch/tools/engineer/PopulateContents()
+ new /obj/item/tool/screwdriver (src)
+ new /obj/item/tool/wirecutters (src)
+ new /obj/item/tool/weldingtool/hugetank (src)
+ new /obj/item/tool/wrench (src)
+ new /obj/item/tool/crowbar (src)
+
/obj/item/storage/pouch/tools/som
desc = "It's designed to hold maintenance tools - screwdriver, wrench, cable coil, etc. It also has a hook for an entrenching tool. Made with traditional SOM leather."
icon_state = "tools_som"
@@ -845,7 +852,6 @@
draw_mode = 0
can_hold = list(/obj/item/ammo_magazine/handful)
-
/obj/item/storage/pouch/shotgun/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/ammo_magazine))
var/obj/item/ammo_magazine/M = I
diff --git a/code/game/objects/items/tools/maintenance_tools.dm b/code/game/objects/items/tools/maintenance_tools.dm
index 98faf4f058f..5a2687bb87e 100644
--- a/code/game/objects/items/tools/maintenance_tools.dm
+++ b/code/game/objects/items/tools/maintenance_tools.dm
@@ -453,6 +453,7 @@
desc = "A hand-held, lightweight cell charger. It isn't going to give you tons of power, but it can help in a pinch."
icon = 'icons/obj/items/tools.dmi'
icon_state = "handheldcharger_black"
+ item_state = "handheldcharger_black"
w_class = WEIGHT_CLASS_SMALL
flags_atom = CONDUCT
force = 6
@@ -530,7 +531,7 @@
cell = null
playsound(user, 'sound/machines/click.ogg', 20, 1, 5)
balloon_alert(user, "Removes the cell")
- update_appearance()
+ update_icon_state()
/obj/item/tool/handheld_charger/attack_hand(mob/living/user)
if(user.get_inactive_held_item() != src)
@@ -542,8 +543,12 @@
cell = null
playsound(user, 'sound/machines/click.ogg', 20, 1, 5)
balloon_alert(user, "Removes the cell")
- update_appearance()
+ update_icon_state()
/obj/item/tool/handheld_charger/Destroy()
QDEL_NULL(cell)
return ..()
+
+/obj/item/tool/handheld_charger/hicapcell/Initialize(mapload)
+ cell = new /obj/item/cell/high(src)
+ return ..()
diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm
index ac69b7acad6..21ad30b426e 100644
--- a/code/game/objects/items/weapons/misc.dm
+++ b/code/game/objects/items/weapons/misc.dm
@@ -72,7 +72,7 @@
var/powerused = setting * 20
. += "It's power setting is set to [setting]."
if(cell)
- . += "It has [round(cell.charge/powerused, 1)] level [setting] punches remaining."
+ . += "It has [round(cell.charge / powerused, 1)] level [setting] punches remaining."
else
. += "There is no cell installed!"
@@ -96,7 +96,7 @@
if(powerused > cell.charge)
to_chat(user, span_warning("\The [src]'s cell doesn't have enough power!"))
M.apply_damage((force * 0.2), BRUTE, user.zone_selected, MELEE)
- playsound(loc, 'sound/weapons/punch1.ogg', 50, TRUE)
+ hitsound = 'sound/weapons/punch1.ogg'
if(M == user)
to_chat(user, span_userdanger("You punch yourself!"))
else
@@ -132,7 +132,7 @@
return
if(cell)
unload(user)
- user.transferItemToLoc(I,src)
+ user.transferItemToLoc(I, src)
cell = I
update_icon()
user.balloon_alert(user, "Cell inserted")
@@ -163,6 +163,15 @@
update_icon()
playsound(user, 'sound/weapons/guns/interact/rifle_reload.ogg', 25, TRUE)
+/obj/item/weapon/powerfist/full
+ setting = 3
+
+/obj/item/weapon/powerfist/full/Initialize(mapload)
+ var/obj/item/cell/lasgun/lasrifle/future_cell = new(src) // snowflaky, but we don't use it often, so it's fine?
+ future_cell.forceMove(src)
+ cell = future_cell
+ return ..()
+
/obj/item/weapon/brick
name = "brick"
desc = "It's a brick. Commonly used to hit things, occasionally used to build stuff instead."
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index dd12272821c..c978f0e3c86 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -592,7 +592,7 @@
else
stun = knockback ? knockback_stun_amount : crush_stun_amount
- if(!M.IsStun() && !M.IsParalyzed() && !isxenoqueen(M)) //Prevent chain stunning. Queen is protected.
+ if(!M.IsStun() && !M.IsParalyzed() && !isxenoqueen(M) && !isxenoking(M)) //Prevent chain stunning. Queen and King are protected.
M.apply_effects(stun,weaken)
return ..()
diff --git a/code/game/objects/machinery/computer/communications.dm b/code/game/objects/machinery/computer/communications.dm
index 29c62ad5836..a720f27ed7d 100644
--- a/code/game/objects/machinery/computer/communications.dm
+++ b/code/game/objects/machinery/computer/communications.dm
@@ -124,7 +124,7 @@
priority_announce(input, subtitle = "Sent by [usr]", type = ANNOUNCEMENT_COMMAND)
message_admins("[ADMIN_TPMONTY(usr)] has just sent a command announcement")
log_game("[key_name(usr)] has just sent a command announcement.")
- TIMER_COOLDOWN_START(usr, COOLDOWN_HUD_ORDER, ORDER_COOLDOWN)
+ TIMER_COOLDOWN_START(usr, COOLDOWN_HUD_ORDER, CIC_ORDER_COOLDOWN)
cooldown_message = world.time
if("award")
@@ -230,7 +230,7 @@
cooldown_request = world.time
if(admin_response == "deny")
SSticker.mode.distress_cancelled = TRUE
- priority_announce("The distress signal has been blocked, the launch tubes are now recalibrating.", "Distress Beacon")
+ priority_announce("Сигнал бедствия заблокирован. Пусковые трубы перекалибруются.", "Сигнал Бедствия", sound = 'sound/AI/distress_deny.ogg')
return FALSE
if(admin_response =="deny without annoncing")
SSticker.mode.distress_cancelled = TRUE
diff --git a/code/game/objects/machinery/computer/intel_computer.dm b/code/game/objects/machinery/computer/intel_computer.dm
index 6aa4795546d..bb1732defee 100644
--- a/code/game/objects/machinery/computer/intel_computer.dm
+++ b/code/game/objects/machinery/computer/intel_computer.dm
@@ -63,7 +63,7 @@
printing_complete = TRUE
SSpoints.supply_points[faction] += supply_reward
SSpoints.dropship_points += dropship_reward
- priority_announce("Classified transmission recieved from [get_area(src)]. Bonus delivered as [supply_reward] supply points and [dropship_reward] dropship points.", title = "TGMC Intel Division")
+ priority_announce("Получена секретная передача из [get_area(src)]. Бонус доставлен в виде [supply_reward] очков Карго и [dropship_reward] очков шаттла.", title = "Отдел Разведки UPP", sound = 'sound/AI/bonus_climed.ogg')
SSminimaps.remove_marker(src)
/obj/machinery/computer/intel_computer/Destroy()
diff --git a/code/game/objects/machinery/overwatch.dm b/code/game/objects/machinery/overwatch.dm
index adb8d859298..9411f2a0039 100644
--- a/code/game/objects/machinery/overwatch.dm
+++ b/code/game/objects/machinery/overwatch.dm
@@ -371,7 +371,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
return
var/input = tgui_input_text(operator, "Please write a message to announce to the squad leader:", "SL Message", max_length = MAX_COMMAND_MESSAGE_LENGTH)
if(input)
- TIMER_COOLDOWN_START(operator, COOLDOWN_HUD_ORDER, ORDER_COOLDOWN)
+ TIMER_COOLDOWN_START(operator, COOLDOWN_HUD_ORDER, CIC_ORDER_COOLDOWN)
message_member(current_squad.squad_leader, input, operator)
if(issilicon(operator))
to_chat(operator, span_boldnotice("Message sent to Squad Leader [current_squad.squad_leader] of squad '[current_squad]'."))
@@ -781,7 +781,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
return
var/input = tgui_input_text(source, "Please write a message to announce to this marine:", "CIC Message", max_length = MAX_COMMAND_MESSAGE_LENGTH)
message_member(human_target, input, source)
- TIMER_COOLDOWN_START(operator, COOLDOWN_HUD_ORDER, ORDER_COOLDOWN)
+ TIMER_COOLDOWN_START(operator, COOLDOWN_HUD_ORDER, CIC_ORDER_COOLDOWN)
if(ASL)
if(human_target == human_target.assigned_squad.squad_leader)
human_target.assigned_squad.demote_leader()
@@ -813,7 +813,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
continue
message_member(target, input, source)
message_member(source, input, source)
- TIMER_COOLDOWN_START(operator, COOLDOWN_HUD_ORDER, ORDER_COOLDOWN)
+ TIMER_COOLDOWN_START(operator, COOLDOWN_HUD_ORDER, CIC_ORDER_COOLDOWN)
if(SQUAD_ACTIONS)
choice = show_radial_menu(source, turf_target, squad_radial_options, null, 48, null, FALSE, TRUE)
var/datum/squad/chosen_squad = squad_select(source, turf_target)
@@ -825,7 +825,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
var/input = tgui_input_text(source, "Please write a message to announce to the squad:", "Squad Message", max_length = MAX_COMMAND_MESSAGE_LENGTH)
if(input)
chosen_squad.message_squad(input, source)
- TIMER_COOLDOWN_START(operator, COOLDOWN_HUD_ORDER, ORDER_COOLDOWN)
+ TIMER_COOLDOWN_START(operator, COOLDOWN_HUD_ORDER, CIC_ORDER_COOLDOWN)
if(SWITCH_SQUAD_NEAR)
for(var/mob/living/carbon/human/target in GLOB.human_mob_list)
if(!target.faction == faction || get_dist(target, turf_target) > 9)
@@ -913,7 +913,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
to_chat(src, span_warning("You cannot give an order while muted."))
return
- if(command_aura_cooldown)
+ if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_SKILL_ORDERS))
to_chat(src, span_warning("You have recently given an order. Calm down."))
return
@@ -925,7 +925,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
if(!command_aura)
return
- if(command_aura_cooldown)
+ if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_SKILL_ORDERS))
to_chat(src, span_warning("You have recently given an order. Calm down."))
return
@@ -933,7 +933,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
return
var/aura_strength = skills.getRating(SKILL_LEADERSHIP) - 1
var/aura_target = pick_order_target()
- SSaura.add_emitter(aura_target, command_aura, aura_strength + 4, aura_strength, 30 SECONDS, faction)
+ SSaura.add_emitter(aura_target, command_aura, aura_strength + 4, aura_strength, SKILL_ORDER_DURATION, faction)
var/message = ""
switch(command_aura)
@@ -953,10 +953,6 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
say(message)
add_emote_overlay(focus)
- command_aura_cooldown = addtimer(CALLBACK(src, PROC_REF(end_command_aura_cooldown)), 45 SECONDS)
-
- update_action_buttons()
-
///Choose what we're sending a buff order through
/mob/living/carbon/human/proc/pick_order_target()
//If we're in overwatch, use the camera eye
@@ -964,10 +960,6 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
return remote_control
return src
-/mob/living/carbon/human/proc/end_command_aura_cooldown()
- command_aura_cooldown = null
- update_action_buttons()
-
/datum/action/skill/issue_order
name = "Issue Order"
action_icon = 'icons/mob/order_icons.dmi'
@@ -975,10 +967,28 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
skill_min = SKILL_LEAD_TRAINED
var/order_type = null
+/datum/action/skill/issue_order/give_action(mob/M)
+ . = ..()
+ RegisterSignals(M, list(COMSIG_SKILL_ORDER_SENT, COMSIG_SKILL_ORDER_OFF_CD), PROC_REF(update_button_icon))
+
+/datum/action/skill/issue_order/remove_action(mob/M)
+ . = ..()
+ UnregisterSignal(M, list(COMSIG_CIC_ORDER_SENT, COMSIG_CIC_ORDER_OFF_CD))
+
+/datum/action/skill/issue_order/can_use_action()
+ . = ..()
+ if(!.)
+ return
+ if(owner.stat || TIMER_COOLDOWN_CHECK(owner, COOLDOWN_SKILL_ORDERS))
+ return FALSE
+
/datum/action/skill/issue_order/action_activate()
var/mob/living/carbon/human/human = owner
if(istype(human))
human.issue_order(order_type)
+ TIMER_COOLDOWN_START(owner, COOLDOWN_SKILL_ORDERS, SKILL_ORDER_COOLDOWN)
+ addtimer(CALLBACK(src, PROC_REF(on_cooldown_finish)), SKILL_ORDER_COOLDOWN + 1)
+ SEND_SIGNAL(owner, COMSIG_SKILL_ORDER_SENT)
/datum/action/skill/issue_order/update_button_icon()
var/mob/living/carbon/human/human = owner
@@ -991,11 +1001,15 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
var/mob/living/carbon/human/human = owner
if(!istype(human))
return
- if(human.command_aura_cooldown)
+ if(TIMER_COOLDOWN_CHECK(human, COOLDOWN_SKILL_ORDERS))
button.color = rgb(255,0,0,255)
else
button.color = rgb(255,255,255,255)
+///Lets any other orders know when we're off CD
+/datum/action/skill/issue_order/proc/on_cooldown_finish()
+ SEND_SIGNAL(owner, COMSIG_SKILL_ORDER_OFF_CD, src)
+
/datum/action/skill/issue_order/move
name = "Issue Move Order"
order_type = AURA_HUMAN_MOVE
@@ -1031,16 +1045,14 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
if(orders_visible)
orders_visible = FALSE
action_icon_state = "show_order"
- for(var/datum/action/skill/path in owner.actions)
- if(istype(path, /datum/action/skill/issue_order))
- path.remove_action(H)
+ for(var/datum/action/skill/issue_order/action in owner.actions)
+ action.hidden = TRUE
else
orders_visible = TRUE
action_icon_state = "hide_order"
- var/list/subtypeactions = subtypesof(/datum/action/skill/issue_order)
- for(var/path in subtypeactions)
- var/datum/action/skill/issue_order/A = new path()
- A.give_action(H)
+ for(var/datum/action/skill/issue_order/action in owner.actions)
+ action.hidden = FALSE
+ owner.update_action_buttons()
/obj/machinery/computer/camera_advanced/overwatch/proc/get_squad_by_id(id)
for(var/datum/squad/squad AS in watchable_squads)
diff --git a/code/game/objects/machinery/self_destruct.dm b/code/game/objects/machinery/self_destruct.dm
index 95f89676ce6..aa8450727fd 100644
--- a/code/game/objects/machinery/self_destruct.dm
+++ b/code/game/objects/machinery/self_destruct.dm
@@ -81,7 +81,7 @@
if("dest_start")
to_chat(usr, span_notice("You press a few keys on the panel."))
to_chat(usr, span_notice("The system must be booting up the self-destruct sequence now."))
- priority_announce("Danger. The emergency destruct system is now activated. The ship will detonate in T-minus 20 minutes. Automatic detonation is unavailable. Manual detonation is required.", title = "Self Destruct System", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/selfdestruct.ogg', color_override = "purple")
+ priority_announce("Тревога! Протокол самоуничтожения активирован. Корабль взорвется через 20 минут. Автоматическая детонация недоступна. Требуется ручное вмешательство.", title = "Протокол Самоуничтожения", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/selfdestruct.ogg', color_override = "purple")
active_state = SELF_DESTRUCT_MACHINE_ARMED
var/obj/machinery/self_destruct/rod/I = SSevacuation.dest_rods[SSevacuation.dest_index]
I.activate_time = world.time
diff --git a/code/game/objects/machinery/vending/beginner_vendor.dm b/code/game/objects/machinery/vending/beginner_vendor.dm
new file mode 100644
index 00000000000..706b579844c
--- /dev/null
+++ b/code/game/objects/machinery/vending/beginner_vendor.dm
@@ -0,0 +1,41 @@
+//Beginner Vendor
+GLOBAL_LIST_INIT(beginner_loadouts, init_beginner_loadouts())
+
+/proc/init_beginner_loadouts() //List of all loadouts in quick_load_beginners.dm
+ . = list()
+ var/list/loadout_list = list(
+ /datum/outfit/quick/beginner/marine/rifleman,
+ /datum/outfit/quick/beginner/marine/machinegunner,
+ /datum/outfit/quick/beginner/marine/marksman,
+ /datum/outfit/quick/beginner/marine/shotgunner,
+ /datum/outfit/quick/beginner/marine/shocktrooper,
+ /datum/outfit/quick/beginner/marine/hazmat,
+ /datum/outfit/quick/beginner/marine/cqc,
+ /datum/outfit/quick/beginner/robot/laser_rifle,
+ /datum/outfit/quick/beginner/robot/laser_machinegunner,
+ /datum/outfit/quick/beginner/robot/laser_sniper,
+ /datum/outfit/quick/beginner/engineer/builder,
+ /datum/outfit/quick/beginner/engineer/burnitall,
+ /datum/outfit/quick/beginner/engineer/pcenjoyer,
+ /datum/outfit/quick/beginner/corpsman/lifesaver,
+ /datum/outfit/quick/beginner/corpsman/hypobelt,
+ /datum/outfit/quick/beginner/smartgunner/sg29,
+ /datum/outfit/quick/beginner/smartgunner/sg85,
+ )
+
+ for(var/loadout in loadout_list)
+ .[loadout] = new loadout
+
+/obj/machinery/quick_vendor/beginner //Loadout vendor that shits out basic pre-made loadouts so new players can get something usable
+ icon_state = "loadoutvendor"
+ categories = list(
+ SQUAD_MARINE,
+ SQUAD_ROBOT,
+ SQUAD_ENGINEER,
+ SQUAD_CORPSMAN,
+ SQUAD_SMARTGUNNER,
+ )
+ drop_worn_items = TRUE
+
+/obj/machinery/quick_vendor/beginner/set_stock_list()
+ global_list_to_use = GLOB.beginner_loadouts
diff --git a/code/game/objects/machinery/vending/marine_vending.dm b/code/game/objects/machinery/vending/marine_vending.dm
index abff9bd66a3..bfeb18587ac 100644
--- a/code/game/objects/machinery/vending/marine_vending.dm
+++ b/code/game/objects/machinery/vending/marine_vending.dm
@@ -789,11 +789,6 @@
"Surplus Special Equipment" = list(
/obj/item/pinpointer = 1,
/obj/item/beacon/supply_beacon = 1,
- /obj/item/ammo_magazine/rifle/sr81 = 3,
- /obj/item/ammo_magazine/rifle/tx8 = 3,
- /obj/item/ammo_magazine/rocket/sadar = 3,
- /obj/item/ammo_magazine/minigun_powerpack = 2,
- /obj/item/ammo_magazine/shotgun/mbx900 = 2,
/obj/item/explosive/plastique = 5,
/obj/item/fulton_extraction_pack = 2,
/obj/item/clothing/suit/storage/marine/boomvest = 20,
diff --git a/code/game/objects/machinery/vending/new_marine_vendors.dm b/code/game/objects/machinery/vending/new_marine_vendors.dm
index 95d73121db4..4d7a0836966 100644
--- a/code/game/objects/machinery/vending/new_marine_vendors.dm
+++ b/code/game/objects/machinery/vending/new_marine_vendors.dm
@@ -62,11 +62,11 @@
to_chat(user, span_warning("Access denied. Your assigned role doesn't have access to this machinery."))
return FALSE
- var/obj/item/card/id/I = H.get_idcard()
- if(!istype(I)) //not wearing an ID
+ var/obj/item/card/id/user_id = H.get_idcard()
+ if(!istype(user_id)) //not wearing an ID
return FALSE
- if(I.registered_name != H.real_name)
+ if(user_id.registered_name != H.real_name)
return FALSE
if(vendor_role && !istype(H.job, vendor_role))
@@ -138,13 +138,16 @@
return
var/idx = text2path(params["vend"])
- var/obj/item/card/id/I = usr.get_idcard()
+ var/obj/item/card/id/user_id = usr.get_idcard()
var/list/L = listed_products[idx]
var/item_category = L[1]
var/cost = L[3]
- if(use_points && (item_category in I.marine_points) && I.marine_points[item_category] < cost)
+ if(!(user_id.flags_id & CAN_BUY_LOADOUT)) //If you use the quick-e-quip, you cannot also use the GHMMEs
+ to_chat(usr, span_warning("Access denied. You have already vended a loadout."))
+ return FALSE
+ if(use_points && (item_category in user_id.marine_points) && user_id.marine_points[item_category] < cost)
to_chat(usr, span_warning("Not enough points."))
if(icon_deny)
flick(icon_deny, src)
@@ -157,9 +160,9 @@
flick(icon_deny, src)
return
- if(item_category in I.marine_buy_choices)
- if(I.marine_buy_choices[item_category] && GLOB.marine_selector_cats[item_category])
- I.marine_buy_choices[item_category] -= 1
+ if(item_category in user_id.marine_buy_choices)
+ if(user_id.marine_buy_choices[item_category] && GLOB.marine_selector_cats[item_category])
+ user_id.marine_buy_choices[item_category] -= 1
else
if(cost == 0)
to_chat(usr, span_warning("You can't buy things from this category anymore."))
@@ -192,9 +195,10 @@
for (var/obj/item/vended_item in vended_items)
vended_item.on_vend(usr, faction, auto_equip = TRUE)
- if(use_points && (item_category in I.marine_points))
- I.marine_points[item_category] -= cost
+ if(use_points && (item_category in user_id.marine_points))
+ user_id.marine_points[item_category] -= cost
. = TRUE
+ user_id.flags_id |= USED_GHMME
/obj/machinery/marine_selector/clothes
name = "GHMME Automated Closet"
@@ -765,7 +769,10 @@
/obj/item/clothing/shoes/marine/separatist,
)
-#undef DEFAULT_TOTAL_BUY_POINTS
+#undef MARINE_TOTAL_BUY_POINTS
+#undef ROBOT_TOTAL_BUY_POINTS
+#undef SMARTGUNNER_TOTAL_BUY_POINTS
+#undef LEADER_TOTAL_BUY_POINTS
#undef MEDIC_TOTAL_BUY_POINTS
#undef ENGINEER_TOTAL_BUY_POINTS
#undef COMMANDER_TOTAL_BUY_POINTS
diff --git a/code/game/objects/machinery/vending/quick_vendor.dm b/code/game/objects/machinery/vending/quick_vendor.dm
index 200305b54b5..16f5a05c835 100644
--- a/code/game/objects/machinery/vending/quick_vendor.dm
+++ b/code/game/objects/machinery/vending/quick_vendor.dm
@@ -81,10 +81,10 @@ GLOBAL_LIST_INIT(quick_loadouts, init_quick_loadouts())
for(var/X in loadout_list)
.[X] = new X
-
/obj/machinery/quick_vendor
name = "Kwik-E-Quip vendor"
- desc = "An advanced vendor to instantly arm soldiers with specific sets of equipment, allowing for immediate combat deployment."
+ desc = "An advanced vendor to instantly arm soldiers with specific sets of equipment, allowing for immediate combat deployment. \
+ Mutually exclusive with the GHMME."
icon = 'icons/obj/machines/vending.dmi'
icon_state = "specialist"
density = TRUE
@@ -100,12 +100,24 @@ GLOBAL_LIST_INIT(quick_loadouts, init_quick_loadouts())
var/faction = FACTION_NEUTRAL
//the different tabs in the vendor
var/list/categories = list(
- "Squad Marine",
- "Squad Engineer",
- "Squad Corpsman",
- "Squad Smartgunner",
- "Squad Leader",
+ SQUAD_MARINE,
+ SQUAD_ENGINEER,
+ SQUAD_CORPSMAN,
+ SQUAD_SMARTGUNNER,
+ SQUAD_LEADER,
)
+ ///Whichever global loadout is used to build the vendor stock
+ var/list/global_list_to_use
+ ///If the vendor drops your items, or deletes them when you vend a loadout
+ var/drop_worn_items = FALSE
+
+/obj/machinery/quick_vendor/Initialize(mapload)
+ . = ..()
+ set_stock_list()
+
+///Chooses which global list the vendor will build stock from, gets run on Initialize()
+/obj/machinery/quick_vendor/proc/set_stock_list()
+ global_list_to_use = GLOB.quick_loadouts
/obj/machinery/quick_vendor/Initialize(mapload)
. = ..()
@@ -149,6 +161,7 @@ GLOBAL_LIST_INIT(quick_loadouts, init_quick_loadouts())
var/obj/item/card/id/user_id = human_user.get_idcard()
if(user_id.registered_name != human_user.real_name)
return FALSE
+
return TRUE
/obj/machinery/quick_vendor/ui_interact(mob/living/user, datum/tgui/ui)
@@ -165,9 +178,9 @@ GLOBAL_LIST_INIT(quick_loadouts, init_quick_loadouts())
. = ..()
var/list/data = list()
var/list/loadouts_data_tgui = list()
- for(var/loadout_data in GLOB.quick_loadouts)
+ for(var/loadout_data in global_list_to_use)
var/list/next_loadout_data = list() //makes a list item with the below lines, for each loadout entry in the list
- var/datum/outfit/quick/current_loadout = GLOB.quick_loadouts[loadout_data]
+ var/datum/outfit/quick/current_loadout = global_list_to_use[loadout_data]
next_loadout_data["job"] = current_loadout.jobtype
next_loadout_data["name"] = current_loadout.name
next_loadout_data["desc"] = current_loadout.desc
@@ -185,14 +198,13 @@ GLOBAL_LIST_INIT(quick_loadouts, init_quick_loadouts())
data["vendor_categories"] = categories
return data
-
/obj/machinery/quick_vendor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(.)
return
switch(action)
if("selectLoadout")
- var/datum/outfit/quick/selected_loadout = GLOB.quick_loadouts[text2path(params["loadout_outfit"])]
+ var/datum/outfit/quick/selected_loadout = global_list_to_use[text2path(params["loadout_outfit"])]
if(!selected_loadout)
to_chat(ui.user, span_warning("Error when loading this loadout"))
CRASH("Fail to load loadouts")
@@ -200,13 +212,36 @@ GLOBAL_LIST_INIT(quick_loadouts, init_quick_loadouts())
to_chat(usr, span_warning("This loadout has been depleted, you'll need to pick another."))
return
var/obj/item/card/id/user_id = usr.get_idcard() //ui.user better?
- if(selected_loadout.jobtype != user_id.rank)
+ var/user_job = user_id.rank
+ user_job = replacetext(user_job, "Fallen ", "") //So that jobs in valhalla can vend a loadout too
+ if(selected_loadout.jobtype != user_job)
to_chat(usr, span_warning("You are not in the right job for this loadout!"))
return
- if(user_id.can_buy_loadout)
- user_id.can_buy_loadout = FALSE
+ if(user_id.flags_id & USED_GHMME) //Same check here, in case they opened the UI before vending a loadout somehow
+ to_chat(ui.user, span_warning("Access denied, continue using the GHHME."))
+ return FALSE
+ if(user_id.flags_id & CAN_BUY_LOADOUT)
+ for(var/points in user_id.marine_points)
+ if(user_id.marine_points[points] != GLOB.default_marine_points[points])
+ to_chat(ui.user, span_warning("Access denied, continue using the GHHME."))
+ return FALSE
+ for(var/option in user_id.marine_buy_choices)
+ if(user_id.marine_buy_choices[option] != GLOB.marine_selector_cats[option])
+ to_chat(ui.user, span_warning("Access denied, continue using the GHHME."))
+ return FALSE
+ user_id.flags_id &= ~CAN_BUY_LOADOUT
selected_loadout.quantity --
+ if(drop_worn_items)
+ for(var/obj/item/inventory_items in ui.user)
+ if(inventory_items.flags_equip_slot == ITEM_SLOT_ID)
+ continue
+ ui.user.dropItemToGround(inventory_items)
selected_loadout.equip(ui.user) //actually equips the loadout
+ //After vending a quick loadout, remove points and GHMME options so that you can't vend them via loadout vendor
+ for(var/points in user_id.marine_points)
+ user_id.marine_points[points] = 0
+ for(var/option in user_id.marine_buy_choices)
+ user_id.marine_buy_choices[option] = 0
else
to_chat(usr, span_warning("You can't buy things from this category anymore."))
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index b1a0d426fbe..8511866d12a 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -14,7 +14,7 @@
. = ..()
switch(dir)
if(NORTH)
- pixel_y = -14
+ pixel_y = -17
if(SOUTH)
pixel_y = 27
if(EAST)
diff --git a/code/game/objects/structures/orbital_cannon.dm b/code/game/objects/structures/orbital_cannon.dm
index e1197c3b654..c496eecdc0f 100644
--- a/code/game/objects/structures/orbital_cannon.dm
+++ b/code/game/objects/structures/orbital_cannon.dm
@@ -214,13 +214,13 @@
var/turf/target = locate(T.x + inaccurate_fuel * pick(-2, 2),T.y + inaccurate_fuel * pick(-2, 2),T.z)
// Give marines a warning if misfuelled.
- var/fuel_warning = "Warhead fuel level: safe."
+ var/fuel_warning = "Уровень топлива боеголовки: корректный."
if(inaccurate_fuel > 0)
- fuel_warning = "Warhead fuel level: incorrect.
Warhead may be inaccurate."
+ fuel_warning = "Уровень топлива боеголовки: некорректный.
Возможно смещение области поражения."
priority_announce(
- message = "Evacuate the impact zone immediately!
Warhead type: [tray.warhead.warhead_kind].
[fuel_warning]
Estimated location of impact: [get_area(T)].",
- title = "Orbital bombardment launch command detected!",
+ message = "Немедленно покиньте зону поражения!
Тип боеголовки: [tray.warhead.warhead_kind_rus].
[fuel_warning]
Цель: [get_area(T)].",
+ title = "Обнаружена команда на запуск орбитальной бомбардировки!",
type = ANNOUNCEMENT_PRIORITY,
sound = 'sound/effects/OB_warning_announce.ogg',
channel_override = SSsounds.random_available_channel(), // This way, we can't have it be cut off by other sounds.
@@ -228,7 +228,7 @@
)
var/list/receivers = (GLOB.alive_human_list + GLOB.ai_list + GLOB.observer_list)
for(var/mob/living/screentext_receiver AS in receivers)
- screentext_receiver.play_screen_text("ORBITAL STRIKE IMMINENT
TYPE: [uppertext(tray.warhead.warhead_kind)]", /atom/movable/screen/text/screen_text/command_order)
+ screentext_receiver.play_screen_text("ОРБИТАЛЬНЫЙ УДАР
ТИП СНАРЯДА: [uppertext(tray.warhead.warhead_kind_rus)]", /atom/movable/screen/text/screen_text/command_order)
playsound(target, 'sound/effects/OB_warning_announce_novoiceover.ogg', 125, FALSE, 30, 10) //VOX-less version for xenomorphs
var/impact_time = 10 SECONDS + (WARHEAD_FLY_TIME * (GLOB.current_orbit/3))
@@ -361,6 +361,7 @@
/obj/structure/ob_ammo/warhead
name = "theoretical orbital ammo"
var/warhead_kind
+ var/warhead_kind_rus
///Explode the warhead
/obj/structure/ob_ammo/warhead/proc/warhead_impact()
@@ -373,8 +374,8 @@
relative_dir = 0
else
relative_dir = get_dir(our_mob, target)
- our_mob.show_message(span_highdanger("The sky erupts into flames [relative_dir ? ("to the " + dir2text(relative_dir)) : "right above you"]!"), EMOTE_VISIBLE,
- span_highdanger("You hear a very loud sound coming from above to the [relative_dir ? ("to the " + dir2text(relative_dir)) : "right above you"]!"), EMOTE_AUDIBLE)
+ our_mob.show_message(span_highdanger("Небо вспыхнуло [relative_dir ? ("с " + dir2rutext(relative_dir) + "а от тебя") : "прямо над тобой"]!"), EMOTE_VISIBLE,
+ span_highdanger("Громкий шум слышно из неба [relative_dir ? ("примерно с " + dir2rutext(relative_dir) + "а от тебя") : "прямо над тобой"]!"), EMOTE_AUDIBLE)
sleep(impact_time / 3)
for(var/mob/living/our_mob in range(25, target))
@@ -382,17 +383,18 @@
relative_dir = 0
else
relative_dir = get_dir(our_mob, target)
- our_mob.show_message(span_highdanger("The sky roars louder [relative_dir ? ("to the " + dir2text(relative_dir)) : "right above you"]!"), EMOTE_VISIBLE,
- span_highdanger("The sound becomes louder [relative_dir ? ("to the " + dir2text(relative_dir)) : "right above you"]!"), EMOTE_AUDIBLE)
+ our_mob.show_message(span_highdanger("Небо ревет все громче [relative_dir ? ("с " + dir2rutext(relative_dir) + "а от тебя") : "прямо над тобой"]!"), EMOTE_VISIBLE,
+ span_highdanger("Шум становится громче [relative_dir ? ("где-то с " + dir2rutext(relative_dir) + "а от тебя") : "прямо над тобой"]!"), EMOTE_AUDIBLE)
sleep(impact_time / 3)
for(var/mob/living/our_mob in range(15, target))
- our_mob.show_message(span_highdanger("OH GOD THE SKY WILL EXPLODE!!!"), EMOTE_VISIBLE,
- span_highdanger("YOU SHOULDN'T BE HERE!"), EMOTE_AUDIBLE)
+ our_mob.show_message(span_highdanger("О БОЖЕ, НЕБО СЕЙЧАС ВЗОРВЕТСЯ!!!"), EMOTE_VISIBLE,
+ span_highdanger("СМАТЫВАЙСЯ ОТСЮДА!"), EMOTE_AUDIBLE)
/obj/structure/ob_ammo/warhead/explosive
name = "\improper HE orbital warhead"
warhead_kind = "explosive"
+ warhead_kind_rus = "взрывной"
icon_state = "ob_warhead_1"
var/explosion_power = 1425
var/explosion_falloff = 90
@@ -403,6 +405,7 @@
/obj/structure/ob_ammo/warhead/incendiary
name = "\improper Incendiary orbital warhead"
warhead_kind = "incendiary"
+ warhead_kind_rus = "зажигательный"
icon_state = "ob_warhead_2"
var/flame_range_num
var/flame_intensity = 36
@@ -420,6 +423,7 @@
/obj/structure/ob_ammo/warhead/cluster
name = "\improper Cluster orbital warhead"
warhead_kind = "cluster"
+ warhead_kind_rus = "кластер"
icon_state = "ob_warhead_3"
var/cluster_amount = 25
var/cluster_power = 240
@@ -441,6 +445,7 @@
/obj/structure/ob_ammo/warhead/plasmaloss
name = "\improper Plasma draining orbital warhead"
warhead_kind = "plasma"
+ warhead_kind_rus = "Т-ГАЗ"
icon_state = "ob_warhead_4"
var/smoke_radius = 25
var/smoke_duration = 3 SECONDS
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 5f89017d467..f9b1853850e 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -402,6 +402,8 @@ A good representation is: 'byond applies a volume reduction to the sound every X
S = pick('sound/voice/predator/pain_rare1.ogg')
if("pred_warcry")
S = pick('sound/voice/predator/warcry.ogg')
+ if("pred_laugh")
+ S = pick('sound/voice/predator/laugh1.ogg', 'sound/voice/predator/laugh2.ogg', 'sound/voice/predator/laugh3.ogg', 'sound/voice/predator/laugh4.ogg')
//pred items
if("clan_sword_hit")
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index e97b048c92f..5053811fdb7 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -682,7 +682,6 @@
var/mob/M = usr
var/chosen = tgui_input_list(usr, "Please, select an area.", "Select an area.", GLOB.sorted_areas, timeout = 0)
- chosen = pick(get_area_turfs(chosen))
var/turf/T = pick(get_area_turfs(chosen))
M.forceMove(T)
diff --git a/code/modules/admin/fun_verbs.dm b/code/modules/admin/fun_verbs.dm
index e901d7167f9..2b5b8a6f09e 100644
--- a/code/modules/admin/fun_verbs.dm
+++ b/code/modules/admin/fun_verbs.dm
@@ -155,7 +155,7 @@
if("Yes")
priority_announce(input, customname, customsubtitle, sound = 'sound/AI/commandreport.ogg', color_override = override);
if("No")
- priority_announce("New update available at all communication consoles.", "Classified Transmission Received", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/commandreport.ogg')
+ priority_announce("Новое объявление доступно на всех консолях связи.", "Получена конфиденциальная передача", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/commandreport.ogg')
else
return
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index f4ad78eea8e..ab5ec796610 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -657,7 +657,7 @@ Status: [status ? status : "Unknown"] | Damage: [health ? health : "None"]
return
SSticker.mode.distress_cancelled = TRUE
- priority_announce("The distress signal has been blocked, the launch tubes are now recalibrating.", "Distress Beacon")
+ priority_announce("Сигнал бедствия заблокирован. Пусковые трубы перекалибруются.", "Сигнал Бедствия", sound = 'sound/AI/distressbeaconlocked.ogg')
log_admin("[key_name(usr)] has denied a distress beacon, requested by [key_name(M)]")
message_admins("[ADMIN_TPMONTY(usr)] has denied a distress beacon, requested by [ADMIN_TPMONTY(M)]")
diff --git a/code/modules/clothing/modular_armor/attachments/modules.dm b/code/modules/clothing/modular_armor/attachments/modules.dm
index 5904906526a..45b6781c7f1 100644
--- a/code/modules/clothing/modular_armor/attachments/modules.dm
+++ b/code/modules/clothing/modular_armor/attachments/modules.dm
@@ -177,14 +177,14 @@
*/
/obj/item/armor_module/module/mimir_environment_protection
name = "\improper Mark 2 Mimir Environmental Resistance System"
- desc = "Designed for mounting on modular armor. This newer model provides great resistance to acid, biological, and radiological attacks. Pairing this with a Mimir helmet module and mask will make the user impervious to xeno gas clouds. Will impact mobility."
+ desc = "Designed for mounting on modular armor. This newer model provides great resistance to acid, biological, and radiological attacks. Pairing this with a Mimir helmet module and mask will make the user impervious to any gas clouds. Will impact mobility."
icon = 'icons/mob/modular/modular_armor_modules.dmi'
icon_state = "mod_biohazard"
item_state = "mod_biohazard_a"
- soft_armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 10)
+ soft_armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 25)
slowdown = 0.2
slot = ATTACHMENT_SLOT_MODULE
- ///siemens coefficient mod for gas protection.
+ ///siemens (electro resist) coefficient mod for gas protection.
var/siemens_coefficient_mod = -0.9
///permeability coefficient mod for gas protection.
var/permeability_coefficient_mod = -1
@@ -205,11 +205,13 @@
/obj/item/armor_module/module/mimir_environment_protection/mark1
name = "\improper Mark 1 Mimir Environmental Resistance System"
- desc = "Designed for mounting on modular armor. This older model provides minor resistance to acid, biological, and radiological attacks. Pairing this with a Mimir helmet module and mask will make the user impervious to xeno gas clouds. Will impact mobility."
+ desc = "Designed for mounting on modular armor. This older model provides minor resistance to acid, biological, and radiological attacks. Pairing this with a Mimir helmet module and mask will make the user almost impervious to any gas clouds. Will impact mobility."
icon_state = "mod_biohazard"
item_state = "mod_biohazard_a"
- soft_armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 5, FIRE = 0, ACID = 5)
+ soft_armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 5, FIRE = 0, ACID = 10)
slowdown = 0.3
+ permeability_coefficient_mod = -0.5
+ gas_transfer_coefficient_mod = -0.5
//SOM version
/obj/item/armor_module/module/mimir_environment_protection/som
@@ -220,20 +222,20 @@
//soft_armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 25, FIRE = 0, ACID = 20)
/obj/item/armor_module/module/mimir_environment_protection/mimir_helmet
- name = "Mimir Environmental Helmet System"
- desc = "Designed for mounting on a modular helmet. Provides good resistance to xeno gas clouds"
+ name = "Mark 2 Mimir Environmental Helmet System"
+ desc = "Designed for mounting on a modular helmet. Provides good resistance to xeno gas clouds."
icon = 'icons/mob/modular/modular_armor_modules.dmi'
icon_state = "mimir_head"
item_state = "mimir_head_a"
variants_by_parent_type = list(/obj/item/clothing/head/modular/m10x = "mimir_head_xn")
- soft_armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 10)
+ soft_armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 25)
slowdown = 0
slot = ATTACHMENT_SLOT_HEAD_MODULE
-/obj/item/armor_module/module/mimir_environment_protection/mimir_helmet/mark1 //gas protection
+/obj/item/armor_module/module/mimir_environment_protection/mimir_helmet/mark1
name = "Mark 1 Mimir Environmental Helmet System"
- desc = "Designed for mounting on a modular helmet. This older model provides minor resistance to acid and biological attacks. Pairing this with a Mimir suit module and mask will make the user impervious to xeno gas clouds."
- soft_armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 5, FIRE = 0, ACID = 5)
+ desc = "Designed for mounting on a modular helmet. This older model provides minor resistance to acid and biological attacks."
+ soft_armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 5, FIRE = 0, ACID = 10)
//Explosive defense armor
/obj/item/armor_module/module/hlin_explosive_armor
diff --git a/code/modules/clothing/modular_armor/attachments/uniform.dm b/code/modules/clothing/modular_armor/attachments/uniform.dm
index 359ac95a346..84eafdcc7ea 100644
--- a/code/modules/clothing/modular_armor/attachments/uniform.dm
+++ b/code/modules/clothing/modular_armor/attachments/uniform.dm
@@ -81,9 +81,7 @@
/obj/item/bodybag,
/obj/item/roller,
/obj/item/whistle,
- //RUTGMC EDIT ADDITION BEGIN - SOLDERING_TOOL
/obj/item/tool/surgery/solderingtool,
- //RUTGMC EDIT ADDITION END
)
/obj/item/armor_module/storage/uniform/surgery_webbing
diff --git a/code/modules/clothing/modular_armor/combat_robot.dm b/code/modules/clothing/modular_armor/combat_robot.dm
index e15a93edc32..5326bc06233 100644
--- a/code/modules/clothing/modular_armor/combat_robot.dm
+++ b/code/modules/clothing/modular_armor/combat_robot.dm
@@ -47,6 +47,37 @@
to_chat(user, span_warning("You can't equip this as it requires mounting bolts on your body!"))
return FALSE
+//---- Medium armor with attachments
+/obj/item/clothing/suit/modular/robot/hodgrenades
+ starting_attachments = list(
+ /obj/item/armor_module/module/ballistic_armor,
+ /obj/item/armor_module/storage/grenade,
+ )
+
+/obj/item/clothing/suit/modular/robot/lightgeneral
+ starting_attachments = list(
+ /obj/item/armor_module/module/better_shoulder_lamp,
+ /obj/item/armor_module/storage/general,
+ )
+
+/obj/item/clothing/suit/modular/robot/lightengineer
+ starting_attachments = list(
+ /obj/item/armor_module/module/better_shoulder_lamp,
+ /obj/item/armor_module/storage/engineering,
+ )
+
+/obj/item/clothing/suit/modular/robot/lightinjector
+ starting_attachments = list(
+ /obj/item/armor_module/module/better_shoulder_lamp,
+ /obj/item/armor_module/storage/injector,
+ )
+
+/obj/item/clothing/suit/modular/robot/svalinn
+ starting_attachments = list(
+ /obj/item/armor_module/module/eshield,
+ /obj/item/armor_module/storage/general,
+ )
+
/obj/item/clothing/suit/modular/robot/light
name = "XR-1-L armor plating"
desc = "Light armor plating designed for self mounting on TerraGov combat robotics. It has self-sealing bolts for mounting on robotic owners inside."
@@ -54,6 +85,19 @@
slowdown = SLOWDOWN_ARMOR_VERY_LIGHT
greyscale_config = /datum/greyscale_config/robot/light
+//---- Light armor with attachments
+/obj/item/clothing/suit/modular/robot/light/baldur_medical
+ starting_attachments = list(
+ /obj/item/armor_module/module/better_shoulder_lamp,
+ /obj/item/armor_module/storage/medical,
+ )
+
+/obj/item/clothing/suit/modular/robot/light/baldur_general
+ starting_attachments = list(
+ /obj/item/armor_module/module/better_shoulder_lamp,
+ /obj/item/armor_module/storage/general,
+ )
+
/obj/item/clothing/suit/modular/robot/heavy
name = "XR-1-H armor plating"
desc = "Heavy armor plating designed for self mounting on TerraGov combat robotics. It has self-sealing bolts for mounting on robotic owners inside."
@@ -61,6 +105,19 @@
slowdown = SLOWDOWN_ARMOR_HEAVY
greyscale_config = /datum/greyscale_config/robot/heavy
+//---- Heavy armor with attachments
+/obj/item/clothing/suit/modular/robot/heavy/tyr_onegeneral
+ starting_attachments = list(
+ /obj/item/armor_module/module/tyr_extra_armor/mark1,
+ /obj/item/armor_module/storage/general,
+ )
+
+/obj/item/clothing/suit/modular/robot/heavy/lightengineer
+ starting_attachments = list(
+ /obj/item/armor_module/module/better_shoulder_lamp,
+ /obj/item/armor_module/storage/engineering,
+ )
+
/obj/item/clothing/suit/modular/robot/heavy/tyr
starting_attachments = list(
/obj/item/armor_module/module/tyr_extra_armor,
@@ -112,13 +169,22 @@
starting_attachments = list(/obj/item/armor_module/storage/helmet, /obj/item/armor_module/armor/visor/marine/robot)
flags_item_map_variant = ITEM_JUNGLE_VARIANT|ITEM_ICE_VARIANT|ITEM_DESERT_VARIANT
-
/obj/item/clothing/head/modular/robot/mob_can_equip(mob/user, slot, warning = TRUE, override_nodrop = FALSE, bitslot = FALSE)
. = ..()
if(!isrobot(user))
to_chat(user, span_warning("You can't equip this as it requires mounting bolts on your body!"))
return FALSE
+//---- Medium helmets with attachments
+/obj/item/clothing/head/modular/robot/hod
+ starting_attachments = list(/obj/item/armor_module/storage/helmet, /obj/item/armor_module/armor/visor/marine/robot, /obj/item/armor_module/module/hod_head)
+
+/obj/item/clothing/head/modular/robot/antenna
+ starting_attachments = list(/obj/item/armor_module/storage/helmet, /obj/item/armor_module/armor/visor/marine/robot/heavy, /obj/item/armor_module/module/antenna)
+
+/obj/item/clothing/head/modular/robot/motion_detector
+ starting_attachments = list(/obj/item/armor_module/storage/helmet, /obj/item/armor_module/armor/visor/marine/robot/heavy, /obj/item/armor_module/module/motion_detector)
+
/obj/item/clothing/head/modular/robot/light
name = "XN-1-L upper armor plating"
desc = "Light armor plating designed for self mounting on the upper half of TerraGov combat robotics. It has self-sealing bolts for mounting on robotic owners inside."
@@ -126,6 +192,9 @@
soft_armor = list(MELEE = 40, BULLET = 55, LASER = 55, ENERGY = 50, BOMB = 40, BIO = 45, FIRE = 45, ACID = 50)
greyscale_config = /datum/greyscale_config/robot/light
+/obj/item/clothing/head/modular/robot/light/motion_detector
+ starting_attachments = list(/obj/item/armor_module/storage/helmet, /obj/item/armor_module/armor/visor/marine/robot/light, /obj/item/armor_module/module/motion_detector)
+
/obj/item/clothing/head/modular/robot/heavy
name = "XN-1-H upper armor plating"
desc = "Heavy armor plating designed for self mounting on the upper half of TerraGov combat robotics. It has self-sealing bolts for mounting on robotic owners inside."
diff --git a/code/modules/clothing/modular_armor/xenonauten.dm b/code/modules/clothing/modular_armor/xenonauten.dm
index 7c22869979f..86d17709e2f 100644
--- a/code/modules/clothing/modular_armor/xenonauten.dm
+++ b/code/modules/clothing/modular_armor/xenonauten.dm
@@ -44,18 +44,42 @@
allowed_uniform_type = /obj/item/clothing/under
+/obj/item/clothing/suit/modular/xenonauten/hodgrenades
+ starting_attachments = list(
+ /obj/item/armor_module/module/ballistic_armor,
+ /obj/item/armor_module/storage/grenade,
+ )
+
/obj/item/clothing/suit/modular/xenonauten/engineer
starting_attachments = list(
/obj/item/armor_module/module/better_shoulder_lamp,
/obj/item/armor_module/storage/engineering,
)
+/obj/item/clothing/suit/modular/xenonauten/lightmedical
+ starting_attachments = list(
+ /obj/item/armor_module/module/better_shoulder_lamp,
+ /obj/item/armor_module/storage/medical,
+ )
+
+/obj/item/clothing/suit/modular/xenonauten/lightgeneral
+ starting_attachments = list(
+ /obj/item/armor_module/module/better_shoulder_lamp,
+ /obj/item/armor_module/storage/general,
+ )
+
/obj/item/clothing/suit/modular/xenonauten/mimir
starting_attachments = list(
/obj/item/armor_module/module/mimir_environment_protection/mark1,
/obj/item/armor_module/storage/general,
)
+/obj/item/clothing/suit/modular/xenonauten/mimirinjector
+ starting_attachments = list(
+ /obj/item/armor_module/module/mimir_environment_protection/mark1,
+ /obj/item/armor_module/storage/injector,
+ )
+
/obj/item/clothing/suit/modular/xenonauten/shield
starting_attachments = list(
/obj/item/armor_module/module/eshield,
@@ -81,6 +105,12 @@
/obj/item/armor_module/storage/medical,
)
+/obj/item/clothing/suit/modular/xenonauten/light/lightmedical
+ starting_attachments = list(
+ /obj/item/armor_module/module/better_shoulder_lamp,
+ /obj/item/armor_module/storage/medical,
+ )
+
/obj/item/clothing/suit/modular/xenonauten/heavy
name = "\improper Xenonauten-H pattern armored vest"
desc = "A XN-H vest, also known as Xenonauten, a set vest with modular attachments made to work in many enviroments. This one seems to be a heavy variant. Alt-Click to remove attached items. Use it to toggle the built-in flashlight."
@@ -88,12 +118,24 @@
slowdown = SLOWDOWN_ARMOR_HEAVY
greyscale_config = /datum/greyscale_config/xenonaut/heavy
+/obj/item/clothing/suit/modular/xenonauten/heavy/mimirengi
+ starting_attachments = list(
+ /obj/item/armor_module/module/mimir_environment_protection/mark1,
+ /obj/item/armor_module/storage/engineering,
+ )
+
/obj/item/clothing/suit/modular/xenonauten/heavy/leader
starting_attachments = list(
/obj/item/armor_module/module/valkyrie_autodoc,
/obj/item/armor_module/storage/medical,
)
+/obj/item/clothing/suit/modular/xenonauten/heavy/tyr_onegeneral
+ starting_attachments = list(
+ /obj/item/armor_module/module/tyr_extra_armor/mark1,
+ /obj/item/armor_module/storage/general,
+ )
+
/obj/item/clothing/suit/modular/xenonauten/heavy/tyr_one
starting_attachments = list(
/obj/item/armor_module/module/tyr_extra_armor/mark1,
@@ -106,6 +148,12 @@
/obj/item/armor_module/storage/medical,
)
+/obj/item/clothing/suit/modular/xenonauten/heavy/grenadier //Literally grenades
+ starting_attachments = list(
+ /obj/item/armor_module/module/ballistic_armor,
+ /obj/item/armor_module/storage/grenade,
+ )
+
/obj/item/clothing/suit/modular/xenonauten/heavy/surt
starting_attachments = list(
/obj/item/armor_module/module/fire_proof,
@@ -177,9 +225,21 @@
visorless_offset_y = 0
+/obj/item/clothing/head/modular/m10x/hod
+ starting_attachments = list(/obj/item/armor_module/storage/helmet, /obj/item/armor_module/module/hod_head)
+
+/obj/item/clothing/head/modular/m10x/freyr
+ starting_attachments = list(/obj/item/armor_module/storage/helmet, /obj/item/armor_module/module/artemis)
+
+/obj/item/clothing/head/modular/m10x/antenna
+ starting_attachments = list(/obj/item/armor_module/storage/helmet, /obj/item/armor_module/module/antenna)
+
/obj/item/clothing/head/modular/m10x/welding
starting_attachments = list(/obj/item/armor_module/storage/helmet, /obj/item/armor_module/module/welding)
+/obj/item/clothing/head/modular/m10x/superiorwelding
+ starting_attachments = list(/obj/item/armor_module/storage/helmet, /obj/item/armor_module/module/welding/superior)
+
/obj/item/clothing/head/modular/m10x/mimir
starting_attachments = list(/obj/item/armor_module/storage/helmet, /obj/item/armor_module/module/mimir_environment_protection/mimir_helmet/mark1)
diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm
index d7b87ec67aa..ff4630c8b27 100644
--- a/code/modules/clothing/under/marine_uniform.dm
+++ b/code/modules/clothing/under/marine_uniform.dm
@@ -19,6 +19,21 @@
/obj/item/clothing/under/marine/black_vest
starting_attachments = list(/obj/item/armor_module/storage/uniform/black_vest)
+/obj/item/clothing/under/marine/brown_vest
+ starting_attachments = list(/obj/item/armor_module/storage/uniform/brown_vest)
+
+/obj/item/clothing/under/marine/corpman_vest
+ starting_attachments = list(/obj/item/armor_module/storage/uniform/white_vest)
+
+/obj/item/clothing/under/marine/black_vest
+ starting_attachments = list(/obj/item/armor_module/storage/uniform/black_vest)
+
+/obj/item/clothing/under/marine/brown_vest
+ starting_attachments = list(/obj/item/armor_module/storage/uniform/brown_vest)
+
+/obj/item/clothing/under/marine/holster
+ starting_attachments = list(/obj/item/armor_module/storage/uniform/holster)
+
//Squad colored turtlenecks
/obj/item/clothing/under/marine/squad/neck
name = "\improper TGMC Delta turtleneck"
@@ -526,9 +541,21 @@
to_chat(user, span_warning("You can't equip this as it requires mounting screws on your body!"))
return FALSE
-/obj/item/clothing/under/marine/robotic/webbing
+/obj/item/clothing/under/marine/robotic/black_vest
starting_attachments = list(/obj/item/armor_module/storage/uniform/black_vest)
+/obj/item/clothing/under/marine/robotic/brown_vest
+ starting_attachments = list(/obj/item/armor_module/storage/uniform/brown_vest)
+
+/obj/item/clothing/under/marine/robotic/corpman_vest
+ starting_attachments = list(/obj/item/armor_module/storage/uniform/white_vest)
+
+/obj/item/clothing/under/marine/robotic/webbing
+ starting_attachments = list(/obj/item/armor_module/storage/uniform/webbing)
+
+/obj/item/clothing/under/marine/robotic/holster
+ starting_attachments = list(/obj/item/armor_module/storage/uniform/holster)
+
/obj/item/clothing/under/marine/squad/neck/foreign
name = "\improper TGMC Foreign Legion turtleneck"
desc = "Tacticool looking, squad issued uniform. This one belongs to the Foreign Legion, smells like fast food."
diff --git a/code/modules/events/intel_computer.dm b/code/modules/events/intel_computer.dm
index 626b5d96b59..5b91384aa14 100644
--- a/code/modules/events/intel_computer.dm
+++ b/code/modules/events/intel_computer.dm
@@ -22,5 +22,5 @@
/datum/round_event/intel_computer/proc/activate(obj/machinery/computer/intel_computer/I)
I.active = TRUE
I.update_minimap_icon()
- priority_announce("Our data sifting algorithm has detected valuable classified information on a access point in [get_area(I)]. Should this data be recovered by ground forces, a reward will be given in the form of increased assets.", title = "TGMC Intel Division")
- xeno_message("We sense a looming threat from [get_area(I)]. We must keep the hosts away from there.")
+ priority_announce("Обнаружена ценная информация в [get_area(I)]. Если эти данные будут восстановлены наземными силами, будет выдано вознаграждение.", title = "Отдел Разведки UPP", sound = 'sound/AI/bonus_found.ogg')
+ xeno_message("Кажется в [get_area(I)] есть что-то полезное для морпехов. Следует держать их подальше от этого места.")
diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm
index a86ea68c7e6..c9924fd4516 100644
--- a/code/modules/events/ion_storm.dm
+++ b/code/modules/events/ion_storm.dm
@@ -23,12 +23,12 @@
addtimer(CALLBACK(src, PROC_REF(fix_comms)), comms_knockout_timer MINUTES)
/datum/round_event/ion_storm/announce()
- var/alert = pick( "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you*%fj00)`5vc-BZZT",
- "Ionospheric anomalies detected. Temporary telecommunication failu*3mga;b4;'1v¬-BZZZT",
- "Ionospheric anomalies detected. Temporary telec#MCi46:5.;@63-BZZZZT",
- "Ionospheric anomalies dete'fZ\\kg5_0-BZZZZZT",
- "Ionospheri:%£ MCayj^j<.3-BZZZZZZT",
- "#4nd%;f4y6,>£%-BZZZZZZZT",
+ var/alert = pick( "Обнаружена ионосферная аномалия. Сбой связи неизбежен. Пожалуйста, свяжитесь с ваши*%fj00)`5vc",
+ "Обнаружена ионосферная аномалия. Сбой связи неизб*3mga;b4;'1v¬",
+ "Обнаружена ионосферная аномалия. Сбой свя#MCi46:5.;@63",
+ "Обнаружена ионосферная аномал'fZ\\kg5_0",
+ "Обнаружена ионосфер:%£ MCayj^j<.3",
+ "#4nd%;f4y6,>£%",
)
priority_announce(alert)
diff --git a/code/modules/events/stock_uptick.dm b/code/modules/events/stock_uptick.dm
index 34dfc1855a1..0a9a2954989 100644
--- a/code/modules/events/stock_uptick.dm
+++ b/code/modules/events/stock_uptick.dm
@@ -19,4 +19,4 @@
if(points_to_be_added > 1250) //cap the max amount of points at 1250
points_to_be_added = 1250
SSpoints.supply_points[FACTION_TERRAGOV] += points_to_be_added
- priority_announce("Due to an increase in Nanotrasen quarterly revenues, our supply allotment has increased by [points_to_be_added] points.")
+ priority_announce("В связи с ростом квартальной выручки Nanotrasen наш объем поставок увеличился на [points_to_be_added] очков.", sound = 'sound/AI/supply_increase.ogg')
diff --git a/code/modules/events/supply_drop.dm b/code/modules/events/supply_drop.dm
index 969abe3025c..a5679b24cdf 100644
--- a/code/modules/events/supply_drop.dm
+++ b/code/modules/events/supply_drop.dm
@@ -29,7 +29,7 @@
///sets the target for this event, and notifies the hive
/datum/round_event/supply_drop/proc/set_target(turf/target_turf)
var/supplying_faction = pick(SSticker.mode.factions)
- priority_announce("Friendly supply drop arriving in AO in [drop_delay / 600] minutes. Drop zone at [target_turf.loc].", "Bluespace Tactical Scanner Status", sound = 'sound/AI/distressreceived.ogg', receivers = (GLOB.alive_human_list_faction[supplying_faction] + GLOB.observer_list))
+ priority_announce("Союзный груз прибудет через [drop_delay / 600] минут. Место посадки - [target_turf.loc].", "Статус Тактического Блюспейс Сканера", sound = 'sound/AI/sup_drop.ogg', receivers = (GLOB.alive_human_list_faction[supplying_faction] + GLOB.observer_list))
addtimer(CALLBACK(src, PROC_REF(alert_hostiles), target_turf, supplying_faction), alert_delay)
addtimer(CALLBACK(src, PROC_REF(drop_supplies), target_turf, supplying_faction), drop_delay)
@@ -40,12 +40,12 @@
if(alerted_human.faction == supplying_faction)
humans_to_alert -= alerted_human
- priority_announce("Incoming [supplying_faction] supply drop detected, ETA [(drop_delay - alert_delay) / 600] minutes. Drop zone estimated as [target_turf.loc].", "Bluespace Tactical Scanner Status", sound = 'sound/AI/distressreceived.ogg', receivers = (humans_to_alert + GLOB.observer_list))
+ priority_announce("На подходе груз [supplying_faction]. Прибудет через [(drop_delay - alert_delay) / 600] минут. Место - [target_turf.loc].", "Статус Тактического Блюспейс Сканера", sound = 'sound/AI/sup_drop_enemy.ogg', receivers = (humans_to_alert + GLOB.observer_list))
///deploys the actual supply drop
/datum/round_event/supply_drop/proc/drop_supplies(turf/target_turf, faction)
- priority_announce("[faction] supply drop Materialisation detected at [target_turf.loc].", "Bluespace Tactical Scanner Status", sound = 'sound/AI/distressreceived.ogg', receivers = (GLOB.alive_human_list + GLOB.observer_list))
+ priority_announce("Обнаружена поставка от [faction] в [target_turf.loc].", "Статус Тактического Блюспейс Сканера", sound = 'sound/AI/sup_drop_act.ogg', receivers = (GLOB.alive_human_list + GLOB.observer_list))
new /obj/item/explosive/grenade/flare/on(target_turf)
switch(faction)
if(FACTION_SOM)
diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm
index 133f833c7a2..6650e50e4c1 100644
--- a/code/modules/language/language_holder.dm
+++ b/code/modules/language/language_holder.dm
@@ -111,6 +111,10 @@
/datum/language_holder/xeno
languages = list(/datum/language/xenocommon)
+/datum/language_holder/hivemind
+ languages = list(/datum/language/xenocommon)
+ shadow_languages = list(/datum/language/common)
+
/datum/language_holder/universal/New()
. = ..()
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index f17ca637602..ec4b8235c5f 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -299,7 +299,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
if(tier != XENO_TIER_MINION && hivenumber == XENO_HIVE_NORMAL)
GLOB.key_to_time_of_xeno_death[ghost.key] = world.time //If you ghost as a xeno that is not a minion, sets respawn timer
-
/mob/dead/observer/Move(atom/newloc, direct, glide_size_override = 32)
if(updatedir)
setDir(direct)//only update dir if we actually need it, so overlays won't spin on base sprites that don't have directions of their own
@@ -654,9 +653,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
if(!istype(target))
return
- var/icon/I = icon(target.icon, target.icon_state, target.dir)
-
- var/orbitsize = (I.Width() + I.Height()) * 0.5
+ var/list/icon_dimensions = get_icon_dimensions(target.icon)
+ var/orbitsize = (icon_dimensions["width"] + icon_dimensions["height"]) * 0.5
orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25)
var/rot_seg
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote/human.dm
similarity index 77%
rename from code/modules/mob/living/carbon/human/emote.dm
rename to code/modules/mob/living/carbon/human/emote/human.dm
index 4c9d351fbc2..49ba1eb59a4 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote/human.dm
@@ -1,31 +1,26 @@
/datum/emote/living/carbon/human
mob_type_allowed_typecache = /mob/living/carbon/human
-
/datum/emote/living/carbon/human/run_emote(mob/living/carbon/human/user, params, type_override, intentional = FALSE, prefix)
var/paygrade = user.get_paygrade()
if(paygrade)
prefix = "[paygrade] "
return ..()
-
/datum/emote/living/carbon/human/blush
key = "blush"
key_third_person = "blushes"
message = "blushes."
-
/datum/emote/living/carbon/human/blink
key = "blink"
key_third_person = "blinks"
message = "blinks."
-
/datum/emote/living/carbon/human/blink_r
key = "blinkr"
message = "blinks rapidly."
-
/datum/emote/living/carbon/human/bow
key = "bow"
key_third_person = "bows"
@@ -33,21 +28,18 @@
message_param = "bows to %t."
flags_emote = EMOTE_RESTRAINT_CHECK
-
/datum/emote/living/carbon/human/chuckle
key = "chuckle"
key_third_person = "chuckles"
message = "chuckles."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/cross
key = "cross"
key_third_person = "crosses"
message = "crosses their arms."
flags_emote = EMOTE_RESTRAINT_CHECK
-
/datum/emote/living/carbon/human/clap
key = "clap"
key_third_person = "claps"
@@ -56,28 +48,24 @@
emote_type = EMOTE_AUDIBLE
sound = 'sound/misc/clap.ogg'
-
/datum/emote/living/carbon/human/collapse
key = "collapse"
key_third_person = "collapses"
message = "collapses!"
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/collapse/run_emote(mob/living/carbon/human/user, params, type_override, intentional = FALSE, prefix)
. = ..()
if(!.)
return
user.Unconscious(4 SECONDS)
-
/datum/emote/living/carbon/human/cough
key = "cough"
key_third_person = "coughs"
message = "coughs!"
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/cough/get_sound(mob/living/carbon/human/user)
if(!user.species)
return
@@ -86,44 +74,37 @@
if(user.species.coughs[NEUTER])
return user.species.coughs[NEUTER]
-
/datum/emote/living/carbon/human/cry
key = "cry"
key_third_person = "cries"
message = "cries."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/drool
key = "drool"
key_third_person = "drools"
message = "drools."
-
/datum/emote/living/carbon/human/eyebrow
key = "eyebrow"
message = "raises an eyebrow."
-
/datum/emote/living/carbon/human/faint
key = "faint"
key_third_person = "faints"
message = "faints."
-
/datum/emote/living/carbon/human/faint/run_emote(mob/living/carbon/human/user, params, type_override, intentional = FALSE, prefix)
. = ..()
if(!.)
return
user.AdjustSleeping(1 SECONDS)
-
/datum/emote/living/carbon/human/frown
key = "frown"
key_third_person = "frowns"
message = "frowns."
-
/datum/emote/living/carbon/human/gasp
key = "gasp"
key_third_person = "gasps"
@@ -131,7 +112,6 @@
emote_type = EMOTE_AUDIBLE
stat_allowed = UNCONSCIOUS
-
/datum/emote/living/carbon/human/gasp/get_sound(mob/living/carbon/human/user)
if(!user.species)
return
@@ -146,7 +126,6 @@
message = "giggles."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/glare
key = "glare"
key_third_person = "glares"
@@ -154,26 +133,22 @@
message_param = "glares at %t."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/yawn
key = "yawn"
key_third_person = "yawns"
message = "yawns."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/wave
key = "wave"
key_third_person = "waves"
message = "waves."
-
/datum/emote/living/carbon/human/twitch
key = "twitch"
key_third_person = "twitches"
message = "twitches."
-
/datum/emote/living/carbon/human/snore
key = "snore"
key_third_person = "snores"
@@ -181,38 +156,32 @@
emote_type = EMOTE_AUDIBLE
stat_allowed = UNCONSCIOUS
-
/datum/emote/living/carbon/human/smile
key = "smile"
key_third_person = "smiles"
message = "smiles."
-
/datum/emote/living/carbon/human/smug
key = "smug"
key_third_person = "smugs"
message = "grins smugly."
-
/datum/emote/living/carbon/human/stare
key = "stare"
key_third_person = "stares"
message = "stares."
message_param = "stares at %t."
-
/datum/emote/living/carbon/human/strech
key = "stretch"
key_third_person = "stretches"
message = "stretches their arms."
-
/datum/emote/living/carbon/human/sulk
key = "sulk"
key_third_person = "sulks"
message = "sulks down sadly."
-
/datum/emote/living/carbon/human/surrender
key = "surrender"
key_third_person = "surrenders"
@@ -221,10 +190,12 @@
/datum/emote/living/carbon/human/surrender/run_emote(mob/user, params, type_override, intentional)
. = ..()
- if(. && isliving(user))
- var/mob/living/L = user
- L.Paralyze(20 SECONDS)
-
+ if(!.)
+ return
+ if(!isliving(user))
+ return
+ var/mob/living/L = user
+ L.Paralyze(20 SECONDS)
/datum/emote/living/carbon/human/sneeze
key = "sneeze"
@@ -232,35 +203,30 @@
message = "sneezes."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/sniff
key = "sniff"
key_third_person = "sniffs"
message = "sniffs."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/shiver
key = "shiver"
key_third_person = "shiver"
message = "shivers."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/scowl
key = "scowl"
key_third_person = "scowls"
message = "scowls."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/sigh
key = "sigh"
key_third_person = "sighs"
message = "sighs."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/sit
key = "sit"
key_third_person = "sits"
@@ -271,28 +237,24 @@
key_third_person = "shrugs"
message = "shrugs."
-
/datum/emote/living/carbon/human/shakehead
key = "shakehead"
key_third_person = "shakeheads"
message = "shakes their head."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/nod
key = "nod"
key_third_person = "nods"
message = "nods."
message_param = "nods at %t."
-
/datum/emote/living/carbon/human/gag
key = "gag"
key_third_person = "gags"
message = "gags."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/glare
key = "glare"
key_third_person = "glares"
@@ -300,26 +262,22 @@
message_param = "glares at %t."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/grin
key = "grin"
key_third_person = "grins"
message = "grins."
-
/datum/emote/living/carbon/human/grimace
key = "grimace"
key_third_person = "grimaces"
message = "grimaces."
-
/datum/emote/living/carbon/human/jump
key = "jump"
key_third_person = "jumps"
message = "jumps!"
flags_emote = EMOTE_RESTRAINT_CHECK
-
/datum/emote/living/carbon/human/grumble
key = "grumble"
key_third_person = "grumbles"
@@ -333,14 +291,12 @@
message_param = "blows a kiss to %t."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/signal
key = "signal"
key_third_person = "signals"
message_param = "raises %t fingers."
flags_emote = EMOTE_RESTRAINT_CHECK
-
/datum/emote/living/carbon/human/signal/select_param(mob/user, params)
params = text2num(params)
if(params == 1 || !isnum(params))
@@ -348,33 +304,25 @@
params = num2text(clamp(params, 2, 10))
return ..()
-
/datum/emote/living/carbon/human/mumble
key = "mumble"
key_third_person = "mumbles"
message = "mumbles!"
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/moan
key = "moan"
key_third_person = "moans"
message = "moans!"
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/laugh
key = "laugh"
key_third_person = "laughs"
message = "laughs."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/laugh/get_sound(mob/living/carbon/human/user)
-
- if(isyautja(user))
- return pick('sound/voice/predator/laugh1.ogg', 'sound/voice/predator/laugh2.ogg', 'sound/voice/predator/laugh3.ogg', 'sound/voice/predator/laugh4.ogg')
-
if(!user?.species?.laughs)
return
if(user.species.laughs[user.gender])
@@ -396,7 +344,6 @@
if(user.species.warcries[NEUTER])
return user.species.warcries[NEUTER]
-
/datum/emote/living/carbon/human/warcry/run_emote(mob/user, params, type_override, intentional = FALSE, prefix)
. = ..()
if(!.)
@@ -420,14 +367,12 @@
flags_emote = EMOTE_RESTRAINT_CHECK
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/look
key = "look"
key_third_person = "looks"
message = "looks."
message_param = "looks at %t."
-
/datum/emote/living/carbon/human/handshake
key = "handshake"
message = "shakes their own hands."
@@ -435,7 +380,6 @@
flags_emote = EMOTE_RESTRAINT_CHECK
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/salute
key = "salute"
key_third_person = "salutes"
@@ -444,7 +388,6 @@
flags_emote = EMOTE_RESTRAINT_CHECK
sound = 'sound/misc/salute.ogg'
-
/datum/emote/living/carbon/human/golfclap
key = "golfclap"
key_third_person = "golfclaps"
@@ -452,21 +395,18 @@
flags_emote = EMOTE_RESTRAINT_CHECK
sound = 'sound/misc/golfclap.ogg'
-
/datum/emote/living/carbon/human/pout
key = "pout"
key_third_person = "pouts"
message = "pouts."
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/scream
key = "scream"
key_third_person = "screams"
message = "screams!"
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/scream/get_sound(mob/living/carbon/human/user)
if(!user.species)
return
@@ -475,7 +415,6 @@
if(user.species.screams[NEUTER])
return user.species.screams[NEUTER]
-
/datum/emote/living/carbon/human/scream/run_emote(mob/user, params, type_override, intentional = FALSE, prefix)
. = ..()
if(!.)
@@ -483,14 +422,20 @@
var/image/scream = image('icons/mob/talk.dmi', user, icon_state = "scream")
user.add_emote_overlay(scream)
-
/datum/emote/living/carbon/human/medic
key = "medic"
message = "calls for a medic!"
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/medic/get_sound(mob/living/carbon/human/user)
+ if(isrobot(user))
+ if(user.gender == MALE)
+ if(prob(95))
+ return 'sound/voice/robotic/male_medic.ogg'
+ else
+ return 'sound/voice/robotic/male_medic2.ogg'
+ else
+ return 'sound/voice/robotic/female_medic.ogg'
if(user.gender == MALE)
if(prob(95))
return 'sound/voice/human/male/medic.ogg'
@@ -499,7 +444,6 @@
else
return 'sound/voice/human/female/medic.ogg'
-
/datum/emote/living/carbon/human/medic/run_emote(mob/user, params, type_override, intentional = FALSE, prefix)
. = ..()
if(!.)
@@ -507,13 +451,11 @@
var/image/medic = image('icons/mob/talk.dmi', user, icon_state = "medic")
user.add_emote_overlay(medic)
-
/datum/emote/living/carbon/human/pain
key = "pain"
message = "cries out in pain!"
emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/carbon/human/pain/get_sound(mob/living/carbon/human/user)
if(!user.species)
return
@@ -522,7 +464,6 @@
if(user.species.paincries[NEUTER])
return user.species.paincries[NEUTER]
-
/datum/emote/living/carbon/human/pain/run_emote(mob/user, params, type_override, intentional = FALSE, prefix)
. = ..()
if(!.)
@@ -530,14 +471,12 @@
var/image/pain = image('icons/mob/talk.dmi', user, icon_state = "pain")
user.add_emote_overlay(pain)
-
/datum/emote/living/carbon/human/gored
key = "gored"
message = "gags out in pain!"
emote_type = EMOTE_AUDIBLE
flags_emote = EMOTE_FORCED_AUDIO
-
/datum/emote/living/carbon/human/gored/get_sound(mob/living/carbon/human/user)
if(!user.species)
return
@@ -546,7 +485,6 @@
if(user.species.goredcries[NEUTER])
return user.species.goredcries[NEUTER]
-
/datum/emote/living/carbon/human/gored/run_emote(mob/user, params, type_override, intentional = FALSE, prefix)
. = ..()
if(!.)
@@ -554,7 +492,6 @@
var/image/pain = image('icons/mob/talk.dmi', user, icon_state = "pain")
user.add_emote_overlay(pain)
-
/datum/emote/living/carbon/human/burstscream
key = "burstscream"
message = "screams in agony!"
@@ -562,7 +499,6 @@
flags_emote = EMOTE_FORCED_AUDIO
stat_allowed = UNCONSCIOUS
-
/datum/emote/living/carbon/human/burstscream/get_sound(mob/living/carbon/human/user)
if(!user.species)
return
@@ -571,7 +507,6 @@
if(user.species.burstscreams[NEUTER])
return user.species.burstscreams[NEUTER]
-
/datum/emote/living/carbon/human/burstscream/run_emote(mob/user, params, type_override, intentional = FALSE, prefix)
. = ..()
if(!.)
@@ -587,7 +522,6 @@
else
return 'sound/misc/human_male_sneeze_1.ogg'
-
/datum/emote/living/carbon/human/sigh/get_sound(mob/living/user)
if(isrobot(user))
return
@@ -596,7 +530,6 @@
else
return 'sound/voice/human/male/sigh_1.ogg'
-
/datum/emote/living/carbon/human/giggle/get_sound(mob/living/user)
if(isrobot(user))
if(user.gender == FEMALE)
@@ -608,7 +541,6 @@
else
return 'sound/voice/human/male/giggle_1.ogg'
-
/datum/emote/living/carbon/human/yawn/get_sound(mob/living/user)
if(isrobot(user))
return
@@ -617,7 +549,6 @@
else
return 'sound/voice/human/male/yawn_1.ogg'
-
/datum/emote/living/carbon/human/moan/get_sound(mob/living/user)
if(isrobot(user))
return
@@ -626,7 +557,6 @@
else
return 'sound/voice/human/male/moan_1.ogg'
-
/datum/emote/living/carbon/human/cry/get_sound(mob/living/user)
if(isrobot(user))
return
@@ -635,17 +565,6 @@
else
return 'sound/voice/human/male/cry_1.ogg'
-/datum/emote/living/carbon/human/medic/get_sound(mob/living/carbon/human/user)
- if(isrobot(user))
- if(user.gender == MALE)
- if(prob(95))
- return 'sound/voice/robotic/male_medic.ogg'
- else
- return 'sound/voice/robotic/male_medic2.ogg'
- else
- return 'sound/voice/robotic/female_medic.ogg'
- return ..()
-
/datum/emote/living/carbon/human/whistle
key = "whistle"
key_third_person = "whistles"
@@ -664,163 +583,3 @@
emote_type = EMOTE_AUDIBLE
flags_emote = EMOTE_RESTRAINT_CHECK|EMOTE_MUZZLE_IGNORE|EMOTE_ARMS_CHECK
sound = 'sound/misc/sound_misc_knuckles.ogg'
-
-//Robotic
-
-/datum/emote/living/carbon/robot
- mob_type_allowed_typecache = list(/mob/living/carbon/human/species/robot, /mob/living/carbon/human/species/synthetic, /mob/living/carbon/human/species/early_synthetic)
-
-/datum/emote/living/carbon/robot/dwoop
- key = "dwoop"
- key_third_person = "dwoops"
- message = "pips happily!"
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/voice/robotic/dwoop.ogg'
-
-/datum/emote/living/carbon/robot/yes
- key = "yes"
- message = "emits an affirmative blip."
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/voice/robotic/synth_yes.ogg'
-
-/datum/emote/living/carbon/robot/no
- key = "no"
- message = "emits a negative blip."
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/voice/robotic/synth_no.ogg'
-
-/datum/emote/living/carbon/robot/buzz
- key = "buzz"
- key_third_person = "buzzes"
- message = "buzzes."
- message_param = "buzzes at %t."
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/machines/buzz-sigh.ogg'
-
-/datum/emote/living/carbon/robot/buzz2
- key = "buzz2"
- message = "buzzes twice."
- message_param = "buzzes twice at %t."
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/machines/buzz-two.ogg'
-
-/datum/emote/living/carbon/robot/beep
- key = "beep"
- message = "beeps sharply."
- message_param = "beeps sharply at %t."
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/machines/twobeep.ogg'
-
-/datum/emote/living/carbon/robot/chime
- key = "chime"
- key_third_person = "chimes"
- message = "chimes."
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/machines/chime.ogg'
-
-/datum/emote/living/carbon/robot/honk
- key = "honk"
- key_third_person = "honks"
- message = "honks."
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/items/bikehorn.ogg'
-
-/datum/emote/living/carbon/robot/ping
- key = "ping"
- key_third_person = "pings"
- message = "pings."
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/machines/ping.ogg'
-
-/datum/emote/living/carbon/robot/sad
- key = "sad"
- message = "plays a sad trombone..."
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/misc/sadtrombone.ogg'
-
-/datum/emote/living/carbon/robot/warn
- key = "warn"
- key_third_person = "warns"
- message = "blares an alarm!"
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/machines/warning-buzzer.ogg'
-
-/datum/emote/living/carbon/robot/laughtrack
- key = "laughtrack"
- message = "plays a laughtrack."
- emote_type = EMOTE_AUDIBLE
-
-/datum/emote/living/carbon/robot/laughtrack/get_sound(mob/living/user)
- return pick('sound/voice/robotic/sitcomLaugh1.ogg', 'sound/voice/robotic/sitcomLaugh2.ogg')
-
-//Neco Ark
-
-/datum/emote/living/carbon/necoarc
- mob_type_allowed_typecache = /mob/living/carbon/human/species/necoarc
-
-/datum/emote/living/carbon/necoarc/mudamuda
- key = "muda"
- key_third_person = "muda muda"
- message = "Muda Muda"
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/voice/necoarc/Neco Muda muDa.ogg'
-
-
-/datum/emote/living/carbon/necoarc/bubu //then add to the grenade throw
- key = "bubu"
- key_third_person = "bu bu"
- message = "bu buuu"
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/voice/necoarc/Neco bu buuu.ogg'
-
-
-/datum/emote/living/carbon/necoarc/dori
- key = "dori"
- key_third_person = "dori dori dori"
- message = "dori dori dori"
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/voice/necoarc/Neco dori dori dori.ogg'
-
-
-/datum/emote/living/carbon/necoarc/sayesa
- key = "sa"
- key_third_person = "sa yesa"
- message = "Sa Yesa!"
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/voice/necoarc/Neco Sa Yesa 1.ogg'
-
-
-/datum/emote/living/carbon/necoarc/sayesa/two
- key = "sa2"
- key_third_person = "sa yesa2"
- sound = 'sound/voice/necoarc/Neco Sa Yesa 2.ogg'
-
-
-/datum/emote/living/carbon/necoarc/yanyan
- key = "yanyan"
- key_third_person = "yanyan yaan"
- message = "yanyan yaan"
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/voice/necoarc/Neco yanyan yaan.ogg'
-
-
-/datum/emote/living/carbon/necoarc/nya
- key = "nya"
- message = "nya"
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/voice/necoarc/Neco-Arc sound effect.ogg'
-
-
-/datum/emote/living/carbon/necoarc/isa
- key = "isa"
- message = "iiiiisAAAAA!"
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/voice/necoarc/Neco iiiiisAAAAA.ogg'
-
-
-/datum/emote/living/carbon/necoarc/qahu
- key = "qahu"
- key_third_person = "quiajuuu"
- message = "qahuuuuu!"
- emote_type = EMOTE_AUDIBLE
- sound = 'sound/voice/necoarc/Neco quiajuuubn.ogg'
diff --git a/code/modules/mob/living/carbon/human/emote/necoarc.dm b/code/modules/mob/living/carbon/human/emote/necoarc.dm
new file mode 100644
index 00000000000..c8bf886e077
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/emote/necoarc.dm
@@ -0,0 +1,61 @@
+/datum/emote/living/carbon/necoarc
+ mob_type_allowed_typecache = /mob/living/carbon/human/species/necoarc
+
+/datum/emote/living/carbon/necoarc/mudamuda
+ key = "muda"
+ key_third_person = "muda muda"
+ message = "Muda Muda"
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/voice/necoarc/Neco Muda muDa.ogg'
+
+/datum/emote/living/carbon/necoarc/bubu //then add to the grenade throw
+ key = "bubu"
+ key_third_person = "bu bu"
+ message = "bu buuu"
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/voice/necoarc/Neco bu buuu.ogg'
+
+/datum/emote/living/carbon/necoarc/dori
+ key = "dori"
+ key_third_person = "dori dori dori"
+ message = "dori dori dori"
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/voice/necoarc/Neco dori dori dori.ogg'
+
+/datum/emote/living/carbon/necoarc/sayesa
+ key = "sa"
+ key_third_person = "sa yesa"
+ message = "Sa Yesa!"
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/voice/necoarc/Neco Sa Yesa 1.ogg'
+
+/datum/emote/living/carbon/necoarc/sayesa/two
+ key = "sa2"
+ key_third_person = "sa yesa2"
+ sound = 'sound/voice/necoarc/Neco Sa Yesa 2.ogg'
+
+/datum/emote/living/carbon/necoarc/yanyan
+ key = "yanyan"
+ key_third_person = "yanyan yaan"
+ message = "yanyan yaan"
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/voice/necoarc/Neco yanyan yaan.ogg'
+
+/datum/emote/living/carbon/necoarc/nya
+ key = "nya"
+ message = "nya"
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/voice/necoarc/Neco-Arc sound effect.ogg'
+
+/datum/emote/living/carbon/necoarc/isa
+ key = "isa"
+ message = "iiiiisAAAAA!"
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/voice/necoarc/Neco iiiiisAAAAA.ogg'
+
+/datum/emote/living/carbon/necoarc/qahu
+ key = "qahu"
+ key_third_person = "quiajuuu"
+ message = "qahuuuuu!"
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/voice/necoarc/Neco quiajuuubn.ogg'
diff --git a/code/modules/mob/living/carbon/human/emote/robot.dm b/code/modules/mob/living/carbon/human/emote/robot.dm
new file mode 100644
index 00000000000..f89743dbe04
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/emote/robot.dm
@@ -0,0 +1,88 @@
+/datum/emote/living/carbon/robot // isn't actually robot only
+ mob_type_allowed_typecache = list(/mob/living/carbon/human/species/robot, /mob/living/carbon/human/species/synthetic, /mob/living/carbon/human/species/early_synthetic)
+
+/datum/emote/living/carbon/robot/dwoop
+ key = "dwoop"
+ key_third_person = "dwoops"
+ message = "pips happily!"
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/voice/robotic/dwoop.ogg'
+
+/datum/emote/living/carbon/robot/yes
+ key = "yes"
+ message = "emits an affirmative blip."
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/voice/robotic/synth_yes.ogg'
+
+/datum/emote/living/carbon/robot/no
+ key = "no"
+ message = "emits a negative blip."
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/voice/robotic/synth_no.ogg'
+
+/datum/emote/living/carbon/robot/buzz
+ key = "buzz"
+ key_third_person = "buzzes"
+ message = "buzzes."
+ message_param = "buzzes at %t."
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/machines/buzz-sigh.ogg'
+
+/datum/emote/living/carbon/robot/buzz2
+ key = "buzz2"
+ message = "buzzes twice."
+ message_param = "buzzes twice at %t."
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/machines/buzz-two.ogg'
+
+/datum/emote/living/carbon/robot/beep
+ key = "beep"
+ message = "beeps sharply."
+ message_param = "beeps sharply at %t."
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/machines/twobeep.ogg'
+
+/datum/emote/living/carbon/robot/chime
+ key = "chime"
+ key_third_person = "chimes"
+ message = "chimes."
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/machines/chime.ogg'
+
+/datum/emote/living/carbon/robot/honk
+ key = "honk"
+ key_third_person = "honks"
+ message = "honks."
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/items/bikehorn.ogg'
+
+/datum/emote/living/carbon/robot/ping
+ key = "ping"
+ key_third_person = "pings"
+ message = "pings."
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/machines/ping.ogg'
+
+/datum/emote/living/carbon/robot/sad
+ key = "sad"
+ message = "plays a sad trombone..."
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/misc/sadtrombone.ogg'
+
+/datum/emote/living/carbon/robot/warn
+ key = "warn"
+ key_third_person = "warns"
+ message = "blares an alarm!"
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/machines/warning-buzzer.ogg'
+
+/datum/emote/living/carbon/robot/laughtrack
+ key = "laughtrack"
+ message = "plays a laughtrack."
+ emote_type = EMOTE_AUDIBLE
+
+/datum/emote/living/carbon/robot/laughtrack/get_sound(mob/living/user)
+ return pick('sound/voice/robotic/sitcomLaugh1.ogg', 'sound/voice/robotic/sitcomLaugh2.ogg')
+
+/datum/emote/living/carbon/robot/sneeze/get_sound(mob/living/user)
+ return
diff --git a/code/modules/mob/living/carbon/human/emote-yautja.dm b/code/modules/mob/living/carbon/human/emote/yautja.dm
similarity index 66%
rename from code/modules/mob/living/carbon/human/emote-yautja.dm
rename to code/modules/mob/living/carbon/human/emote/yautja.dm
index fe38dbbfa23..eea2d4f2bb6 100644
--- a/code/modules/mob/living/carbon/human/emote-yautja.dm
+++ b/code/modules/mob/living/carbon/human/emote/yautja.dm
@@ -1,108 +1,108 @@
-/datum/emote/living/carbon/human/species/yautja
+/datum/emote/living/carbon/human/yautja
mob_type_allowed_typecache = /mob/living/carbon/human/species/yautja
-/datum/emote/living/carbon/human/species/yautja/anytime
+/datum/emote/living/carbon/human/yautja/anytime
key = "anytime"
sound = 'sound/voice/predator/anytime.ogg'
key_third_person = "anytime"
message = "any time"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/click
+/datum/emote/living/carbon/human/yautja/click
key = "click"
key_third_person = "click"
message = "clicks"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/click/get_sound(mob/living/user)
- if(rand(0,100) < 50)
+/datum/emote/living/carbon/human/yautja/click/get_sound(mob/living/user)
+ if(prob(50))
return 'sound/voice/predator/click1.ogg'
else
return 'sound/voice/predator/click2.ogg'
-/datum/emote/living/carbon/human/species/yautja/helpme
+/datum/emote/living/carbon/human/yautja/helpme
key = "helpme"
sound = 'sound/voice/predator/helpme.ogg'
key_third_person = "helpme"
message = "help me!"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/iseeyou
+/datum/emote/living/carbon/human/yautja/iseeyou
key = "iseeyou"
sound = 'sound/hallucinations/i_see_you2.ogg'
key_third_person = "iseeyou"
message = "i see you!"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/itsatrap
+/datum/emote/living/carbon/human/yautja/itsatrap
key = "itsatrap"
sound = 'sound/voice/predator/itsatrap.ogg'
key_third_person = "itsatrap"
message = "it's a trap!"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/laugh1
+/datum/emote/living/carbon/human/yautja/laugh1
key = "laugh1"
sound = 'sound/voice/predator/laugh1.ogg'
key_third_person = "laugh1"
message = "laughs"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/laugh2
+/datum/emote/living/carbon/human/yautja/laugh2
key = "laugh2"
sound = 'sound/voice/predator/laugh2.ogg'
key_third_person = "laugh2"
message = "laughs"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/laugh3
+/datum/emote/living/carbon/human/yautja/laugh3
key = "laugh3"
sound = 'sound/voice/predator/laugh3.ogg'
key_third_person = "laugh3"
message = "laughs"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/laugh4
+/datum/emote/living/carbon/human/yautja/laugh4
key = "laugh4"
sound = 'sound/voice/predator/laugh4.ogg'
key_third_person = "laugh4"
message = "laughs"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/overhere
+/datum/emote/living/carbon/human/yautja/overhere
key = "overhere"
sound = 'sound/voice/predator/overhere.ogg'
key_third_person = "overhere"
message = "over here!"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/predroar
+/datum/emote/living/carbon/human/yautja/predroar
key = "predroar"
key_third_person = "predroars"
message = "roars!"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/predroar/get_sound(mob/living/user)
+/datum/emote/living/carbon/human/yautja/predroar/get_sound(mob/living/user)
return pick('sound/voice/predator/roar1.ogg', 'sound/voice/predator/roar2.ogg')
-/datum/emote/living/carbon/human/species/yautja/predroar2
+/datum/emote/living/carbon/human/yautja/predroar2
key = "predroar2"
key_third_person = "predroars2"
sound = 'sound/voice/predator/roar3.ogg'
message = "roars!"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/loudroar
+/datum/emote/living/carbon/human/yautja/loudroar
key = "loudroar"
key_third_person = "loudroar"
message = "roars loudly!"
cooldown = 120 SECONDS
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/loudroar/get_sound(mob/living/user)
+/datum/emote/living/carbon/human/yautja/loudroar/get_sound(mob/living/user)
return pick('sound/voice/predator/roar4.ogg', 'sound/voice/predator/roar5.ogg')
-/datum/emote/living/carbon/human/species/yautja/loudroar/run_emote(mob/user, params, type_override, intentional)
+/datum/emote/living/carbon/human/yautja/loudroar/run_emote(mob/user, params, type_override, intentional)
. = ..()
if(!.)
return
@@ -114,55 +114,55 @@
var/final_dir = dir2text(relative_dir)
to_chat(current_mob, span_highdanger("You hear a loud roar coming from [final_dir ? "the [final_dir]" : "nearby"]!"))
-/datum/emote/living/carbon/human/species/yautja/turnaround
+/datum/emote/living/carbon/human/yautja/turnaround
key = "turnaround"
key_third_person = "turnaround"
message = "turn around!"
sound = 'sound/voice/predator/turnaround.ogg'
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/click2
+/datum/emote/living/carbon/human/yautja/click2
key = "click2"
key_third_person = "click2"
message = "clicks"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/click2/get_sound(mob/living/user)
+/datum/emote/living/carbon/human/yautja/click2/get_sound(mob/living/user)
return pick('sound/voice/predator/click3.ogg', 'sound/voice/predator/click4.ogg')
-/datum/emote/living/carbon/human/species/yautja/aliengrowl
+/datum/emote/living/carbon/human/yautja/aliengrowl
key = "aliengrowl"
key_third_person = "aliengrowl"
message = "growls!"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/aliengrowl/get_sound(mob/living/user)
+/datum/emote/living/carbon/human/yautja/aliengrowl/get_sound(mob/living/user)
return pick('sound/voice/alien/growl1.ogg', 'sound/voice/alien/growl2.ogg')
-/datum/emote/living/carbon/human/species/yautja/alienhelp
+/datum/emote/living/carbon/human/yautja/alienhelp
key = "alienhelp"
key_third_person = "alienhelp"
message = "needs help!"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/alienhelp/get_sound(mob/living/user)
+/datum/emote/living/carbon/human/yautja/alienhelp/get_sound(mob/living/user)
return pick('sound/voice/alien/help1.ogg', 'sound/voice/alien/help2.ogg')
-/datum/emote/living/carbon/human/species/yautja/comeonout
+/datum/emote/living/carbon/human/yautja/comeonout
key = "comeonout"
key_third_person = "comeonout"
message = "come on out!"
sound = 'sound/voice/predator/come_on_out.ogg'
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/overthere
+/datum/emote/living/carbon/human/yautja/overthere
key = "overthere"
key_third_person = "overthere"
message = "over there!"
sound = 'sound/voice/predator/over_there.ogg'
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/carbon/human/species/yautja/uglyfreak
+/datum/emote/living/carbon/human/yautja/uglyfreak
key = "uglyfreak"
key_third_person = "uglyfreak"
message = "ugly freak!"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 8b96aeb7f44..1af8d9e277a 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -647,8 +647,6 @@
species.create_organs(src)
- dextrous = species.has_fine_manipulation
-
if(species.default_language_holder)
language_holder = new species.default_language_holder(src)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 6d39327ffe2..53434f60987 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -27,7 +27,7 @@
return TRUE
if(istype(wear_mask, /obj/item/clothing/mask/facehugger) && H != src)
- H.stripPanelUnequip(wear_mask, src, SLOT_WEAR_MASK)
+ H.stripPanelUnequip(wear_mask, src, SLOT_WEAR_MASK, BUSY_ICON_FACEHUGGER)
return TRUE
if(health >= get_crit_threshold())
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 2d8022f688b..01ec5561f83 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -11,7 +11,7 @@
buckle_flags = CAN_BE_BUCKLED|CAN_BUCKLE
resistance_flags = XENO_DAMAGEABLE
appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE
-
+ dextrous = TRUE
hud_type = /datum/hud/human
/// Used for preventing possible lags in the med_hud_set_status(), yes it's ugly
@@ -107,9 +107,7 @@
///Auras we can create, used for the order choice UI.
var/static/list/command_aura_allowed = list(AURA_HUMAN_MOVE, AURA_HUMAN_HOLD, AURA_HUMAN_FOCUS)
- ///Whether we can use another command order yet. Either null or a timer ID.
- var/command_aura_cooldown
-
+ ///Strength of the move order aura affecting us
var/mobility_aura = 0
var/protection_aura = 0
var/marksman_aura = 0
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index da0bd8d546d..d060114e32a 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -253,3 +253,27 @@
var/datum/internal_organ/organ = get_organ_slot(string)
internal_organs_by_name -= string
internal_organs -= organ
+
+/// Does something. Unshitcode me.
+/mob/living/carbon/human/proc/disable_special_items()
+ set waitfor = FALSE // Scout decloak animation uses sleep(), which is problematic for taser gun
+
+ if(istype(back, /obj/item/storage/backpack/marine/satchel/scout_cloak))
+ var/obj/item/storage/backpack/marine/satchel/scout_cloak/SC = back
+ if(SC.camo_active)
+ SC.camo_off(src)
+ return
+ var/list/cont = list()
+ for(var/atom/A in contents)
+ cont += A
+ if(A.contents.len)
+ cont += A.contents
+
+ for(var/i in cont)
+ if(istype(i, /obj/item/assembly/prox_sensor))
+ var/obj/item/assembly/prox_sensor/prox = i
+ if(prox.scanning)
+ prox.toggle_scan()
+ if(istype(i, /obj/item/attachable/motiondetector))
+ var/obj/item/attachable/motiondetector/md = i
+ md.clean_operator()
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 0c86358fa4f..cef924ff4b3 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -535,20 +535,21 @@
else if(equipped_item == s_store)
. = SLOT_S_STORE
-/mob/living/carbon/human/stripPanelUnequip(obj/item/I, mob/M, slot_to_process)
+/mob/living/carbon/human/stripPanelUnequip(obj/item/I, mob/M, slot_to_process, display_icon = BUSY_ICON_HOSTILE)
if(!I.canStrip(M))
return
log_combat(src, M, "attempted to remove [key_name(I)] ([slot_to_process])")
M.visible_message(span_danger("[src] tries to remove [M]'s [I.name]."), \
- span_userdanger("[src] tries to remove [M]'s [I.name]."), null, 5)
- if(do_after(src, HUMAN_STRIP_DELAY, NONE, M, BUSY_ICON_HOSTILE))
- if(Adjacent(M) && I && I == M.get_item_by_slot(slot_to_process))
- M.dropItemToGround(I)
- log_combat(src, M, "removed [key_name(I)] ([slot_to_process])")
- if(isidcard(I))
- message_admins("[ADMIN_TPMONTY(src)] took the [I] of [ADMIN_TPMONTY(M)].")
-
+ span_userdanger("[src] tries to remove [M]'s [I.name]."), null, 5)
+ if(!do_after(src, HUMAN_STRIP_DELAY, NONE, M, display_icon))
+ return
+ if(!Adjacent(M)|| !I || I != M.get_item_by_slot(slot_to_process))
+ return
+ M.dropItemToGround(I)
+ log_combat(src, M, "removed [key_name(I)] ([slot_to_process])")
+ if(isidcard(I))
+ message_admins("[ADMIN_TPMONTY(src)] took the [I] of [ADMIN_TPMONTY(M)].")
/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE, client/override_client)
var/datum/outfit/O = null
@@ -564,7 +565,6 @@
return O.equip(src, visualsOnly, override_client)
-
/mob/living/carbon/human/proc/delete_equipment(save_id = FALSE)
for(var/i in contents)
if(save_id && istype(i, /obj/item/card/id))
diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm
index 315802ffd1e..7cd08a9ca78 100644
--- a/code/modules/mob/living/carbon/human/login.dm
+++ b/code/modules/mob/living/carbon/human/login.dm
@@ -1,6 +1,4 @@
/mob/living/carbon/human/Login()
. = ..()
- species?.handle_login_special(src)
-
if(HAS_TRAIT(src, TRAIT_IS_RESURRECTING))
to_chat(src, span_notice("You are resurrecting, hold still..."))
diff --git a/code/modules/mob/living/carbon/human/logout.dm b/code/modules/mob/living/carbon/human/logout.dm
index fc7f485cd30..9be08269203 100644
--- a/code/modules/mob/living/carbon/human/logout.dm
+++ b/code/modules/mob/living/carbon/human/logout.dm
@@ -1,6 +1,5 @@
/mob/living/carbon/human/Logout()
. = ..()
- species?.handle_logout_special(src)
if(!key)
set_afk_status(MOB_DISCONNECTED)
else if(!isclientedaghost(src))
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
deleted file mode 100644
index c2701dbe6d4..00000000000
--- a/code/modules/mob/living/carbon/human/species.dm
+++ /dev/null
@@ -1,1055 +0,0 @@
-/*
- Datum-based species. Should make for much cleaner and easier to maintain species code.
-*/
-///TODO SPLIT THIS INTO MULTIPLE FILES
-
-/datum/species
- ///Species name
- var/name
- var/name_plural
- ///what kind of species it is considered
- var/species_type = SPECIES_HUMAN
-
- ///Normal icon file
- var/icobase = 'icons/mob/human_races/r_human.dmi'
- ///icon state for calculating brute damage icons
- var/brute_damage_icon_state = "human_brute"
- ///icon state for calculating brute damage icons
- var/burn_damage_icon_state = "human_burn"
- ///damage mask icon we want to use when drawing wounds
- var/damage_mask_icon = 'icons/mob/dam_mask.dmi'
- ///If set, draws this from icobase when mob is prone.
- var/prone_icon
- ///icon for eyes
- var/eyes = "eyes_s"
-
- var/datum/unarmed_attack/unarmed // For empty hand harm-intent attack
- var/datum/unarmed_attack/secondary_unarmed // For empty hand harm-intent attack if the first fails.
- var/datum/hud_data/hud
- var/hud_type
- var/slowdown = 0
- var/taste_sensitivity = TASTE_NORMAL
- var/gluttonous // Can eat some mobs. 1 for monkeys, 2 for people.
- var/rarity_value = 1 // Relative rarity/collector value for this species. Only used by ninja and cultists atm.
- var/datum/unarmed_attack/unarmed_type = /datum/unarmed_attack
- var/secondary_unarmed_type = /datum/unarmed_attack/bite
- var/default_language_holder = /datum/language_holder
- var/speech_verb_override
- var/secondary_langs = list() // The names of secondary languages that are available to this species.
- var/list/speech_sounds // A list of sounds to potentially play when speaking.
- var/list/speech_chance
- var/has_fine_manipulation = TRUE // Can use small items.
- var/count_human = FALSE // Does this count as a human?
-
- ///Inventory slots the race can't equip stuff to. Golems cannot wear jumpsuits, for example.
- var/list/no_equip = list()
-
- // Some species-specific gibbing data.
- var/gibbed_anim = "gibbed-h"
- var/dusted_anim = "dust-h"
- var/remains_type = /obj/effect/decal/cleanable/ash
- var/death_sound
- var/death_message = "seizes up and falls limp, their eyes dead and lifeless..."
-
- /// new maxHealth [/mob/living/carbon/human/var/maxHealth] of the human mob once species is applied
- var/total_health = 100
- var/max_stamina = 50
-
- var/cold_level_1 = BODYTEMP_COLD_DAMAGE_LIMIT_ONE // Cold damage level 1 below this point.
- var/cold_level_2 = BODYTEMP_COLD_DAMAGE_LIMIT_TWO // Cold damage level 2 below this point.
- var/cold_level_3 = BODYTEMP_COLD_DAMAGE_LIMIT_THREE // Cold damage level 3 below this point.
-
- var/heat_level_1 = BODYTEMP_HEAT_DAMAGE_LIMIT_ONE // Heat damage level 1 above this point.
- var/heat_level_2 = BODYTEMP_HEAT_DAMAGE_LIMIT_TWO // Heat damage level 2 above this point.
- var/heat_level_3 = BODYTEMP_HEAT_DAMAGE_LIMIT_THREE // Heat damage level 2 above this point.
-
- var/body_temperature = BODYTEMP_NORMAL //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing)
- var/reagent_tag //Used for metabolizing reagents.
-
- var/darksight = 2
-
- var/brute_mod = null // Physical damage reduction/malus.
- var/burn_mod = null // Burn damage reduction/malus.
-
- ///Whether this mob will tell when the user has logged out
- var/is_sentient = TRUE
-
- ///Generic traits tied to having the species.
- var/list/inherent_traits = list()
- var/species_flags = NONE // Various specific features.
-
- var/list/preferences = list()
- var/list/screams = list()
- var/list/paincries = list()
- var/list/goredcries = list()
- var/list/gasps = list()
- var/list/coughs = list()
- var/list/burstscreams = list()
- var/list/warcries = list()
- var/list/laughs = list()
-
- var/blood_color = "#A10808" //Red.
- var/flesh_color = "#FFC896" //Pink.
- var/base_color //Used when setting species.
- var/hair_color //If the species only has one hair color
-
- //Used in icon caching.
- var/race_key = 0
- var/icon/icon_template
-
- /// inherent Species-specific verbs.
- var/list/inherent_verbs
- /// inherent species-specific actions
- var/list/inherent_actions
- var/list/has_organ = list(
- ORGAN_SLOT_HEART = /datum/internal_organ/heart,
- ORGAN_SLOT_LUNGS = /datum/internal_organ/lungs,
- ORGAN_SLOT_LIVER = /datum/internal_organ/liver,
- ORGAN_SLOT_STOMACH = /datum/internal_organ/stomach,
- ORGAN_SLOT_KIDNEYS = /datum/internal_organ/kidneys,
- ORGAN_SLOT_BRAIN = /datum/internal_organ/brain,
- ORGAN_SLOT_APPENDIX = /datum/internal_organ/appendix,
- ORGAN_SLOT_EYES = /datum/internal_organ/eyes
- )
-
- var/knock_down_reduction = 1 //how much the knocked_down effect is reduced per Life call.
- var/stun_reduction = 1 //how much the stunned effect is reduced per Life call.
- var/knock_out_reduction = 1 //same thing
- var/lighting_alpha
- var/see_in_dark
-
- var/datum/namepool/namepool = /datum/namepool
- var/special_death_message = "You have perished." // Special death message that gets overwritten if possible.
- ///Whether it is possible with this race roundstart
- var/joinable_roundstart = FALSE
-
-/datum/species/New()
- if(hud_type)
- hud = new hud_type()
- else
- hud = new()
-
- if(unarmed_type)
- unarmed = new unarmed_type()
- if(secondary_unarmed_type)
- secondary_unarmed = new secondary_unarmed_type()
- if(species_flags & GREYSCALE_BLOOD)
- brute_damage_icon_state = "grayscale"
-
-/datum/species/proc/create_organs(mob/living/carbon/human/organless_human) //Handles creation of mob organs and limbs.
-
- organless_human.limbs = list()
- organless_human.internal_organs = list()
- organless_human.internal_organs_by_name = list()
-
- //This is a basic humanoid limb setup.
- var/datum/limb/chest/new_chest = new(null, organless_human)
- organless_human.limbs += new_chest
- var/datum/limb/groin/new_groin = new(new_chest, organless_human)
- organless_human.limbs += new_groin
- organless_human.limbs += new/datum/limb/head(new_chest, organless_human)
- var/datum/limb/l_arm/new_l_arm = new(new_chest, organless_human)
- organless_human.limbs += new_l_arm
- var/datum/limb/r_arm/new_r_arm = new(new_chest, organless_human)
- organless_human.limbs += new_r_arm
- var/datum/limb/l_leg/new_l_leg = new(new_groin, organless_human)
- organless_human.limbs += new_l_leg
- var/datum/limb/r_leg/new_r_leg = new(new_groin, organless_human)
- organless_human.limbs += new_r_leg
- organless_human.limbs += new/datum/limb/hand/l_hand(new_l_arm, organless_human)
- organless_human.limbs += new/datum/limb/hand/r_hand(new_r_arm, organless_human)
- organless_human.limbs += new/datum/limb/foot/l_foot(new_l_leg, organless_human)
- organless_human.limbs += new/datum/limb/foot/r_foot(new_r_leg, organless_human)
-
- for(var/datum/internal_organ/organ AS in has_organ)
- var/datum/internal_organ/organ_type = has_organ[organ]
- organless_human.internal_organs_by_name[organ] = new organ_type(organless_human)
-
- if(species_flags & ROBOTIC_LIMBS)
- for(var/datum/limb/robotic_limb AS in organless_human.limbs)
- if(robotic_limb.limb_status & LIMB_DESTROYED)
- continue
- robotic_limb.add_limb_flags(LIMB_ROBOT)
-
-/datum/species/proc/hug(mob/living/carbon/human/H, mob/living/target)
- if(H.zone_selected == "head")
- H.visible_message(span_notice("[H] pats [target] on the head."), \
- span_notice("You pat [target] on the head."), null, 4)
- else if(H.zone_selected == "l_hand" && CONFIG_GET(flag/fun_allowed))
- H.visible_message(span_notice("[H] holds [target] 's left hand."), \
- span_notice("You hold [target]'s left hand."), null, 4)
- else if (H.zone_selected == "r_hand" && CONFIG_GET(flag/fun_allowed))
- H.visible_message(span_notice("[H] holds [target] 's right hand."), \
- span_notice("You hold [target]'s right hand."), null, 4)
- else
- H.visible_message(span_notice("[H] hugs [target] to make [target.p_them()] feel better!"), \
- span_notice("You hug [target] to make [target.p_them()] feel better!"), null, 4)
-
-/datum/species/proc/random_name(gender)
- return GLOB.namepool[namepool].get_random_name(gender)
-
-/datum/species/proc/prefs_name(datum/preferences/prefs)
- return prefs.real_name
-
-/datum/species/human/prefs_name(datum/preferences/prefs)
- . = ..()
- if(CONFIG_GET(flag/humans_need_surnames))
- var/firstspace = findtext(., " ")
- if(!firstspace || firstspace == length(.))
- . += " " + pick(SSstrings.get_list_from_file("names/last_name"))
-
-/datum/species/synthetic/prefs_name(datum/preferences/prefs)
- . = prefs.synthetic_name
- if(!. || . == "Undefined") //In case they don't have a name set.
- switch(prefs.gender)
- if(MALE)
- . = "David"
- if(FEMALE)
- . = "Anna"
- else
- . = "Jeri"
- to_chat(prefs.parent, span_warning("You forgot to set your synthetic name in your preferences. Please do so next time."))
-
-/datum/species/early_synthetic/prefs_name(datum/preferences/prefs)
- . = prefs.synthetic_name
- if(!. || . == "Undefined") //In case they don't have a name set.
- switch(prefs.gender)
- if(MALE)
- . = "David"
- if(FEMALE)
- . = "Anna"
- else
- . = "Jeri"
- to_chat(prefs.parent, span_warning("You forgot to set your synthetic name in your preferences. Please do so next time."))
-
-/datum/species/robot/prefs_name(datum/preferences/prefs)
- . = prefs.squad_robot_name
- if(!. || . == "Undefined") //In case they don't have a name set.
- . = GLOB.namepool[namepool].get_random_name()
- to_chat(prefs.parent, span_warning("You forgot to set your robot in your preferences. Please do so next time."))
-
-/datum/species/proc/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
- SHOULD_CALL_PARENT(TRUE) //remember to call base procs kids
- for(var/slot_id in no_equip)
- var/obj/item/thing = H.get_item_by_slot(slot_id)
- if(thing && !is_type_in_list(src,thing.species_exception))
- H.dropItemToGround(thing)
- for(var/newtrait in inherent_traits)
- ADD_TRAIT(H, newtrait, SPECIES_TRAIT)
- H.maxHealth += total_health - (old_species ? old_species.total_health : initial(H.maxHealth))
-
-//special things to change after we're no longer that species
-/datum/species/proc/post_species_loss(mob/living/carbon/human/H)
- SHOULD_CALL_PARENT(TRUE)
- for(var/oldtrait in inherent_traits)
- REMOVE_TRAIT(H, oldtrait, SPECIES_TRAIT)
-
-/// Removes all species-specific verbs and actions
-/datum/species/proc/remove_inherent_abilities(mob/living/carbon/human/H)
- if(inherent_verbs)
- remove_verb(H, inherent_verbs)
- if(inherent_actions)
- for(var/action_path in inherent_actions)
- var/datum/action/old_species_action = H.actions_by_path[action_path]
- qdel(old_species_action)
- return
-
-/// Adds all species-specific verbs and actions
-/datum/species/proc/add_inherent_abilities(mob/living/carbon/human/H)
- if(inherent_verbs)
- add_verb(H, inherent_verbs)
- if(inherent_actions)
- for(var/action_path in inherent_actions)
- var/datum/action/new_species_action = new action_path(H)
- new_species_action.give_action(H)
- return
-
-/datum/species/proc/handle_post_spawn(mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment.
- add_inherent_abilities(H)
-
-/datum/species/proc/handle_death(mob/living/carbon/human/H) //Handles any species-specific death events.
-
-//TODO KILL ME
-///Snowflake proc for monkeys so they can call attackpaw
-/datum/species/proc/spec_unarmedattack(mob/living/carbon/human/user, atom/target)
- return FALSE
-
-//Only used by horrors at the moment. Only triggers if the mob is alive and not dead.
-/datum/species/proc/handle_unique_behavior(mob/living/carbon/human/H)
- return
-
-/// Used to update alien icons for aliens.
-/datum/species/proc/handle_login_special(mob/living/carbon/human/H)
- return
-
-// As above.
-/datum/species/proc/handle_logout_special(mob/living/carbon/human/H)
- return
-
-// Builds the HUD using species-specific icons and usable slots.
-/datum/species/proc/build_hud(mob/living/carbon/human/H)
- return
-
-// Grabs the window recieved when you click-drag someone onto you.
-/datum/species/proc/get_inventory_dialogue(mob/living/carbon/human/H)
- return
-
-//Used by xenos understanding larvae and dionaea understanding nymphs.
-/datum/species/proc/can_understand(mob/other)
- return
-
-/datum/species/proc/handle_fire(mob/living/carbon/human/H)
- return
-
-/datum/species/proc/update_body(mob/living/carbon/human/H)
- return
-
-/datum/species/proc/update_inv_head(mob/living/carbon/human/H)
- return
-
-/datum/species/proc/update_inv_w_uniform(mob/living/carbon/human/H)
- return
-
-/datum/species/proc/update_inv_wear_suit(mob/living/carbon/human/H)
- return
-
-/datum/species/proc/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
- if(CHECK_BITFIELD(species_flags, NO_CHEM_METABOLIZATION)) //explicit
- H.reagents.del_reagent(chem.type) //for the time being
- return TRUE
- if(CHECK_BITFIELD(species_flags, NO_POISON) && istype(chem, /datum/reagent/toxin))
- H.reagents.remove_reagent(chem.type, chem.custom_metabolism * H.metabolism_efficiency)
- return TRUE
-//RUTGMC EDIT ADDITION BEGIN - Preds
- if(isyautja(H) && istype(chem, /datum/reagent/medicine))
- H.reagents.remove_reagent(chem.type, chem.custom_metabolism * H.metabolism_efficiency)
- return TRUE
-//RUTGMC EDIT ADDITION END
- if(CHECK_BITFIELD(species_flags, NO_OVERDOSE)) //no stacking
- if(chem.overdose_threshold && chem.volume > chem.overdose_threshold)
- H.reagents.remove_reagent(chem.type, chem.volume - chem.overdose_threshold)
- return FALSE
-
-/datum/species/human
- name = "Human"
- name_plural = "Humans"
- unarmed_type = /datum/unarmed_attack/punch
- species_flags = HAS_SKIN_TONE|HAS_LIPS|HAS_UNDERWEAR
- count_human = TRUE
-
- screams = list(MALE = "male_scream", FEMALE = "female_scream")
- paincries = list(MALE = "male_pain", FEMALE = "female_pain")
- goredcries = list(MALE = "male_gored", FEMALE = "female_gored")
- gasps = list(MALE = "male_gasp", FEMALE = "female_gasp")
- coughs = list(MALE = "male_cough", FEMALE = "female_cough")
- burstscreams = list(MALE = "male_preburst", FEMALE = "female_preburst")
- warcries = list(MALE = "male_warcry", FEMALE = "female_warcry")
- laughs = list(MALE = "male_laugh", FEMALE = "female_laugh")
- special_death_message = "You have perished.
But it is not the end of you yet... if you still have your body with your head still attached, wait until somebody can resurrect you..."
- joinable_roundstart = TRUE
-
-
-/datum/species/human/vatborn
- name = "Vatborn"
- name_plural = "Vatborns"
- icobase = 'icons/mob/human_races/r_vatborn.dmi'
- namepool = /datum/namepool/vatborn
-
-/datum/species/human/vatborn/prefs_name(datum/preferences/prefs)
- return prefs.real_name
-
-/datum/species/human/vatgrown
- name = "Vat-Grown Human"
- name_plural = "Vat-Grown Humans"
- icobase = 'icons/mob/human_races/r_vatgrown.dmi'
- brute_mod = 1.05
- burn_mod = 1.05
- slowdown = 0.05
- joinable_roundstart = FALSE
-
-/datum/species/human/vatgrown/random_name(gender)
- return "CS-[gender == FEMALE ? "F": "M"]-[rand(111,999)]"
-
-/datum/species/human/vatgrown/prefs_name(datum/preferences/prefs)
- return prefs.real_name
-
-/datum/species/human/vatgrown/handle_post_spawn(mob/living/carbon/human/H)
- . = ..()
- H.h_style = "Bald"
- H.set_skills(getSkillsType(/datum/skills/vatgrown))
-
-/datum/species/human/vatgrown/early
- name = "Early Vat-Grown Human"
- name_plural = "Early Vat-Grown Humans"
- brute_mod = 1.3
- burn_mod = 1.3
- slowdown = 0.3
-
- var/timerid
-
-/datum/species/human/vatgrown/early/handle_post_spawn(mob/living/carbon/human/H)
- . = ..()
- H.set_skills(getSkillsType(/datum/skills/vatgrown/early))
- timerid = addtimer(CALLBACK(src, PROC_REF(handle_age), H), 15 MINUTES, TIMER_STOPPABLE)
-
-/datum/species/human/vatgrown/early/post_species_loss(mob/living/carbon/human/H)
- . = ..()
- // Ensure we don't update the species again
- if(timerid)
- deltimer(timerid)
- timerid = null
-
-/datum/species/human/vatgrown/early/proc/handle_age(mob/living/carbon/human/H)
- H.set_species("Vat-Grown Human")
-
-
-/datum/species/robot
- name = "Combat Robot"
- name_plural = "Combat Robots"
- species_type = SPECIES_COMBAT_ROBOT
- icobase = 'icons/mob/human_races/r_robot.dmi'
- damage_mask_icon = 'icons/mob/dam_mask_robot.dmi'
- brute_damage_icon_state = "robot_brute"
- burn_damage_icon_state = "robot_burn"
- eyes = "blank_eyes"
- hud_type = /datum/hud_data/robotic
- default_language_holder = /datum/language_holder/robot
- namepool = /datum/namepool/robotic
-
- unarmed_type = /datum/unarmed_attack/punch/strong
- total_health = 100
- slowdown = SHOES_SLOWDOWN //because they don't wear boots.
-
- cold_level_1 = -1
- cold_level_2 = -1
- cold_level_3 = -1
-
- heat_level_1 = 500
- heat_level_2 = 1000
- heat_level_3 = 2000
-
- body_temperature = 350
-
- inherent_traits = list(TRAIT_NON_FLAMMABLE, TRAIT_IMMEDIATE_DEFIB)
- species_flags = NO_BREATHE|NO_BLOOD|NO_POISON|NO_PAIN|NO_CHEM_METABOLIZATION|NO_STAMINA|DETACHABLE_HEAD|HAS_NO_HAIR|ROBOTIC_LIMBS|IS_INSULATED
-
- no_equip = list(
- SLOT_W_UNIFORM,
- SLOT_HEAD,
- SLOT_WEAR_MASK,
- SLOT_WEAR_SUIT,
- SLOT_SHOES,
- SLOT_GLOVES,
- SLOT_GLASSES,
- )
- blood_color = "#2d2055" //"oil" color
- hair_color = "#00000000"
- has_organ = list()
-
-
- screams = list(MALE = "robot_scream", FEMALE = "robot_scream", PLURAL = "robot_scream", NEUTER = "robot_scream")
- paincries = list(MALE = "robot_pain", FEMALE = "robot_pain", PLURAL = "robot_pain", NEUTER = "robot_pain")
- goredcries = list(MALE = "robot_scream", FEMALE = "robot_scream", PLURAL = "robot_scream", NEUTER = "robot_scream")
- warcries = list(MALE = "robot_warcry", FEMALE = "robot_warcry", PLURAL = "robot_warcry", NEUTER = "robot_warcry")
- laughs = list(MALE = "robot_male_laugh", FEMALE = "robot_female_laugh", PLURAL = "robot_male_laugh", NEUTER = "robot_female_laugh")
- death_message = "shudders violently whilst spitting out error text before collapsing, their visual sensor darkening..."
- special_death_message = "You have been shut down.
But it is not the end of you yet... if you still have your body, wait until somebody can resurrect you..."
- joinable_roundstart = FALSE
-
- inherent_actions = list(/datum/action/repair_self)
-
-/datum/species/robot/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
- . = ..()
- H.speech_span = SPAN_ROBOT
- H.health_threshold_crit = -100
-
-/datum/species/robot/post_species_loss(mob/living/carbon/human/H)
- . = ..()
- H.speech_span = initial(H.speech_span)
- H.health_threshold_crit = -50
-
-/datum/species/robot/handle_unique_behavior(mob/living/carbon/human/H)
- if(H.health <= 0 && H.health > -50)
- H.clear_fullscreen("robotlow")
- H.overlay_fullscreen("robothalf", /atom/movable/screen/fullscreen/machine/robothalf)
- else if(H.health <= -50)
- H.clear_fullscreen("robothalf")
- H.overlay_fullscreen("robotlow", /atom/movable/screen/fullscreen/machine/robotlow)
- else
- H.clear_fullscreen("robothalf")
- H.clear_fullscreen("robotlow")
- if(H.health > -25) //Staggerslowed if below crit threshold.
- return
- H.Stagger(2 SECONDS)
- H.adjust_slowdown(1)
-
-///Lets a robot repair itself over time at the cost of being stunned and blind
-/datum/action/repair_self
- name = "Activate autorepair"
- action_icon_state = "suit_configure"
- keybinding_signals = list(
- KEYBINDING_NORMAL = COMSIG_KB_ROBOT_AUTOREPAIR,
- )
-
-/datum/action/repair_self/can_use_action()
- . = ..()
- if(!.)
- return
- return !owner.incapacitated()
-
-/datum/action/repair_self/action_activate()
- . = ..()
- if(!. || !ishuman(owner))
- return
- var/mob/living/carbon/human/howner = owner
- howner.apply_status_effect(STATUS_EFFECT_REPAIR_MODE, 10 SECONDS)
- howner.balloon_alert_to_viewers("Repairing")
-
-/datum/species/robot/alpharii
- name = "Hammerhead Combat Robot"
- name_plural = "Hammerhead Combat Robots"
- icobase = 'icons/mob/human_races/r_robot_alpharii.dmi'
- joinable_roundstart = FALSE
-
-/datum/species/robot/charlit
- name = "Chilvaris Combat Robot"
- name_plural = "Chilvaris Combat Robots"
- icobase = 'icons/mob/human_races/r_robot_charlit.dmi'
- joinable_roundstart = FALSE
-
-/datum/species/robot/deltad
- name = "Ratcher Combat Robot"
- name_plural = "Ratcher Combat Robots"
- icobase = 'icons/mob/human_races/r_robot_deltad.dmi'
- joinable_roundstart = FALSE
-
-/datum/species/robot/bravada
- name = "Sterling Combat Robot"
- name_plural = "Sterling Combat Robots"
- icobase = 'icons/mob/human_races/r_robot_bravada.dmi'
- joinable_roundstart = FALSE
-
-/mob/living/carbon/human/species/robot/binarycheck(mob/H)
- return TRUE
-
-/datum/species/synthetic
- name = "Synthetic"
- name_plural = "Synthetics"
-
- hud_type = /datum/hud_data/robotic
- default_language_holder = /datum/language_holder/synthetic
- unarmed_type = /datum/unarmed_attack/punch
- rarity_value = 2
-
- total_health = 125 //more health than regular humans
-
- brute_mod = 0.70
- burn_mod = 0.70 //Synthetics should not be instantly melted by acid compared to humans - This is a test to hopefully fix very glaring issues involving synthetics taking 2.6 trillion damage when so much as touching acid
-
- cold_level_1 = -1
- cold_level_2 = -1
- cold_level_3 = -1
-
- heat_level_1 = 500
- heat_level_2 = 1000
- heat_level_3 = 2000
-
- body_temperature = 350
-
- species_flags = NO_BREATHE|NO_SCAN|NO_BLOOD|NO_POISON|NO_PAIN|IS_SYNTHETIC|NO_CHEM_METABOLIZATION|NO_STAMINA|DETACHABLE_HEAD|HAS_LIPS|HAS_UNDERWEAR|HAS_SKIN_COLOR|ROBOTIC_LIMBS|GREYSCALE_BLOOD
-
- blood_color = "#EEEEEE"
-
- has_organ = list()
-
- lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
- see_in_dark = 8
-
- screams = list(MALE = "male_scream", FEMALE = "female_scream")
- paincries = list(MALE = "male_pain", FEMALE = "female_pain")
- goredcries = list(MALE = "male_gored", FEMALE = "female_gored")
- warcries = list(MALE = "male_warcry", FEMALE = "female_warcry")
- laughs = list(MALE = "male_laugh", FEMALE = "female_laugh")
- special_death_message = "You have been shut down.
But it is not the end of you yet... if you still have your body, wait until somebody can resurrect you..."
-
-/datum/species/synthetic/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
- . = ..()
- var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED_SYNTH]
- AH.add_hud_to(H)
-
-
-/datum/species/synthetic/post_species_loss(mob/living/carbon/human/H)
- . = ..()
- var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED_SYNTH]
- AH.remove_hud_from(H)
-
-/mob/living/carbon/human/species/synthetic/binarycheck(mob/H)
- return TRUE
-
-/datum/species/early_synthetic // Worse at medical, better at engineering. Tougher in general than later synthetics.
- name = "Early Synthetic"
- name_plural = "Early Synthetics"
- icobase = 'icons/mob/human_races/r_synthetic.dmi'
- hud_type = /datum/hud_data/robotic
- default_language_holder = /datum/language_holder/synthetic
- unarmed_type = /datum/unarmed_attack/punch
- rarity_value = 1.5
- slowdown = 1.15 //Slower than Late Synths.
- total_health = 200 //Tough boys, very tough boys.
- brute_mod = 0.6
- burn_mod = 0.6
-
- cold_level_1 = -1
- cold_level_2 = -1
- cold_level_3 = -1
-
- heat_level_1 = 500
- heat_level_2 = 1000
- heat_level_3 = 2000
-
- body_temperature = 350
-
- species_flags = NO_BREATHE|NO_SCAN|NO_BLOOD|NO_POISON|NO_PAIN|IS_SYNTHETIC|NO_CHEM_METABOLIZATION|NO_STAMINA|DETACHABLE_HEAD|HAS_UNDERWEAR|ROBOTIC_LIMBS|GREYSCALE_BLOOD
-
- blood_color = "#EEEEEE"
- hair_color = "#000000"
- has_organ = list()
-
- lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
- see_in_dark = 8
-
- screams = list(MALE = "male_scream", FEMALE = "female_scream")
- paincries = list(MALE = "male_pain", FEMALE = "female_pain")
- goredcries = list(MALE = "male_gored", FEMALE = "female_gored")
- warcries = list(MALE = "male_warcry", FEMALE = "female_warcry")
- laughs = list(MALE = "male_laugh", FEMALE = "female_laugh")
- special_death_message = "You have been shut down.
But it is not the end of you yet... if you still have your body, wait until somebody can resurrect you..."
-
-/datum/species/early_synthetic/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
- . = ..()
- var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED_SYNTH]
- AH.add_hud_to(H)
-
-
-/datum/species/early_synthetic/post_species_loss(mob/living/carbon/human/H)
- . = ..()
- var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED_SYNTH]
- AH.remove_hud_from(H)
-
-/mob/living/carbon/human/species/early_synthetic/binarycheck(mob/H)
- return TRUE
-
-
-/mob/living/carbon/human/proc/reset_jitteriness() //todo kill this
- jitteriness = 0
-
-//todo: wound overlays are strange for monkeys and should likely use icon adding instead
-//im not about to cram in that refactor with a carbon -> species refactor though
-/datum/species/monkey
- name = "Monkey"
- name_plural = "Monkeys"
- icobase = 'icons/mob/human_races/r_monkey.dmi'
- species_flags = HAS_NO_HAIR|NO_STAMINA|DETACHABLE_HEAD
- inherent_traits = list(TRAIT_CAN_VENTCRAWL)
- reagent_tag = IS_MONKEY
- eyes = "blank_eyes"
- speech_verb_override = "chimpers"
- unarmed_type = /datum/unarmed_attack/bite/strong
- secondary_unarmed_type = /datum/unarmed_attack/punch/strong
- joinable_roundstart = FALSE
- has_fine_manipulation = TRUE //monki gun
- death_message = "lets out a faint chimper as it collapses and stops moving..."
- dusted_anim = "dust-m"
- gibbed_anim = "gibbed-m"
- is_sentient = FALSE
-
-/datum/species/monkey/handle_unique_behavior(mob/living/carbon/human/H)
- if(!H.client && H.stat == CONSCIOUS)
- if(prob(33) && H.canmove && !H.buckled && isturf(H.loc) && !H.pulledby) //won't move if being pulled
- step(H, pick(GLOB.cardinals))
-
- if(prob(1))
- H.emote(pick("scratch","jump","roll","tail"))
-
-/datum/species/monkey/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
- . = ..()
- H.allow_pass_flags |= PASS_LOW_STRUCTURE
-
-/datum/species/monkey/spec_unarmedattack(mob/living/carbon/human/user, atom/target)
- if(!iscarbon(target))
- return FALSE
- var/mob/living/carbon/victim = target
- if(prob(25))
- victim.visible_message(span_danger("[user]'s bite misses [victim]!"),
- span_danger("You avoid [user]'s bite!"), span_hear("You hear jaws snapping shut!"))
- to_chat(user, span_danger("Your bite misses [victim]!"))
- return TRUE
- victim.apply_damage(rand(10, 20), BRUTE, "chest", updating_health = TRUE)
- victim.visible_message(span_danger("[name] bites [victim]!"),
- span_userdanger("[name] bites you!"), span_hear("You hear a chomp!"))
- to_chat(user, span_danger("You bite [victim]!"))
- target.attack_hand(user)
- return TRUE
-
-/datum/species/monkey/random_name(gender,unique,lastname)
- return "[lowertext(name)] ([rand(1,999)])"
-
-/datum/species/monkey/tajara
- name = "Farwa"
- icobase = 'icons/mob/human_races/r_farwa.dmi'
- speech_verb_override = "mews"
-
-/datum/species/monkey/skrell
- name = "Naera"
- icobase = 'icons/mob/human_races/r_naera.dmi'
- speech_verb_override = "squiks"
-
-/datum/species/monkey/unathi
- name = "Stok"
- icobase = 'icons/mob/human_races/r_stok.dmi'
- speech_verb_override = "hisses"
-
-/datum/species/monkey/yiren
- name = "Yiren"
- icobase = 'icons/mob/human_races/r_yiren.dmi'
- speech_verb_override = "grumbles"
- cold_level_1 = ICE_COLONY_TEMPERATURE - 20
- cold_level_2 = ICE_COLONY_TEMPERATURE - 40
- cold_level_3 = ICE_COLONY_TEMPERATURE - 80
-
-/datum/species/sectoid
- name = "Sectoid"
- name_plural = "Sectoids"
- icobase = 'icons/mob/human_races/r_sectoid.dmi'
- default_language_holder = /datum/language_holder/sectoid
- eyes = "blank_eyes"
- speech_verb_override = "transmits"
- count_human = TRUE
- total_health = 80
-
- species_flags = HAS_NO_HAIR|NO_BREATHE|NO_POISON|NO_PAIN|USES_ALIEN_WEAPONS|NO_DAMAGE_OVERLAY
-
- paincries = list("neuter" = 'sound/voice/sectoid_death.ogg')
- death_sound = 'sound/voice/sectoid_death.ogg'
-
- blood_color = "#00FF00"
- flesh_color = "#C0C0C0"
-
- reagent_tag = IS_SECTOID
-
- namepool = /datum/namepool/sectoid
- special_death_message = "You have perished."
-
-/datum/species/moth
- name = "Moth"
- name_plural = "Moth"
- icobase = 'icons/mob/human_races/r_moth.dmi'
- default_language_holder = /datum/language_holder/moth
- eyes = "blank_eyes"
- speech_verb_override = "flutters"
- count_human = TRUE
-
- species_flags = HAS_LIPS|HAS_NO_HAIR
- preferences = list("moth_wings" = "Wings")
-
- screams = list("neuter" = 'sound/voice/moth_scream.ogg')
- paincries = list("neuter" = 'sound/voice/human/male/pain_3.ogg')
- goredcries = list("neuter" = 'sound/voice/moth_scream.ogg')
- burstscreams = list("neuter" = 'sound/voice/moth_scream.ogg')
- warcries = list("neuter" = 'sound/voice/moth_scream.ogg')
- laughs = list("neuter" = 'sound/voice/silly_laugh.ogg')
-
- flesh_color = "#E5CD99"
-
- reagent_tag = IS_MOTH
-
- namepool = /datum/namepool/moth
-
-/datum/species/moth/handle_fire(mob/living/carbon/human/H)
- if(H.moth_wings != "Burnt Off" && H.bodytemperature >= 400 && H.fire_stacks > 0)
- to_chat(H, span_danger("Your precious wings burn to a crisp!"))
- H.moth_wings = "Burnt Off"
- H.update_body()
-
-/datum/species/moth/proc/update_moth_wings(mob/living/carbon/human/H)
- H.remove_overlay(MOTH_WINGS_LAYER)
- H.remove_underlay(MOTH_WINGS_BEHIND_LAYER)
-
- var/datum/sprite_accessory/moth_wings/wings = GLOB.moth_wings_list[H.moth_wings]
-
- if(wings)
- H.overlays_standing[MOTH_WINGS_LAYER] = image(wings.icon, icon_state = "m_moth_wings_[wings.icon_state]_FRONT")
- H.underlays_standing[MOTH_WINGS_BEHIND_LAYER] = image(wings.icon, icon_state = "m_moth_wings_[wings.icon_state]_BEHIND")
- H.apply_overlay(MOTH_WINGS_LAYER)
- H.apply_underlay(MOTH_WINGS_BEHIND_LAYER)
-
-/datum/species/moth/update_body(mob/living/carbon/human/H)
- update_moth_wings(H)
-
-/datum/species/moth/update_inv_head(mob/living/carbon/human/H)
- update_moth_wings(H)
-
-/datum/species/moth/update_inv_w_uniform(mob/living/carbon/human/H)
- update_moth_wings(H)
-
-/datum/species/moth/update_inv_wear_suit(mob/living/carbon/human/H)
- update_moth_wings(H)
-
-/datum/species/moth/post_species_loss(mob/living/carbon/human/H)
- . = ..()
- H.remove_overlay(MOTH_WINGS_LAYER)
- H.remove_underlay(MOTH_WINGS_BEHIND_LAYER)
-
-
-/datum/species/skeleton
- name = "Skeleton"
- name_plural = "skeletons"
- icobase = 'icons/mob/human_races/r_skeleton.dmi'
- unarmed_type = /datum/unarmed_attack/punch
- speech_verb_override = "rattles"
- count_human = TRUE
-
- species_flags = NO_BREATHE|NO_SCAN|NO_BLOOD|NO_POISON|NO_CHEM_METABOLIZATION|DETACHABLE_HEAD // Where we're going, we don't NEED underwear.
-
- screams = list("neuter" = 'sound/voice/skeleton_scream.ogg') // RATTLE ME BONES
- paincries = list("neuter" = 'sound/voice/skeleton_scream.ogg')
- goredcries = list("neuter" = 'sound/voice/skeleton_scream.ogg')
- burstscreams = list("neuter" = 'sound/voice/moth_scream.ogg')
- death_message = "collapses in a pile of bones, with a final rattle..."
- death_sound = list("neuter" = 'sound/voice/skeleton_scream.ogg')
- warcries = list("neuter" = 'sound/voice/skeleton_warcry.ogg') // AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- namepool = /datum/namepool/skeleton
-
-///Called when using the shredding behavior.
-/datum/species/proc/can_shred(mob/living/carbon/human/H)
- if(H.a_intent != INTENT_HARM)
- return FALSE
-
- if(unarmed.is_usable(H))
- if(unarmed.shredding)
- return TRUE
- else if(secondary_unarmed.is_usable(H))
- if(secondary_unarmed.shredding)
- return TRUE
- return FALSE
-
-//Species unarmed attacks
-/datum/unarmed_attack
- var/attack_verb = list("attack") // Empty hand hurt intent verb.
- var/damage = 0 // Extra empty hand attack damage.
- var/attack_sound = "punch"
- var/miss_sound = 'sound/weapons/punchmiss.ogg'
- var/shredding = 0 // Calls the old attack_alien() behavior on objects/mobs when on harm intent.
- var/sharp = 0
- var/edge = 0
-
-/datum/unarmed_attack/proc/is_usable(mob/living/carbon/human/user)
- if(user.restrained())
- return FALSE
-
- // Check if they have a functioning hand.
- var/datum/limb/E = user.get_limb("l_hand")
- if(E?.is_usable())
- return TRUE
-
- E = user.get_limb("r_hand")
- if(E?.is_usable())
- return TRUE
- return FALSE
-
-/datum/unarmed_attack/bite
- attack_verb = list("bite") // 'x has biteed y', needs work.
- attack_sound = 'sound/weapons/bite.ogg'
- shredding = 0
- damage = 5
- sharp = 1
- edge = 1
-
-/datum/unarmed_attack/bite/is_usable(mob/living/carbon/human/user)
- if (user.wear_mask && istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
- return FALSE
- return TRUE
-
-/datum/unarmed_attack/punch
- attack_verb = list("punch")
- damage = 3
-
-/datum/unarmed_attack/punch/strong
- attack_verb = list("punch","bust","jab")
- damage = 10
-
-/datum/unarmed_attack/claws
- attack_verb = list("scratch", "claw")
- attack_sound = 'sound/weapons/slice.ogg'
- miss_sound = 'sound/weapons/slashmiss.ogg'
- damage = 5
- sharp = 1
- edge = 1
-
-/datum/unarmed_attack/claws/strong
- attack_verb = list("slash")
- damage = 10
- shredding = 1
-
-/datum/unarmed_attack/bite/strong
- attack_verb = list("maul")
- damage = 15
- shredding = 1
-
-/datum/hud_data
- var/icon // If set, overrides ui_style.
- var/has_a_intent = TRUE // Set to draw intent box.
- var/has_m_intent = TRUE // Set to draw move intent box.
- var/has_warnings = TRUE // Set to draw environment warnings.
- var/has_pressure = TRUE // Draw the pressure indicator.
- var/has_nutrition = TRUE // Draw the nutrition indicator.
- var/has_bodytemp = TRUE // Draw the bodytemp indicator.
- var/has_hands = TRUE // Set to draw shand.
- var/has_drop = TRUE // Set to draw drop button.
- var/has_throw = TRUE // Set to draw throw button.
- var/has_resist = TRUE // Set to draw resist button.
- var/list/equip_slots = list() // Checked by mob_can_equip().
-
- // Contains information on the position and tag for all inventory slots
- // to be drawn for the mob. This is fairly delicate, try to avoid messing with it
- // unless you know exactly what it does.
- var/list/gear = list(
- "i_clothing" = list("loc" = ui_iclothing, "slot" = SLOT_W_UNIFORM, "state" = "uniform", "toggle" = TRUE),
- "o_clothing" = list("loc" = ui_oclothing, "slot" = SLOT_WEAR_SUIT, "state" = "suit", "toggle" = TRUE),
- "mask" = list("loc" = ui_mask, "slot" = SLOT_WEAR_MASK, "state" = "mask", "toggle" = TRUE),
- "gloves" = list("loc" = ui_gloves, "slot" = SLOT_GLOVES, "state" = "gloves", "toggle" = TRUE),
- "eyes" = list("loc" = ui_glasses, "slot" = SLOT_GLASSES, "state" = "glasses","toggle" = TRUE),
- "wear_ear" = list("loc" = ui_wear_ear, "slot" = SLOT_EARS, "state" = "ears", "toggle" = TRUE),
- "head" = list("loc" = ui_head, "slot" = SLOT_HEAD, "state" = "head", "toggle" = TRUE),
- "shoes" = list("loc" = ui_shoes, "slot" = SLOT_SHOES, "state" = "shoes", "toggle" = TRUE),
- "suit storage" = list("loc" = ui_sstore1, "slot" = SLOT_S_STORE, "state" = "suit_storage"),
- "back" = list("loc" = ui_back, "slot" = SLOT_BACK, "state" = "back"),
- "id" = list("loc" = ui_id, "slot" = SLOT_WEAR_ID, "state" = "id"),
- "storage1" = list("loc" = ui_storage1, "slot" = SLOT_L_STORE, "state" = "pocket"),
- "storage2" = list("loc" = ui_storage2, "slot" = SLOT_R_STORE, "state" = "pocket"),
- "belt" = list("loc" = ui_belt, "slot" = SLOT_BELT, "state" = "belt")
- )
-
-/datum/hud_data/New()
- . = ..()
- for(var/slot in gear)
- equip_slots |= gear[slot]["slot"]
-
- if(has_hands)
- equip_slots |= SLOT_L_HAND
- equip_slots |= SLOT_R_HAND
- equip_slots |= SLOT_HANDCUFFED
- if(SLOT_HEAD in equip_slots)
- equip_slots |= SLOT_IN_HEAD
- if(SLOT_BACK in equip_slots)
- equip_slots |= SLOT_IN_BACKPACK
- equip_slots |= SLOT_IN_B_HOLSTER
- if(SLOT_BELT in equip_slots)
- equip_slots |= SLOT_IN_HOLSTER
- equip_slots |= SLOT_IN_BELT
- if(SLOT_WEAR_SUIT in equip_slots)
- equip_slots |= SLOT_IN_S_HOLSTER
- equip_slots |= SLOT_IN_SUIT
- if(SLOT_SHOES in equip_slots)
- equip_slots |= SLOT_IN_BOOT
- if(SLOT_W_UNIFORM in equip_slots)
- equip_slots |= SLOT_IN_STORAGE
- equip_slots |= SLOT_IN_L_POUCH
- equip_slots |= SLOT_IN_R_POUCH
- equip_slots |= SLOT_ACCESSORY
- equip_slots |= SLOT_IN_ACCESSORY
-
-/datum/hud_data/robotic
- has_nutrition = FALSE
-
-///damage override at the species level, called by /mob/living/proc/apply_damage
-/datum/species/proc/apply_damage(damage = 0, damagetype = BRUTE, def_zone, blocked = 0, sharp = FALSE, edge = FALSE, updating_health = FALSE, penetration, mob/living/carbon/human/victim, mob/attacker)
- var/datum/limb/organ = null
- if(isorgan(def_zone)) //Got sent a limb datum, convert to a zone define
- organ = def_zone
- def_zone = organ.name
-
- if(!def_zone)
- def_zone = ran_zone(def_zone)
- if(!organ)
- organ = victim.get_limb(check_zone(def_zone))
- if(!organ)
- return FALSE
-
- if(isnum(blocked))
- damage -= clamp(damage * (blocked - penetration) * 0.01, 0, damage)
- else
- damage = victim.modify_by_armor(damage, blocked, penetration, def_zone)
-
- if(victim.protection_aura)
- damage = round(damage * ((20 - victim.protection_aura) / 20))
-
- if(!damage)
- return 0
-
-
- switch(damagetype)
- if(BRUTE)
- victim.damageoverlaytemp = 20
- if(brute_mod)
- damage *= brute_mod
- var/old_status = organ.limb_status
- if(organ.take_damage_limb(damage, 0, sharp, edge))
- victim.UpdateDamageIcon()
- record_internal_injury(victim, attacker, old_status, organ.limb_status)
- if(BURN)
- victim.damageoverlaytemp = 20
- if(burn_mod)
- damage *= burn_mod
- if(organ.take_damage_limb(0, damage, sharp, edge))
- victim.UpdateDamageIcon()
- return
- switch(damage)
- if(-INFINITY to 0)
- return FALSE
- if(25 to 50)
- if(prob(20))
- victim.emote("pain")
- if(50 to INFINITY)
- if(prob(60))
- victim.emote("pain")
- if(TOX)
- victim.adjustToxLoss(damage)
- if(OXY)
- victim.adjustOxyLoss(damage)
- if(CLONE)
- victim.adjustCloneLoss(damage)
- if(STAMINA)
- if(species_flags & NO_STAMINA)
- return
- victim.adjustStaminaLoss(damage)
-
- // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
- SEND_SIGNAL(victim, COMSIG_HUMAN_DAMAGE_TAKEN, damage)
-
- if(updating_health)
- victim.updatehealth()
- return damage
-
-/datum/species/necoarc
- name = "Neco Arc"
- name_plural = "Neco Arc"
- icobase = 'icons/mob/human_races/r_NecoArc.dmi'
- default_language_holder = /datum/language_holder/sectoid
- eyes = "blank_eyes"
- speech_verb_override = "transmits"
- count_human = TRUE
- total_health = 80
-
- species_flags = HAS_NO_HAIR|NO_BREATHE|NO_POISON|NO_PAIN|USES_ALIEN_WEAPONS|NO_DAMAGE_OVERLAY
-
- paincries = list("neuter" = 'sound/voice/necoarc/NecoVIBIVII!!.ogg')
- death_sound = 'sound/voice/necoarc/Necojooooonoooooooo.ogg'
-
- blood_color = "#00FF00"
- flesh_color = "#C0C0C0"
-
- reagent_tag = IS_SECTOID
-
- namepool = /datum/namepool/necoarc
- special_death_message = "You have perished."
diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm
new file mode 100644
index 00000000000..52f09ed27e3
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/_species.dm
@@ -0,0 +1,368 @@
+/datum/species
+ /// Species name
+ var/name
+ var/name_plural
+ /// What kind of species it is considered
+ var/species_type = SPECIES_HUMAN
+
+ /// Normal icon file
+ var/icobase = 'icons/mob/human_races/r_human.dmi'
+ /// Icon state for calculating brute damage icons
+ var/brute_damage_icon_state = "human_brute"
+ /// Icon state for calculating brute damage icons
+ var/burn_damage_icon_state = "human_burn"
+ /// Damage mask icon we want to use when drawing wounds
+ var/damage_mask_icon = 'icons/mob/dam_mask.dmi'
+ /// If set, draws this from icobase when mob is prone.
+ var/prone_icon
+ /// Icon for eyes
+ var/eyes = "eyes_s"
+
+ /// For empty hand harm-intent attack
+ var/datum/unarmed_attack/unarmed
+ /// For empty hand harm-intent attack if the first fails.
+ var/datum/unarmed_attack/secondary_unarmed
+ var/datum/hud_data/hud
+ var/hud_type
+ var/slowdown = 0
+ var/taste_sensitivity = TASTE_NORMAL
+ var/datum/unarmed_attack/unarmed_type = /datum/unarmed_attack
+ var/secondary_unarmed_type = /datum/unarmed_attack/bite
+ var/default_language_holder = /datum/language_holder
+ var/speech_verb_override
+ /// The names of secondary languages that are available to this species.
+ var/secondary_langs = list()
+ /// A list of sounds to potentially play when speaking.
+ var/list/speech_sounds
+ var/list/speech_chance
+ /// Does this count as a human?
+ var/count_human = FALSE
+
+ /// Inventory slots the race can't equip stuff to. Robots cannot wear shoes and gloves, for example.
+ var/list/no_equip = list()
+
+ // Some species-specific gibbing data.
+ var/gibbed_anim = "gibbed-h"
+ var/dusted_anim = "dust-h"
+ var/remains_type = /obj/effect/decal/cleanable/ash
+ var/death_sound
+ var/death_message = "seizes up and falls limp, their eyes dead and lifeless..."
+
+ /// new maxHealth [/mob/living/carbon/human/var/maxHealth] of the human mob once species is applied
+ var/total_health = 100
+ var/max_stamina = 50
+
+ /// Cold damage level 1 below this point.
+ var/cold_level_1 = BODYTEMP_COLD_DAMAGE_LIMIT_ONE
+ /// Cold damage level 2 below this point.
+ var/cold_level_2 = BODYTEMP_COLD_DAMAGE_LIMIT_TWO
+ /// Cold damage level 3 below this point.
+ var/cold_level_3 = BODYTEMP_COLD_DAMAGE_LIMIT_THREE
+
+ /// Heat damage level 1 above this point.
+ var/heat_level_1 = BODYTEMP_HEAT_DAMAGE_LIMIT_ONE
+ /// Heat damage level 2 above this point.
+ var/heat_level_2 = BODYTEMP_HEAT_DAMAGE_LIMIT_TWO
+ /// Heat damage level 2 above this point.
+ var/heat_level_3 = BODYTEMP_HEAT_DAMAGE_LIMIT_THREE
+
+ /// non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing)
+ var/body_temperature = BODYTEMP_NORMAL
+ /// Used for metabolizing reagents.
+ var/reagent_tag
+
+ /// Converts into see_in_dark on update_sight()
+ var/darksight = 2
+
+ /// Physical damage reduction/malus.
+ var/brute_mod = null
+ /// Burn damage reduction/malus.
+ var/burn_mod = null
+
+ /// Whether this mob will tell when the user has logged out
+ var/is_sentient = TRUE
+
+ /// Generic traits tied to having the species.
+ var/list/inherent_traits = list()
+ /// Various specific features.
+ var/species_flags = NONE
+
+ var/list/preferences = list()
+ var/list/screams = list()
+ var/list/paincries = list()
+ var/list/goredcries = list()
+ var/list/gasps = list()
+ var/list/coughs = list()
+ var/list/burstscreams = list()
+ var/list/warcries = list()
+ var/list/laughs = list()
+
+ /// Red.
+ var/blood_color = "#A10808"
+ /// Pink.
+ var/flesh_color = "#FFC896"
+ /// Used when setting species.
+ var/base_color
+ /// If the species only has one hair color
+ var/hair_color
+
+ // Used in icon caching.
+ var/race_key = 0
+ var/icon/icon_template
+
+ /// inherent Species-specific verbs.
+ var/list/inherent_verbs
+ /// inherent species-specific actions
+ var/list/inherent_actions
+ var/list/has_organ = list(
+ ORGAN_SLOT_HEART = /datum/internal_organ/heart,
+ ORGAN_SLOT_LUNGS = /datum/internal_organ/lungs,
+ ORGAN_SLOT_LIVER = /datum/internal_organ/liver,
+ ORGAN_SLOT_STOMACH = /datum/internal_organ/stomach,
+ ORGAN_SLOT_KIDNEYS = /datum/internal_organ/kidneys,
+ ORGAN_SLOT_BRAIN = /datum/internal_organ/brain,
+ ORGAN_SLOT_APPENDIX = /datum/internal_organ/appendix,
+ ORGAN_SLOT_EYES = /datum/internal_organ/eyes
+ )
+ var/lighting_alpha
+ var/see_in_dark
+
+ var/datum/namepool/namepool = /datum/namepool
+ /// Special death message that gets overwritten if possible.
+ var/special_death_message = "You have perished."
+ /// Whether it is possible with this race roundstart
+ var/joinable_roundstart = FALSE
+
+/datum/species/New()
+ if(hud_type)
+ hud = new hud_type()
+ else
+ hud = new()
+
+ if(unarmed_type)
+ unarmed = new unarmed_type()
+ if(secondary_unarmed_type)
+ secondary_unarmed = new secondary_unarmed_type()
+ if(species_flags & GREYSCALE_BLOOD)
+ brute_damage_icon_state = "grayscale"
+
+/// Handles creation of mob organs and limbs.
+/datum/species/proc/create_organs(mob/living/carbon/human/organless_human)
+
+ organless_human.limbs = list()
+ organless_human.internal_organs = list()
+ organless_human.internal_organs_by_name = list()
+
+ //This is a basic humanoid limb setup.
+ var/datum/limb/chest/new_chest = new(null, organless_human)
+ organless_human.limbs += new_chest
+ var/datum/limb/groin/new_groin = new(new_chest, organless_human)
+ organless_human.limbs += new_groin
+ organless_human.limbs += new/datum/limb/head(new_chest, organless_human)
+ var/datum/limb/l_arm/new_l_arm = new(new_chest, organless_human)
+ organless_human.limbs += new_l_arm
+ var/datum/limb/r_arm/new_r_arm = new(new_chest, organless_human)
+ organless_human.limbs += new_r_arm
+ var/datum/limb/l_leg/new_l_leg = new(new_groin, organless_human)
+ organless_human.limbs += new_l_leg
+ var/datum/limb/r_leg/new_r_leg = new(new_groin, organless_human)
+ organless_human.limbs += new_r_leg
+ organless_human.limbs += new/datum/limb/hand/l_hand(new_l_arm, organless_human)
+ organless_human.limbs += new/datum/limb/hand/r_hand(new_r_arm, organless_human)
+ organless_human.limbs += new/datum/limb/foot/l_foot(new_l_leg, organless_human)
+ organless_human.limbs += new/datum/limb/foot/r_foot(new_r_leg, organless_human)
+
+ for(var/datum/internal_organ/organ AS in has_organ)
+ var/datum/internal_organ/organ_type = has_organ[organ]
+ organless_human.internal_organs_by_name[organ] = new organ_type(organless_human)
+
+ if(!(species_flags & ROBOTIC_LIMBS))
+ return
+ for(var/datum/limb/robotic_limb AS in organless_human.limbs)
+ if(robotic_limb.limb_status & LIMB_DESTROYED)
+ continue
+ robotic_limb.add_limb_flags(LIMB_ROBOT)
+
+///damage override at the species level, called by /mob/living/proc/apply_damage
+/datum/species/proc/apply_damage(damage = 0, damagetype = BRUTE, def_zone, blocked = 0, sharp = FALSE, edge = FALSE, updating_health = FALSE, penetration, mob/living/carbon/human/victim, mob/attacker)
+ var/datum/limb/organ = null
+ if(isorgan(def_zone)) //Got sent a limb datum, convert to a zone define
+ organ = def_zone
+ def_zone = organ.name
+
+ if(!def_zone)
+ def_zone = ran_zone(def_zone)
+ if(!organ)
+ organ = victim.get_limb(check_zone(def_zone))
+ if(!organ)
+ return FALSE
+
+ if(isnum(blocked))
+ damage -= clamp(damage * (blocked - penetration) * 0.01, 0, damage)
+ else
+ damage = victim.modify_by_armor(damage, blocked, penetration, def_zone)
+
+ if(victim.protection_aura)
+ damage = round(damage * ((20 - victim.protection_aura) / 20))
+
+ if(!damage)
+ return FALSE
+
+ switch(damagetype)
+ if(BRUTE)
+ victim.damageoverlaytemp = 20
+ if(brute_mod)
+ damage *= brute_mod
+ var/old_status = organ.limb_status
+ if(organ.take_damage_limb(damage, 0, sharp, edge))
+ victim.UpdateDamageIcon()
+ record_internal_injury(victim, attacker, old_status, organ.limb_status)
+ if(BURN)
+ victim.damageoverlaytemp = 20
+ if(burn_mod)
+ damage *= burn_mod
+ if(organ.take_damage_limb(0, damage, sharp, edge))
+ victim.UpdateDamageIcon()
+ return
+ switch(damage)
+ if(-INFINITY to 0)
+ return FALSE
+ if(25 to 50)
+ if(prob(20))
+ victim.emote("pain")
+ if(50 to INFINITY)
+ if(prob(60))
+ victim.emote("pain")
+ if(TOX)
+ victim.adjustToxLoss(damage)
+ if(OXY)
+ victim.adjustOxyLoss(damage)
+ if(CLONE)
+ victim.adjustCloneLoss(damage)
+ if(STAMINA)
+ if(species_flags & NO_STAMINA)
+ return
+ victim.adjustStaminaLoss(damage)
+
+ // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
+ SEND_SIGNAL(victim, COMSIG_HUMAN_DAMAGE_TAKEN, damage)
+
+ if(updating_health)
+ victim.updatehealth()
+ return damage
+
+/// Handles how the species hugs another mobs.
+/datum/species/proc/hug(mob/living/carbon/human/H, mob/living/target)
+ if(H.zone_selected == "head")
+ H.visible_message(span_notice("[H] pats [target] on the head."), \
+ span_notice("You pat [target] on the head."), null, 4)
+ else if(H.zone_selected == "l_hand" && CONFIG_GET(flag/fun_allowed))
+ H.visible_message(span_notice("[H] holds [target] 's left hand."), \
+ span_notice("You hold [target]'s left hand."), null, 4)
+ else if (H.zone_selected == "r_hand" && CONFIG_GET(flag/fun_allowed))
+ H.visible_message(span_notice("[H] holds [target] 's right hand."), \
+ span_notice("You hold [target]'s right hand."), null, 4)
+ else
+ H.visible_message(span_notice("[H] hugs [target] to make [target.p_them()] feel better!"), \
+ span_notice("You hug [target] to make [target.p_them()] feel better!"), null, 4)
+
+/// Handles setting of the random name.
+/datum/species/proc/random_name(gender)
+ return GLOB.namepool[namepool].get_random_name(gender)
+
+/datum/species/proc/prefs_name(datum/preferences/prefs)
+ return prefs.real_name
+
+/// What will this species do on being gained by human
+/datum/species/proc/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
+ SHOULD_CALL_PARENT(TRUE) //remember to call base procs kids
+ for(var/slot_id in no_equip)
+ var/obj/item/thing = H.get_item_by_slot(slot_id)
+ if(thing && !is_type_in_list(src,thing.species_exception))
+ H.dropItemToGround(thing)
+ for(var/newtrait in inherent_traits)
+ ADD_TRAIT(H, newtrait, SPECIES_TRAIT)
+ H.maxHealth += total_health - (old_species ? old_species.total_health : initial(H.maxHealth))
+
+/// Special things to change after we're no longer that species
+/datum/species/proc/post_species_loss(mob/living/carbon/human/H)
+ SHOULD_CALL_PARENT(TRUE)
+ for(var/oldtrait in inherent_traits)
+ REMOVE_TRAIT(H, oldtrait, SPECIES_TRAIT)
+
+/// Removes all species-specific verbs and actions
+/datum/species/proc/remove_inherent_abilities(mob/living/carbon/human/H)
+ if(inherent_verbs)
+ remove_verb(H, inherent_verbs)
+ if(inherent_actions)
+ for(var/action_path in inherent_actions)
+ var/datum/action/old_species_action = H.actions_by_path[action_path]
+ qdel(old_species_action)
+ return
+
+/// Adds all species-specific verbs and actions
+/datum/species/proc/add_inherent_abilities(mob/living/carbon/human/H)
+ if(inherent_verbs)
+ add_verb(H, inherent_verbs)
+ if(inherent_actions)
+ for(var/action_path in inherent_actions)
+ var/datum/action/new_species_action = new action_path(H)
+ new_species_action.give_action(H)
+ return
+
+/// Handles anything not already covered by basic species assignment.
+/datum/species/proc/handle_post_spawn(mob/living/carbon/human/H)
+ add_inherent_abilities(H)
+
+/// Handles any species-specific death events.
+/datum/species/proc/handle_death(mob/living/carbon/human/H)
+ return
+
+//TODO KILL ME
+///Snowflake proc for monkeys so they can call attackpaw
+/datum/species/proc/spec_unarmedattack(mob/living/carbon/human/user, atom/target)
+ return FALSE
+
+//Only used by horrors at the moment. Only triggers if the mob is alive and not dead.
+/datum/species/proc/handle_unique_behavior(mob/living/carbon/human/H)
+ return
+
+/datum/species/proc/handle_fire(mob/living/carbon/human/H)
+ return
+
+/datum/species/proc/update_body(mob/living/carbon/human/H)
+ return
+
+/datum/species/proc/update_inv_head(mob/living/carbon/human/H)
+ return
+
+/datum/species/proc/update_inv_w_uniform(mob/living/carbon/human/H)
+ return
+
+/datum/species/proc/update_inv_wear_suit(mob/living/carbon/human/H)
+ return
+
+/datum/species/proc/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
+ if(CHECK_BITFIELD(species_flags, NO_CHEM_METABOLIZATION)) //explicit
+ H.reagents.del_reagent(chem.type) //for the time being
+ return TRUE
+ if(CHECK_BITFIELD(species_flags, NO_POISON) && istype(chem, /datum/reagent/toxin))
+ H.reagents.remove_reagent(chem.type, chem.custom_metabolism * H.metabolism_efficiency)
+ return TRUE
+ if(CHECK_BITFIELD(species_flags, NO_OVERDOSE)) //no stacking
+ if(chem.overdose_threshold && chem.volume > chem.overdose_threshold)
+ H.reagents.remove_reagent(chem.type, chem.volume - chem.overdose_threshold)
+ return FALSE
+
+///Called when using the shredding behavior.
+/datum/species/proc/can_shred(mob/living/carbon/human/H)
+ if(H.a_intent != INTENT_HARM)
+ return FALSE
+
+ if(unarmed.is_usable(H))
+ if(unarmed.shredding)
+ return TRUE
+ else if(secondary_unarmed.is_usable(H))
+ if(secondary_unarmed.shredding)
+ return TRUE
+ return FALSE
diff --git a/code/modules/mob/living/carbon/human/species/early_synthetic.dm b/code/modules/mob/living/carbon/human/species/early_synthetic.dm
new file mode 100644
index 00000000000..ae3f7adba84
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/early_synthetic.dm
@@ -0,0 +1,63 @@
+//It really should be just a subtype of synthetic
+/datum/species/early_synthetic // Worse at medical, better at engineering. Tougher in general than later synthetics.
+ name = "Early Synthetic"
+ name_plural = "Early Synthetics"
+ icobase = 'icons/mob/human_races/r_synthetic.dmi'
+ hud_type = /datum/hud_data/robotic
+ default_language_holder = /datum/language_holder/synthetic
+ unarmed_type = /datum/unarmed_attack/punch
+ slowdown = 1.15 //Slower than Late Synths.
+ total_health = 200 //Tough boys, very tough boys.
+ brute_mod = 0.6
+ burn_mod = 0.6
+
+ cold_level_1 = -1
+ cold_level_2 = -1
+ cold_level_3 = -1
+
+ heat_level_1 = 500
+ heat_level_2 = 1000
+ heat_level_3 = 2000
+
+ body_temperature = 350
+
+ species_flags = NO_BREATHE|NO_SCAN|NO_BLOOD|NO_POISON|NO_PAIN|IS_SYNTHETIC|NO_CHEM_METABOLIZATION|NO_STAMINA|DETACHABLE_HEAD|HAS_UNDERWEAR|ROBOTIC_LIMBS|GREYSCALE_BLOOD
+
+ blood_color = "#EEEEEE"
+ hair_color = "#000000"
+ has_organ = list()
+
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
+ see_in_dark = 8
+
+ screams = list(MALE = "male_scream", FEMALE = "female_scream")
+ paincries = list(MALE = "male_pain", FEMALE = "female_pain")
+ goredcries = list(MALE = "male_gored", FEMALE = "female_gored")
+ warcries = list(MALE = "male_warcry", FEMALE = "female_warcry")
+ laughs = list(MALE = "male_laugh", FEMALE = "female_laugh")
+ special_death_message = "You have been shut down.
But it is not the end of you yet... if you still have your body, wait until somebody can resurrect you..."
+
+/datum/species/early_synthetic/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
+ . = ..()
+ var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED_SYNTH]
+ AH.add_hud_to(H)
+
+/datum/species/early_synthetic/post_species_loss(mob/living/carbon/human/H)
+ . = ..()
+ var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED_SYNTH]
+ AH.remove_hud_from(H)
+
+/mob/living/carbon/human/species/early_synthetic/binarycheck(mob/H)
+ return TRUE
+
+/datum/species/early_synthetic/prefs_name(datum/preferences/prefs)
+ . = prefs.synthetic_name
+ if(!. || . == "Undefined") //In case they don't have a name set.
+ switch(prefs.gender)
+ if(MALE)
+ . = "David"
+ if(FEMALE)
+ . = "Anna"
+ else
+ . = "Jeri"
+ to_chat(prefs.parent, span_warning("You forgot to set your synthetic name in your preferences. Please do so next time."))
diff --git a/code/modules/mob/living/carbon/human/species/hud_data.dm b/code/modules/mob/living/carbon/human/species/hud_data.dm
new file mode 100644
index 00000000000..3eaa20968d8
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/hud_data.dm
@@ -0,0 +1,65 @@
+/datum/hud_data
+ var/icon // If set, overrides ui_style.
+ var/has_a_intent = TRUE // Set to draw intent box.
+ var/has_m_intent = TRUE // Set to draw move intent box.
+ var/has_warnings = TRUE // Set to draw environment warnings.
+ var/has_pressure = TRUE // Draw the pressure indicator.
+ var/has_nutrition = TRUE // Draw the nutrition indicator.
+ var/has_bodytemp = TRUE // Draw the bodytemp indicator.
+ var/has_hands = TRUE // Set to draw shand.
+ var/has_drop = TRUE // Set to draw drop button.
+ var/has_throw = TRUE // Set to draw throw button.
+ var/has_resist = TRUE // Set to draw resist button.
+ var/list/equip_slots = list() // Checked by mob_can_equip().
+
+ // Contains information on the position and tag for all inventory slots
+ // to be drawn for the mob. This is fairly delicate, try to avoid messing with it
+ // unless you know exactly what it does.
+ var/list/gear = list(
+ "i_clothing" = list("loc" = ui_iclothing, "slot" = SLOT_W_UNIFORM, "state" = "uniform", "toggle" = TRUE),
+ "o_clothing" = list("loc" = ui_oclothing, "slot" = SLOT_WEAR_SUIT, "state" = "suit", "toggle" = TRUE),
+ "mask" = list("loc" = ui_mask, "slot" = SLOT_WEAR_MASK, "state" = "mask", "toggle" = TRUE),
+ "gloves" = list("loc" = ui_gloves, "slot" = SLOT_GLOVES, "state" = "gloves", "toggle" = TRUE),
+ "eyes" = list("loc" = ui_glasses, "slot" = SLOT_GLASSES, "state" = "glasses","toggle" = TRUE),
+ "wear_ear" = list("loc" = ui_wear_ear, "slot" = SLOT_EARS, "state" = "ears", "toggle" = TRUE),
+ "head" = list("loc" = ui_head, "slot" = SLOT_HEAD, "state" = "head", "toggle" = TRUE),
+ "shoes" = list("loc" = ui_shoes, "slot" = SLOT_SHOES, "state" = "shoes", "toggle" = TRUE),
+ "suit storage" = list("loc" = ui_sstore1, "slot" = SLOT_S_STORE, "state" = "suit_storage"),
+ "back" = list("loc" = ui_back, "slot" = SLOT_BACK, "state" = "back"),
+ "id" = list("loc" = ui_id, "slot" = SLOT_WEAR_ID, "state" = "id"),
+ "storage1" = list("loc" = ui_storage1, "slot" = SLOT_L_STORE, "state" = "pocket"),
+ "storage2" = list("loc" = ui_storage2, "slot" = SLOT_R_STORE, "state" = "pocket"),
+ "belt" = list("loc" = ui_belt, "slot" = SLOT_BELT, "state" = "belt")
+ )
+
+/datum/hud_data/New()
+ . = ..()
+ for(var/slot in gear)
+ equip_slots |= gear[slot]["slot"]
+
+ if(has_hands)
+ equip_slots |= SLOT_L_HAND
+ equip_slots |= SLOT_R_HAND
+ equip_slots |= SLOT_HANDCUFFED
+ if(SLOT_HEAD in equip_slots)
+ equip_slots |= SLOT_IN_HEAD
+ if(SLOT_BACK in equip_slots)
+ equip_slots |= SLOT_IN_BACKPACK
+ equip_slots |= SLOT_IN_B_HOLSTER
+ if(SLOT_BELT in equip_slots)
+ equip_slots |= SLOT_IN_HOLSTER
+ equip_slots |= SLOT_IN_BELT
+ if(SLOT_WEAR_SUIT in equip_slots)
+ equip_slots |= SLOT_IN_S_HOLSTER
+ equip_slots |= SLOT_IN_SUIT
+ if(SLOT_SHOES in equip_slots)
+ equip_slots |= SLOT_IN_BOOT
+ if(SLOT_W_UNIFORM in equip_slots)
+ equip_slots |= SLOT_IN_STORAGE
+ equip_slots |= SLOT_IN_L_POUCH
+ equip_slots |= SLOT_IN_R_POUCH
+ equip_slots |= SLOT_ACCESSORY
+ equip_slots |= SLOT_IN_ACCESSORY
+
+/datum/hud_data/robotic
+ has_nutrition = FALSE
diff --git a/code/modules/mob/living/carbon/human/species/human.dm b/code/modules/mob/living/carbon/human/species/human.dm
new file mode 100644
index 00000000000..0a4927524e2
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/human.dm
@@ -0,0 +1,25 @@
+/datum/species/human
+ name = "Human"
+ name_plural = "Humans"
+ unarmed_type = /datum/unarmed_attack/punch
+ species_flags = HAS_SKIN_TONE|HAS_LIPS|HAS_UNDERWEAR
+ count_human = TRUE
+
+ screams = list(MALE = "male_scream", FEMALE = "female_scream")
+ paincries = list(MALE = "male_pain", FEMALE = "female_pain")
+ goredcries = list(MALE = "male_gored", FEMALE = "female_gored")
+ gasps = list(MALE = "male_gasp", FEMALE = "female_gasp")
+ coughs = list(MALE = "male_cough", FEMALE = "female_cough")
+ burstscreams = list(MALE = "male_preburst", FEMALE = "female_preburst")
+ warcries = list(MALE = "male_warcry", FEMALE = "female_warcry")
+ laughs = list(MALE = "male_laugh", FEMALE = "female_laugh")
+ special_death_message = "You have perished.
But it is not the end of you yet... if you still have your body with your head still attached, wait until somebody can resurrect you..."
+ joinable_roundstart = TRUE
+
+/datum/species/human/prefs_name(datum/preferences/prefs)
+ . = ..()
+ if(!CONFIG_GET(flag/humans_need_surnames))
+ return
+ var/firstspace = findtext(., " ")
+ if(!firstspace || firstspace == length(.))
+ . += " " + pick(SSstrings.get_list_from_file("names/last_name"))
diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm
new file mode 100644
index 00000000000..edd1a509461
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/monkey.dm
@@ -0,0 +1,73 @@
+//todo: wound overlays are strange for monkeys and should likely use icon adding instead
+//im not about to cram in that refactor with a carbon -> species refactor though
+/datum/species/monkey
+ name = "Monkey"
+ name_plural = "Monkeys"
+ icobase = 'icons/mob/human_races/r_monkey.dmi'
+ species_flags = HAS_NO_HAIR|NO_STAMINA|DETACHABLE_HEAD
+ inherent_traits = list(TRAIT_CAN_VENTCRAWL)
+ reagent_tag = IS_MONKEY
+ eyes = "blank_eyes"
+ speech_verb_override = "chimpers"
+ unarmed_type = /datum/unarmed_attack/bite/strong
+ secondary_unarmed_type = /datum/unarmed_attack/punch/strong
+ joinable_roundstart = FALSE
+ death_message = "lets out a faint chimper as it collapses and stops moving..."
+ dusted_anim = "dust-m"
+ gibbed_anim = "gibbed-m"
+ is_sentient = FALSE
+
+/datum/species/monkey/handle_unique_behavior(mob/living/carbon/human/H)
+ if(H.client || H.stat != CONSCIOUS)
+ return
+ if(prob(33) && H.canmove && !H.buckled && isturf(H.loc) && !H.pulledby) //won't move if being pulled
+ step(H, pick(GLOB.cardinals))
+
+ if(prob(1))
+ H.emote(pick("scratch","jump","roll","tail"))
+
+/datum/species/monkey/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
+ . = ..()
+ H.allow_pass_flags |= PASS_LOW_STRUCTURE
+
+/datum/species/monkey/spec_unarmedattack(mob/living/carbon/human/user, atom/target)
+ if(!iscarbon(target))
+ return FALSE
+ var/mob/living/carbon/victim = target
+ if(prob(25))
+ victim.visible_message(span_danger("[user]'s bite misses [victim]!"),
+ span_danger("You avoid [user]'s bite!"), span_hear("You hear jaws snapping shut!"))
+ to_chat(user, span_danger("Your bite misses [victim]!"))
+ return TRUE
+ victim.apply_damage(rand(10, 20), BRUTE, "chest", updating_health = TRUE)
+ victim.visible_message(span_danger("[name] bites [victim]!"),
+ span_userdanger("[name] bites you!"), span_hear("You hear a chomp!"))
+ to_chat(user, span_danger("You bite [victim]!"))
+ target.attack_hand(user)
+ return TRUE
+
+/datum/species/monkey/random_name(gender,unique,lastname)
+ return "[lowertext(name)] ([rand(1,999)])"
+
+/datum/species/monkey/tajara
+ name = "Farwa"
+ icobase = 'icons/mob/human_races/r_farwa.dmi'
+ speech_verb_override = "mews"
+
+/datum/species/monkey/skrell
+ name = "Naera"
+ icobase = 'icons/mob/human_races/r_naera.dmi'
+ speech_verb_override = "squiks"
+
+/datum/species/monkey/unathi
+ name = "Stok"
+ icobase = 'icons/mob/human_races/r_stok.dmi'
+ speech_verb_override = "hisses"
+
+/datum/species/monkey/yiren
+ name = "Yiren"
+ icobase = 'icons/mob/human_races/r_yiren.dmi'
+ speech_verb_override = "grumbles"
+ cold_level_1 = ICE_COLONY_TEMPERATURE - 20
+ cold_level_2 = ICE_COLONY_TEMPERATURE - 40
+ cold_level_3 = ICE_COLONY_TEMPERATURE - 80
diff --git a/code/modules/mob/living/carbon/human/species/moth.dm b/code/modules/mob/living/carbon/human/species/moth.dm
new file mode 100644
index 00000000000..b19076f990f
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/moth.dm
@@ -0,0 +1,63 @@
+/datum/species/moth
+ name = "Moth"
+ name_plural = "Moth"
+ icobase = 'icons/mob/human_races/r_moth.dmi'
+ default_language_holder = /datum/language_holder/moth
+ eyes = "blank_eyes"
+ speech_verb_override = "flutters"
+ count_human = TRUE
+
+ species_flags = HAS_LIPS|HAS_NO_HAIR
+ preferences = list("moth_wings" = "Wings")
+
+ screams = list(NEUTER = 'sound/voice/moth_scream.ogg')
+ paincries = list(NEUTER = 'sound/voice/human/male/pain_3.ogg')
+ goredcries = list(NEUTER = 'sound/voice/moth_scream.ogg')
+ burstscreams = list(NEUTER = 'sound/voice/moth_scream.ogg')
+ warcries = list(NEUTER = 'sound/voice/moth_scream.ogg')
+ laughs = list(NEUTER = 'sound/voice/silly_laugh.ogg')
+
+ flesh_color = "#E5CD99"
+
+ reagent_tag = IS_MOTH
+
+ namepool = /datum/namepool/moth
+
+/datum/species/moth/handle_fire(mob/living/carbon/human/H)
+ if(H.moth_wings == "Burnt Off")
+ return
+ if(H.bodytemperature < 400 && H.fire_stacks < 0)
+ return
+ to_chat(H, span_danger("Your precious wings burn to a crisp!"))
+ H.moth_wings = "Burnt Off"
+ H.update_body()
+
+/datum/species/moth/proc/update_moth_wings(mob/living/carbon/human/H)
+ H.remove_overlay(MOTH_WINGS_LAYER)
+ H.remove_underlay(MOTH_WINGS_BEHIND_LAYER)
+
+ var/datum/sprite_accessory/moth_wings/wings = GLOB.moth_wings_list[H.moth_wings]
+
+ if(!wings)
+ return
+ H.overlays_standing[MOTH_WINGS_LAYER] = image(wings.icon, icon_state = "m_moth_wings_[wings.icon_state]_FRONT")
+ H.underlays_standing[MOTH_WINGS_BEHIND_LAYER] = image(wings.icon, icon_state = "m_moth_wings_[wings.icon_state]_BEHIND")
+ H.apply_overlay(MOTH_WINGS_LAYER)
+ H.apply_underlay(MOTH_WINGS_BEHIND_LAYER)
+
+/datum/species/moth/update_body(mob/living/carbon/human/H)
+ update_moth_wings(H)
+
+/datum/species/moth/update_inv_head(mob/living/carbon/human/H)
+ update_moth_wings(H)
+
+/datum/species/moth/update_inv_w_uniform(mob/living/carbon/human/H)
+ update_moth_wings(H)
+
+/datum/species/moth/update_inv_wear_suit(mob/living/carbon/human/H)
+ update_moth_wings(H)
+
+/datum/species/moth/post_species_loss(mob/living/carbon/human/H)
+ . = ..()
+ H.remove_overlay(MOTH_WINGS_LAYER)
+ H.remove_underlay(MOTH_WINGS_BEHIND_LAYER)
diff --git a/code/modules/mob/living/carbon/human/species/necoarc.dm b/code/modules/mob/living/carbon/human/species/necoarc.dm
new file mode 100644
index 00000000000..9d17a5792d3
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/necoarc.dm
@@ -0,0 +1,22 @@
+/datum/species/necoarc
+ name = "Neco Arc"
+ name_plural = "Neco Arc"
+ icobase = 'icons/mob/human_races/r_NecoArc.dmi'
+ default_language_holder = /datum/language_holder/sectoid
+ eyes = "blank_eyes"
+ speech_verb_override = "transmits"
+ count_human = TRUE
+ total_health = 80
+
+ species_flags = HAS_NO_HAIR|NO_BREATHE|NO_POISON|NO_PAIN|USES_ALIEN_WEAPONS|NO_DAMAGE_OVERLAY
+
+ paincries = list("neuter" = 'sound/voice/necoarc/NecoVIBIVII!!.ogg')
+ death_sound = 'sound/voice/necoarc/Necojooooonoooooooo.ogg'
+
+ blood_color = "#00FF00"
+ flesh_color = "#C0C0C0"
+
+ reagent_tag = IS_SECTOID
+
+ namepool = /datum/namepool/necoarc
+ special_death_message = "You have perished."
diff --git a/code/modules/mob/living/carbon/human/species/robot.dm b/code/modules/mob/living/carbon/human/species/robot.dm
new file mode 100644
index 00000000000..fd304392c2d
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/robot.dm
@@ -0,0 +1,112 @@
+/datum/species/robot
+ name = "Combat Robot"
+ name_plural = "Combat Robots"
+ species_type = SPECIES_COMBAT_ROBOT
+ icobase = 'icons/mob/human_races/r_robot.dmi'
+ damage_mask_icon = 'icons/mob/dam_mask_robot.dmi'
+ brute_damage_icon_state = "robot_brute"
+ burn_damage_icon_state = "robot_burn"
+ eyes = "blank_eyes"
+ hud_type = /datum/hud_data/robotic
+ default_language_holder = /datum/language_holder/robot
+ namepool = /datum/namepool/robotic
+
+ unarmed_type = /datum/unarmed_attack/punch/strong
+ total_health = 100
+ slowdown = SHOES_SLOWDOWN //because they don't wear boots.
+
+ cold_level_1 = -1
+ cold_level_2 = -1
+ cold_level_3 = -1
+
+ heat_level_1 = 500
+ heat_level_2 = 1000
+ heat_level_3 = 2000
+
+ body_temperature = 350
+
+ inherent_traits = list(TRAIT_NON_FLAMMABLE, TRAIT_IMMEDIATE_DEFIB)
+ species_flags = NO_BREATHE|NO_BLOOD|NO_POISON|NO_PAIN|NO_CHEM_METABOLIZATION|NO_STAMINA|DETACHABLE_HEAD|HAS_NO_HAIR|ROBOTIC_LIMBS|IS_INSULATED
+
+ no_equip = list(
+ SLOT_W_UNIFORM,
+ SLOT_HEAD,
+ SLOT_WEAR_MASK,
+ SLOT_WEAR_SUIT,
+ SLOT_SHOES,
+ SLOT_GLOVES,
+ SLOT_GLASSES,
+ )
+ blood_color = "#2d2055" //"oil" color
+ hair_color = "#00000000"
+ has_organ = list()
+
+
+ screams = list(MALE = "robot_scream", FEMALE = "robot_scream", PLURAL = "robot_scream", NEUTER = "robot_scream")
+ paincries = list(MALE = "robot_pain", FEMALE = "robot_pain", PLURAL = "robot_pain", NEUTER = "robot_pain")
+ goredcries = list(MALE = "robot_scream", FEMALE = "robot_scream", PLURAL = "robot_scream", NEUTER = "robot_scream")
+ warcries = list(MALE = "robot_warcry", FEMALE = "robot_warcry", PLURAL = "robot_warcry", NEUTER = "robot_warcry")
+ laughs = list(MALE = "robot_male_laugh", FEMALE = "robot_female_laugh", PLURAL = "robot_male_laugh", NEUTER = "robot_female_laugh")
+ death_message = "shudders violently whilst spitting out error text before collapsing, their visual sensor darkening..."
+ special_death_message = "You have been shut down.
But it is not the end of you yet... if you still have your body, wait until somebody can resurrect you..."
+ joinable_roundstart = FALSE
+
+ inherent_actions = list(/datum/action/repair_self)
+
+/datum/species/robot/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
+ . = ..()
+ H.speech_span = SPAN_ROBOT
+ H.health_threshold_crit = -100
+
+/datum/species/robot/post_species_loss(mob/living/carbon/human/H)
+ . = ..()
+ H.speech_span = initial(H.speech_span)
+ H.health_threshold_crit = -50
+
+/datum/species/robot/handle_unique_behavior(mob/living/carbon/human/H)
+ if(H.health <= 0 && H.health > -50)
+ H.clear_fullscreen("robotlow")
+ H.overlay_fullscreen("robothalf", /atom/movable/screen/fullscreen/machine/robothalf)
+ else if(H.health <= -50)
+ H.clear_fullscreen("robothalf")
+ H.overlay_fullscreen("robotlow", /atom/movable/screen/fullscreen/machine/robotlow)
+ else
+ H.clear_fullscreen("robothalf")
+ H.clear_fullscreen("robotlow")
+ if(H.health > -25) //Staggerslowed if below crit threshold.
+ return
+ H.Stagger(2 SECONDS)
+ H.adjust_slowdown(1)
+
+/mob/living/carbon/human/species/robot/binarycheck(mob/H)
+ return TRUE
+
+/datum/species/robot/prefs_name(datum/preferences/prefs)
+ . = prefs.squad_robot_name
+ if(!. || . == "Undefined") //In case they don't have a name set.
+ . = GLOB.namepool[namepool].get_random_name()
+ to_chat(prefs.parent, span_warning("You forgot to set your robot in your preferences. Please do so next time."))
+
+/datum/species/robot/alpharii
+ name = "Hammerhead Combat Robot"
+ name_plural = "Hammerhead Combat Robots"
+ icobase = 'icons/mob/human_races/r_robot_alpharii.dmi'
+ joinable_roundstart = FALSE
+
+/datum/species/robot/charlit
+ name = "Chilvaris Combat Robot"
+ name_plural = "Chilvaris Combat Robots"
+ icobase = 'icons/mob/human_races/r_robot_charlit.dmi'
+ joinable_roundstart = FALSE
+
+/datum/species/robot/deltad
+ name = "Ratcher Combat Robot"
+ name_plural = "Ratcher Combat Robots"
+ icobase = 'icons/mob/human_races/r_robot_deltad.dmi'
+ joinable_roundstart = FALSE
+
+/datum/species/robot/bravada
+ name = "Sterling Combat Robot"
+ name_plural = "Sterling Combat Robots"
+ icobase = 'icons/mob/human_races/r_robot_bravada.dmi'
+ joinable_roundstart = FALSE
diff --git a/code/modules/mob/living/carbon/human/species/sectoid.dm b/code/modules/mob/living/carbon/human/species/sectoid.dm
new file mode 100644
index 00000000000..93d51a370a6
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/sectoid.dm
@@ -0,0 +1,22 @@
+/datum/species/sectoid
+ name = "Sectoid"
+ name_plural = "Sectoids"
+ icobase = 'icons/mob/human_races/r_sectoid.dmi'
+ default_language_holder = /datum/language_holder/sectoid
+ eyes = "blank_eyes"
+ speech_verb_override = "transmits"
+ count_human = TRUE
+ total_health = 80
+
+ species_flags = HAS_NO_HAIR|NO_BREATHE|NO_POISON|NO_PAIN|USES_ALIEN_WEAPONS|NO_DAMAGE_OVERLAY
+
+ paincries = list("neuter" = 'sound/voice/sectoid_death.ogg')
+ death_sound = 'sound/voice/sectoid_death.ogg'
+
+ blood_color = "#00FF00"
+ flesh_color = "#C0C0C0"
+
+ reagent_tag = IS_SECTOID
+
+ namepool = /datum/namepool/sectoid
+ special_death_message = "You have perished."
diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm
new file mode 100644
index 00000000000..41e8bb88934
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/skeleton.dm
@@ -0,0 +1,18 @@
+/datum/species/skeleton
+ name = "Skeleton"
+ name_plural = "skeletons"
+ icobase = 'icons/mob/human_races/r_skeleton.dmi'
+ unarmed_type = /datum/unarmed_attack/punch
+ speech_verb_override = "rattles"
+ count_human = TRUE
+
+ species_flags = NO_BREATHE|NO_SCAN|NO_BLOOD|NO_POISON|NO_CHEM_METABOLIZATION|DETACHABLE_HEAD // Where we're going, we don't NEED underwear.
+
+ screams = list("neuter" = 'sound/voice/skeleton_scream.ogg') // RATTLE ME BONES
+ paincries = list("neuter" = 'sound/voice/skeleton_scream.ogg')
+ goredcries = list("neuter" = 'sound/voice/skeleton_scream.ogg')
+ burstscreams = list("neuter" = 'sound/voice/moth_scream.ogg')
+ death_message = "collapses in a pile of bones, with a final rattle..."
+ death_sound = list("neuter" = 'sound/voice/skeleton_scream.ogg')
+ warcries = list("neuter" = 'sound/voice/skeleton_warcry.ogg') // AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ namepool = /datum/namepool/skeleton
diff --git a/code/modules/mob/living/carbon/human/species/synthetic.dm b/code/modules/mob/living/carbon/human/species/synthetic.dm
new file mode 100644
index 00000000000..159d42dc09e
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/synthetic.dm
@@ -0,0 +1,63 @@
+/datum/species/synthetic
+ name = "Synthetic"
+ name_plural = "Synthetics"
+
+ hud_type = /datum/hud_data/robotic
+ default_language_holder = /datum/language_holder/synthetic
+ unarmed_type = /datum/unarmed_attack/punch
+
+ total_health = 125 //more health than regular humans
+
+ brute_mod = 0.70
+ burn_mod = 0.70 //Synthetics should not be instantly melted by acid compared to humans - This is a test to hopefully fix very glaring issues involving synthetics taking 2.6 trillion damage when so much as touching acid
+
+ cold_level_1 = -1
+ cold_level_2 = -1
+ cold_level_3 = -1
+
+ heat_level_1 = 500
+ heat_level_2 = 1000
+ heat_level_3 = 2000
+
+ body_temperature = 350
+
+ species_flags = NO_BREATHE|NO_SCAN|NO_BLOOD|NO_POISON|NO_PAIN|IS_SYNTHETIC|NO_CHEM_METABOLIZATION|NO_STAMINA|DETACHABLE_HEAD|HAS_LIPS|HAS_UNDERWEAR|HAS_SKIN_COLOR|ROBOTIC_LIMBS|GREYSCALE_BLOOD
+
+ blood_color = "#EEEEEE"
+
+ has_organ = list()
+
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
+ see_in_dark = 8
+
+ screams = list(MALE = "male_scream", FEMALE = "female_scream")
+ paincries = list(MALE = "male_pain", FEMALE = "female_pain")
+ goredcries = list(MALE = "male_gored", FEMALE = "female_gored")
+ warcries = list(MALE = "male_warcry", FEMALE = "female_warcry")
+ laughs = list(MALE = "male_laugh", FEMALE = "female_laugh")
+ special_death_message = "You have been shut down.
But it is not the end of you yet... if you still have your body, wait until somebody can resurrect you..."
+
+/datum/species/synthetic/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
+ . = ..()
+ var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED_SYNTH]
+ AH.add_hud_to(H)
+
+/datum/species/synthetic/prefs_name(datum/preferences/prefs)
+ . = prefs.synthetic_name
+ if(!. || . == "Undefined") //In case they don't have a name set.
+ switch(prefs.gender)
+ if(MALE)
+ . = "David"
+ if(FEMALE)
+ . = "Anna"
+ else
+ . = "Jeri"
+ to_chat(prefs.parent, span_warning("You forgot to set your synthetic name in your preferences. Please do so next time."))
+
+/datum/species/synthetic/post_species_loss(mob/living/carbon/human/H)
+ . = ..()
+ var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED_SYNTH]
+ AH.remove_hud_from(H)
+
+/mob/living/carbon/human/species/synthetic/binarycheck(mob/H)
+ return TRUE
diff --git a/code/modules/mob/living/carbon/human/species/unarmed_attack.dm b/code/modules/mob/living/carbon/human/species/unarmed_attack.dm
new file mode 100644
index 00000000000..cddce0ffe35
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/unarmed_attack.dm
@@ -0,0 +1,62 @@
+//Species unarmed attacks
+/datum/unarmed_attack
+ var/attack_verb = list("attack") // Empty hand hurt intent verb.
+ var/damage = 0 // Extra empty hand attack damage.
+ var/attack_sound = "punch"
+ var/miss_sound = 'sound/weapons/punchmiss.ogg'
+ var/shredding = 0 // Calls the old attack_alien() behavior on objects/mobs when on harm intent.
+ var/sharp = 0
+ var/edge = 0
+
+/datum/unarmed_attack/proc/is_usable(mob/living/carbon/human/user)
+ if(user.restrained())
+ return FALSE
+
+ // Check if they have a functioning hand.
+ var/datum/limb/E = user.get_limb("l_hand")
+ if(E?.is_usable())
+ return TRUE
+
+ E = user.get_limb("r_hand")
+ if(E?.is_usable())
+ return TRUE
+ return FALSE
+
+/datum/unarmed_attack/bite
+ attack_verb = list("bite") // 'x has biteed y', needs work.
+ attack_sound = 'sound/weapons/bite.ogg'
+ shredding = 0
+ damage = 5
+ sharp = 1
+ edge = 1
+
+/datum/unarmed_attack/bite/is_usable(mob/living/carbon/human/user)
+ if(user.wear_mask && istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
+ return FALSE
+ return TRUE
+
+/datum/unarmed_attack/punch
+ attack_verb = list("punch")
+ damage = 3
+
+/datum/unarmed_attack/punch/strong
+ attack_verb = list("punch","bust","jab")
+ damage = 10
+
+/datum/unarmed_attack/claws
+ attack_verb = list("scratch", "claw")
+ attack_sound = 'sound/weapons/slice.ogg'
+ miss_sound = 'sound/weapons/slashmiss.ogg'
+ damage = 5
+ sharp = 1
+ edge = 1
+
+/datum/unarmed_attack/claws/strong
+ attack_verb = list("slash")
+ damage = 10
+ shredding = 1
+
+/datum/unarmed_attack/bite/strong
+ attack_verb = list("maul")
+ damage = 15
+ shredding = 1
diff --git a/code/modules/mob/living/carbon/human/species/vatborn.dm b/code/modules/mob/living/carbon/human/species/vatborn.dm
new file mode 100644
index 00000000000..f2fad9772c2
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/vatborn.dm
@@ -0,0 +1,8 @@
+/datum/species/human/vatborn
+ name = "Vatborn"
+ name_plural = "Vatborns"
+ icobase = 'icons/mob/human_races/r_vatborn.dmi'
+ namepool = /datum/namepool/vatborn
+
+/datum/species/human/vatborn/prefs_name(datum/preferences/prefs)
+ return prefs.real_name
diff --git a/code/modules/mob/living/carbon/human/species/vatgrown.dm b/code/modules/mob/living/carbon/human/species/vatgrown.dm
new file mode 100644
index 00000000000..a1b0f36c80d
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/vatgrown.dm
@@ -0,0 +1,43 @@
+/datum/species/human/vatgrown
+ name = "Vat-Grown Human"
+ name_plural = "Vat-Grown Humans"
+ icobase = 'icons/mob/human_races/r_vatgrown.dmi'
+ brute_mod = 1.05
+ burn_mod = 1.05
+ slowdown = 0.05
+ joinable_roundstart = FALSE
+
+/datum/species/human/vatgrown/random_name(gender)
+ return "CS-[gender == FEMALE ? "F": "M"]-[rand(111,999)]"
+
+/datum/species/human/vatgrown/prefs_name(datum/preferences/prefs)
+ return prefs.real_name
+
+/datum/species/human/vatgrown/handle_post_spawn(mob/living/carbon/human/H)
+ . = ..()
+ H.h_style = "Bald"
+ H.set_skills(getSkillsType(/datum/skills/vatgrown))
+
+/datum/species/human/vatgrown/early
+ name = "Early Vat-Grown Human"
+ name_plural = "Early Vat-Grown Humans"
+ brute_mod = 1.3
+ burn_mod = 1.3
+ slowdown = 0.3
+
+ var/timerid
+
+/datum/species/human/vatgrown/early/handle_post_spawn(mob/living/carbon/human/H)
+ . = ..()
+ H.set_skills(getSkillsType(/datum/skills/vatgrown/early))
+ timerid = addtimer(CALLBACK(src, PROC_REF(handle_age), H), 15 MINUTES, TIMER_STOPPABLE)
+
+/datum/species/human/vatgrown/early/post_species_loss(mob/living/carbon/human/H)
+ . = ..()
+ // Ensure we don't update the species again
+ if(timerid)
+ deltimer(timerid)
+ timerid = null
+
+/datum/species/human/vatgrown/early/proc/handle_age(mob/living/carbon/human/H)
+ H.set_species("Vat-Grown Human")
diff --git a/code/modules/mob/living/carbon/human/species/yautja.dm b/code/modules/mob/living/carbon/human/species/yautja.dm
new file mode 100644
index 00000000000..349e42234ca
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/yautja.dm
@@ -0,0 +1,177 @@
+/datum/species/yautja
+ name = "Yautja"
+ name_plural = "Yautja"
+ brute_mod = 0.28 //Beefy!
+ burn_mod = 0.45
+ reagent_tag = IS_YAUTJA
+ species_flags = HAS_SKIN_COLOR|NO_POISON|NO_PAIN|USES_ALIEN_WEAPONS|PARALYSE_RESISTANT
+ inherent_traits = list(
+ TRAIT_YAUTJA_TECH,
+ TRAIT_SUPER_STRONG,
+ TRAIT_FOREIGN_BIO,
+ )
+ inherent_actions = list(
+ /datum/action/predator_action/mark_for_hunt,
+ /datum/action/predator_action/mark_panel,
+ )
+
+ screams = list(MALE = "pred_scream", FEMALE = "pred_scream")
+ paincries = list(MALE = "pred_pain", FEMALE = "pred_pain")
+ goredcries = list(MALE = "pred_pain", FEMALE = "pred_pain")
+ burstscreams = list(MALE = "pred_preburst", FEMALE = "pred_preburst")
+ warcries = list(MALE = "pred_warcry", FEMALE = "pred_warcry")
+ laughs = list(MALE = "pred_laugh", FEMALE = "pred_laugh")
+
+ unarmed_type = /datum/unarmed_attack/punch/strong
+ secondary_unarmed_type = /datum/unarmed_attack/bite/strong
+ max_stamina = 250
+ blood_color = "#20d450"
+ flesh_color = "#907E4A"
+ speech_sounds = list('sound/voice/predator/click1.ogg', 'sound/voice/predator/click2.ogg')
+ speech_chance = 100
+ death_message = "clicks in agony and falls still, motionless and completely lifeless..."
+
+ brute_damage_icon_state = "pred_brute"
+ burn_damage_icon_state = "pred_burn"
+
+ darksight = 5
+ slowdown = -0.5
+ total_health = 175 //more health than regular humans
+
+ default_language_holder = /datum/language_holder/yautja
+
+ heat_level_1 = 500
+ heat_level_2 = 700
+ heat_level_3 = 1000
+
+ inherent_verbs = list(
+ /mob/living/carbon/human/proc/butcher,
+ )
+
+ icobase = 'icons/mob/hunter/r_predator.dmi'
+
+/datum/species/yautja/handle_death(mob/living/carbon/human/H, gibbed)
+ if(gibbed)
+ GLOB.yautja_mob_list -= H
+
+ for(var/mob/living/carbon/M in H.hunter_data.dishonored_targets)
+ M.hunter_data.dishonored_set = null
+ H.hunter_data.dishonored_targets -= M
+ for(var/mob/living/carbon/M in H.hunter_data.honored_targets)
+ M.hunter_data.honored_set = null
+ H.hunter_data.honored_targets -= M
+ for(var/mob/living/carbon/M in H.hunter_data.gear_targets)
+ M.hunter_data.gear_set = null
+ H.hunter_data.gear_targets -= M
+
+ if(H.hunter_data.prey)
+ var/mob/living/carbon/M = H.hunter_data.prey
+ H.hunter_data.prey = null
+ M.hunter_data.hunter = null
+ M.hud_set_hunter()
+
+ set_predator_status(H, gibbed ? "Gibbed" : "Dead")
+
+ // Notify all yautja so they start the gear recovery
+ message_all_yautja("[H.real_name] has died at \the [get_area_name(H)].")
+
+ if(H.hunter_data.thrall)
+ var/mob/living/carbon/T = H.hunter_data.thrall
+ message_all_yautja("[H.real_name]'s Thrall, [T.real_name] is now masterless.")
+ H.message_thrall("Your master has fallen!")
+ H.hunter_data.thrall = null
+
+/datum/species/yautja/proc/set_predator_status(mob/living/carbon/human/H, status = "Alive")
+ if(!H.key)
+ return
+ var/datum/game_mode/GM
+ if(SSticker?.mode)
+ GM = SSticker.mode
+ if(H.key in GM.predators)
+ GM.predators[lowertext(H.key)]["Status"] = status
+ else
+ GM.predators[lowertext(H.key)] = list("Name" = H.real_name, "Status" = status)
+
+/datum/species/yautja/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
+ . = ..()
+ var/datum/atom_hud/A = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
+ A.add_to_hud(H)
+
+ for(var/datum/limb/limb in H.limbs)
+ switch(limb.name)
+ if("groin","chest")
+ limb.min_broken_damage = 120
+ limb.max_damage = 350
+ if("head")
+ limb.min_broken_damage = 100
+ limb.max_damage = 350
+ if("l_hand","r_hand","r_foot","l_foot")
+ limb.min_broken_damage = 85
+ limb.max_damage = 180
+ if("r_leg","r_arm","l_leg","l_arm")
+ limb.min_broken_damage = 100
+ limb.max_damage = 225
+
+ set_predator_status(H, "Alive")
+
+/datum/species/yautja/post_species_loss(mob/living/carbon/human/H)
+ . = ..()
+ var/datum/atom_hud/A = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
+ A.remove_hud_from(H)
+ remove_inherent_abilities(H)
+ H.blood_type = pick("A+","A-","B+","B-","O-","O+","AB+","AB-")
+ H.h_style = "Bald"
+ GLOB.yautja_mob_list -= H
+
+ for(var/datum/limb/limb in H.limbs)
+ switch(limb.name)
+ if("groin","chest")
+ limb.min_broken_damage = 60
+ limb.max_damage = 200
+ if("head")
+ limb.min_broken_damage = 40
+ limb.max_damage = 125
+ if("l_hand","r_hand","r_foot","l_foot")
+ limb.min_broken_damage = 37
+ limb.max_damage = 100
+ if("r_arm","l_arm")
+ limb.min_broken_damage = 50
+ limb.max_damage = 150
+ if("r_leg","l_leg")
+ limb.min_broken_damage = 50
+ limb.max_damage = 125
+
+ set_predator_status(H, "Demoted")
+
+ if(H.actions_by_path[/datum/action/minimap/yautja])
+ var/datum/action/minimap/yautja/mini = H.actions_by_path[/datum/action/minimap/yautja]
+ mini.remove_action(src)
+
+/datum/species/yautja/handle_post_spawn(mob/living/carbon/human/H)
+ GLOB.alive_human_list -= H
+
+ H.blood_type = "Y*"
+ H.h_style = H.client ? H.client.prefs.predator_h_style : "Standard"
+ #ifndef UNIT_TESTS // Since this is a hard ref, we shouldn't confuse create_and_destroy
+ GLOB.yautja_mob_list += H
+ #endif
+
+ if(!H.actions_by_path[/datum/action/minimap/yautja])
+ var/datum/action/minimap/yautja/mini = new
+ mini.give_action(H)
+ return ..()
+
+/datum/species/yautja/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
+ if(CHECK_BITFIELD(species_flags, NO_CHEM_METABOLIZATION)) //explicit
+ H.reagents.del_reagent(chem.type) //for the time being
+ return TRUE
+ if(CHECK_BITFIELD(species_flags, NO_POISON) && istype(chem, /datum/reagent/toxin))
+ H.reagents.remove_reagent(chem.type, chem.custom_metabolism * H.metabolism_efficiency)
+ return TRUE
+ if(istype(chem, /datum/reagent/medicine))
+ H.reagents.remove_reagent(chem.type, chem.custom_metabolism * H.metabolism_efficiency)
+ return TRUE
+ if(CHECK_BITFIELD(species_flags, NO_OVERDOSE)) //no stacking
+ if(chem.overdose_threshold && chem.volume > chem.overdose_threshold)
+ H.reagents.remove_reagent(chem.type, chem.volume - chem.overdose_threshold)
+ return FALSE
diff --git a/code/modules/mob/living/carbon/human/yautja.dm b/code/modules/mob/living/carbon/human/yautja.dm
index 8e28c2a5a95..770a2815169 100644
--- a/code/modules/mob/living/carbon/human/yautja.dm
+++ b/code/modules/mob/living/carbon/human/yautja.dm
@@ -5,214 +5,6 @@
if(client.clan_info)
return client.clan_info.item[2] <= GLOB.clan_ranks_ordered.len ? GLOB.clan_ranks_ordered[client.clan_info.item[2]] : GLOB.clan_ranks_ordered[1]
-/datum/species/yautja
- name = "Yautja"
- name_plural = "Yautja"
- brute_mod = 0.28 //Beefy!
- burn_mod = 0.45
- reagent_tag = IS_YAUTJA
- species_flags = HAS_SKIN_COLOR|NO_POISON|NO_PAIN|USES_ALIEN_WEAPONS|PARALYSE_RESISTANT
- inherent_traits = list(
- TRAIT_YAUTJA_TECH,
- TRAIT_SUPER_STRONG,
- TRAIT_FOREIGN_BIO,
- )
- inherent_actions = list(
- /datum/action/predator_action/mark_for_hunt,
- /datum/action/predator_action/mark_panel,
- )
-
- screams = list(MALE = "pred_scream", FEMALE = "pred_scream")
- paincries = list(MALE = "pred_pain", FEMALE = "pred_pain")
- goredcries = list(MALE = "pred_pain", FEMALE = "pred_pain")
- burstscreams = list(MALE = "pred_preburst", FEMALE = "pred_preburst")
- warcries = list(MALE = "pred_warcry", FEMALE = "pred_warcry")
-
- unarmed_type = /datum/unarmed_attack/punch/strong
- secondary_unarmed_type = /datum/unarmed_attack/bite/strong
- max_stamina = 250
- blood_color = "#20d450"
- flesh_color = "#907E4A"
- speech_sounds = list('sound/voice/predator/click1.ogg', 'sound/voice/predator/click2.ogg')
- speech_chance = 100
- death_message = "clicks in agony and falls still, motionless and completely lifeless..."
-
- brute_damage_icon_state = "pred_brute"
- burn_damage_icon_state = "pred_burn"
-
- darksight = 5
- slowdown = -0.5
- total_health = 175 //more health than regular humans
-
- default_language_holder = /datum/language_holder/yautja
-
- heat_level_1 = 500
- heat_level_2 = 700
- heat_level_3 = 1000
-
- inherent_verbs = list(
- /mob/living/carbon/human/proc/butcher,
- )
-
- knock_down_reduction = 4
- stun_reduction = 4
-
- icobase = 'icons/mob/hunter/r_predator.dmi'
-
-/datum/species/yautja/handle_death(mob/living/carbon/human/H, gibbed)
- if(gibbed)
- GLOB.yautja_mob_list -= H
-
- for(var/mob/living/carbon/M in H.hunter_data.dishonored_targets)
- M.hunter_data.dishonored_set = null
- H.hunter_data.dishonored_targets -= M
- for(var/mob/living/carbon/M in H.hunter_data.honored_targets)
- M.hunter_data.honored_set = null
- H.hunter_data.honored_targets -= M
- for(var/mob/living/carbon/M in H.hunter_data.gear_targets)
- M.hunter_data.gear_set = null
- H.hunter_data.gear_targets -= M
-
- if(H.hunter_data.prey)
- var/mob/living/carbon/M = H.hunter_data.prey
- H.hunter_data.prey = null
- M.hunter_data.hunter = null
- M.hud_set_hunter()
-
- set_predator_status(H, gibbed ? "Gibbed" : "Dead")
-
- // Notify all yautja so they start the gear recovery
- message_all_yautja("[H.real_name] has died at \the [get_area_name(H)].")
-
- if(H.hunter_data.thrall)
- var/mob/living/carbon/T = H.hunter_data.thrall
- message_all_yautja("[H.real_name]'s Thrall, [T.real_name] is now masterless.")
- H.message_thrall("Your master has fallen!")
- H.hunter_data.thrall = null
-
-/datum/species/yautja/proc/set_predator_status(mob/living/carbon/human/H, status = "Alive")
- if(!H.key)
- return
- var/datum/game_mode/GM
- if(SSticker?.mode)
- GM = SSticker.mode
- if(H.key in GM.predators)
- GM.predators[lowertext(H.key)]["Status"] = status
- else
- GM.predators[lowertext(H.key)] = list("Name" = H.real_name, "Status" = status)
-
-/datum/species/yautja/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
- . = ..()
- var/datum/atom_hud/A = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
- A.add_to_hud(H)
-
- for(var/datum/limb/limb in H.limbs)
- switch(limb.name)
- if("groin","chest")
- limb.min_broken_damage = 120
- limb.max_damage = 350
- if("head")
- limb.min_broken_damage = 100
- limb.max_damage = 350
- if("l_hand","r_hand","r_foot","l_foot")
- limb.min_broken_damage = 85
- limb.max_damage = 180
- if("r_leg","r_arm","l_leg","l_arm")
- limb.min_broken_damage = 100
- limb.max_damage = 225
-
- set_predator_status(H, "Alive")
-
-/datum/species/yautja/post_species_loss(mob/living/carbon/human/H)
- ..()
- var/datum/atom_hud/A = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
- A.remove_hud_from(H)
- remove_inherent_abilities(H)
- H.blood_type = pick("A+","A-","B+","B-","O-","O+","AB+","AB-")
- H.h_style = "Bald"
- GLOB.yautja_mob_list -= H
-
- for(var/datum/limb/limb in H.limbs)
- switch(limb.name)
- if("groin","chest")
- limb.min_broken_damage = 60
- limb.max_damage = 200
- if("head")
- limb.min_broken_damage = 40
- limb.max_damage = 125
- if("l_hand","r_hand","r_foot","l_foot")
- limb.min_broken_damage = 37
- limb.max_damage = 100
- if("r_arm","l_arm")
- limb.min_broken_damage = 50
- limb.max_damage = 150
- if("r_leg","l_leg")
- limb.min_broken_damage = 50
- limb.max_damage = 125
-
- set_predator_status(H, "Demoted")
-
- if(H.actions_by_path[/datum/action/minimap/yautja])
- var/datum/action/minimap/yautja/mini = H.actions_by_path[/datum/action/minimap/yautja]
- mini.remove_action(src)
-
-/datum/species/yautja/handle_post_spawn(mob/living/carbon/human/H)
- GLOB.alive_human_list -= H
-
- H.blood_type = "Y*"
- H.h_style = H.client ? H.client.prefs.predator_h_style : "Standard"
- #ifndef UNIT_TESTS // Since this is a hard ref, we shouldn't confuse create_and_destroy
- GLOB.yautja_mob_list += H
- #endif
-
- if(!H.actions_by_path[/datum/action/minimap/yautja])
- var/datum/action/minimap/yautja/mini = new
- mini.give_action(H)
-
- return ..()
-
-/mob/proc/hud_set_hunter()
- return
-
-/mob/living/carbon/hud_set_hunter()
- var/image/holder = hud_list[HUNTER_HUD]
- if(!holder)
- return
- holder.icon_state = ""
- holder.overlays.Cut()
- if(hunter_data.hunted)
- holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_hunted")
-
- if(hunter_data.dishonored)
- holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_dishonored")
- else if(hunter_data.honored)
- holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_honored")
-
- if(hunter_data.thralled)
- holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_thralled")
- else if(hunter_data.gear)
- holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_gear")
-
- hud_list[HUNTER_HUD] = holder
-
-/mob/living/carbon/xenomorph/hud_set_hunter()
- var/image/holder = hud_list[HUNTER_HUD]
- if(!holder)
- return
- holder.icon_state = ""
- holder.overlays.Cut()
- holder.pixel_x = -17
- holder.pixel_y = 20
- if(hunter_data.hunted)
- holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_hunted")
-
- if(hunter_data.dishonored)
- holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_dishonored")
- else if(hunter_data.honored)
- holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_honored")
-
- hud_list[HUNTER_HUD] = holder
-
/mob/living/carbon/human/species/yautja/hud_set_hunter()
. = ..()
@@ -242,29 +34,6 @@
. = bracer.embedded_id
return .
-/mob/living/carbon/human/proc/disable_special_items()
- set waitfor = FALSE // Scout decloak animation uses sleep(), which is problematic for taser gun
-
- if(istype(back, /obj/item/storage/backpack/marine/satchel/scout_cloak))
- var/obj/item/storage/backpack/marine/satchel/scout_cloak/SC = back
- if(SC.camo_active)
- SC.camo_off(src)
- return
- var/list/cont = list()
- for(var/atom/A in contents)
- cont += A
- if(A.contents.len)
- cont += A.contents
-
- for(var/i in cont)
- if(istype(i, /obj/item/assembly/prox_sensor))
- var/obj/item/assembly/prox_sensor/prox = i
- if(prox.scanning)
- prox.toggle_scan()
- if(istype(i, /obj/item/attachable/motiondetector))
- var/obj/item/attachable/motiondetector/md = i
- md.clean_operator()
-
/mob/living/carbon/human/species/yautja/get_reagent_tags()
return species?.reagent_tag
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index bede5c0511a..d38104ae7e8 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -38,3 +38,24 @@
if(changed)
animate(src, transform = ntransform, time = (lying_prev == 0 || lying_angle == 0) ? 0.2 SECONDS : 0, pixel_y = final_pixel_y, dir = final_dir, easing = (EASE_IN|EASE_OUT))
+
+/mob/living/carbon/hud_set_hunter()
+ var/image/holder = hud_list[HUNTER_HUD]
+ if(!holder)
+ return
+ holder.icon_state = ""
+ holder.overlays.Cut()
+ if(hunter_data.hunted)
+ holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_hunted")
+
+ if(hunter_data.dishonored)
+ holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_dishonored")
+ else if(hunter_data.honored)
+ holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_honored")
+
+ if(hunter_data.thralled)
+ holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_thralled")
+ else if(hunter_data.gear)
+ holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_gear")
+
+ hud_list[HUNTER_HUD] = holder
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities.dm
index 7df6bc58996..ba5cc47514a 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities.dm
@@ -514,40 +514,33 @@
keybinding_signals = list(
KEYBINDING_NORMAL = COMSIG_XENOABILITY_EMIT_RECOVERY,
)
+ hidden = TRUE
/datum/action/ability/xeno_action/pheromones/emit_recovery/action_activate()
apply_pheros(AURA_XENO_RECOVERY)
-/datum/action/ability/xeno_action/pheromones/emit_recovery/should_show()
- return FALSE
-
/datum/action/ability/xeno_action/pheromones/emit_warding
name = "Toggle Warding Pheromones"
desc = "Increases armor for yourself and nearby teammates."
keybinding_signals = list(
KEYBINDING_NORMAL = COMSIG_XENOABILITY_EMIT_WARDING,
)
+ hidden = TRUE
/datum/action/ability/xeno_action/pheromones/emit_warding/action_activate()
apply_pheros(AURA_XENO_WARDING)
-/datum/action/ability/xeno_action/pheromones/emit_warding/should_show()
- return FALSE
-
/datum/action/ability/xeno_action/pheromones/emit_frenzy
name = "Toggle Frenzy Pheromones"
desc = "Increases damage for yourself and nearby teammates."
keybinding_signals = list(
KEYBINDING_NORMAL = COMSIG_XENOABILITY_EMIT_FRENZY,
)
+ hidden = TRUE
/datum/action/ability/xeno_action/pheromones/emit_frenzy/action_activate()
apply_pheros(AURA_XENO_FRENZY)
-/datum/action/ability/xeno_action/pheromones/emit_frenzy/should_show()
- return FALSE
-
-
/datum/action/ability/activable/xeno/transfer_plasma
name = "Transfer Plasma"
action_icon_state = "transfer_plasma"
@@ -1382,9 +1375,7 @@
KEYBINDING_NORMAL = COMSIG_XENOABILITY_BLESSINGSMENU,
)
use_state_flags = ABILITY_USE_LYING|ABILITY_USE_CRESTED
-
-/datum/action/ability/xeno_action/blessing_menu/should_show()
- return FALSE // Blessings meni now done through hive status UI!
+ hidden = TRUE
/datum/action/ability/xeno_action/blessing_menu/action_activate()
var/mob/living/carbon/xenomorph/X = owner
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/carrier/abilities_carrier.dm b/code/modules/mob/living/carbon/xenomorph/castes/carrier/abilities_carrier.dm
index 2a832977002..b319513d4c4 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/carrier/abilities_carrier.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/carrier/abilities_carrier.dm
@@ -347,10 +347,10 @@ GLOBAL_LIST_INIT(hugger_images_list, list(
to_chat(owner, span_xenowarning("No weeds here!"))
return FALSE
- if(!T.check_alien_construction(owner, silent, /obj/structure/xeno/xeno_turret) || !T.check_disallow_alien_fortification(owner))
+ if(!T.check_alien_construction(owner, silent, /obj/structure/xeno/turret) || !T.check_disallow_alien_fortification(owner))
return FALSE
- for(var/obj/structure/xeno/xeno_turret/turret AS in GLOB.xeno_resin_turrets_by_hive[blocker.hivenumber])
+ for(var/obj/structure/xeno/turret/turret AS in GLOB.xeno_resin_turrets_by_hive[blocker.hivenumber])
if(get_dist(turret, owner) < 6)
if(!silent)
to_chat(owner, span_xenowarning("Another turret is too close!"))
@@ -364,7 +364,7 @@ GLOBAL_LIST_INIT(hugger_images_list, list(
return FALSE
var/mob/living/carbon/xenomorph/carrier/caster = owner
- var/obj/structure/xeno/xeno_turret/hugger_turret/turret = new (get_turf(owner), caster.hivenumber)
+ var/obj/structure/xeno/turret/facehugger/turret = new (get_turf(owner), caster.hivenumber)
turret.ammo = GLOB.ammo_list[GLOB.hugger_to_ammo[caster.selected_hugger_type]]
succeed_activate()
add_cooldown()
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/defender/abilities_defender.dm b/code/modules/mob/living/carbon/xenomorph/castes/defender/abilities_defender.dm
index 5edf369cf18..7c31dcfef05 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/defender/abilities_defender.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/defender/abilities_defender.dm
@@ -15,32 +15,32 @@
/datum/action/ability/xeno_action/tail_sweep/can_use_action(silent, override_flags)
. = ..()
- var/mob/living/carbon/xenomorph/X = owner
- if(X.crest_defense && X.plasma_stored < (ability_cost * 2))
- to_chat(X, span_xenowarning("We don't have enough plasma, we need [(ability_cost * 2) - X.plasma_stored] more plasma!"))
+ var/mob/living/carbon/xenomorph/xeno_owner = owner
+ if(xeno_owner.crest_defense && xeno_owner.plasma_stored < (ability_cost * 2))
+ to_chat(xeno_owner, span_xenowarning("We don't have enough plasma, we need [(ability_cost * 2) - xeno_owner.plasma_stored] more plasma!"))
return FALSE
/datum/action/ability/xeno_action/tail_sweep/action_activate()
- var/mob/living/carbon/xenomorph/X = owner
+ var/mob/living/carbon/xenomorph/xeno_owner = owner
GLOB.round_statistics.defender_tail_sweeps++
SSblackbox.record_feedback(FEEDBACK_TALLY, "round_statistics", 1, "defender_tail_sweeps")
- X.visible_message(span_xenowarning("\The [X] sweeps its tail in a wide circle!"), \
+ xeno_owner.visible_message(span_xenowarning("\The [xeno_owner] sweeps its tail in a wide circle!"), \
span_xenowarning("We sweep our tail in a wide circle!"))
- X.add_filter("defender_tail_sweep", 2, gauss_blur_filter(1)) //Add cool SFX
- X.spin(4, 1)
- X.enable_throw_parry(0.6 SECONDS)
- playsound(X,pick('sound/effects/alien/tail_swipe1.ogg','sound/effects/alien/tail_swipe2.ogg','sound/effects/alien/tail_swipe3.ogg'), 25, 1) //Sound effects
+ xeno_owner.add_filter("defender_tail_sweep", 2, gauss_blur_filter(1)) //Add cool SFX
+ xeno_owner.spin(4, 1)
+ xeno_owner.enable_throw_parry(0.6 SECONDS)
+ playsound(xeno_owner,pick('sound/effects/alien/tail_swipe1.ogg','sound/effects/alien/tail_swipe2.ogg','sound/effects/alien/tail_swipe3.ogg'), 25, 1) //Sound effects
var/sweep_range = 1
- var/list/L = orange(sweep_range, X) // Not actually the fruit
+ var/list/L = orange(sweep_range, xeno_owner) // Not actually the fruit
for(var/obj/item/explosive/grenade/G in L)
- G.knockback(X, 6, 2)
+ G.knockback(xeno_owner, 6, 2)
for(var/obj/machinery/deployable/mounted/sentry/sentry in L)
- var/damage = X.xeno_caste.melee_damage
+ var/damage = xeno_owner.xeno_caste.melee_damage
sentry.take_damage(damage, BRUTE, MELEE)
sentry.knock_down()
@@ -49,11 +49,11 @@
continue
H.add_filter("defender_tail_sweep", 2, gauss_blur_filter(1)) //Add cool SFX; motion blur
addtimer(CALLBACK(H, TYPE_PROC_REF(/atom, remove_filter), "defender_tail_sweep"), 0.5 SECONDS) //Remove cool SFX
- var/damage = X.xeno_caste.melee_damage
+ var/damage = xeno_owner.xeno_caste.melee_damage
var/affecting = H.get_limb(ran_zone(null, 0))
if(!affecting) //Still nothing??
affecting = H.get_limb("chest") //Gotta have a torso?!
- H.knockback(X, sweep_range, 4)
+ H.knockback(xeno_owner, sweep_range, 4)
H.apply_damage(damage, BRUTE, affecting, MELEE)
H.apply_damage(damage, STAMINA, updating_health = TRUE)
H.Paralyze(0.5 SECONDS) //trip and go
@@ -61,18 +61,18 @@
SSblackbox.record_feedback(FEEDBACK_TALLY, "round_statistics", 1, "defender_tail_sweep_hits")
shake_camera(H, 2, 1)
- to_chat(H, span_xenowarning("We are struck by \the [X]'s tail sweep!"))
+ to_chat(H, span_xenowarning("We are struck by \the [xeno_owner]'s tail sweep!"))
playsound(H,'sound/weapons/alien_claw_block.ogg', 50, 1)
- addtimer(CALLBACK(X, TYPE_PROC_REF(/atom, remove_filter), "defender_tail_sweep"), 0.5 SECONDS) //Remove cool SFX
+ addtimer(CALLBACK(xeno_owner, TYPE_PROC_REF(/atom, remove_filter), "defender_tail_sweep"), 0.5 SECONDS) //Remove cool SFX
succeed_activate()
- if(X.crest_defense)
- X.use_plasma(ability_cost)
+ if(xeno_owner.crest_defense)
+ xeno_owner.use_plasma(ability_cost)
add_cooldown()
/datum/action/ability/xeno_action/tail_sweep/on_cooldown_finish()
- var/mob/living/carbon/xenomorph/X = owner
- to_chat(X, span_notice("We gather enough strength to tail sweep again."))
+ var/mob/living/carbon/xenomorph/xeno_owner = owner
+ to_chat(xeno_owner, span_notice("We gather enough strength to tail sweep again."))
owner.playsound_local(owner, 'sound/effects/alien/newlarva.ogg', 25, 0, 1)
return ..()
@@ -179,67 +179,67 @@
/datum/action/ability/xeno_action/toggle_crest_defense/give_action()
. = ..()
- var/mob/living/carbon/xenomorph/defender/X = owner
- last_crest_bonus = X.xeno_caste.crest_defense_armor
+ var/mob/living/carbon/xenomorph/defender/xeno_owner = owner
+ last_crest_bonus = xeno_owner.xeno_caste.crest_defense_armor
/datum/action/ability/xeno_action/toggle_crest_defense/on_xeno_upgrade()
- var/mob/living/carbon/xenomorph/X = owner
- if(X.crest_defense)
- X.soft_armor = X.soft_armor.modifyAllRatings(-last_crest_bonus)
- last_crest_bonus = X.xeno_caste.crest_defense_armor
- X.soft_armor = X.soft_armor.modifyAllRatings(last_crest_bonus)
- X.add_movespeed_modifier(MOVESPEED_ID_CRESTDEFENSE, TRUE, 0, NONE, TRUE, X.xeno_caste.crest_defense_slowdown)
+ var/mob/living/carbon/xenomorph/xeno_owner = owner
+ if(xeno_owner.crest_defense)
+ xeno_owner.soft_armor = xeno_owner.soft_armor.modifyAllRatings(-last_crest_bonus)
+ last_crest_bonus = xeno_owner.xeno_caste.crest_defense_armor
+ xeno_owner.soft_armor = xeno_owner.soft_armor.modifyAllRatings(last_crest_bonus)
+ xeno_owner.add_movespeed_modifier(MOVESPEED_ID_CRESTDEFENSE, TRUE, 0, NONE, TRUE, xeno_owner.xeno_caste.crest_defense_slowdown)
else
- last_crest_bonus = X.xeno_caste.crest_defense_armor
+ last_crest_bonus = xeno_owner.xeno_caste.crest_defense_armor
/datum/action/ability/xeno_action/toggle_crest_defense/on_cooldown_finish()
- var/mob/living/carbon/xenomorph/defender/X = owner
- to_chat(X, span_notice("We can [X.crest_defense ? "raise" : "lower"] our crest."))
+ var/mob/living/carbon/xenomorph/defender/xeno_owner = owner
+ to_chat(xeno_owner, span_notice("We can [xeno_owner.crest_defense ? "raise" : "lower"] our crest."))
return ..()
/datum/action/ability/xeno_action/toggle_crest_defense/action_activate()
- var/mob/living/carbon/xenomorph/defender/X = owner
+ var/mob/living/carbon/xenomorph/defender/xeno_owner = owner
- if(X.crest_defense)
+ if(xeno_owner.crest_defense)
set_crest_defense(FALSE)
add_cooldown()
return succeed_activate()
- var/was_fortified = X.fortify
- if(X.fortify)
- var/datum/action/ability/xeno_action/fortify/FT = X.actions_by_path[/datum/action/ability/xeno_action/fortify]
+ var/was_fortified = xeno_owner.fortify
+ if(xeno_owner.fortify)
+ var/datum/action/ability/xeno_action/fortify/FT = xeno_owner.actions_by_path[/datum/action/ability/xeno_action/fortify]
if(FT.cooldown_timer)
- to_chat(X, span_xenowarning("We cannot yet untuck ourselves!"))
+ to_chat(xeno_owner, span_xenowarning("We cannot yet untuck ourselves!"))
return fail_activate()
FT.set_fortify(FALSE, TRUE)
FT.add_cooldown()
- to_chat(X, span_xenowarning("We carefully untuck, keeping our crest lowered."))
+ to_chat(xeno_owner, span_xenowarning("We carefully untuck, keeping our crest lowered."))
set_crest_defense(TRUE, was_fortified)
add_cooldown()
return succeed_activate()
/datum/action/ability/xeno_action/toggle_crest_defense/proc/set_crest_defense(on, silent = FALSE)
- var/mob/living/carbon/xenomorph/defender/X = owner
+ var/mob/living/carbon/xenomorph/defender/xeno_owner = owner
if(on)
if(!silent)
- to_chat(X, span_xenowarning("We tuck ourselves into a defensive stance."))
+ to_chat(xeno_owner, span_xenowarning("We tuck ourselves into a defensive stance."))
GLOB.round_statistics.defender_crest_lowerings++
SSblackbox.record_feedback(FEEDBACK_TALLY, "round_statistics", 1, "defender_crest_lowerings")
- ADD_TRAIT(X, TRAIT_STAGGERIMMUNE, CREST_DEFENSE_TRAIT) //Can now endure impacts/damages that would make lesser xenos flinch
- X.soft_armor = X.soft_armor.modifyAllRatings(last_crest_bonus)
- X.add_movespeed_modifier(MOVESPEED_ID_CRESTDEFENSE, TRUE, 0, NONE, TRUE, X.xeno_caste.crest_defense_slowdown)
+ ADD_TRAIT(xeno_owner, TRAIT_STAGGERIMMUNE, CREST_DEFENSE_TRAIT) //Can now endure impacts/damages that would make lesser xenos flinch
+ xeno_owner.soft_armor = xeno_owner.soft_armor.modifyAllRatings(last_crest_bonus)
+ xeno_owner.add_movespeed_modifier(MOVESPEED_ID_CRESTDEFENSE, TRUE, 0, NONE, TRUE, xeno_owner.xeno_caste.crest_defense_slowdown)
else
if(!silent)
- to_chat(X, span_xenowarning("We raise our crest."))
+ to_chat(xeno_owner, span_xenowarning("We raise our crest."))
GLOB.round_statistics.defender_crest_raises++
SSblackbox.record_feedback(FEEDBACK_TALLY, "round_statistics", 1, "defender_crest_raises")
- REMOVE_TRAIT(X, TRAIT_STAGGERIMMUNE, CREST_DEFENSE_TRAIT)
- X.soft_armor = X.soft_armor.modifyAllRatings(-last_crest_bonus)
- X.remove_movespeed_modifier(MOVESPEED_ID_CRESTDEFENSE)
+ REMOVE_TRAIT(xeno_owner, TRAIT_STAGGERIMMUNE, CREST_DEFENSE_TRAIT)
+ xeno_owner.soft_armor = xeno_owner.soft_armor.modifyAllRatings(-last_crest_bonus)
+ xeno_owner.remove_movespeed_modifier(MOVESPEED_ID_CRESTDEFENSE)
- X.crest_defense = on
- X.update_icons()
+ xeno_owner.crest_defense = on
+ xeno_owner.update_icons()
// ***************************************
// *********** Fortify
@@ -254,79 +254,86 @@
KEYBINDING_NORMAL = COMSIG_XENOABILITY_FORTIFY,
)
var/last_fortify_bonus = 0
+ var/move_on_fortifed = FALSE
/datum/action/ability/xeno_action/fortify/give_action()
. = ..()
- var/mob/living/carbon/xenomorph/defender/X = owner
- last_fortify_bonus = X.xeno_caste.fortify_armor
+ var/mob/living/carbon/xenomorph/defender/xeno_owner = owner
+ last_fortify_bonus = xeno_owner.xeno_caste.fortify_armor
/datum/action/ability/xeno_action/fortify/on_xeno_upgrade()
- var/mob/living/carbon/xenomorph/X = owner
- if(X.fortify)
- X.soft_armor = X.soft_armor.modifyAllRatings(-last_fortify_bonus)
- X.soft_armor = X.soft_armor.modifyRating(BOMB = -last_fortify_bonus)
+ var/mob/living/carbon/xenomorph/xeno_owner = owner
+ if(xeno_owner.fortify)
+ xeno_owner.soft_armor = xeno_owner.soft_armor.modifyAllRatings(-last_fortify_bonus)
+ xeno_owner.soft_armor = xeno_owner.soft_armor.modifyRating(BOMB = -last_fortify_bonus)
- last_fortify_bonus = X.xeno_caste.fortify_armor
+ last_fortify_bonus = xeno_owner.xeno_caste.fortify_armor
- X.soft_armor = X.soft_armor.modifyAllRatings(last_fortify_bonus)
- X.soft_armor = X.soft_armor.modifyRating(BOMB = last_fortify_bonus)
+ xeno_owner.soft_armor = xeno_owner.soft_armor.modifyAllRatings(last_fortify_bonus)
+ xeno_owner.soft_armor = xeno_owner.soft_armor.modifyRating(BOMB = last_fortify_bonus)
else
- last_fortify_bonus = X.xeno_caste.fortify_armor
+ last_fortify_bonus = xeno_owner.xeno_caste.fortify_armor
/datum/action/ability/xeno_action/fortify/on_cooldown_finish()
- var/mob/living/carbon/xenomorph/X = owner
- to_chat(X, span_notice("We can [X.fortify ? "stand up" : "fortify"] again."))
+ var/mob/living/carbon/xenomorph/xeno_owner = owner
+ to_chat(xeno_owner, span_notice("We can [xeno_owner.fortify ? "stand up" : "fortify"] again."))
return ..()
/datum/action/ability/xeno_action/fortify/action_activate()
- var/mob/living/carbon/xenomorph/defender/X = owner
+ var/mob/living/carbon/xenomorph/defender/xeno_owner = owner
- if(X.fortify)
+ if(xeno_owner.fortify)
set_fortify(FALSE)
add_cooldown()
return succeed_activate()
- var/was_crested = X.crest_defense
- if(X.crest_defense)
- var/datum/action/ability/xeno_action/toggle_crest_defense/CD = X.actions_by_path[/datum/action/ability/xeno_action/toggle_crest_defense]
+ var/was_crested = xeno_owner.crest_defense
+ if(xeno_owner.crest_defense)
+ var/datum/action/ability/xeno_action/toggle_crest_defense/CD = xeno_owner.actions_by_path[/datum/action/ability/xeno_action/toggle_crest_defense]
if(CD.cooldown_timer)
- to_chat(X, span_xenowarning("We cannot yet transition to a defensive stance!"))
+ to_chat(xeno_owner, span_xenowarning("We cannot yet transition to a defensive stance!"))
return fail_activate()
CD.set_crest_defense(FALSE, TRUE)
CD.add_cooldown()
- to_chat(X, span_xenowarning("We tuck our lowered crest into ourselves."))
+ to_chat(xeno_owner, span_xenowarning("We tuck our lowered crest into ourselves."))
- var/datum/action/ability/activable/xeno/charge/forward_charge/combo_cooldown = X.actions_by_path[/datum/action/ability/activable/xeno/charge/forward_charge]
- combo_cooldown.add_cooldown(cooldown_duration)
+ var/datum/action/ability/activable/xeno/charge/forward_charge/combo_cooldown = xeno_owner.actions_by_path[/datum/action/ability/activable/xeno/charge/forward_charge]
+ combo_cooldown?.add_cooldown(cooldown_duration)
set_fortify(TRUE, was_crested)
add_cooldown()
return succeed_activate()
/datum/action/ability/xeno_action/fortify/proc/set_fortify(on, silent = FALSE)
- var/mob/living/carbon/xenomorph/defender/X = owner
+ var/mob/living/carbon/xenomorph/defender/xeno_owner = owner
GLOB.round_statistics.defender_fortifiy_toggles++
SSblackbox.record_feedback(FEEDBACK_TALLY, "round_statistics", 1, "defender_fortifiy_toggles")
if(on)
- ADD_TRAIT(X, TRAIT_IMMOBILE, FORTIFY_TRAIT)
- ADD_TRAIT(X, TRAIT_STOPS_TANK_COLLISION, FORTIFY_TRAIT)
+ if(move_on_fortifed)
+ xeno_owner.add_movespeed_modifier(MOVESPEED_ID_FORTIFY, TRUE, 0, NONE, TRUE, 5)
+ else
+ ADD_TRAIT(xeno_owner, TRAIT_IMMOBILE, FORTIFY_TRAIT)
+ ADD_TRAIT(xeno_owner, TRAIT_STOPS_TANK_COLLISION, FORTIFY_TRAIT)
if(!silent)
- to_chat(X, span_xenowarning("We tuck ourselves into a defensive stance."))
- X.soft_armor = X.soft_armor.modifyAllRatings(last_fortify_bonus)
- X.soft_armor = X.soft_armor.modifyRating(BOMB = last_fortify_bonus) //double bomb bonus for explosion immunity
+ to_chat(xeno_owner, span_xenowarning("We tuck ourselves into a defensive stance."))
+ xeno_owner.soft_armor = xeno_owner.soft_armor.modifyAllRatings(last_fortify_bonus)
+ xeno_owner.soft_armor = xeno_owner.soft_armor.modifyRating(BOMB = last_fortify_bonus) //double bomb bonus for explosion immunity
owner.drop_all_held_items() // drop items (hugger/jelly)
else
if(!silent)
- to_chat(X, span_xenowarning("We resume our normal stance."))
- X.soft_armor = X.soft_armor.modifyAllRatings(-last_fortify_bonus)
- X.soft_armor = X.soft_armor.modifyRating(BOMB = -last_fortify_bonus)
- REMOVE_TRAIT(X, TRAIT_IMMOBILE, FORTIFY_TRAIT)
- REMOVE_TRAIT(X, TRAIT_STOPS_TANK_COLLISION, FORTIFY_TRAIT)
-
- X.fortify = on
- X.anchored = on
- playsound(X.loc, 'sound/effects/stonedoor_openclose.ogg', 30, TRUE)
- X.update_icons()
+ to_chat(xeno_owner, span_xenowarning("We resume our normal stance."))
+ xeno_owner.soft_armor = xeno_owner.soft_armor.modifyAllRatings(-last_fortify_bonus)
+ xeno_owner.soft_armor = xeno_owner.soft_armor.modifyRating(BOMB = -last_fortify_bonus)
+ if(move_on_fortifed)
+ xeno_owner.remove_movespeed_modifier(MOVESPEED_ID_FORTIFY)
+ else
+ REMOVE_TRAIT(xeno_owner, TRAIT_IMMOBILE, FORTIFY_TRAIT)
+ REMOVE_TRAIT(xeno_owner, TRAIT_STOPS_TANK_COLLISION, FORTIFY_TRAIT)
+
+ xeno_owner.fortify = on
+ xeno_owner.anchored = on
+ playsound(xeno_owner.loc, 'sound/effects/stonedoor_openclose.ogg', 30, TRUE)
+ xeno_owner.update_icons()
// ***************************************
// *********** Regenerate Skin
@@ -344,27 +351,27 @@
)
/datum/action/ability/xeno_action/regenerate_skin/on_cooldown_finish()
- var/mob/living/carbon/xenomorph/X = owner
- to_chat(X, span_notice("We feel we are ready to shred our skin and grow another."))
+ var/mob/living/carbon/xenomorph/xeno_owner = owner
+ to_chat(xeno_owner, span_notice("We feel we are ready to shred our skin and grow another."))
return ..()
/datum/action/ability/xeno_action/regenerate_skin/action_activate()
- var/mob/living/carbon/xenomorph/defender/X = owner
+ var/mob/living/carbon/xenomorph/defender/xeno_owner = owner
if(!can_use_action(TRUE))
return fail_activate()
- if(X.on_fire)
- to_chat(X, span_xenowarning("We can't use that while on fire."))
+ if(xeno_owner.on_fire)
+ to_chat(xeno_owner, span_xenowarning("We can't use that while on fire."))
return fail_activate()
- X.emote("roar")
- X.visible_message(span_warning("The skin on \the [X] shreds and a new layer can be seen in it's place!"),
+ xeno_owner.emote("roar")
+ xeno_owner.visible_message(span_warning("The skin on \the [xeno_owner] shreds and a new layer can be seen in it's place!"),
span_notice("We shed our skin, showing the fresh new layer underneath!"))
- X.do_jitter_animation(1000)
- X.set_sunder(0)
- X.heal_overall_damage(50, 50, updating_health = TRUE) //RUTGMC EDIT
+ xeno_owner.do_jitter_animation(1000)
+ xeno_owner.set_sunder(0)
+ xeno_owner.heal_overall_damage(50, 50, updating_health = TRUE)
add_cooldown()
return succeed_activate()
@@ -392,9 +399,9 @@
if(spin_loop_timer)
return TRUE
. = ..()
- var/mob/living/carbon/xenomorph/X = owner
- if(X.crest_defense && X.plasma_stored < (ability_cost * 2))
- to_chat(X, span_xenowarning("We don't have enough plasma, we need [(ability_cost * 2) - X.plasma_stored] more plasma!"))
+ var/mob/living/carbon/xenomorph/xeno_owner = owner
+ if(xeno_owner.crest_defense && xeno_owner.plasma_stored < (ability_cost * 2))
+ to_chat(xeno_owner, span_xenowarning("We don't have enough plasma, we need [(ability_cost * 2) - xeno_owner.plasma_stored] more plasma!"))
return FALSE
/datum/action/ability/xeno_action/centrifugal_force/action_activate()
@@ -416,43 +423,43 @@
/// runs a spin, then starts the timer for a new spin if needed
/datum/action/ability/xeno_action/centrifugal_force/proc/do_spin()
spin_loop_timer = null
- var/mob/living/carbon/xenomorph/X = owner
- X.spin(4, 1)
- X.enable_throw_parry(0.6 SECONDS)
- playsound(X, pick('sound/effects/alien/tail_swipe1.ogg','sound/effects/alien/tail_swipe2.ogg','sound/effects/alien/tail_swipe3.ogg'), 25, 1) //Sound effects
+ var/mob/living/carbon/xenomorph/xeno_owner = owner
+ xeno_owner.spin(4, 1)
+ xeno_owner.enable_throw_parry(0.6 SECONDS)
+ playsound(xeno_owner, pick('sound/effects/alien/tail_swipe1.ogg','sound/effects/alien/tail_swipe2.ogg','sound/effects/alien/tail_swipe3.ogg'), 25, 1) //Sound effects
- for(var/obj/item/explosive/grenade/G in orange (1, X))
- G.knockback(X, 6, 2)
+ for(var/obj/item/explosive/grenade/G in orange (1, xeno_owner))
+ G.knockback(xeno_owner, 6, 2)
- for(var/obj/machinery/deployable/mounted/sentry/sentry in orange (1, X))
- var/damage = X.xeno_caste.melee_damage
+ for(var/obj/machinery/deployable/mounted/sentry/sentry in orange (1, xeno_owner))
+ var/damage = xeno_owner.xeno_caste.melee_damage
sentry.take_damage(damage, BRUTE, MELEE)
sentry.knock_down()
- for(var/mob/living/carbon/human/slapped in orange(1, X))
+ for(var/mob/living/carbon/human/slapped in orange(1, xeno_owner))
if(slapped.stat == DEAD)
continue
slapped.add_filter("defender_tail_sweep", 2, gauss_blur_filter(1)) //Add cool SFX; motion blur
addtimer(CALLBACK(slapped, TYPE_PROC_REF(/atom, remove_filter), "defender_tail_sweep"), 0.5 SECONDS) //Remove cool SFX
- var/damage = X.xeno_caste.melee_damage * 0.5
+ var/damage = xeno_owner.xeno_caste.melee_damage * 0.5
var/affecting = slapped.get_limb(ran_zone(null, 0))
if(!affecting)
affecting = slapped.get_limb("chest")
- slapped.knockback(X, 1, 4)
+ slapped.knockback(xeno_owner, 1, 4)
slapped.apply_damage(damage, BRUTE, affecting, MELEE)
slapped.apply_damage(damage, STAMINA, updating_health = TRUE)
slapped.Paralyze(0.3 SECONDS)
shake_camera(slapped, 2, 1)
- to_chat(slapped, span_xenowarning("We are struck by \the [X]'s flying tail!"))
+ to_chat(slapped, span_xenowarning("We are struck by \the [xeno_owner]'s flying tail!"))
playsound(slapped, 'sound/weapons/alien_claw_block.ogg', 50, 1)
- succeed_activate(X.crest_defense ? ability_cost * 2 : ability_cost)
+ succeed_activate(xeno_owner.crest_defense ? ability_cost * 2 : ability_cost)
if(step_tick)
- step(X, pick(GLOB.alldirs))
+ step(xeno_owner, pick(GLOB.alldirs))
step_tick = !step_tick
- if(can_use_action(X, ABILITY_IGNORE_COOLDOWN))
+ if(can_use_action(xeno_owner, ABILITY_IGNORE_COOLDOWN))
spin_loop_timer = addtimer(CALLBACK(src, PROC_REF(do_spin)), 5, TIMER_STOPPABLE)
return
stop_spin()
@@ -464,3 +471,152 @@
deltimer(spin_loop_timer)
spin_loop_timer = null
UnregisterSignal(owner, list(SIGNAL_ADDTRAIT(TRAIT_FLOORED), SIGNAL_ADDTRAIT(TRAIT_INCAPACITATED), SIGNAL_ADDTRAIT(TRAIT_IMMOBILE)))
+
+// ***************************************
+// *********** Headbutt
+// ***************************************
+
+/datum/action/ability/activable/xeno/headbutt
+ name = "Headbutt"
+ action_icon_state = "headbutt"
+ desc = "Headbutts into the designated target"
+ cooldown_duration = 10 SECONDS
+ ability_cost = 35
+ use_state_flags = ABILITY_USE_FORTIFIED|ABILITY_USE_CRESTED // yea
+ keybinding_signals = list(
+ KEYBINDING_NORMAL = COMSIG_XENOABILITY_STEELCREST_HEADBUTT,
+ )
+ target_flags = ABILITY_MOB_TARGET
+ var/base_damage = 30
+
+/datum/action/ability/activable/xeno/headbutt/on_cooldown_finish()
+ to_chat(owner, span_notice("We gather enough strength to headbutt again."))
+ return ..()
+
+/datum/action/ability/activable/xeno/headbutt/can_use_ability(atom/target, silent = FALSE, override_flags)
+ . = ..()
+ if(!.)
+ return FALSE
+ if(QDELETED(target))
+ return FALSE
+ if(!ishuman(target))
+ return FALSE
+ var/mob/living/carbon/xenomorph/defender/xeno_owner = owner
+ var/max_dist = 2 - (xeno_owner.crest_defense)
+ if(!line_of_sight(owner, target, max_dist))
+ if(!silent)
+ to_chat(owner, span_warning("We must get closer to headbutt"))
+ return FALSE
+ if(ishuman(target))
+ var/mob/living/carbon/human/victim = target
+ if(isnestedhost(victim))
+ return FALSE
+ if(!CHECK_BITFIELD(use_state_flags|override_flags, ABILITY_IGNORE_DEAD_TARGET) && victim.stat == DEAD)
+ return FALSE
+
+/datum/action/ability/activable/xeno/headbutt/use_ability(atom/target)
+ var/mob/living/carbon/xenomorph/defender/xeno_owner = owner
+ var/mob/living/victim = target
+
+ SSblackbox.record_feedback(FEEDBACK_TALLY, "round_statistics", 1, "headbutts")
+
+ var/headbutt_distance = 1 + (xeno_owner.crest_defense * 2) + (xeno_owner.fortify * 2)
+ var/headbutt_damage = base_damage - (xeno_owner.crest_defense * 10)
+
+ if(!xeno_owner.crest_defense)
+ add_cooldown()
+ xeno_owner.throw_at(get_step_towards(victim, xeno_owner), 4, 3, owner)
+ if(!xeno_owner.Adjacent(victim))
+ succeed_activate()
+ return
+
+ owner.visible_message(span_xenowarning("[owner] rams [victim] with its armored crest!"), \
+ span_xenowarning("We ram [victim] with our armored crest!"))
+
+ victim.apply_damage(headbutt_damage, BRUTE, BODY_ZONE_CHEST, MELEE)
+
+ xeno_owner.do_attack_animation(victim)
+
+ var/facing = get_dir(xeno_owner, victim)
+ var/turf/T = victim.loc
+ var/turf/temp
+ for(var/x in 1 to headbutt_distance)
+ temp = get_step(T, facing)
+ if(!temp)
+ break
+ T = temp
+ victim.throw_at(T, headbutt_distance, 1, owner, TRUE)
+
+ playsound(victim,'sound/weapons/alien_claw_block.ogg', 75, 1)
+
+ succeed_activate()
+ add_cooldown()
+
+/datum/action/ability/xeno_action/soak
+ name = "soak"
+ action_icon_state = "soak"
+ desc = "When activated tracks damaged taken for 6 seconds, once the amount of damage reaches 140, the Defender is healed by 75 and the Tail Slam cooldown is reset. If the damage threshold is not reached, nothing happens."
+ cooldown_duration = 17 SECONDS
+ ability_cost = 35
+ use_state_flags = ABILITY_USE_FORTIFIED|ABILITY_USE_CRESTED // yea
+ keybinding_signals = list(
+ KEYBINDING_NORMAL = COMSIG_XENOABILITY_STEELCREST_SOAK,
+ )
+ /// Requires 140 damage taken within 6 seconds to activate the ability
+ var/damage_threshold = 140
+ /// Heal
+ var/heal_amount = 80
+ /// Sunder heal
+ var/heal_sunder_amount = 25
+ /// Initially zero, gets damage added when the ability is activated
+ var/damage_accumulated = 0
+
+/datum/action/ability/xeno_action/soak/action_activate(atom/target)
+ var/mob/living/carbon/xenomorph/xeno_owner = owner
+
+ RegisterSignal(xeno_owner, COMSIG_XENOMORPH_TAKING_DAMAGE, PROC_REF(damage_accumulate))
+ addtimer(CALLBACK(src, PROC_REF(stop_accumulating)), 6 SECONDS)
+
+ xeno_owner.balloon_alert(xeno_owner, "begins to tank incoming damage!")
+
+ to_chat(xeno_owner, span_xenonotice("We begin to tank incoming damage!"))
+
+ xeno_owner.add_filter("steelcrest_enraging", 1, list("type" = "outline", "color" = "#421313", "size" = 1))
+
+ succeed_activate()
+ add_cooldown()
+
+/datum/action/ability/xeno_action/soak/proc/damage_accumulate(datum/source, damage)
+ SIGNAL_HANDLER
+
+ damage_accumulated += damage
+
+ if(damage_accumulated >= damage_threshold)
+ addtimer(CALLBACK(src, PROC_REF(enraged), owner), 0.1 SECONDS) //CM use timer, so i do
+ UnregisterSignal(owner, COMSIG_XENOMORPH_TAKING_DAMAGE) // Two Unregistersignal because if the enrage proc doesnt happen, then it needs to stop counting
+
+/datum/action/ability/xeno_action/soak/proc/stop_accumulating()
+ UnregisterSignal(owner, COMSIG_XENOMORPH_TAKING_DAMAGE)
+
+ damage_accumulated = 0
+ to_chat(owner, span_xenonotice("We stop taking incoming damage."))
+ owner.remove_filter("steelcrest_enraging")
+
+/datum/action/ability/xeno_action/soak/proc/enraged()
+ owner.remove_filter("steelcrest_enraging")
+ owner.add_filter("steelcrest_enraged", 1, list("type" = "outline", "color" = "#ad1313", "size" = 1))
+
+ owner.visible_message(span_xenowarning("[owner] gets enraged after being damaged enough!"), \
+ span_xenowarning("We feel enraged after taking in oncoming damage! Our tail slam's cooldown is reset and we heal!"))
+
+ var/mob/living/carbon/xenomorph/enraged_mob = owner
+ HEAL_XENO_DAMAGE(enraged_mob, heal_amount, FALSE)
+ enraged_mob.adjust_sunder(-heal_sunder_amount)
+
+ addtimer(CALLBACK(src, PROC_REF(remove_enrage), owner), 3 SECONDS)
+
+/datum/action/ability/xeno_action/soak/proc/remove_enrage()
+ owner.remove_filter("steelcrest_enraged")
+
+/datum/action/ability/xeno_action/fortify/steel_crest
+ move_on_fortifed = TRUE
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/defender/castedatum_defender.dm b/code/modules/mob/living/carbon/xenomorph/castes/defender/castedatum_defender.dm
index 167214217df..d03e76c13cf 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/defender/castedatum_defender.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/defender/castedatum_defender.dm
@@ -53,7 +53,10 @@
/datum/action/ability/xeno_action/tail_sweep,
)
-/datum/xeno_caste/defender/ancient
+/datum/xeno_caste/defender/normal
+ upgrade = XENO_UPGRADE_NORMAL
+
+/datum/xeno_caste/defender/steel_crest/normal
upgrade = XENO_UPGRADE_NORMAL
/datum/xeno_caste/defender/primordial
@@ -72,3 +75,35 @@
/datum/action/ability/xeno_action/tail_sweep,
/datum/action/ability/xeno_action/centrifugal_force,
)
+
+/datum/xeno_caste/defender/steel_crest
+ caste_type_path = /mob/living/carbon/xenomorph/defender/steel_crest
+ base_caste_type_path = /mob/living/carbon/xenomorph/defender
+ upgrade_name = ""
+ caste_name = "Defender"
+ display_name = "Steel crest"
+ upgrade = XENO_UPGRADE_BASETYPE
+ caste_desc = "An alien with an armored crest. It looks very tough."
+
+ // *** Speed *** //
+ speed = -0.4
+
+ // *** Defender Abilities *** //
+ crest_defense_armor = 30
+ crest_defense_slowdown = 0.8
+ fortify_armor = 40
+
+ actions = list(
+ /datum/action/ability/xeno_action/xeno_resting,
+ /datum/action/ability/xeno_action/watch_xeno,
+ /datum/action/ability/activable/xeno/psydrain,
+ /datum/action/ability/xeno_action/fortify/steel_crest,
+ /datum/action/ability/xeno_action/toggle_crest_defense,
+ /datum/action/ability/activable/xeno/headbutt,
+ /datum/action/ability/xeno_action/soak,
+ )
+
+/datum/xeno_caste/defender/steel_crest/primordial
+ upgrade_name = "Primordial"
+ upgrade = XENO_UPGRADE_PRIMO
+ caste_desc = "Alien with an incredibly tough and armored head crest able to endure even the strongest hits."
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/defender/defender.dm b/code/modules/mob/living/carbon/xenomorph/castes/defender/defender.dm
index fbd230aff73..bba27badc16 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/defender/defender.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/defender/defender.dm
@@ -43,9 +43,13 @@
if(isnull(.))
return
if(. == CONSCIOUS && fortify) //No longer conscious.
- var/datum/action/ability/xeno_action/fortify/FT = actions_by_path[/datum/action/ability/xeno_action/fortify]
- FT.set_fortify(FALSE) //Fortify prevents dragging due to the anchor component.
-
+ //Fortify prevents dragging due to the anchor component. // TODO: Unshitcode me
+ if(actions_by_path[/datum/action/ability/xeno_action/fortify])
+ var/datum/action/ability/xeno_action/fortify/FT = actions_by_path[/datum/action/ability/xeno_action/fortify]
+ FT.set_fortify(FALSE)
+ else if(actions_by_path[/datum/action/ability/xeno_action/fortify/steel_crest])
+ var/datum/action/ability/xeno_action/fortify/FT = actions_by_path[/datum/action/ability/xeno_action/fortify/steel_crest]
+ FT.set_fortify(FALSE)
// ***************************************
// *********** Mob overrides
@@ -54,3 +58,24 @@
/mob/living/carbon/xenomorph/defender/Initialize(mapload)
. = ..()
AddComponent(/datum/component/throw_parry)
+
+// ***************************************
+// *********** Steel crest
+// ***************************************
+
+/mob/living/carbon/xenomorph/defender/steel_crest
+ icon = 'icons/Xeno/castes/defender/steel_crest.dmi'
+ caste_base_type = /datum/xeno_caste/defender/steel_crest
+
+// ***************************************
+// *********** Front Armor
+// ***************************************
+
+/mob/living/carbon/xenomorph/defender/steel_crest/projectile_hit(obj/projectile/proj, cardinal_move, uncrossing)
+ if(SEND_SIGNAL(src, COMSIG_XENO_PROJECTILE_HIT, proj, cardinal_move, uncrossing) & COMPONENT_PROJECTILE_DODGE)
+ return FALSE
+ if(proj.ammo.flags_ammo_behavior & AMMO_SKIPS_ALIENS)
+ return FALSE
+ if((cardinal_move & REVERSE_DIR(dir)))
+ proj.damage -= proj.damage * (0.2 * get_sunder())
+ return ..()
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/hivemind/hivemind.dm b/code/modules/mob/living/carbon/xenomorph/castes/hivemind/hivemind.dm
index 9f214ea4008..f58770375fe 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/hivemind/hivemind.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/hivemind/hivemind.dm
@@ -29,6 +29,7 @@
sight = SEE_MOBS|SEE_TURFS|SEE_OBJS
see_in_dark = 8
move_on_shuttle = TRUE
+ initial_language_holder = /datum/language_holder/hivemind
hud_type = /datum/hud/hivemind
hud_possible = list(PLASMA_HUD, HEALTH_HUD_XENO, PHEROMONE_HUD, XENO_RANK_HUD, QUEEN_OVERWATCH_HUD, XENO_BLESSING_HUD, XENO_EVASION_HUD)
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/hunter/abilities_hunter.dm b/code/modules/mob/living/carbon/xenomorph/castes/hunter/abilities_hunter.dm
index 00efedefec0..be8f5635701 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/hunter/abilities_hunter.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/hunter/abilities_hunter.dm
@@ -632,6 +632,7 @@
ability_cost = 0
cooldown_duration = 0
keybind_flags = ABILITY_USE_STAGGERED | ABILITY_IGNORE_SELECTED_ABILITY
+ hidden = TRUE
/datum/action/ability/xeno_action/hunter_army/give_action(mob/living/L)
. = ..()
@@ -653,9 +654,6 @@
if(prob(ILUSSION_CHANCE))
new /mob/illusion/xeno(target_turf, owner, owner, ILLUSION_LIFETIME)
-/datum/action/ability/xeno_action/hunter_army/should_show()
- return FALSE
-
// ***************************************
// *********** Crippling strike
// ***************************************
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/king/king.dm b/code/modules/mob/living/carbon/xenomorph/castes/king/king.dm
index 86f059663af..9e17e5e28ea 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/king/king.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/king/king.dm
@@ -44,7 +44,7 @@
if(4201 to 9000)
name = prefix + "Ancient Emperor ([nicknumber])"
if(9001 to INFINITY)
- name = prefix + "Prime Emperor ([nicknumber])"
+ name = prefix + "Primal Emperor ([nicknumber])"
else
name = prefix + "Young King ([nicknumber])"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/queen/abilities_queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/queen/abilities_queen.dm
index 33f365838ab..7c6f8fc5f37 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/queen/abilities_queen.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/queen/abilities_queen.dm
@@ -16,7 +16,7 @@
var/mob/living/carbon/xenomorph/queen/Q = owner
//Preferring the use of multiline input as the message box is larger and easier to quickly proofread before sending to hive.
- var/input = stripped_multiline_input(Q, "Maximum message length: [MAX_BROADCAST_LEN]", "Hive Message", "", MAX_BROADCAST_LEN, TRUE)
+ var/input = stripped_multiline_input(Q, "Максимальная длина: [MAX_BROADCAST_LEN]", "Приказ Улью", "", MAX_BROADCAST_LEN, TRUE)
//Newlines are of course stripped and replaced with a space.
input = capitalize(trim(replacetext(input, "\n", " ")))
if(!input)
@@ -34,14 +34,14 @@
log_game("[key_name(Q)] has messaged the hive with: \"[input]\"")
deadchat_broadcast(" has messaged the hive: \"[input]\"", Q, Q)
- var/queens_word = "HIVE MESSAGE:
" + input
+ var/queens_word = "ПРИКАЗ УЛЬЮ:
" + input
var/sound/queen_sound = sound(get_sfx("queen"), channel = CHANNEL_ANNOUNCEMENTS)
var/sound/king_sound = sound('sound/voice/alien/xenos_roaring.ogg', channel = CHANNEL_ANNOUNCEMENTS)
for(var/mob/living/carbon/xenomorph/X AS in Q.hive.get_all_xenos())
to_chat(X, assemble_alert(
- title = "Hive Announcement",
- subtitle = "From [Q.name]",
+ title = "Приказ Улью",
+ subtitle = "Приказ [Q.name]",
message = input,
color_override = "purple"
))
@@ -224,6 +224,7 @@
desc = "See from the target Xenomorphs vision. Click again the ability to stop observing"
ability_cost = 0
use_state_flags = ABILITY_USE_LYING
+ hidden = TRUE
var/overwatch_active = FALSE
/datum/action/ability/xeno_action/watch_xeno/give_action(mob/living/L)
@@ -237,9 +238,6 @@
UnregisterSignal(L, list(COMSIG_MOB_DEATH, COMSIG_XENOMORPH_WATCHXENO))
return ..()
-/datum/action/ability/xeno_action/watch_xeno/should_show()
- return FALSE // Overwatching now done through hive status UI!
-
/datum/action/ability/xeno_action/watch_xeno/proc/start_overwatch(mob/living/carbon/xenomorph/target)
if(!can_use_action()) // Check for action now done here as action_activate pipeline has been bypassed with signal activation.
return
@@ -359,9 +357,7 @@
desc = "Make a target Xenomorph a leader."
ability_cost = 200
use_state_flags = ABILITY_USE_LYING
-
-/datum/action/ability/xeno_action/set_xeno_lead/should_show()
- return FALSE // Leadership now set through hive status UI!
+ hidden = TRUE
/datum/action/ability/xeno_action/set_xeno_lead/give_action(mob/living/L)
. = ..()
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/queen/queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/queen/queen.dm
index 72b590df603..df98d46d3ee 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/queen/queen.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/queen/queen.dm
@@ -87,7 +87,7 @@
if(4201 to 9000)
name = prefix + "Ancient Empress ([nicknumber])"
if(9001 to INFINITY)
- name = prefix + "Prime Empress ([nicknumber])"
+ name = prefix + "Primal Empress ([nicknumber])"
else
name = prefix + "Young Queen ([nicknumber])"
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/spiderling/castedatum_spiderling.dm b/code/modules/mob/living/carbon/xenomorph/castes/spiderling/castedatum_spiderling.dm
index f19a362fc49..6f2b52206c3 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/spiderling/castedatum_spiderling.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/spiderling/castedatum_spiderling.dm
@@ -15,7 +15,7 @@
plasma_max = 200
plasma_gain = 1
// *** Health *** //
- max_health = 225
+ max_health = 150
// *** Flags *** //
caste_flags = CASTE_NOT_IN_BIOSCAN|CASTE_DO_NOT_ANNOUNCE_DEATH|CASTE_DO_NOT_ALERT_LOW_LIFE|CASTE_IS_A_MINION
// *** Minimap Icon *** //
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/warrior/abilities_warrior.dm b/code/modules/mob/living/carbon/xenomorph/castes/warrior/abilities_warrior.dm
index 26dbc36d1e4..282fadf01ae 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/warrior/abilities_warrior.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/warrior/abilities_warrior.dm
@@ -18,9 +18,7 @@
/datum/action/ability/activable/xeno/warrior/punch/jab,
/datum/action/ability/activable/xeno/warrior/punch/flurry,
)
-
-/datum/action/ability/xeno_action/empower/should_show()
- return FALSE
+ hidden = TRUE
/// Checks if Empower is capped and gives bonuses if so, otherwise increases combo count.
/datum/action/ability/xeno_action/empower/proc/check_empower(atom/target)
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/widow/abilities_widow.dm b/code/modules/mob/living/carbon/xenomorph/castes/widow/abilities_widow.dm
index 53e96c87446..54b00ff12b7 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/widow/abilities_widow.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/widow/abilities_widow.dm
@@ -164,6 +164,9 @@
if(owner.do_actions)
return fail_activate()
+ if(current_charges <= 0)
+ return fail_activate()
+
var/mob/living/carbon/xenomorph/X = owner
if(length(spiderlings) >= X.xeno_caste.max_spiderlings)
X.balloon_alert(X, "Max Spiderlings")
@@ -411,6 +414,7 @@
ability_cost = 0
cooldown_duration = 0
keybind_flags = ABILITY_USE_STAGGERED | ABILITY_IGNORE_SELECTED_ABILITY
+ hidden = TRUE
/datum/action/ability/xeno_action/spider_venom/give_action(mob/living/L)
. = ..()
@@ -428,6 +432,3 @@
return
target.apply_status_effect(STATUS_EFFECT_SPIDER_VENOM)
-
-/datum/action/ability/xeno_action/spider_venom/should_show()
- return FALSE
diff --git a/code/modules/mob/living/carbon/xenomorph/charge_crush.dm b/code/modules/mob/living/carbon/xenomorph/charge_crush.dm
index d1dc7ae9f10..64846e2c795 100644
--- a/code/modules/mob/living/carbon/xenomorph/charge_crush.dm
+++ b/code/modules/mob/living/carbon/xenomorph/charge_crush.dm
@@ -279,7 +279,7 @@
if(isobj(crushed))
var/obj/crushed_obj = crushed
- if(istype(crushed_obj, /obj/structure/xeno/silo) || istype(crushed_obj, /obj/structure/xeno/xeno_turret))
+ if(istype(crushed_obj, /obj/structure/xeno/silo) || istype(crushed_obj, /obj/structure/xeno/turret))
return precrush2signal(crushed_obj.post_crush_act(charger, src))
playsound(crushed_obj.loc, "punch", 25, 1)
var/crushed_behavior = crushed_obj.crushed_special_behavior()
diff --git a/code/modules/mob/living/carbon/xenomorph/egg.dm b/code/modules/mob/living/carbon/xenomorph/egg.dm
index a3a9e365c66..3dee9bacf95 100644
--- a/code/modules/mob/living/carbon/xenomorph/egg.dm
+++ b/code/modules/mob/living/carbon/xenomorph/egg.dm
@@ -100,13 +100,13 @@
//Observers can become playable facehuggers by clicking on the egg
/obj/alien/egg/hugger/attack_ghost(mob/dead/observer/user)
. = ..()
- var/datum/hive_status/hive = GLOB.hive_datums[hivenumber]
if(maturity_stage != stage_ready_to_burst)
return FALSE
if(!hugger_type)
return FALSE
+ var/datum/hive_status/hive = GLOB.hive_datums[hivenumber]
if(!hive.can_spawn_as_hugger(user))
return FALSE
@@ -137,7 +137,7 @@
F.balloon_alert(F, span_xenowarning("We can't use this egg"))
return
- F.visible_message(span_xenowarning("[F] slides back into [src]."),span_xenonotice("You slides back into [src]."))
+ F.visible_message(span_xenowarning("[F] slides back into [src]."),span_xenonotice("You slide back into [src]."))
F.ghostize()
F.death(deathmessage = "get inside the egg", silent = TRUE)
qdel(F)
diff --git a/code/modules/mob/living/carbon/xenomorph/embryo.dm b/code/modules/mob/living/carbon/xenomorph/embryo.dm
index ca3a6e056df..01ceed82799 100644
--- a/code/modules/mob/living/carbon/xenomorph/embryo.dm
+++ b/code/modules/mob/living/carbon/xenomorph/embryo.dm
@@ -147,7 +147,7 @@
if(isyautja(affected_mob))
new_xeno = new /mob/living/carbon/xenomorph/larva/predalien(affected_mob)
- yautja_announcement(span_yautjaboldbig("WARNING!\n\nAn abomination has been detected at [get_area_name(new_xeno)]. It is a stain upon our purity and is unfit for life. Exterminate it immediately.\n\nHeavy Armory unlocked."))
+ yautja_announcement(span_yautjaboldbig("ТРЕВОГА!\n\nЗамечено Отродье в [get_area_name(new_xeno)]. Это слишком низко для нашей чести. Ошибка природы. Уничтожьте его немедленно.\n\nОткрыт доступ к Тяжелому Вооружению."))
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_YAUTJA_ARMORY_OPENED)
else
new_xeno = new(affected_mob)
diff --git a/code/modules/mob/living/carbon/xenomorph/evolution.dm b/code/modules/mob/living/carbon/xenomorph/evolution.dm
index a3928a480b9..0af4df8ae57 100644
--- a/code/modules/mob/living/carbon/xenomorph/evolution.dm
+++ b/code/modules/mob/living/carbon/xenomorph/evolution.dm
@@ -133,7 +133,7 @@
///Actually changes the xenomorph to another caste
/mob/living/carbon/xenomorph/proc/finish_evolve(new_mob_type)
- var/mob/living/carbon/xenomorph/new_xeno = new new_mob_type(get_turf(src))
+ var/mob/living/carbon/xenomorph/new_xeno = new new_mob_type(get_turf(src), TRUE)
if(!istype(new_xeno))
//Something went horribly wrong!
@@ -148,7 +148,6 @@
return
SEND_SIGNAL(src, COMSIG_XENOMORPH_EVOLVED, new_xeno)
-
for(var/obj/item/W in contents) //Drop stuff
dropItemToGround(W)
@@ -168,6 +167,11 @@
qdel(new_xeno.hunter_data)
new_xeno.hunter_data = hunter_data
hunter_data = null
+ new_xeno.upgrades_holder = upgrades_holder
+ for(var/datum/status_effect/S AS in new_xeno.upgrades_holder)
+ new_xeno.apply_status_effect(S)
+ new_xeno.generate_name() // This is specifically for numbered xenos who want to keep their previous number instead of a random new one.
+ new_xeno.hive?.update_ruler() // Since ruler wasn't set during initialization, update ruler now.
transfer_observers_to(new_xeno)
if(new_xeno.health - getBruteLoss(src) - getFireLoss(src) > 0) //Cmon, don't kill the new one! Shouldnt be possible though
@@ -221,7 +225,6 @@
selector?.set_selected_zone(zone_selected, new_xeno)
qdel(src)
INVOKE_ASYNC(new_xeno, TYPE_PROC_REF(/atom, do_jitter_animation), 1000)
- new_xeno.overlay_fullscreen_timer(2 SECONDS, 20, "roundstart2", /atom/movable/screen/fullscreen/spawning_in)
///Check if the xeno is currently able to evolve
/mob/living/carbon/xenomorph/proc/generic_evolution_checks()
diff --git a/code/modules/mob/living/carbon/xenomorph/hive_datum.dm b/code/modules/mob/living/carbon/xenomorph/hive_datum.dm
index 602f7759cbe..598a4e647a2 100644
--- a/code/modules/mob/living/carbon/xenomorph/hive_datum.dm
+++ b/code/modules/mob/living/carbon/xenomorph/hive_datum.dm
@@ -122,7 +122,7 @@
for(var/obj/structure/xeno/silo/resin_silo AS in GLOB.xeno_resin_silos_by_hive[hivenumber])
.["hive_structures"] += list(get_structure_packet(resin_silo))
// Acid, sticky, and hugger turrets.
- for(var/obj/structure/xeno/xeno_turret/turret AS in GLOB.xeno_resin_turrets_by_hive[hivenumber])
+ for(var/obj/structure/xeno/turret/turret AS in GLOB.xeno_resin_turrets_by_hive[hivenumber])
.["hive_structures"] += list(get_structure_packet(turret))
// Psychic relays
for(var/obj/structure/xeno/psychictower/tower AS in GLOB.hive_datums[hivenumber].psychictowers)
@@ -403,6 +403,9 @@
// *********** Adding xenos
// ***************************************
/datum/hive_status/proc/add_xeno(mob/living/carbon/xenomorph/X) // should only be called by add_to_hive below
+ if(isnull(X)) // don't add nulls please
+ return FALSE
+
if(X.stat == DEAD)
dead_xenos += X
else
@@ -429,7 +432,7 @@
return TRUE
-/mob/living/carbon/xenomorph/proc/add_to_hive(datum/hive_status/HS, force=FALSE)
+/mob/living/carbon/xenomorph/proc/add_to_hive(datum/hive_status/HS, force=FALSE, prevent_ruler=FALSE)
if(!force && hivenumber != XENO_HIVE_NONE)
CRASH("trying to do a dirty add_to_hive")
@@ -446,24 +449,30 @@
SSdirection.start_tracking(HS.hivenumber, src)
hive.update_tier_limits() //Update our tier limits.
-/mob/living/carbon/xenomorph/queen/add_to_hive(datum/hive_status/HS, force=FALSE) // override to ensure proper queen/hive behaviour
+/mob/living/carbon/xenomorph/queen/add_to_hive(datum/hive_status/HS, force=FALSE, prevent_ruler=FALSE) // override to ensure proper queen/hive behaviour
. = ..()
if(HS.living_xeno_queen) // theres already a queen
return
HS.living_xeno_queen = src
+ if(prevent_ruler)
+ return
+
HS.update_ruler()
-/mob/living/carbon/xenomorph/shrike/add_to_hive(datum/hive_status/HS, force = FALSE) // override to ensure proper queen/hive behaviour
+/mob/living/carbon/xenomorph/shrike/add_to_hive(datum/hive_status/HS, force = FALSE, prevent_ruler=FALSE) // override to ensure proper queen/hive behaviour
. = ..()
if(HS.living_xeno_ruler)
return
+ if(prevent_ruler)
+ return
+
HS.update_ruler()
-/mob/living/carbon/xenomorph/hivemind/add_to_hive(datum/hive_status/HS, force = FALSE)
+/mob/living/carbon/xenomorph/hivemind/add_to_hive(datum/hive_status/HS, force = FALSE, prevent_ruler=FALSE)
. = ..()
if(!GLOB.xeno_structures_by_hive[HS.hivenumber])
GLOB.xeno_structures_by_hive[HS.hivenumber] = list()
@@ -484,23 +493,26 @@
hive_core.name = "[HS.hivenumber == XENO_HIVE_NORMAL ? "" : "[HS.name] "]hivemind core"
hive_core.color = HS.color
-/mob/living/carbon/xenomorph/king/add_to_hive(datum/hive_status/HS, force = FALSE)
+/mob/living/carbon/xenomorph/king/add_to_hive(datum/hive_status/HS, force = FALSE, prevent_ruler=FALSE)
. = ..()
if(HS.living_xeno_ruler)
return
+ if(prevent_ruler)
+ return
+
HS.update_ruler()
-/mob/living/carbon/xenomorph/proc/add_to_hive_by_hivenumber(hivenumber, force=FALSE) // helper function to add by given hivenumber
+/mob/living/carbon/xenomorph/proc/add_to_hive_by_hivenumber(hivenumber, force=FALSE, prevent_ruler=FALSE) // helper function to add by given hivenumber
if(!GLOB.hive_datums[hivenumber])
CRASH("add_to_hive_by_hivenumber called with invalid hivenumber")
var/datum/hive_status/HS = GLOB.hive_datums[hivenumber]
- add_to_hive(HS, force)
+ add_to_hive(HS, force, prevent_ruler)
hive.update_tier_limits() //Update our tier limits.
// This is a special proc called only when a xeno is first created to set their hive and name properly
-/mob/living/carbon/xenomorph/proc/set_initial_hivenumber()
- add_to_hive_by_hivenumber(hivenumber, force=TRUE)
+/mob/living/carbon/xenomorph/proc/set_initial_hivenumber(prevent_ruler=FALSE)
+ add_to_hive_by_hivenumber(hivenumber, force=TRUE, prevent_ruler=prevent_ruler)
// ***************************************
// *********** Removing xenos
@@ -829,20 +841,23 @@
// ***************************************
// *********** Xeno death
// ***************************************
-/datum/hive_status/proc/on_xeno_death(mob/living/carbon/xenomorph/X)
- remove_from_lists(X)
- dead_xenos += X
- SEND_SIGNAL(X, COMSIG_HIVE_XENO_DEATH)
+///Handles any effects when a xeno dies
+/datum/hive_status/proc/on_xeno_death(mob/living/carbon/xenomorph/dead_xeno)
+ remove_from_lists(dead_xeno)
+ dead_xenos += dead_xeno
+
+ SEND_SIGNAL(dead_xeno, COMSIG_HIVE_XENO_DEATH)
- if(X == living_xeno_ruler)
- on_ruler_death(X)
- var/datum/xeno_caste/caste = X?.xeno_caste
- if(caste.death_evolution_delay <= 0)
+ if(dead_xeno == living_xeno_ruler)
+ on_ruler_death(dead_xeno)
+ var/datum/xeno_caste/base_caste = GLOB.xeno_caste_datums[dead_xeno.caste_base_type][XENO_UPGRADE_BASETYPE]
+ if(base_caste.death_evolution_delay <= 0)
return
- if(!caste_death_timers[caste])
- caste_death_timers[caste] = addtimer(CALLBACK(src, PROC_REF(end_caste_death_timer), caste), caste.death_evolution_delay , TIMER_STOPPABLE)
+ if(!caste_death_timers[base_caste])
+ caste_death_timers[base_caste] = addtimer(CALLBACK(src, PROC_REF(end_caste_death_timer), base_caste), base_caste.death_evolution_delay , TIMER_STOPPABLE)
+///Handles effects if a xeno is revived
/datum/hive_status/proc/on_xeno_revive(mob/living/carbon/xenomorph/X)
dead_xenos -= X
add_to_lists(X)
@@ -1016,7 +1031,7 @@ to_chat will check for valid clients itself already so no need to double check f
/datum/hive_status/proc/set_all_xeno_trackers(atom/target)
for(var/mob/living/carbon/xenomorph/X AS in get_all_xenos())
X.set_tracked(target)
- to_chat(X, span_notice(" Now tracking [target.name]"))
+ to_chat(X, span_notice("Now tracking [target.name]"))
// ***************************************
// *********** Normal Xenos
diff --git a/code/modules/mob/living/carbon/xenomorph/hive_upgrades.dm b/code/modules/mob/living/carbon/xenomorph/hive_upgrades.dm
index 562bb3cdb04..d912be2f905 100644
--- a/code/modules/mob/living/carbon/xenomorph/hive_upgrades.dm
+++ b/code/modules/mob/living/carbon/xenomorph/hive_upgrades.dm
@@ -250,6 +250,7 @@ GLOBAL_LIST_INIT(tier_to_primo_upgrade, list(
/datum/hive_upgrade/building/upgrade_chamber
flags_upgrade = ABILITY_NUCLEARWAR
+ building_loc = 0
var/max_chambers = 3
/datum/hive_upgrade/building/upgrade_chamber/shell
@@ -303,7 +304,7 @@ GLOBAL_LIST_INIT(tier_to_primo_upgrade, list(
///How long to build one turret
var/build_time = 10 SECONDS
///What type of turret is built
- var/turret_type = /obj/structure/xeno/xeno_turret
+ var/turret_type = /obj/structure/xeno/turret
/datum/hive_upgrade/defence/turret/can_buy(mob/living/carbon/xenomorph/buyer, silent = TRUE)
. = ..()
@@ -324,10 +325,10 @@ GLOBAL_LIST_INIT(tier_to_primo_upgrade, list(
to_chat(buyer, span_xenowarning("No weeds here!"))
return FALSE
- if(!T.check_alien_construction(buyer, silent, /obj/structure/xeno/xeno_turret) || !T.check_disallow_alien_fortification(buyer))
+ if(!T.check_alien_construction(buyer, silent, /obj/structure/xeno/turret) || !T.check_disallow_alien_fortification(buyer))
return FALSE
- for(var/obj/structure/xeno/xeno_turret/turret AS in GLOB.xeno_resin_turrets_by_hive[blocker.hivenumber])
+ for(var/obj/structure/xeno/turret/turret AS in GLOB.xeno_resin_turrets_by_hive[blocker.hivenumber])
if(get_dist(turret, buyer) < 6)
if(!silent)
to_chat(buyer, span_xenowarning("Another turret is too close!"))
@@ -355,7 +356,7 @@ GLOBAL_LIST_INIT(tier_to_primo_upgrade, list(
desc = "Places a sticky spit spitting resin turret under you. Must be at least 6 tiles away from other turrets, not near fog and on a weeded area."
icon = "resinturret"
psypoint_cost = 50
- turret_type = /obj/structure/xeno/xeno_turret/sticky
+ turret_type = /obj/structure/xeno/turret/sticky
/datum/hive_upgrade/xenos
category = "Xenos"
diff --git a/code/modules/mob/living/carbon/xenomorph/update_icons.dm b/code/modules/mob/living/carbon/xenomorph/update_icons.dm
index 19f50b8ae84..55fc77ac05b 100644
--- a/code/modules/mob/living/carbon/xenomorph/update_icons.dm
+++ b/code/modules/mob/living/carbon/xenomorph/update_icons.dm
@@ -201,3 +201,21 @@
else
set_light_range_power_color(intensity, 0.5, LIGHT_COLOR_FIRE)
set_light_on(TRUE)
+
+/mob/living/carbon/xenomorph/hud_set_hunter()
+ var/image/holder = hud_list[HUNTER_HUD]
+ if(!holder)
+ return
+ holder.icon_state = ""
+ holder.overlays.Cut()
+ holder.pixel_x = -17
+ holder.pixel_y = 20
+ if(hunter_data.hunted)
+ holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_hunted")
+
+ if(hunter_data.dishonored)
+ holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_dishonored")
+ else if(hunter_data.honored)
+ holder.overlays += image('icons/mob/screen/yautja.dmi', src, "hunter_honored")
+
+ hud_list[HUNTER_HUD] = holder
diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm
index c8dd5e558df..eb0b5f97959 100644
--- a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm
+++ b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm
@@ -350,6 +350,8 @@ GLOBAL_LIST_INIT(strain_list, init_glob_strain_list())
var/regen_power = 0
///Stored biomass
var/biomass = 0
+ ///Stored upgrade effects, so we reapply them on evolve
+ var/list/upgrades_holder = list()
var/is_zoomed = FALSE
var/zoom_turf = null
diff --git a/code/modules/mob/living/carbon/xenomorph/xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/xenomorph.dm
index 67c6a446a59..49a331ab367 100644
--- a/code/modules/mob/living/carbon/xenomorph/xenomorph.dm
+++ b/code/modules/mob/living/carbon/xenomorph/xenomorph.dm
@@ -4,7 +4,7 @@
//Just about ALL the procs are tied to the parent, not to the children
//This is so they can be easily transferred between them without copypasta
-/mob/living/carbon/xenomorph/Initialize(mapload)
+/mob/living/carbon/xenomorph/Initialize(mapload, do_not_set_as_ruler)
if(mob_size == MOB_SIZE_BIG)
move_resist = MOVE_FORCE_EXTREMELY_STRONG
move_force = MOVE_FORCE_EXTREMELY_STRONG
@@ -28,7 +28,7 @@
if(is_centcom_level(z) && hivenumber == XENO_HIVE_NORMAL)
hivenumber = XENO_HIVE_ADMEME //so admins can safely spawn xenos in Thunderdome for tests.
- set_initial_hivenumber()
+ set_initial_hivenumber(prevent_ruler=do_not_set_as_ruler)
switch(stat)
if(CONSCIOUS)
@@ -167,7 +167,7 @@
if(4201 to 9000)
rank_name = "Ancient"
if(9001 to INFINITY)
- rank_name = "Prime"
+ rank_name = "Primal"
else
rank_name = "Young"
var/prefix = (hive.prefix || xeno_caste.upgrade_name) ? "[hive.prefix][xeno_caste.upgrade_name] " : ""
diff --git a/code/modules/mob/living/carbon/xenomorph/xenoprocs.dm b/code/modules/mob/living/carbon/xenomorph/xenoprocs.dm
index 075d4614579..90e971d031b 100644
--- a/code/modules/mob/living/carbon/xenomorph/xenoprocs.dm
+++ b/code/modules/mob/living/carbon/xenomorph/xenoprocs.dm
@@ -441,9 +441,7 @@
if(locate(/turf/closed/wall/resin) in loc)
to_chat(src, span_warning("We decide not to drop [F] after all."))
return
-
- . = ..()
-
+ return ..()
//When the Queen's pheromones are updated, or we add/remove a leader, update leader pheromones
/mob/living/carbon/xenomorph/proc/handle_xeno_leader_pheromones(mob/living/carbon/xenomorph/queen/Q)
@@ -659,16 +657,6 @@
get_upgrades(src)
/mob/living/carbon/xenomorph/proc/get_upgrades(mob/living/carbon/xenomorph/user)
- var/upgrade_price
- switch(xeno_caste.tier)
- if(XENO_TIER_ONE)
- upgrade_price = XENO_UPGRADE_BIOMASS_COST_T1
- if(XENO_TIER_TWO)
- upgrade_price = XENO_UPGRADE_BIOMASS_COST_T2
- if(XENO_TIER_THREE)
- upgrade_price = XENO_UPGRADE_BIOMASS_COST_T3
- else
- upgrade_price = XENO_UPGRADE_BIOMASS_COST_T4
var/dat = "