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/BigRed_v2/BigRed_v2.dmm b/_maps/map_files/BigRed_v2/BigRed_v2.dmm index 366e83ebcf5..01e45e98a8f 100644 --- a/_maps/map_files/BigRed_v2/BigRed_v2.dmm +++ b/_maps/map_files/BigRed_v2/BigRed_v2.dmm @@ -2726,10 +2726,6 @@ /obj/machinery/light, /turf/open/floor/tile/darkish, /area/bigredv2/caves/lambda_lab) -"axF" = ( -/obj/structure/barricade/wooden, -/turf/open/floor/plating/ground/mars/random/sand, -/area/bigredv2/outside/n) "axP" = ( /obj/structure/bed/chair{ dir = 4 @@ -37102,7 +37098,7 @@ gzM gzM gzM gzM -axF +aqO aqO gzM gQv diff --git a/_maps/map_files/Magmoor_Digsite_IV/Magmoor_Digsite_IV.dmm b/_maps/map_files/Magmoor_Digsite_IV/Magmoor_Digsite_IV.dmm index d50b6863838..47b112a72ba 100644 --- a/_maps/map_files/Magmoor_Digsite_IV/Magmoor_Digsite_IV.dmm +++ b/_maps/map_files/Magmoor_Digsite_IV/Magmoor_Digsite_IV.dmm @@ -14226,8 +14226,8 @@ /area/magmoor/compound) "koF" = ( /obj/item/toy/plush/rouny, -/turf/open/lavaland/basalt/cave/autosmooth, -/area/magmoor/cave/south) +/turf/closed/mineral/smooth, +/area/magmoor/cave/rock) "kpw" = ( /obj/structure/rock/basalt/pile, /turf/open/floor/plating/ground/mars/random/dirt, @@ -32962,7 +32962,7 @@ /turf/open/floor/mainship/mono, /area/magmoor/engi) "xWF" = ( -/turf/open/liquid/lava/autosmoothing, +/turf/open/floor/plating/ground/mars/random/dirt, /area/magmoor/cave/south) "xWG" = ( /obj/effect/ai_node, @@ -55248,8 +55248,8 @@ ylo ylo ylo ylo -ylo -ylo +rxl +rxl rxl rxl rxl @@ -55481,9 +55481,9 @@ ylo ylo ylo ylo -ylo -ylo -ylo +rxl +rxl +rxl rxl rxl rxl @@ -55714,10 +55714,10 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo +rxl +rxl +rxl +rxl rxl rxl rxl @@ -55946,11 +55946,11 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo -ylo +rxl +rxl +rxl +rxl +rxl rxl rxl rxl @@ -56179,6 +56179,232 @@ ylo ylo ylo ylo +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +iLH +iLH +"} +(99,1,1) = {" +iLH +iLH +rxl +rxl +rxl +kcd +kcd +kcd +kxx +awr +kcd +kcd +jkR +jkR +lxN +lxN +lxN +lxN +jkR +jkR +kcd +kcd +kcd +kcd +kxx +kcd +kcd +rxl +rxl +rxl +rxl +rxl +rxl +kcd +kcd +kcd +kcd +kcd +kcd +kcd +kcd +kcd +kxx +kcd +kcd +kcd +kcd +kcd +kcd +vRc +vRc +ymj +ymj +ymj +ymj +vUC +vUC +ymj +rxl +rxl +rxl +rxl +rxl +gKh +gKh +bsu +mNI +mNI +gKh +gKh +urG +gKh +gKh +bsu +gKh +gKh +bsu +gKh +gKh +gKh +xAr +pCC +ymj +ymj +ymj +ymj +ymj +ymj +ymj +ymj +ymj +xfT +xfT +jVm +uOU +qHR +qHR +qHR +qHR +iXj +xqg +dSo +dSo +kJY +noB +jjU +vcM +rBq +tlb +kdG +rge +wEH +bgM +nSX +hiG +hiG +iDm +rKd +dtj +hiG +hiG +hiG +hiG +hiG +hiG +pDq +syD +rSf +hiG +hiG +hiG +kKp +beu +lGN +xmr +rjq +hIT +aje +aau +mSb +imu +mSb +aau +aje +hIT +pKb +fIr +jRr +xmr +hIT +gRT +eeU +mpw +gRT +ddm +uJz +gRT +mpw +eeU +gRT +eeU +mpw +gRT +ddm +uJz +gRT +mpw +eeU +gRT +eeU +mpw +gRT +ddm +uJz +gRT +mpw +eeU +gRT +iCe +dum +dum +pDq +dum +dum +dum +qkn +eTo +pUx +ylo +ylo +ylo +ylo +ylo +ylo +ylo ylo ylo ylo @@ -56206,232 +56432,6 @@ rxl rxl rxl rxl -iLH -iLH -"} -(99,1,1) = {" -iLH -iLH -rxl -rxl -rxl -kcd -kcd -kcd -kxx -awr -kcd -kcd -jkR -jkR -lxN -lxN -lxN -lxN -jkR -jkR -kcd -kcd -kcd -kcd -kxx -kcd -kcd -rxl -rxl -rxl -rxl -rxl -rxl -kcd -kcd -kcd -kcd -kcd -kcd -kcd -kcd -kcd -kxx -kcd -kcd -kcd -kcd -kcd -kcd -vRc -vRc -ymj -ymj -ymj -ymj -vUC -vUC -ymj -rxl -rxl -rxl -rxl -rxl -gKh -gKh -bsu -mNI -mNI -gKh -gKh -urG -gKh -gKh -bsu -gKh -gKh -bsu -gKh -gKh -gKh -xAr -pCC -ymj -ymj -ymj -ymj -ymj -ymj -ymj -ymj -ymj -xfT -xfT -jVm -uOU -qHR -qHR -qHR -qHR -iXj -xqg -dSo -dSo -kJY -noB -jjU -vcM -rBq -tlb -kdG -rge -wEH -bgM -nSX -hiG -hiG -iDm -rKd -dtj -hiG -hiG -hiG -hiG -hiG -hiG -pDq -syD -rSf -hiG -hiG -hiG -kKp -beu -lGN -xmr -rjq -hIT -aje -aau -mSb -imu -mSb -aau -aje -hIT -pKb -fIr -jRr -xmr -hIT -gRT -eeU -mpw -gRT -ddm -uJz -gRT -mpw -eeU -gRT -eeU -mpw -gRT -ddm -uJz -gRT -mpw -eeU -gRT -eeU -mpw -gRT -ddm -uJz -gRT -mpw -eeU -gRT -iCe -dum -dum -pDq -dum -dum -dum -qkn -eTo -pUx -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -rxl -rxl -rxl -rxl -rxl -rxl -rxl -rxl -rxl -rxl -rxl -rxl -rxl -rxl rxl rxl rxl @@ -56643,14 +56643,14 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl rxl rxl rxl @@ -56876,15 +56876,15 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl rxl rxl rxl @@ -57108,16 +57108,16 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl rxl rxl rxl @@ -57340,18 +57340,18 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl rxl rxl rxl @@ -57573,28 +57573,28 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl rxl rxl rxl @@ -57806,30 +57806,30 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl koF rxl rxl @@ -58040,31 +58040,31 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF -xWF +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl rxl rxl rxl @@ -58274,16 +58274,6 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo rxl rxl rxl @@ -58293,12 +58283,22 @@ rxl rxl rxl rxl -xWF -xWF -xWF -xWF -xWF -xWF +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl rxl rxl rxl @@ -58507,15 +58507,6 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo rxl rxl rxl @@ -58527,12 +58518,21 @@ rxl rxl rxl rxl -xWF -xWF -xWF -xWF -xWF -xWF +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl rxl rxl rxl @@ -58741,14 +58741,6 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo rxl rxl rxl @@ -58762,11 +58754,19 @@ rxl rxl rxl rxl -xWF -xWF -xWF -xWF -xWF +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl rxl rxl iLH @@ -58974,13 +58974,6 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo -ylo -ylo -ylo rxl rxl rxl @@ -58996,10 +58989,17 @@ rxl rxl rxl rxl -xWF -xWF -xWF -xWF +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl rxl rxl iLH @@ -59208,11 +59208,6 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo -ylo rxl rxl rxl @@ -59229,10 +59224,15 @@ rxl rxl rxl rxl -xWF -xWF -xWF -xWF +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl +rxl rxl rxl iLH @@ -59442,10 +59442,10 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo +rxl +rxl +rxl +rxl rxl rxl rxl @@ -59675,10 +59675,10 @@ ylo ylo ylo ylo -ylo -ylo -ylo -ylo +rxl +rxl +rxl +rxl rxl rxl rxl @@ -59909,9 +59909,9 @@ ylo ylo ylo ylo -ylo -ylo -ylo +rxl +rxl +rxl rxl rxl rxl @@ -60142,8 +60142,8 @@ ylo ylo ylo ylo -ylo -ylo +rxl +rxl rxl rxl rxl @@ -60375,8 +60375,8 @@ ylo ylo ylo ylo -ylo -ylo +rxl +rxl rxl rxl rxl @@ -60608,7 +60608,7 @@ ylo ylo ylo ylo -ylo +rxl rxl rxl rxl @@ -60841,7 +60841,7 @@ ylo ylo ylo ylo -ylo +rxl rxl rxl rxl @@ -64554,7 +64554,7 @@ xwh xwh xwh xUd -xwh +xUd xUd jRL jRL @@ -64787,8 +64787,8 @@ xUd xUd xUd xUd -xwh -xUd +jRL +jRL jRL jRL jRL @@ -65019,9 +65019,9 @@ xUd jRL jRL jRL -xUd -xwh -xUd +jRL +jRL +jRL jRL jRL jRL @@ -65252,10 +65252,10 @@ jRL jRL jRL jRL -xUd -xwh -xUd -xUd +jRL +jRL +jRL +jRL jRL jRL jRL @@ -65485,10 +65485,10 @@ jRL jRL jRL jRL -xUd -xwh -xwh -xUd +jRL +jRL +jRL +jRL jRL jRL jRL @@ -65718,10 +65718,10 @@ jRL jRL jRL jRL -xUd -xUd -xwh -xUd +jRL +jRL +jRL +jRL jRL jRL jRL @@ -65952,9 +65952,9 @@ jRL jRL jRL jRL -xUd -xwh -xUd +jRL +jRL +jRL jRL jRL jRL @@ -66185,9 +66185,9 @@ jRL jRL jRL jRL -xUd -xwh -xUd +jRL +jRL +jRL jRL jRL rxl @@ -66418,9 +66418,9 @@ jRL jRL jRL jRL -xUd -xwh -xUd +jRL +jRL +jRL jRL jRL rxl @@ -66651,9 +66651,9 @@ jRL jRL jRL jRL -xUd -xwh -xUd +jRL +jRL +jRL jRL rxl rxl @@ -66884,9 +66884,9 @@ jRL jRL jRL jRL -xUd -xwh -xUd +jRL +jRL +jRL jRL rxl rxl @@ -67117,9 +67117,9 @@ jRL jRL jRL jRL -xUd -xwh -xUd +jRL +jRL +jRL jRL rxl rxl @@ -67350,9 +67350,9 @@ jRL jRL jRL jRL -xUd -xwh -xUd +jRL +jRL +jRL jRL rxl rxl @@ -67583,9 +67583,9 @@ jRL jRL jRL jRL -xUd -xwh -xUd +jRL +jRL +jRL jRL rxl rxl @@ -67816,9 +67816,9 @@ jRL jRL jRL jRL -xUd -xwh -xUd +jRL +jRL +jRL rxl rxl rxl @@ -68049,9 +68049,9 @@ jRL jRL jRL jRL -xUd -xwh -xUd +jRL +jRL +jRL rxl rxl rxl @@ -68282,9 +68282,9 @@ jRL jRL jRL jRL -xUd -xwh -xwh +jRL +jRL +jRL xWF rxl rxl @@ -68515,9 +68515,9 @@ jRL jRL jRL jRL -xUd -xUd -xUd +jRL +jRL +jRL xWF rxl rxl @@ -68750,9 +68750,7 @@ jRL jRL jRL jRL -xUd -xWF -xWF +jRL xWF rxl rxl @@ -68788,6 +68786,8 @@ rxl rxl rxl rxl +rxl +rxl iLH iLH "} @@ -68983,10 +68983,10 @@ jRL jRL jRL jRL -xUd +jRL +rxl rxl rxl -xWF rxl rxl rxl @@ -69219,8 +69219,8 @@ jRL rxl rxl rxl -xWF -xWF +rxl +rxl rxl rxl rxl @@ -69453,8 +69453,8 @@ rxl rxl rxl rxl -xWF -xWF +rxl +rxl rxl rxl rxl @@ -69687,8 +69687,8 @@ rxl rxl rxl rxl -xWF -xWF +rxl +rxl rxl rxl rxl @@ -69921,11 +69921,11 @@ rxl rxl rxl rxl -xWF -xWF -xWF -xWF -xWF +rxl +rxl +rxl +rxl +rxl rxl rxl rxl @@ -70158,8 +70158,8 @@ rxl rxl rxl rxl -xWF -xWF +rxl +rxl rxl rxl rxl @@ -70392,8 +70392,8 @@ rxl rxl rxl rxl -xWF -xWF +rxl +rxl rxl rxl rxl diff --git a/_maps/map_files/Orion_Military_Outpost/orionoutpost.dmm b/_maps/map_files/Orion_Military_Outpost/orionoutpost.dmm index 23a764f5f9d..d55f2d0936f 100644 --- a/_maps/map_files/Orion_Military_Outpost/orionoutpost.dmm +++ b/_maps/map_files/Orion_Military_Outpost/orionoutpost.dmm @@ -8570,10 +8570,6 @@ "RQ" = ( /turf/closed/mineral/smooth/indestructible, /area/orion_outpost/ground/outpostw) -"RS" = ( -/obj/structure/barricade/metal, -/turf/open/floor/plating/ground/mars/random/cave/darker, -/area/orion_outpost/surface/landing_pad2_external) "RT" = ( /obj/structure/window{ dir = 4 @@ -12867,7 +12863,7 @@ ft jF gU eW -RS +hz Df lW lW diff --git a/_maps/map_files/Talos/TGS_Talos.dmm b/_maps/map_files/Talos/TGS_Talos.dmm index 5a16988c3b8..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,14 +4085,14 @@ /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, /area/mainship/living/pilotbunks) "cmc" = ( -/obj/machinery/telecomms/processor/preset_four, +/obj/machinery/telecomms/processor/preset/four, /turf/open/floor/mainship/silver/full, /area/mainship/command/telecomms) "cmn" = ( @@ -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) @@ -20434,7 +20473,7 @@ /turf/closed/wall/mainship/outer/talos, /area/mainship/hull/port_hull) "mkk" = ( -/obj/machinery/telecomms/bus/preset_two, +/obj/machinery/telecomms/bus/preset/two, /turf/open/floor/mainship/silver/full, /area/mainship/command/telecomms) "mku" = ( @@ -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" = ( @@ -20731,7 +20774,7 @@ /turf/open/floor/plating, /area/mainship/hull/starboard_hull) "msD" = ( -/obj/machinery/telecomms/receiver/preset_left, +/obj/machinery/telecomms/receiver/preset/left, /turf/open/floor/mainship/silver/full, /area/mainship/command/telecomms) "msE" = ( @@ -20762,7 +20805,7 @@ }, /area/mainship/living/basketball) "msU" = ( -/obj/machinery/telecomms/broadcaster/preset_left, +/obj/machinery/telecomms/broadcaster/preset/left, /turf/open/floor/mainship/silver/full, /area/mainship/command/telecomms) "msZ" = ( @@ -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 @@ -21523,6 +21566,10 @@ /obj/machinery/light/mainship, /turf/open/floor/mainship/red/full, /area/mainship/shipboard/brig) +"mMJ" = ( +/obj/machinery/telecomms/receiver/preset/right, +/turf/open/floor/mainship/silver/full, +/area/mainship/command/telecomms) "mMT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 9 @@ -21571,7 +21618,7 @@ /turf/open/floor/wood, /area/mainship/squads/alpha) "mNr" = ( -/obj/machinery/telecomms/bus/preset_one, +/obj/machinery/telecomms/bus/preset/one, /turf/open/floor/mainship/silver/full, /area/mainship/command/telecomms) "mOb" = ( @@ -21591,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) @@ -21703,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 @@ -21986,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 @@ -22045,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) @@ -22213,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 @@ -22464,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 @@ -22556,7 +22597,7 @@ /turf/open/floor/prison/plate, /area/mainship/command/self_destruct) "nrw" = ( -/obj/machinery/telecomms/bus/preset_three, +/obj/machinery/telecomms/bus/preset/three, /turf/open/floor/mainship/silver/full, /area/mainship/command/telecomms) "nrJ" = ( @@ -22741,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) @@ -23129,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 @@ -23140,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 @@ -23549,7 +23590,7 @@ /turf/open/floor/plating, /area/mainship/hull/upper_hull) "nRT" = ( -/obj/machinery/telecomms/bus/preset_four, +/obj/machinery/telecomms/bus/preset/four, /turf/open/floor/mainship/silver/full, /area/mainship/command/telecomms) "nRU" = ( @@ -23646,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) @@ -23697,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 @@ -23962,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 @@ -24550,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 @@ -24615,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 @@ -24652,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) @@ -24664,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) @@ -24928,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 @@ -24976,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 }, @@ -24986,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) @@ -25038,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) @@ -25393,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) @@ -25408,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) @@ -25564,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 @@ -25672,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 @@ -25997,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) @@ -26091,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 @@ -26208,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) @@ -26222,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) @@ -26244,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; @@ -26416,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 @@ -26600,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) @@ -26762,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, @@ -26771,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) @@ -26785,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) @@ -26809,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) @@ -26989,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; @@ -27010,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 @@ -27150,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 @@ -27225,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) @@ -27270,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{ @@ -27292,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) @@ -27541,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) @@ -28014,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) @@ -28335,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 @@ -28363,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 }, @@ -29290,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" = ( @@ -29440,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 }, @@ -29469,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) @@ -29640,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) @@ -29675,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) @@ -29707,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) @@ -30036,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 @@ -30111,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 @@ -30279,10 +30316,6 @@ /obj/effect/spawner/random/engineering/computercircuit, /turf/open/floor/plating, /area/mainship/hull/starboard_hull) -"rPT" = ( -/obj/machinery/telecomms/receiver/preset_right, -/turf/open/floor/mainship/silver/full, -/area/mainship/command/telecomms) "rPU" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -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, @@ -31499,7 +31529,7 @@ /turf/open/floor/mainship/metal/green, /area/mainship/medical/lounge) "sBS" = ( -/obj/machinery/telecomms/broadcaster/preset_right, +/obj/machinery/telecomms/broadcaster/preset/right, /turf/open/floor/mainship/silver/full, /area/mainship/command/telecomms) "sCb" = ( @@ -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, @@ -34026,7 +34056,7 @@ /turf/open/floor/wood, /area/mainship/medical/upper_medical) "ugO" = ( -/obj/machinery/telecomms/processor/preset_one, +/obj/machinery/telecomms/processor/preset/one, /turf/open/floor/mainship/silver/full, /area/mainship/command/telecomms) "uho" = ( @@ -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) @@ -35752,7 +35785,7 @@ /turf/closed/wall/mainship/talos, /area/mainship/hull/upper_hull) "viz" = ( -/obj/machinery/telecomms/processor/preset_three, +/obj/machinery/telecomms/processor/preset/three, /turf/open/floor/mainship/silver/full, /area/mainship/command/telecomms) "viB" = ( @@ -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, @@ -37320,7 +37360,7 @@ /turf/open/floor/mainship/metal, /area/mainship/hallways/aft_hallway) "wgv" = ( -/obj/machinery/telecomms/processor/preset_two, +/obj/machinery/telecomms/processor/preset/two, /turf/open/floor/mainship/silver/full, /area/mainship/command/telecomms) "wgY" = ( @@ -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 @@ -69477,7 +69517,7 @@ vfY vfY ver vfY -rPT +mMJ xPw eRE snt @@ -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/Whiskey_Outpost/Whiskey_Outpost_v2.dmm b/_maps/map_files/Whiskey_Outpost/Whiskey_Outpost_v2.dmm index 7fad30fbd7d..61a9f0a2cbc 100644 --- a/_maps/map_files/Whiskey_Outpost/Whiskey_Outpost_v2.dmm +++ b/_maps/map_files/Whiskey_Outpost/Whiskey_Outpost_v2.dmm @@ -7044,10 +7044,6 @@ /obj/structure/barricade/plasteel, /turf/open/floor/plating/warning, /area/whiskey_outpost/outside/west) -"Rb" = ( -/obj/structure/barricade/metal, -/turf/open/floor/plating/warning, -/area/whiskey_outpost/outside/west) "Rc" = ( /obj/structure/flora/tree/jungle, /turf/open/ground/jungle, @@ -15132,7 +15128,7 @@ Hr hm hm Xh -Rb +QX Hm Qu In diff --git a/_maps/map_files/deltastation/deltastation.dmm b/_maps/map_files/deltastation/deltastation.dmm index 87f8c6806f6..220a27c6e29 100644 --- a/_maps/map_files/deltastation/deltastation.dmm +++ b/_maps/map_files/deltastation/deltastation.dmm @@ -4980,10 +4980,6 @@ }, /turf/open/floor/plating, /area/deltastation/maintenance/port/fore) -"baV" = ( -/obj/machinery/telecomms/receiver/preset_left, -/turf/open/floor/gcircuit, -/area/deltastation/tcommsat/server) "baY" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -6357,10 +6353,6 @@ /obj/effect/spawner/random/engineering/cable, /turf/open/floor/iron, /area/deltastation/command/heads_quarters/rd) -"bpC" = ( -/obj/machinery/telecomms/broadcaster/preset_right, -/turf/open/floor/bcircuit, -/area/deltastation/tcommsat/server) "bpI" = ( /obj/machinery/light{ dir = 8 @@ -29969,6 +29961,10 @@ /obj/machinery/miner/damaged, /turf/open/floor/plating/ground/mars/random/cave, /area/deltastation/engineering/storage/tech) +"fZT" = ( +/obj/machinery/telecomms/receiver/preset/left, +/turf/open/floor/gcircuit, +/area/deltastation/tcommsat/server) "gac" = ( /obj/effect/turf_decal/tile/transparent/neutral{ dir = 4 @@ -45980,6 +45976,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/deltastation/commons/toilet/restrooms) +"jrg" = ( +/obj/machinery/telecomms/broadcaster/preset/left, +/turf/open/floor/bcircuit, +/area/deltastation/tcommsat/server) "jrk" = ( /obj/effect/turf_decal/warning_stripes/linethick{ dir = 4 @@ -69355,10 +69355,6 @@ }, /turf/open/floor/iron, /area/deltastation/maintenance/department/science) -"ojN" = ( -/obj/machinery/telecomms/broadcaster/preset_left, -/turf/open/floor/bcircuit, -/area/deltastation/tcommsat/server) "ojW" = ( /obj/effect/landmark/xeno_resin_door, /turf/open/floor/plating, @@ -74284,6 +74280,10 @@ /obj/effect/spawner/random/misc/structure/chair_or_metal/west, /turf/open/floor/iron/white, /area/deltastation/science/research) +"pjX" = ( +/obj/machinery/telecomms/broadcaster/preset/right, +/turf/open/floor/bcircuit, +/area/deltastation/tcommsat/server) "pjZ" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -74998,10 +74998,6 @@ }, /turf/open/floor/glass/reinforced, /area/deltastation/maintenance/space_hut/observatory) -"prv" = ( -/obj/machinery/telecomms/receiver/preset_right, -/turf/open/floor/gcircuit, -/area/deltastation/tcommsat/server) "prR" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/misc/paperbin{ @@ -158152,7 +158148,7 @@ rpV vRI wHO vgI -ojN +jrg pCQ fun wGX @@ -158662,7 +158658,7 @@ ndM jLv vIe ykl -prv +fZT tNq pCQ mBm @@ -159690,7 +159686,7 @@ cAr jLv vIe ykl -baV +fZT tNq pCQ sHW @@ -160208,7 +160204,7 @@ rpV cjF kpV xKi -bpC +pjX vgI ixu beT diff --git a/_maps/map_files/gelida_iv/gelida_iv.dmm b/_maps/map_files/gelida_iv/gelida_iv.dmm index 174b8972b28..9cd3151c30d 100644 --- a/_maps/map_files/gelida_iv/gelida_iv.dmm +++ b/_maps/map_files/gelida_iv/gelida_iv.dmm @@ -27045,12 +27045,6 @@ /obj/structure/prop/mainship/gelida/rails, /turf/open/floor/prison, /area/gelida/indoors/c_block/mining) -"shH" = ( -/obj/structure/barricade/metal{ - dir = 4 - }, -/turf/open/floor/plating/ground/snow/layer0, -/area/gelida/outdoors/colony_streets/south_west_street) "shI" = ( /obj/item/clothing/mask/facehugger/dead{ desc = "It has some sort of a tube at the end of its tail. What the hell is this thing?"; @@ -31417,12 +31411,6 @@ dir = 1 }, /area/gelida/outdoors/colony_streets/east_central_street) -"vka" = ( -/obj/structure/barricade/metal{ - dir = 1 - }, -/turf/open/floor/plating/ground/snow/layer0, -/area/gelida/outdoors/colony_streets/south_east_street) "vke" = ( /obj/effect/spawner/random/misc/structure/chair_or_metal, /obj/structure/cable, @@ -45360,7 +45348,7 @@ ngP ndb ngP iCC -shH +iCC xNz xNz ljQ @@ -66001,7 +65989,7 @@ eWY eWY eWY mDs -vka +sHp txG txG txG 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/map_files/kutjevo/kutjevo.dmm b/_maps/map_files/kutjevo/kutjevo.dmm index 7b465dbe394..e87775d3c9f 100644 --- a/_maps/map_files/kutjevo/kutjevo.dmm +++ b/_maps/map_files/kutjevo/kutjevo.dmm @@ -2412,7 +2412,7 @@ /turf/open/floor/kutjevo/tan/multi_tiles, /area/kutjevo/interior/complex/botany) "cKD" = ( -/obj/structure/window/framed/kutjevo, +/obj/structure/window/framed/kutjevo/reinforced, /turf/open/floor/kutjevo/colors/orange, /area/kutjevo/interior/filtration) "cKH" = ( @@ -2772,10 +2772,6 @@ }, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/power) -"dbg" = ( -/obj/structure/window/framed/kutjevo/reinforced, -/turf/open/floor/plating/kutjevo, -/area/kutjevo/interior/complex/botany/east) "dbh" = ( /obj/machinery/light{ dir = 4 @@ -2807,7 +2803,7 @@ /area/kutjevo/interior/complex/botany) "ddi" = ( /obj/structure/platform/metalplatform, -/obj/structure/window/framed/kutjevo/orange, +/obj/structure/window/framed/kutjevo/reinforced/orange, /turf/open/floor/kutjevo/multi_tiles{ dir = 6 }, @@ -3335,10 +3331,10 @@ /turf/open/floor/kutjevo/tan, /area/kutjevo/interior/complex/med/cells) "dGx" = ( -/obj/structure/window/framed/kutjevo, /obj/structure/platform/metalplatform{ dir = 4 }, +/obj/structure/window/framed/kutjevo/reinforced, /turf/open/floor/kutjevo/tan, /area/kutjevo/interior/complex/med/operating) "dGy" = ( @@ -3891,10 +3887,10 @@ /turf/open/floor/kutjevo/tan/multi_tiles, /area/kutjevo/interior/power/comms) "eiX" = ( -/obj/structure/window/framed/kutjevo/reinforced, /obj/structure/bed/chair/sofa/corsat/verticaltop{ pixel_y = -17 }, +/obj/structure/window/framed/kutjevo, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/complex/med) "ejT" = ( @@ -4209,7 +4205,7 @@ /turf/open/floor/kutjevo/colors/orange, /area/kutjevo/interior/filtration) "ezX" = ( -/obj/structure/window/framed/kutjevo, +/obj/structure/window/framed/kutjevo/reinforced, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/power/comms) "eAC" = ( @@ -4669,6 +4665,10 @@ /obj/effect/spawner/random/misc/folder, /turf/open/floor/kutjevo/colors/orange, /area/kutjevo/exterior/Northwest_Colony) +"eUK" = ( +/obj/structure/window/framed/kutjevo, +/turf/open/floor/plating/kutjevo, +/area/kutjevo/interior/power_pt2_electric_boogaloo) "eVr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -4802,7 +4802,7 @@ bound_height = 32; dir = 8 }, -/obj/structure/window/framed/kutjevo/orange, +/obj/structure/window/framed/kutjevo/reinforced/orange, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/power) "fdK" = ( @@ -4870,7 +4870,7 @@ /turf/open/floor/kutjevo/colors/orange, /area/kutjevo/interior/power) "feY" = ( -/obj/structure/window_frame/kutjevo, +/obj/structure/window_frame/kutjevo/reinforced, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/construction) "ffa" = ( @@ -6143,10 +6143,10 @@ /turf/open/floor/plating/ground/mars/random/sand, /area/kutjevo/exterior/colony_South) "gAu" = ( -/obj/structure/window/framed/kutjevo/orange, /obj/structure/platform/metalplatform{ bound_height = 32 }, +/obj/structure/window/framed/kutjevo/reinforced/orange, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/colony_South/power2) "gBa" = ( @@ -7689,11 +7689,11 @@ /turf/open/floor/kutjevo/plate, /area/kutjevo/exterior/colony_central) "iqE" = ( -/obj/structure/window/framed/kutjevo, /obj/machinery/door/poddoor/shutters/mainship/open{ id = "kutjevo_medlock_ne"; name = "\improper Medical North East Shutters" }, +/obj/structure/window/framed/kutjevo/reinforced, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/complex/med/triage) "irK" = ( @@ -7962,7 +7962,7 @@ }, /area/kutjevo/exterior/complex_border/med_park) "iHO" = ( -/obj/structure/window/framed/kutjevo, +/obj/structure/window/framed/kutjevo/reinforced, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/complex/med/triage) "iIz" = ( @@ -8176,10 +8176,10 @@ /turf/closed/wall/r_wall/kutjevo, /area/kutjevo/interior/power) "iWa" = ( -/obj/structure/window/framed/kutjevo, /obj/structure/platform/metalplatform{ dir = 4 }, +/obj/structure/window/framed/kutjevo/reinforced, /turf/open/floor/kutjevo/colors/cyan, /area/kutjevo/interior/complex/med/operating) "iWz" = ( @@ -9521,7 +9521,7 @@ /area/kutjevo/interior/complex/med/operating) "ksX" = ( /obj/structure/sign/prop3, -/turf/closed/wall/kutjevo, +/turf/closed/wall/r_wall/kutjevo, /area/kutjevo/interior/complex/botany) "ktf" = ( /obj/structure/flora/grass/tallgrass/autosmooth/desert, @@ -11288,7 +11288,6 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/air_alarm, /obj/item/tool/analyzer/plant_analyzer, /obj/structure/closet/crate/hydroponics, /turf/open/floor/kutjevo/multi_tiles{ @@ -11614,10 +11613,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/kutjevo/multi_tiles, /area/kutjevo/interior/power) -"mwh" = ( -/obj/structure/window/framed/kutjevo/reinforced, -/turf/open/floor/kutjevo/colors/green/tile, -/area/kutjevo/interior/complex/botany) "mwV" = ( /obj/machinery/disposal, /obj/structure/window/reinforced{ @@ -11756,10 +11751,6 @@ /obj/structure/platform_decoration/metalplatform_deco, /turf/open/floor/kutjevo/multi_tiles, /area/kutjevo/interior/power) -"mDm" = ( -/obj/structure/window/framed/kutjevo, -/turf/open/floor/plating/kutjevo, -/area/kutjevo/interior/construction) "mDu" = ( /obj/structure/platform_decoration/metalplatform_deco{ dir = 1 @@ -13813,9 +13804,6 @@ }, /turf/open/floor/plating/ground/mars/dirttosand/autosmooth, /area/kutjevo/exterior/colony_north) -"oMZ" = ( -/turf/closed/wall/kutjevo, -/area/kutjevo/interior/foremans_office) "oNG" = ( /obj/effect/landmark/weed_node, /turf/open/floor/plating/ground/mars/dirttosand/autosmooth, @@ -13881,7 +13869,7 @@ /obj/structure/platform/metalplatform{ dir = 4 }, -/obj/structure/window/framed/kutjevo/orange, +/obj/structure/window/framed/kutjevo/reinforced/orange, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/power) "oPH" = ( @@ -14551,7 +14539,7 @@ bound_height = 32; dir = 8 }, -/obj/structure/window/framed/kutjevo/orange, +/obj/structure/window/framed/kutjevo/reinforced/orange, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/oob) "pue" = ( @@ -14610,8 +14598,8 @@ /turf/open/floor/kutjevo/tan, /area/kutjevo/interior/power_pt2_electric_boogaloo) "pyE" = ( -/obj/structure/window/framed/kutjevo, /obj/structure/sign/poster, +/obj/structure/window/framed/kutjevo/reinforced, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/construction) "pyZ" = ( @@ -14678,10 +14666,6 @@ /obj/effect/landmark/lv624/fog_blocker/xeno_spawn, /turf/open/floor/plating/ground/mars/random/sand, /area/kutjevo/exterior/colony_N_East) -"pBV" = ( -/obj/structure/window/framed/kutjevo, -/turf/open/floor/plating/kutjevo, -/area/kutjevo/interior/power) "pCj" = ( /obj/structure/flora/ausbushes/reedbush, /turf/open/liquid/water/river/autosmooth/desert, @@ -15166,7 +15150,7 @@ /area/kutjevo/exterior/runoff_dunes) "pZx" = ( /obj/structure/platform_decoration/metalplatform_deco, -/obj/structure/window/framed/kutjevo/reinforced, +/obj/structure/window/framed/kutjevo, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/complex/botany) "pZC" = ( @@ -16153,11 +16137,11 @@ /turf/open/floor/kutjevo/tan, /area/kutjevo/interior/complex/med/operating) "rhZ" = ( -/obj/structure/window/framed/kutjevo/orange, /obj/structure/platform/metalplatform{ bound_height = 32; dir = 8 }, +/obj/structure/window/framed/kutjevo/reinforced/orange, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/colony_South/power2) "rir" = ( @@ -16340,6 +16324,14 @@ }, /turf/open/floor/mainship/research/containment/floor1, /area/kutjevo/interior/filtration) +"rsF" = ( +/obj/machinery/air_alarm{ + dir = 4 + }, +/turf/open/floor/kutjevo/multi_tiles{ + dir = 8 + }, +/area/kutjevo/interior/filtration) "rsM" = ( /obj/machinery/power/apc/drained, /obj/structure/cable, @@ -16402,7 +16394,7 @@ /turf/open/floor/kutjevo/colors/orange, /area/kutjevo/interior/power/comms) "rwj" = ( -/obj/structure/window/framed/kutjevo/orange, +/obj/structure/window/framed/kutjevo/reinforced/orange, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/power) "rwG" = ( @@ -17272,10 +17264,10 @@ }, /area/kutjevo/interior/power) "sqr" = ( -/obj/structure/window/framed/kutjevo, /obj/structure/platform/metalplatform{ dir = 1 }, +/obj/structure/window/framed/kutjevo/reinforced, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/power) "sqB" = ( @@ -17481,7 +17473,7 @@ /turf/open/floor/kutjevo/tan/grey_edge, /area/kutjevo/interior/construction/two) "sBm" = ( -/obj/structure/window/framed/kutjevo, +/obj/structure/window/framed/kutjevo/reinforced, /turf/open/floor/kutjevo/multi_tiles, /area/kutjevo/interior/foremans_office) "sBA" = ( @@ -17902,7 +17894,7 @@ /turf/open/liquid/water/river/desertdam/clean/shallow/dirty, /area/kutjevo/interior/power) "sZn" = ( -/obj/structure/window/framed/kutjevo, +/obj/structure/window/framed/kutjevo/reinforced, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/filtration) "sZz" = ( @@ -19045,10 +19037,10 @@ /turf/open/floor/kutjevo/tan, /area/kutjevo/interior/complex/Northwest_Dorms) "ukd" = ( -/obj/structure/window/framed/kutjevo/orange, /obj/structure/platform/metalplatform{ dir = 1 }, +/obj/structure/window/framed/kutjevo/reinforced/orange, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/colony_South/power2) "ukq" = ( @@ -19775,7 +19767,7 @@ /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/colony_South/power2) "uSG" = ( -/obj/structure/window/framed/kutjevo/orange, +/obj/structure/window/framed/kutjevo/reinforced/orange, /turf/open/floor/kutjevo/multi_tiles{ dir = 6 }, @@ -20158,8 +20150,8 @@ /turf/open/floor/mainship/research/containment/floor1, /area/kutjevo/interior/filtration) "vkV" = ( -/obj/structure/window/framed/kutjevo/orange, /obj/structure/platform/metalplatform, +/obj/structure/window/framed/kutjevo/reinforced/orange, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/colony_South/power2) "vla" = ( @@ -20522,7 +20514,7 @@ /obj/structure/platform/metalplatform{ dir = 1 }, -/obj/structure/window/framed/kutjevo/orange, +/obj/structure/window/framed/kutjevo/reinforced/orange, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/power) "vHf" = ( @@ -21270,10 +21262,10 @@ }, /area/kutjevo/interior/foremans_office) "wtk" = ( -/obj/structure/window/framed/kutjevo/orange, /obj/structure/platform/metalplatform{ dir = 4 }, +/obj/structure/window/framed/kutjevo/reinforced/orange, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/colony_South/power2) "wtm" = ( @@ -21683,8 +21675,8 @@ /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/colony_South/power2) "wRO" = ( -/obj/structure/window_frame/kutjevo, /obj/effect/ai_node, +/obj/structure/window_frame/kutjevo/reinforced, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/construction) "wSd" = ( @@ -22190,10 +22182,10 @@ /turf/open/floor/plating/ground/mars/random/sand, /area/kutjevo/exterior/Northwest_Colony) "xti" = ( -/obj/structure/window/framed/kutjevo/orange, /obj/structure/platform/metalplatform{ dir = 8 }, +/obj/structure/window/framed/kutjevo/reinforced/orange, /turf/open/floor/plating/kutjevo, /area/kutjevo/interior/colony_South/power2) "xtA" = ( @@ -22232,10 +22224,6 @@ }, /turf/open/floor/kutjevo/plate, /area/kutjevo/interior/construction/two) -"xvn" = ( -/obj/structure/window/framed/kutjevo/reinforced, -/turf/open/floor/plating/kutjevo, -/area/kutjevo/exterior/runoff_bridge) "xvM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -22484,10 +22472,6 @@ /obj/structure/cable, /turf/open/floor/kutjevo/colors/orange, /area/kutjevo/exterior/Northwest_Colony) -"xKb" = ( -/obj/structure/window/framed/kutjevo, -/turf/open/floor/plating/kutjevo, -/area/kutjevo/interior/complex/med/auto_doc) "xKi" = ( /obj/structure/stairs/seamless/edge_vert{ dir = 1 @@ -24803,7 +24787,7 @@ sBA tdl xOd etl -sgE +rsF mgm oKC sgE @@ -30324,7 +30308,7 @@ xpk xpk xpk vin -pBV +lUg wIG vOD aQP @@ -30491,7 +30475,7 @@ xpk xpk xpk vin -pBV +lUg wIG kGE cvm @@ -30825,7 +30809,7 @@ xpk use xpk vin -pBV +lUg tez xzB qvP @@ -30992,7 +30976,7 @@ xpk awv xpk vin -pBV +lUg xGI uBz lQC @@ -31494,7 +31478,7 @@ xpk xpk xoV cTz -pBV +lUg ksb kGE xzY @@ -31661,7 +31645,7 @@ cTz vVC vVC ePx -pBV +lUg bkn kGE tez @@ -31828,7 +31812,7 @@ ler vVC vVC ePx -pBV +lUg bkn kGE wIG @@ -31995,7 +31979,7 @@ ePx vVC vVC cTz -pBV +lUg bkn oKA iSF @@ -32513,7 +32497,7 @@ iLE loI wec cvV -pBV +lUg hbK hbK dxF @@ -32680,7 +32664,7 @@ mGb nHV fUD wIG -pBV +lUg ptd dxF dxF @@ -33841,8 +33825,8 @@ mBD tql huF pyp -pBV -pBV +lUg +lUg pyp bEp xzY @@ -34011,8 +33995,8 @@ xJg vea vea pyp -pBV -pBV +lUg +lUg pyp dxF dxF @@ -36917,7 +36901,7 @@ dxF jkR vlg vlg -xKb +snn uHP iYo iYo @@ -37084,7 +37068,7 @@ dxF jkR sSq vlg -xKb +snn mxA wjK qXW @@ -37131,7 +37115,7 @@ egZ egZ egZ mtS -mbS +eXm plf flp fyD @@ -37251,7 +37235,7 @@ dxF jkR oex oex -xKb +snn amb iYo tUn @@ -37293,12 +37277,12 @@ egZ egZ egZ egZ -mbS +eXm lHs -qhw -qhw lHs -mbS +lHs +lHs +eXm plf rBH ghI @@ -37418,7 +37402,7 @@ dxF jkR sSq vlg -xKb +snn vuj lNA tUn @@ -37460,12 +37444,12 @@ qhw qhw lHs lHs -mbS +eXm fme dIQ vDS kNn -mbS +eXm plf flp fyD @@ -37585,7 +37569,7 @@ dxF jkR vlg vlg -xKb +snn sSF iYo tUn @@ -37750,9 +37734,9 @@ jkR jkR jkR jkR -xKb -xKb -sGs +snn +snn +jkR oDe iYo vHI @@ -37794,12 +37778,12 @@ vDS scY kUW dJk -mbS +eXm jwR qgW nAo nIA -mbS +eXm xhV kxW eNf @@ -38071,7 +38055,7 @@ kkH dTL xtN sHg -kkH +xgl mqG gNI oww @@ -39240,7 +39224,7 @@ lrw oQQ oQQ oQQ -dkm +lrw dkm baL ipz @@ -39417,7 +39401,7 @@ qKm aLe kqA jiz -dRX +pSK glB tZc mXZ @@ -39455,10 +39439,10 @@ sOc ifU kiN juO -mbS +eXm lHs lHs -mbS +eXm kKE dil qPO @@ -39642,12 +39626,12 @@ wOU cBq sVx mbS -lHs -lHs +qhw +qhw mbS -xvn -xvn -xvn +dJT +dJT +dJT mNM pKE aXa @@ -39762,7 +39746,7 @@ nYO gwY bRJ oVX -lcs +lCu snr snr lxd @@ -39808,14 +39792,14 @@ sVx wOU cBq sVx -lHs +qhw hzB gYr -lHs +qhw uTa uTa uTa -lHs +qhw lcv hni xaB @@ -39928,8 +39912,8 @@ dEB aHl lCu oVX -jzl -jzl +gwY +gwY wXV lxB jzl @@ -39956,7 +39940,7 @@ eXm lce hVg qgW -mbS +eXm vDH ksX eXm @@ -39978,11 +39962,11 @@ mbS mbS kDl gKY -lHs +qhw fGk wct bPV -lHs +qhw tFi hni xaB @@ -40095,7 +40079,7 @@ raP lyb lCu oVX -jzl +gwY ujk rxX qfN @@ -40262,8 +40246,8 @@ dEB aHl lCu oVX -jzl -jzl +gwY +gwY kBb uTj abS @@ -40429,8 +40413,8 @@ bOc vQJ lCu oVX -jzl -jzl +gwY +gwY cZt cDf dvL @@ -40477,8 +40461,8 @@ qGA xfW nCM mbS -lHs -lHs +qhw +qhw mbS bDl wwd @@ -40624,14 +40608,14 @@ lHs vDS kPZ sRk -mbS +eXm lHs lHs -mbS +eXm arU jJj vdH -mbS +eXm vDu uMa hWW @@ -40813,7 +40797,7 @@ sVx vDS qQU vDS -lHs +qhw uTa mpY uTa @@ -41128,11 +41112,11 @@ oqd mCI oqd wGD -mbS +eXm lHs lHs lHs -mbS +eXm vDS izd uyu @@ -41151,7 +41135,7 @@ pNi scY blZ scY -mwh +qhw lcv aXa xaB @@ -41318,7 +41302,7 @@ pZx gZA uTa uTa -mwh +qhw tFi hni xaB @@ -41794,11 +41778,11 @@ vOO cQH wfS wtH -dbg +jnS yir aRl yir -dbg +jnS wtH wtH jnS @@ -42466,8 +42450,8 @@ oQc sLx ciR kHm -ubR -ubR +eUK +eUK oQc oFz vHL @@ -42651,7 +42635,7 @@ waP vPK vfd mNM -xvn +dJT dJT xms uYx @@ -44094,8 +44078,8 @@ oUP oUP nKc uOk -oUP -oUP +qaI +qaI eTT eTT eAS @@ -44753,9 +44737,9 @@ xyF mJY xyF nJa -oUP -mDm -mDm +qaI +mYM +mYM pyE qaI mDz @@ -45599,10 +45583,10 @@ bbW bbW toD toD -oMZ +bbW idG -oMZ -oMZ +bbW +bbW bbW pmv pmv @@ -45766,11 +45750,11 @@ wnk bbW bbW bbW -oMZ +bbW buo nnz rEI -oMZ +bbW bQg qnB fyT @@ -46266,12 +46250,12 @@ oUh oUh gHp gUZ -oMZ +bbW wsq bRl shn mti -oMZ +bbW vCT qnB fyT @@ -46431,9 +46415,9 @@ dxF bbW juY juY -oMZ -oMZ -oMZ +bbW +bbW +bbW sBm sBm sBm @@ -49125,11 +49109,11 @@ oMl wSU oQL wbE -oMl -oMl -oMl -oMl -oMl +eBz +eBz +eBz +eBz +eBz csE eBz csE @@ -49292,7 +49276,7 @@ oMl eBz djo eBz -oMl +eBz dxF dxF dxF @@ -49459,7 +49443,7 @@ tVI ubm hvQ haK -oMl +eBz dxF dxF dxF @@ -49626,10 +49610,10 @@ eBz eUA pvA sBk -oMl -oMl -oMl -oMl +eBz +eBz +eBz +eBz vxa rob rob diff --git a/_maps/modularmaps/big_red/bigredcaveswvar2.dmm b/_maps/modularmaps/big_red/bigredcaveswvar2.dmm index 79416dd2517..76a1cfd4017 100644 --- a/_maps/modularmaps/big_red/bigredcaveswvar2.dmm +++ b/_maps/modularmaps/big_red/bigredcaveswvar2.dmm @@ -63,9 +63,6 @@ /obj/effect/landmark/lv624/fog_blocker, /turf/open/floor/plating/ground/mars/random/cave, /area/bigredv2/caves/southwest) -"D" = ( -/turf/open/floor/plating/ground/mars/random/cave/rock, -/area/bigredv2/caves/southwest) "F" = ( /obj/effect/landmark/weed_node, /obj/effect/ai_node, @@ -90,15 +87,6 @@ /obj/effect/landmark/weed_node, /turf/open/floor/plating/ground/mars/random/cave/rock, /area/bigredv2/caves/southwest) -"R" = ( -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/southwest) -"S" = ( -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/southwest) -"W" = ( -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/southwest) "Y" = ( /obj/effect/landmark/xeno_silo_spawn, /turf/open/floor/plating/ground/mars/random/cave, @@ -486,8 +474,8 @@ j j j j -R -S +N +N j j j @@ -510,8 +498,8 @@ l l "} (10,1,1) = {" -S -S +N +N j j j @@ -527,12 +515,12 @@ j j j j -S -S +N +N g -S -S -S +N +N +N j j j @@ -556,8 +544,8 @@ l "} (11,1,1) = {" g -S -S +N +N j j j @@ -571,14 +559,14 @@ j j j j -S -S -S -S -S -S -S -S +N +N +N +N +N +N +N +N j j j @@ -600,11 +588,11 @@ l l "} (12,1,1) = {" -S -S -S -D -D +N +N +N +b +b j j j @@ -616,14 +604,14 @@ j j j j -S -S +N +N j j -S -S -S -S +N +N +N +N j j j @@ -645,11 +633,11 @@ l l "} (13,1,1) = {" -S -D +N +b d -S -D +N +b j j j @@ -661,14 +649,14 @@ j j j g -S -S +N +N j j j j -S -S +N +N g j j @@ -690,11 +678,11 @@ l l "} (14,1,1) = {" -S -S -D -S -D +N +N +b +N +b j j j @@ -705,16 +693,16 @@ j j j j -S -S -S -S +N +N +N +N j j j -S -S -S +N +N +N j j j @@ -735,11 +723,11 @@ l l "} (15,1,1) = {" -S -S -S -S -D +N +N +N +N +b j j j @@ -750,16 +738,16 @@ j j j j -S -S -S -S +N +N +N +N g j j j -S -S +N +N j j j @@ -780,10 +768,10 @@ l l "} (16,1,1) = {" -S -S +N +N m -S +N d j j @@ -795,16 +783,16 @@ j j j j -S +N g -S -S -S -S +N +N +N +N j j -S -W +N +N j j j @@ -825,10 +813,10 @@ l l "} (17,1,1) = {" -S +N g -S -S +N +N g d j @@ -836,20 +824,20 @@ j j j j -D -D -D -S -S -S -S -S +b +b +b +N +N +N +N +N k -S -S -S -S -S +N +N +N +N +N j j j @@ -870,31 +858,31 @@ l l "} (18,1,1) = {" -S -S -S -S -S -D +N +N +N +N +N +b j j j j j -D -S -S -S -S -S -S -S -S +b +N +N +N +N +N +N +N +N g -S -S +N +N m -S +N j j j @@ -915,32 +903,32 @@ l l "} (19,1,1) = {" -S +N g M g -S -S -D -S +N +N +b +N j j j -S +N M -S -S -S -S -S -S -S -S +N +N +N +N +N +N +N +N g -S -D -S -S +N +b +N +N j j j @@ -961,32 +949,32 @@ l "} (20,1,1) = {" j -S -S -S -S -S -S -S -S +N +N +N +N +N +N +N +N j -S -S -S -S -S -S -S -S -S -S -S -S -S -D -S -S -S +N +N +N +N +N +N +N +N +N +N +N +N +N +b +N +N +N j j j @@ -1008,30 +996,30 @@ l j j j -S -S -S -S -S -S -S -S -S -S -S -S +N +N +N +N +N +N +N +N +N +N +N +N g -S -S -S -S -S -S -D -S -S +N +N +N +N +N +N +b +N +N g -S +N j j j @@ -1053,30 +1041,30 @@ l j j j -S -S +N +N M -S -S -S -S -S -S +N +N +N +N +N +N M -S -S +N +N M -D +b j b -S -S -S -D +N +N +N +b j j -S -S +N +N j j j @@ -1098,19 +1086,19 @@ l j j j -S -S -S -S -S -S -S -S -S -S -S -S -D +N +N +N +N +N +N +N +N +N +N +N +N +b j j j @@ -1120,9 +1108,9 @@ j j j j -S -S -S +N +N +N j j j @@ -1143,19 +1131,19 @@ l j j j -S -S +N +N g -S -S -D -S -S -D -S +N +N +b +N +N +b +N g -S -D +N +b j j j @@ -1165,9 +1153,9 @@ j j j N -S -S -S +N +N +N j j j @@ -1188,18 +1176,18 @@ l j j j -D -S -S -S +b +N +N +N g -S -S +N +N Q -S -S -S -S +N +N +N +N j j j @@ -1209,10 +1197,10 @@ j j j j -S +N F -S -S +N +N j j j @@ -1235,16 +1223,16 @@ j j j M -S -S -S -S -S -S +N +N +N +N +N +N g -D -S -S +b +N +N t t t @@ -1255,9 +1243,9 @@ t t t t -S +N M -S +N j j j @@ -1278,18 +1266,18 @@ l j j j -S +N g M -S -S -S -S -S -S +N +N +N +N +N +N M -S -S +N +N t j j @@ -1300,10 +1288,10 @@ j j j t -S -S +N +N g -S +N j j j @@ -1322,33 +1310,33 @@ l (28,1,1) = {" j j -S -S -S -S -S -S -S -S -S -S +N +N +N +N +N +N +N +N +N +N g -S -D +N +b t j j j -S +N g v j j t j -S -S -S +N +N +N j j j @@ -1367,33 +1355,33 @@ l (29,1,1) = {" j j -S -S -S -S -S +N +N +N +N +N g -S -S -S -S -S +N +N +N +N +N g -S +N t j j -S -S -S +N +N +N Y -S +N j t j -S +N g -S +N j j j @@ -1412,34 +1400,34 @@ l (30,1,1) = {" j j -S +N g -S -S -S -S +N +N +N +N g -D +b j -D +b M -S +N F c j j -S +N g -S -S +N +N g j t j -S +N g -S -S +N +N j j j @@ -1456,35 +1444,35 @@ l "} (31,1,1) = {" j -S -S -S -S -S -S -S -S -D +N +N +N +N +N +N +N +N +b j j -D +b M g c q j M -S -S -S -S +N +N +N +N j t j d -S -S -S +N +N +N j j j @@ -1501,35 +1489,35 @@ l "} (32,1,1) = {" j -S +N M -S -S +N +N M j -S -S -D +N +N +b j j j -S -S +N +N c q M -S -S -S -S +N +N +N +N j j t j -D +b d g -S +N j j j @@ -1546,36 +1534,36 @@ l "} (33,1,1) = {" j -S -S -S +N +N +N j j j -D -D +b +b j j j j -S -S +N +N c x -S +N g -S -D +N +b g j j t j j -D +b M -S -S +N +N j j j @@ -1591,9 +1579,9 @@ l "} (34,1,1) = {" j -S -S -S +N +N +N j j j @@ -1604,7 +1592,7 @@ j j j j -S +N c q w @@ -1618,10 +1606,10 @@ t j j j -S -S -S -S +N +N +N +N j j j @@ -1636,8 +1624,8 @@ l "} (35,1,1) = {" j -S -S +N +N j j j @@ -1648,8 +1636,8 @@ j j j j -S -S +N +N c c c @@ -1663,9 +1651,9 @@ t j j j -S -S -S +N +N +N j j j @@ -1681,8 +1669,8 @@ l "} (36,1,1) = {" j -S -S +N +N j j j @@ -1693,14 +1681,14 @@ j j j j -D +b F -S -S +N +N g F -S -D +N +b j j j @@ -1708,9 +1696,9 @@ j j j j -S +N g -S +N j j j @@ -1725,9 +1713,9 @@ l l "} (37,1,1) = {" -S -S -S +N +N +N j j j @@ -1741,11 +1729,11 @@ j j j j -S +N h -S +N M -S +N d j j @@ -1753,9 +1741,9 @@ j j j j -S +N k -S +N j j j @@ -1770,9 +1758,9 @@ l l "} (38,1,1) = {" -S -S -S +N +N +N j j j @@ -1786,21 +1774,21 @@ j j j j -S -S -S -S -S -D +N +N +N +N +N +b j j j j -D +b Q -S +N g -S +N j j j @@ -1815,9 +1803,9 @@ l l "} (39,1,1) = {" -S -S -S +N +N +N j j j @@ -1831,20 +1819,20 @@ j j j j -D -S -S -S -S -D +b +N +N +N +N +b j j j j -D -D -S -S +b +b +N +N j j j @@ -1860,9 +1848,9 @@ l l "} (40,1,1) = {" -S +N g -S +N j j j @@ -1881,15 +1869,15 @@ j j g g -S -D -D +N +b +b j j j j -S -S +N +N j j j @@ -1924,16 +1912,16 @@ j j j j -S -S -S -S -D +N +N +N +N +b j j j j -S +N g j j diff --git a/_maps/modularmaps/big_red/bigredcaveswvar3.dmm b/_maps/modularmaps/big_red/bigredcaveswvar3.dmm index dece87cdc04..538c1e45272 100644 --- a/_maps/modularmaps/big_red/bigredcaveswvar3.dmm +++ b/_maps/modularmaps/big_red/bigredcaveswvar3.dmm @@ -15,9 +15,6 @@ /obj/effect/landmark/weed_node, /turf/open/floor/plating/ground/mars/random/cave, /area/bigredv2/caves/southwest) -"l" = ( -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/southwest) "p" = ( /obj/effect/ai_node, /turf/open/floor/plating/ground/mars/random/cave/rock, @@ -45,12 +42,6 @@ /obj/effect/landmark/weed_node, /turf/open/floor/plating/ground/mars/random/cave/rock, /area/bigredv2/caves/southwest) -"B" = ( -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/southwest) -"C" = ( -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/southwest) "E" = ( /obj/effect/landmark/xeno_resin_wall, /turf/open/floor/plating/ground/mars/random/cave/rock, @@ -96,9 +87,6 @@ /obj/effect/landmark/lv624/fog_blocker/xeno_spawn, /turf/open/floor/plating/ground/mars/random/cave, /area/bigredv2/caves/southwest) -"Y" = ( -/turf/open/floor/plating/ground/mars/random/cave/rock, -/area/bigredv2/caves/southwest) (1,1,1) = {" K @@ -315,8 +303,8 @@ Q Q Q Q -l -l +c +c t i Q @@ -359,11 +347,11 @@ Q Q Q Q -l -l -l +c +c +c S -l +c c d Q @@ -375,11 +363,11 @@ Q Q Q Q -l -l -l -l -l +c +c +c +c +c Q Q Q @@ -398,17 +386,17 @@ Q Q Q Q -C +c V -l +c E Q -l +c i -l -l -l -l +c +c +c +c i d Q @@ -418,42 +406,42 @@ K (8,1,1) = {" Q Q -l -l -l +c +c +c i -Y -l -l -l -l +u +c +c +c +c Q Q Q Q Q Q -l -l -l -l -Y -l -l -l -l -l -l +c +c +c +c +u +c +c +c +c +c +c V -l +c E -l -l -l -l -l -l -l +c +c +c +c +c +c +c L d Q @@ -462,43 +450,43 @@ K "} (9,1,1) = {" Q -l -Y -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l +c +u +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c i -l +c V -l +c E -l +c i -l -l -l +c +c +c i -l +c Q d Q @@ -506,44 +494,44 @@ Q K "} (10,1,1) = {" -l -l +c +c t -l +c i i -l -l +c +c i -l +c i t -l -l -l -l -l +c +c +c +c +c t -l -l -l -l +c +c +c +c t -l -l -l -l +c +c +c +c t V -l +c U -Y -l +u +c t i -l +c t -l +c Q d Q @@ -552,42 +540,42 @@ K "} (11,1,1) = {" i -l -l -l -l -l +c +c +c +c +c i -l -Y -l -l -l -l -Y -Y -l -l -l -l -Y -l -l -l +c +u +c +c +c +c +u +u +c +c +c +c +u +c +c +c i -l -l -l -l +c +c +c +c V -l +c U -Y +u i -l -l -l -l +c +c +c +c Q Q d @@ -596,40 +584,40 @@ Q K "} (12,1,1) = {" -l -l -l -l -l -l -l -l -l -l -Q -Q -Q -l -l -l -Y -l -l -l -l -l -l -l -l -l -l -l +c +c +c +c +c +c +c +c +c +c +Q +Q +Q +c +c +c +u +c +c +c +c +c +c +c +c +c +c +c V -l +c q -l -l -B +c +c +c Q Q Q @@ -641,8 +629,8 @@ Q K "} (13,1,1) = {" -l -Y +c +u p Q Q @@ -655,22 +643,22 @@ Q Q Q Q -l -l -l +c +c +c t -l -l -l -l +c +c +c +c i -l -l -l +c +c +c i -l +c V -l +c q f q @@ -686,9 +674,9 @@ Q K "} (14,1,1) = {" -l -l -Y +c +c +u Q Q Q @@ -704,23 +692,23 @@ Q Q Q Q -l -l -l -l -l -l -l -l -l -l +c +c +c +c +c +c +c +c +c +c V -l -l -l -l -l -Y +c +c +c +c +c +u Q Q Q @@ -731,11 +719,11 @@ Q K "} (15,1,1) = {" -l -l -l -Y -Y +c +c +c +u +u Q Q Q @@ -751,14 +739,14 @@ Q Q Q Q -l -l -l -l -l -l +c +c +c +c +c +c i -l +c V V V @@ -776,11 +764,11 @@ Q K "} (16,1,1) = {" -l -l +c +c M -l -Y +c +u Q Q Q @@ -796,21 +784,21 @@ Q Q Q Q -l -l +c +c t i -l -l -l +c +c +c t -l -l -l -l +c +c +c +c t -l -l +c +c Q Q Q @@ -821,11 +809,11 @@ Q K "} (17,1,1) = {" -l +c i -l -l -Y +c +c +u Q Q Q @@ -841,20 +829,20 @@ Q Q Q Q -l -l -l -l -l -l +c +c +c +c +c +c r -l -l -l -l -l -l -l +c +c +c +c +c +c +c u Q Q @@ -866,11 +854,11 @@ Q K "} (18,1,1) = {" -l -l -l -l -Y +c +c +c +c +u Q Q Q @@ -885,20 +873,20 @@ Q Q Q Q -l -l -l -l -l -l -l -l -i -l -l -M -l -l +c +c +c +c +c +c +c +c +i +c +c +M +c +c Q Q Q @@ -911,10 +899,10 @@ Q K "} (19,1,1) = {" -l +c i t -l +c p Q Q @@ -928,22 +916,22 @@ Q Q Q Q -l -l -Y -l -l +c +c +u +c +c i -l -l -l -l -l +c +c +c +c +c i -l -Y -l -l +c +u +c +c Q Q Q @@ -957,11 +945,11 @@ K "} (20,1,1) = {" Q -l -l -l +c +c +c i -Y +u Q Q Q @@ -971,25 +959,25 @@ Q Q Q Q -l -l -l +c +c +c i -l -l -l -l -l -l +c +c +c +c +c +c A -l -l -l -l -Y -l -l -l +c +c +c +c +u +c +c +c Q Q Q @@ -1004,37 +992,37 @@ K Q Q Q -l -l -Y +c +c +u Q Q Q Q Q -Y -l -l -l -l -l -Y -l -l -l -l +u +c +c +c +c +c +u +c +c +c +c i -l -l -l -l -l -l -Y -l -l +c +c +c +c +c +c +u +c +c I -l +c Q Q Q @@ -1050,38 +1038,38 @@ Q Q Q i -l -l -Y -l +c +c +u +c Q Q Q -l +c t -l -l +c +c i -l -l -l -l -l -l +c +c +c +c +c +c t -Y +u Q -Y -l -l -l -Y +u +c +c +c +u Q Q -l +c t i -l +c t Q Q @@ -1094,19 +1082,19 @@ K Q Q Q -l -l -l -l -l -l +c +c +c +c +c +c Q -l -l -l -l -l -Y +c +c +c +c +c +u Q Q Q @@ -1116,17 +1104,17 @@ Q Q Q Q -l -l +c +c t Q Q Q Q Q -l -l -l +c +c +c i Q Q @@ -1139,19 +1127,19 @@ K Q Q Q -l -l +c +c i -l -l -Y -l -l -Y -l +c +c +u +c +c +u +c i -l -Y +c +u Q Q Q @@ -1160,21 +1148,21 @@ Q Q Q Q -l -l -l -l +c +c +c +c Q Q Q Q Q -l -Y -l -l -l -l +c +u +c +c +c +c Q Q Q @@ -1184,18 +1172,18 @@ K Q Q Q -Y -l -l -l +u +c +c +c i -l -l +c +c A -l -l -l -l +c +c +c +c Q Q Q @@ -1205,22 +1193,22 @@ Q Q Q Q -l +c I -l -l +c +c Q Q Q Q Q Q -l -l -l -l -l -l +c +c +c +c +c +c Q Q K @@ -1231,16 +1219,16 @@ Q Q Q t -l -l -l -l -l -l +c +c +c +c +c +c i -Y -l -l +u +c +c Q Q Q @@ -1251,9 +1239,9 @@ Q Q Q Q -l +c t -l +c Q Q Q @@ -1261,11 +1249,11 @@ Q Q Q Q -l -l -l +c +c +c A -l +c Q Q K @@ -1274,18 +1262,18 @@ K Q Q Q -l +c i t -l -l -l -l -l -l +c +c +c +c +c +c t -l -l +c +c Q Q Q @@ -1296,21 +1284,21 @@ Q Q Q Q -l -l +c +c i -l +c Q Q Q Q Q Q -l -l -l -l -l +c +c +c +c +c Q Q K @@ -1318,19 +1306,19 @@ K (28,1,1) = {" Q Q -l -l -l -l -l -l -l -l -l -l +c +c +c +c +c +c +c +c +c +c i -l -Y +c +u Q Q Q @@ -1342,20 +1330,20 @@ Q Q Q Q -l -l -l +c +c +c Q Q Q Q Q Q -l +c A -l +c i -l +c Q Q K @@ -1363,19 +1351,19 @@ K (29,1,1) = {" Q Q -l -l -l -l -l +c +c +c +c +c i -l -l -l -l -l +c +c +c +c +c i -l +c Q Q Q @@ -1387,20 +1375,20 @@ Q Q Q Q -l +c i -l +c Q Q Q Q Q Q -l -l -l -l -l +c +c +c +c +c Q Q K @@ -1408,20 +1396,20 @@ K (30,1,1) = {" Q Q -l +c i -l -l -l -l +c +c +c +c i -Y +u Q -Y +u t -l -l -l +c +c +c Q Q Q @@ -1432,19 +1420,19 @@ Q Q Q Q -l +c i -l -l +c +c Q Q Q t i -l +c t -l -l +c +c Q Q Q @@ -1452,22 +1440,22 @@ K "} (31,1,1) = {" Q -l -l -l -l -l -l -l -l -Y +c +c +c +c +c +c +c +c +u Q Q -Y +u t i -l -l +c +c Q Q Q @@ -1478,15 +1466,15 @@ Q Q Q p -l -l -l -l -l -l -l -l -l +c +c +c +c +c +c +c +c +c Q Q Q @@ -1497,24 +1485,24 @@ K "} (32,1,1) = {" Q -l +c t -l -l +c +c t Q -l -l -Y +c +c +u Q Q Q -l +c t -l -l +c +c t -l +c Q Q Q @@ -1522,14 +1510,14 @@ Q Q Q Q -Y +u p i -l -l +c +c i -l -l +c +c Q Q Q @@ -1542,38 +1530,38 @@ K "} (33,1,1) = {" Q -l -l -l +c +c +c Q Q Q -Y -Y +u +u Q Q Q Q -l -l -l +c +c +c i -l +c i -l -Y +c +u Q Q Q Q Q Q -Y +u t -l -l -l -l +c +c +c +c t Q K @@ -1587,9 +1575,9 @@ K "} (34,1,1) = {" Q -l -l -l +c +c +c Q Q Q @@ -1600,25 +1588,25 @@ Q Q Q Q -l -l -l -l -l -l -l -Y +c +c +c +c +c +c +c +u Q Q Q Q Q Q -l +c i -l -l -l +c +c +c Q Q K @@ -1632,8 +1620,8 @@ K "} (35,1,1) = {" Q -l -l +c +c Q Q Q @@ -1644,14 +1632,14 @@ Q Q Q Q -l -l -l -l -l -l -l -Y +c +c +c +c +c +c +c +u Q Q Q @@ -1659,9 +1647,9 @@ Q Q Q Q -l -l -l +c +c +c Q Q Q @@ -1677,8 +1665,8 @@ K "} (36,1,1) = {" Q -l -l +c +c Q Q Q @@ -1689,14 +1677,14 @@ Q Q Q Q -Y +u t -l -l +c +c t i -l -Y +c +u Q Q Q @@ -1704,9 +1692,9 @@ Q Q Q Q -l +c i -l +c Q Q Q @@ -1721,9 +1709,9 @@ K K "} (37,1,1) = {" -l -l -l +c +c +c Q Q Q @@ -1737,11 +1725,11 @@ Q Q Q Q -l +c F -l -l -l +c +c +c p Q Q @@ -1749,9 +1737,9 @@ Q Q Q Q -l +c r -l +c Q Q Q @@ -1766,9 +1754,9 @@ K K "} (38,1,1) = {" -l -l -l +c +c +c Q Q Q @@ -1782,21 +1770,21 @@ Q Q Q Q -l -l -l -l -l -Y +c +c +c +c +c +u Q Q Q Q -Y +u A -l +c i -l +c Q Q Q @@ -1811,9 +1799,9 @@ K K "} (39,1,1) = {" -l -l -l +c +c +c Q Q Q @@ -1827,20 +1815,20 @@ Q Q Q Q -Y -l -l -l -l -Y +u +c +c +c +c +u Q Q Q Q -Y -Y -l -l +u +u +c +c Q Q Q @@ -1856,9 +1844,9 @@ K K "} (40,1,1) = {" -l +c i -l +c Q Q Q @@ -1877,15 +1865,15 @@ Q Q i i -l -Y -Y +c +u +u Q Q Q Q t -l +c Q Q Q @@ -1920,16 +1908,16 @@ Q Q Q Q -l -l -l -l -Y +c +c +c +c +u Q Q Q Q -l +c i Q Q diff --git a/_maps/modularmaps/big_red/bigredcaveswvar4.dmm b/_maps/modularmaps/big_red/bigredcaveswvar4.dmm index 0992917c1ad..bb988d350f1 100644 --- a/_maps/modularmaps/big_red/bigredcaveswvar4.dmm +++ b/_maps/modularmaps/big_red/bigredcaveswvar4.dmm @@ -18,9 +18,6 @@ "af" = ( /turf/open/floor/plating/ground/mars/random/cave, /area/bigredv2/caves/southwest) -"ag" = ( -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/southwest) "ah" = ( /obj/effect/ai_node, /turf/open/floor/plating/ground/mars/random/cave/rock, @@ -71,17 +68,11 @@ /obj/effect/landmark/lv624/fog_blocker/xeno_spawn, /turf/open/floor/plating/ground/mars/random/cave, /area/bigredv2/caves/southwest) -"aB" = ( -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/southwest) "aF" = ( /obj/effect/landmark/weed_node, /obj/effect/landmark/xeno_resin_wall, /turf/open/floor/plating/ground/mars/random/cave, /area/bigredv2/caves/southwest) -"aG" = ( -/turf/open/floor/plating/ground/mars/random/cave/rock, -/area/bigredv2/caves/southwest) "aH" = ( /turf/closed/mineral/smooth/bigred, /area/bigredv2/caves/rock) @@ -98,9 +89,6 @@ /obj/effect/landmark/weed_node, /turf/open/floor/plating/ground/mars/random/cave, /area/bigredv2/caves/southwest) -"aR" = ( -/turf/open/floor/plating/ground/mars/random/cave/rock, -/area/bigredv2/caves/southwest) "aT" = ( /obj/effect/landmark/lv624/fog_blocker/xeno_spawn, /turf/closed/mineral/smooth/bigred, @@ -358,11 +346,11 @@ aH aT aH aH -aB -aR -aR +af +ae +ae hG -aR +ae ae aH aH @@ -385,11 +373,11 @@ aH aH aH aH -aB -aB -aB -aB -aB +af +af +af +af +af aH aH aH @@ -397,19 +385,19 @@ aH aH aH aj -ag -aB -aB +af +af +af az -aB +af ar -aB -aB -aB -aB -aB -aB -aR +af +af +af +af +af +af +ae aH aH aH @@ -428,33 +416,33 @@ au (8,1,1) = {" aH aH -aB -aB -aB +af +af +af aQ -aB -aB -aB -aB -aB +af +af +af +af +af aH aH aH -aR -aB -aB -aB -aB +ae +af +af +af +af aJ -aB +af ar -aB -aB +af +af aQ -aB +af aQ -aB -aR +af +ae aH aH aH @@ -472,33 +460,33 @@ au "} (9,1,1) = {" aH -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af az -aB +af ar -aB -aB -aB +af +af +af ak -aB -aB +af +af aj aH aH @@ -516,36 +504,36 @@ au au "} (10,1,1) = {" -aB -aB +af +af am -aB +af aQ aQ -aB -aB +af +af aQ -aB +af aQ am -aB -aB -aB +af +af +af am -aB -aB -aB +af +af +af az -aB +af ar -aB -aB +af +af aQ am -aB +af aQ -aB -aR +af +ae aH aH aH @@ -562,35 +550,35 @@ au "} (11,1,1) = {" aQ -aB -aB -aB -aB -aB +af +af +af +af +af aQ -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB +af +af +af +af +af +af +af +af +af +af +af aQ az -aB +af aF -aB -aB -aB -aB -aB -aB -aB -aR +af +af +af +af +af +af +af +ae aH aH aH @@ -606,38 +594,38 @@ au au "} (12,1,1) = {" -aB -aB -aB -aB -aB -aB -aB -aB -aH -aH -aH -aB -aB -aB -aB -aB -aB -aB -aB +af +af +af +af +af +af +af +af +aH +aH +aH +af +af +af +af +af +af +af +af az -aB +af ar -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB +af +af +af +af +af +af +af +af +af +af aH aH aH @@ -651,8 +639,8 @@ au au "} (13,1,1) = {" -aB -aB +af +af aH aH aH @@ -662,16 +650,16 @@ aH aH aH aH -aB -aB -aB -aB +af +af +af +af aQ -aB -aB -aB +af +af +af az -aB +af ar ar ar @@ -696,7 +684,7 @@ au au "} (14,1,1) = {" -aB +af aH aH aH @@ -707,26 +695,26 @@ aH aH aH aH -aB -aB -aB -aB -aB -aB -aB -aB +af +af +af +af +af +af +af +af az -aB -aB -aB -aB -aB -aB -aB -aR -aB -aB -aB +af +af +af +af +af +af +af +ae +af +af +af aH aH aH @@ -752,25 +740,25 @@ aH aH aH aH -aR -aB -aB -aB -aB -aB -aB -aB +ae +af +af +af +af +af +af +af aJ -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB +af +af +af +af +af +af +af +af +af +af aQ aH aH @@ -798,25 +786,25 @@ aH aH aH aH -aB -aB -aB +af +af +af am aQ -aB -aB +af +af az am -aB -aB -aB -aB +af +af +af +af am -aB -aB +af +af aQ -aB -aB +af +af aH aH aH @@ -843,13 +831,13 @@ aH aH aH aH -aB -aB -aB -aB -aB -aB -aB +af +af +af +af +af +af +af an az az @@ -888,23 +876,23 @@ aH aH aH aH -aB -aB +af +af aQ -aB -aB -aB -aB -aB +af +af +af +af +af aQ -aB -aB +af +af ai -aB -aB -aB -aB -aB +af +af +af +af +af af aH aH @@ -933,22 +921,22 @@ aH aH aH aH -aB -aB -aB -aB -aB -aB -aB -aB -aB +af +af +af +af +af +af +af +af +af aQ -aB -aR +af +ae aQ -aB -aB -aB +af +af +af aH aH aH @@ -976,23 +964,23 @@ aH aH aH aH -aB -aR -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB -aR -aB -aB -aB +af +ae +af +af +af +af +af +af +af +af +af +af +af +ae +af +af +af aH aH aH @@ -1020,24 +1008,24 @@ aH aH aH aH -aB -aB -aR -aB -aB -aB +af +af +ae +af +af +af aQ -aB -aB -aB +af +af +af aQ -aB -aB -aR -aB -aB +af +af +ae +af +af aQ -aB +af aH aH aH @@ -1065,24 +1053,24 @@ aH aH aH aH -aB -aB -aB +af +af +af am -aB -aB +af +af am -aR +ae aH -aR -aB -aB -aB -aG +ae +af +af +af +ae aH aH -aB -aB +af +af aH aH aH @@ -1109,14 +1097,14 @@ aH aH aH aH -aB -aB -aB -aB -aB -aB -aB -aR +af +af +af +af +af +af +af +ae aH aH aH @@ -1126,9 +1114,9 @@ aH aH aH aH -aB -aB -aB +af +af +af aH aH aH @@ -1152,16 +1140,16 @@ aH aH aH aQ -aB -aB -aR -aB -aB -aR -aB +af +af +ae +af +af +ae +af aQ -aB -aR +af +ae aH aH aH @@ -1170,10 +1158,10 @@ aH aH aH aH -aB -aB -aB -aB +af +af +af +af aH aH aH @@ -1196,16 +1184,16 @@ aH aH aH aH -aB -aB +af +af aQ -aB -aB +af +af aj -aB -aB -aB -aB +af +af +af +af aH aH aH @@ -1215,10 +1203,10 @@ aH aH aH aH -aB +af ab -aB -aB +af +af aH aH aH @@ -1241,16 +1229,16 @@ aH aH aH am -aB -aB -aB -aB -aB -aB +af +af +af +af +af +af aQ -aR -aB -aB +ae +af +af aH aH aH @@ -1261,9 +1249,9 @@ aH aH aH aH -aB +af am -aB +af aH aH aH @@ -1284,18 +1272,18 @@ au aH aH aH -aB +af aQ am -aB -aB -aB -aB -aB -aB +af +af +af +af +af +af am -aB -aB +af +af aH aH aH @@ -1306,10 +1294,10 @@ aH aH aH aH -aB -aB +af +af aQ -aB +af aH aH aH @@ -1328,19 +1316,19 @@ au (28,1,1) = {" aH aH -aB -aB -aB -aB -aB -aB -aB -aB -aB -aB +af +af +af +af +af +af +af +af +af +af aQ -aB -aR +af +ae aH aH aH @@ -1352,9 +1340,9 @@ aH aH aH aH -aB -aB -aB +af +af +af aH aH aH @@ -1373,19 +1361,19 @@ au (29,1,1) = {" aH aH -aB -aB -aB -aB -aB +af +af +af +af +af aQ -aB -aB -aB -aB -aB +af +af +af +af +af aQ -aB +af aH aH aH @@ -1397,9 +1385,9 @@ aH aH aH aH -aB +af aQ -aB +af aH aH aH @@ -1418,20 +1406,20 @@ au (30,1,1) = {" aH aH -aB +af aQ -aB -aB -aB -aB +af +af +af +af aQ -aR +ae aH -aR +ae am -aB -aB -aB +af +af +af aH aH aH @@ -1442,10 +1430,10 @@ aH aH aH aH -aB +af aQ -aB -aB +af +af aH aH aH @@ -1462,22 +1450,22 @@ au "} (31,1,1) = {" aH -aB -aB -aB -aB -aB -aB -aB -aB -aR +af +af +af +af +af +af +af +af +ae aH aH -aR +ae am aQ -aB -aB +af +af aH aH aH @@ -1488,9 +1476,9 @@ aH aH aH ah -aB -aB -aB +af +af +af aH aH aH @@ -1507,24 +1495,24 @@ au "} (32,1,1) = {" aH -aB +af am -aB -aB +af +af am aH -aB -aB -aR +af +af +ae aH aH aH -aB +af am -aB -aB +af +af am -aB +af aH aH aH @@ -1532,10 +1520,10 @@ aH aH aH aH -aR +ae ah aQ -aB +af aH aH aH @@ -1552,36 +1540,36 @@ au "} (33,1,1) = {" aH -aB -aB -aB +af +af +af aH aH aH -aR -aR +ae +ae aH aH aH aH -aB -aB -aB +af +af +af aQ -aB +af aQ -aB -aR +af +ae aH aH aH aH aH aH -aR +ae am -aB -aB +af +af aH aH aH @@ -1597,9 +1585,9 @@ au "} (34,1,1) = {" aH -aB -aB -aB +af +af +af aH aH aH @@ -1610,24 +1598,24 @@ aH aH aH aH -aB -aB -aB -aB -aB -aB -aB -aR +af +af +af +af +af +af +af +ae aH aH aH aH aH aH -aB -aB -aB -aB +af +af +af +af aH aH aH @@ -1642,8 +1630,8 @@ au "} (35,1,1) = {" aH -aB -aB +af +af aH aH aH @@ -1654,14 +1642,14 @@ aH aH aH aH -aB -aB -aB -aB -aB -aB -aB -aR +af +af +af +af +af +af +af +ae aH aH aH @@ -1669,9 +1657,9 @@ aH aH aH aH -aB -aB -aB +af +af +af aH aH aH @@ -1687,8 +1675,8 @@ au "} (36,1,1) = {" aH -aB -aB +af +af aH aH aH @@ -1699,14 +1687,14 @@ aH aH aH aH -aR -aB -aB -aB -aB +ae +af +af +af +af aQ -aB -aR +af +ae aH aH aH @@ -1714,9 +1702,9 @@ aH aH aH aH -aB +af aQ -aB +af aH aH aH @@ -1731,9 +1719,9 @@ au au "} (37,1,1) = {" -aB -aB -aB +af +af +af aH aH aH @@ -1747,11 +1735,11 @@ aH aH aH aH -aB +af as -aB -aB -aB +af +af +af ah aH aH @@ -1759,9 +1747,9 @@ aH aH aH aH -aB +af ac -aB +af aH aH aH @@ -1776,9 +1764,9 @@ au au "} (38,1,1) = {" -aB -aB -aB +af +af +af aH aH aH @@ -1792,21 +1780,21 @@ aH aH aH aH -aB -aB -aB -aB -aB -aR +af +af +af +af +af +ae aH aH aH aH -aR +ae aj -aB +af aQ -aB +af aH aH aH @@ -1821,9 +1809,9 @@ au au "} (39,1,1) = {" -aB -aB -aB +af +af +af aH aH aH @@ -1837,20 +1825,20 @@ aH aH aH aH -aR -aB -aB -aB -aB -aR +ae +af +af +af +af +ae aH aH aH aH -aR -aR -aB -aB +ae +ae +af +af aH aH aH @@ -1866,9 +1854,9 @@ au au "} (40,1,1) = {" -aB +af aQ -aB +af aH aH aH @@ -1887,15 +1875,15 @@ aH aH aQ aQ -aB -aR -aR +af +ae +ae aH aH aH aH -aB -aB +af +af aH aH aH @@ -1930,16 +1918,16 @@ aH aH aH aH -aB -aB -aB -aB -aR +af +af +af +af +ae aH aH aH aH -aB +af aQ aH aH diff --git a/_maps/modularmaps/big_red/bigredcaveswvar5.dmm b/_maps/modularmaps/big_red/bigredcaveswvar5.dmm index 2c3adf839cd..7adeb11a551 100644 --- a/_maps/modularmaps/big_red/bigredcaveswvar5.dmm +++ b/_maps/modularmaps/big_red/bigredcaveswvar5.dmm @@ -50,9 +50,6 @@ /obj/effect/landmark/lv624/fog_blocker/xeno_spawn, /turf/open/floor/plating/ground/mars/random/cave, /area/bigredv2/caves/southwest) -"A" = ( -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/southwest) "F" = ( /obj/effect/landmark/xeno_silo_spawn, /turf/open/floor/plating/ground/mars/random/cave, @@ -74,23 +71,14 @@ /obj/effect/landmark/xeno_tunnel_spawn, /turf/open/floor/plating/ground/mars/random/cave, /area/bigredv2/caves/southwest) -"L" = ( -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/southwest) "P" = ( /obj/effect/landmark/lv624/fog_blocker, /turf/closed/mineral/smooth/bigred, /area/bigredv2/caves/rock) -"T" = ( -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/southwest) "U" = ( /obj/effect/ai_node, /turf/open/floor/plating/ground/mars/random/cave/rock, /area/bigredv2/caves/southwest) -"V" = ( -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/southwest) "W" = ( /obj/effect/ai_node, /turf/open/floor/plating/ground/mars/random/cave, @@ -300,10 +288,10 @@ f f f j -T -T -T -T +j +j +j +j f f f @@ -339,17 +327,17 @@ I f f f -T +j w w w w w -T +j h -T -T -T +j +j +j f f f @@ -371,30 +359,30 @@ f f f f -T -T +j +j W -T -T +j +j f f f f I -T +j p l -T -T -T -T -T -T -T -T -T +j +j +j +j +j +j +j +j +j F -T +j f f f @@ -414,33 +402,33 @@ n (8,1,1) = {" f f -T +j h -T +j h -T -T +j +j h -T -T +j +j f f g U -T +j l -T -T +j +j h -T +j h W -T -T -T -T +j +j +j +j W -T +j f f f @@ -458,34 +446,34 @@ n "} (9,1,1) = {" f -T -T -T -T -T -T -T -T -T -T -T -T +j +j +j +j +j +j +j +j +j +j +j +j g -T -T +j +j l -T -T -T -T -T -T +j +j +j +j +j +j h -T -T -T -T -A +j +j +j +j +j f f f @@ -502,19 +490,19 @@ n n "} (10,1,1) = {" -T -T +j +j W -T +j h h W -T +j h -T +j h W -T +j y W f @@ -522,15 +510,15 @@ f f f f -T -T -T -T -T -T -T -T -T +j +j +j +j +j +j +j +j +j f f f @@ -548,20 +536,20 @@ n "} (11,1,1) = {" h -T -T -T -T -T +j +j +j +j +j h -T -T -T -T -T -T +j +j +j +j +j +j g -T +j f f f @@ -569,13 +557,13 @@ f f f f -V +j K w -T -T +j +j h -T +j f f f @@ -592,22 +580,22 @@ n n "} (12,1,1) = {" -T -T -T -T -T -T -T -T -T -T +j +j +j +j +j +j +j +j +j +j f f f g -T -T +j +j f f f @@ -616,11 +604,11 @@ f f f f -T -T -T -T -T +j +j +j +j +j f f f @@ -637,7 +625,7 @@ n n "} (13,1,1) = {" -T +j w U f @@ -651,9 +639,9 @@ f f f g -T +j h -T +j f f f @@ -661,11 +649,11 @@ f f f f -T -T -T -T -T +j +j +j +j +j f f f @@ -682,8 +670,8 @@ n n "} (14,1,1) = {" -T -T +j +j w f f @@ -696,19 +684,19 @@ f f f g -T -T -T -T -T +j +j +j +j +j f f f f f f -T -T +j +j w f f @@ -728,8 +716,8 @@ n "} (15,1,1) = {" h -T -T +j +j w w f @@ -742,19 +730,19 @@ f f x W -T -T -T -T +j +j +j +j h f f f f f -T -T -T +j +j +j f f f @@ -772,10 +760,10 @@ n n "} (16,1,1) = {" -T -T +j +j t -T +j w f f @@ -786,12 +774,12 @@ f f f I -T +j W h -T -T -T +j +j +j W f f @@ -817,10 +805,10 @@ n n "} (17,1,1) = {" -T +j h -T -T +j +j w f f @@ -831,19 +819,19 @@ f f f I -T -T -T -T -T +j +j +j +j +j u -T +j W -T -T -L -T -T +j +j +j +j +j U f f @@ -862,10 +850,10 @@ n n "} (18,1,1) = {" -T -T -T -T +j +j +j +j w f f @@ -876,18 +864,18 @@ f f f I -T -T -T +j +j +j h -T -T +j +j h -T -T +j +j t -T -T +j +j W f f @@ -907,10 +895,10 @@ n n "} (19,1,1) = {" -T +j h W -T +j U f f @@ -953,9 +941,9 @@ n "} (20,1,1) = {" f -T -T -T +j +j +j h w f @@ -968,17 +956,17 @@ f f f f -T -T -T -T +j +j +j +j h -T -T +j +j w -T -T -T +j +j +j f f f @@ -1000,8 +988,8 @@ n f f f -T -T +j +j w f f @@ -1014,16 +1002,16 @@ f f f f -T -T -T -T -T +j +j +j +j +j w -T -T +j +j h -T +j f f f @@ -1046,10 +1034,10 @@ f f f h -T -T +j +j w -T +j f f f @@ -1062,13 +1050,13 @@ f f f f -T -T +j +j w f f -T -T +j +j f f f @@ -1090,12 +1078,12 @@ n f f f -T -T -T -T -T -T +j +j +j +j +j +j f f f @@ -1112,9 +1100,9 @@ f f f f -T -T -T +j +j +j f f f @@ -1135,14 +1123,14 @@ n f f f -T -T +j +j h -T -T +j +j w -T -T +j +j f f f @@ -1156,10 +1144,10 @@ f f f f -T -T -T -T +j +j +j +j f f f @@ -1181,14 +1169,14 @@ f f f w -T -T -T +j +j +j h -T -T +j +j p -T +j f f f @@ -1201,10 +1189,10 @@ f f f f -T +j J -T -T +j +j f f f @@ -1227,12 +1215,12 @@ f f f W -T -T -T -T -T -T +j +j +j +j +j +j h w f @@ -1247,9 +1235,9 @@ f f f f -T +j W -T +j f f f @@ -1270,17 +1258,17 @@ n f f f -T +j h W -T -T -T -T -T -T -T -T +j +j +j +j +j +j +j +j f f f @@ -1292,10 +1280,10 @@ f f f f -T -T +j +j h -T +j f f f @@ -1314,18 +1302,18 @@ n (28,1,1) = {" f f -T -T -T -T -T -T -T -T -T -T +j +j +j +j +j +j +j +j +j +j h -T +j w f f @@ -1338,9 +1326,9 @@ f f f f -T -T -T +j +j +j f f f @@ -1359,19 +1347,19 @@ n (29,1,1) = {" f f -T -T -T -T -T +j +j +j +j +j h -T -T -T -T -T +j +j +j +j +j h -T +j f f f @@ -1383,9 +1371,9 @@ f f f f -T +j h -T +j f f f @@ -1404,20 +1392,20 @@ n (30,1,1) = {" f f -T +j h -T -T -T -T +j +j +j +j h w f w W -T -T -T +j +j +j f f f @@ -1428,10 +1416,10 @@ f f f f -T +j h -T -T +j +j f f f @@ -1448,22 +1436,22 @@ n "} (31,1,1) = {" f -T -T -T -T -T -T -T -T +j +j +j +j +j +j +j +j w f f w W h -T -T +j +j f f f @@ -1474,9 +1462,9 @@ f f f U -T -T -T +j +j +j f f f @@ -1493,24 +1481,24 @@ n "} (32,1,1) = {" f -T +j W -T -T +j +j W f -T -T +j +j w f f f -T +j W -T -T +j +j W -T +j f f f @@ -1521,7 +1509,7 @@ f w U h -T +j f f f @@ -1538,9 +1526,9 @@ n "} (33,1,1) = {" f -T -T -T +j +j +j f f f @@ -1550,13 +1538,13 @@ f f f f -T -T -T +j +j +j h -T +j h -T +j w f f @@ -1566,8 +1554,8 @@ f f w W -T -T +j +j f f f @@ -1583,9 +1571,9 @@ n "} (34,1,1) = {" f -T -T -T +j +j +j f f f @@ -1596,13 +1584,13 @@ f f f f -T -T -T -T -T -T -T +j +j +j +j +j +j +j w f f @@ -1610,10 +1598,10 @@ f f f f -T -T +j +j h -T +j f f f @@ -1628,8 +1616,8 @@ n "} (35,1,1) = {" f -T -T +j +j f f f @@ -1640,13 +1628,13 @@ f f f f -T +j h -T -T -T -T -T +j +j +j +j +j w f f @@ -1655,9 +1643,9 @@ f f f f -T -T -T +j +j +j f f f @@ -1673,8 +1661,8 @@ n "} (36,1,1) = {" f -T -T +j +j f f f @@ -1686,12 +1674,12 @@ f f f w -T -T -T -T +j +j +j +j h -T +j w f f @@ -1700,9 +1688,9 @@ f f f f -T +j h -T +j f f f @@ -1717,9 +1705,9 @@ n n "} (37,1,1) = {" -T -T -T +j +j +j f f f @@ -1733,11 +1721,11 @@ f f f f -T +j d -T -T -T +j +j +j U f f @@ -1745,9 +1733,9 @@ f f f f -T +j u -T +j f f f @@ -1762,9 +1750,9 @@ n n "} (38,1,1) = {" -T -T -T +j +j +j f f f @@ -1778,11 +1766,11 @@ f f f f -T -T -T -T -T +j +j +j +j +j w f f @@ -1790,9 +1778,9 @@ f f w p -T +j h -T +j f f f @@ -1807,9 +1795,9 @@ n n "} (39,1,1) = {" -T -T -T +j +j +j f f f @@ -1824,10 +1812,10 @@ f f f w -T -T -T -T +j +j +j +j w f f @@ -1835,8 +1823,8 @@ f f w w -T -T +j +j f f f @@ -1852,9 +1840,9 @@ n n "} (40,1,1) = {" -T +j h -T +j f f f @@ -1873,15 +1861,15 @@ f f h h -T +j w w f f f f -T -T +j +j f f f @@ -1916,16 +1904,16 @@ f f f f -T -T -T -T +j +j +j +j w f f f f -T +j h f f diff --git a/_maps/modularmaps/big_red/bigredengineeringvar2.dmm b/_maps/modularmaps/big_red/bigredengineeringvar2.dmm index 64198449fba..d7cc7a1fb18 100644 --- a/_maps/modularmaps/big_red/bigredengineeringvar2.dmm +++ b/_maps/modularmaps/big_red/bigredengineeringvar2.dmm @@ -887,9 +887,6 @@ "VL" = ( /turf/closed/wall/r_wall, /area/bigredv2/caves/rock) -"Wo" = ( -/turf/open/floor, -/area/bigredv2/outside/engineering) "WD" = ( /obj/machinery/light{ dir = 1 @@ -983,9 +980,9 @@ GH Pt Ds uk -Wo +ib kJ -Wo +ib jo GH Cj @@ -1011,9 +1008,9 @@ oK Zt Pt tK -Wo +ib JW -Wo +ib Vv kq GH @@ -1065,8 +1062,8 @@ su (5,1,1) = {" Pt ge -Wo -Wo +ib +ib Pt EH wt @@ -1098,9 +1095,9 @@ pZ LM Pt Ds -Wo +ib Jv -Wo +ib gF gF GH @@ -1150,17 +1147,17 @@ LF LF "} (8,1,1) = {" -Wo +ib iu Pt xn bb Oa -Wo -Wo -Wo -Wo -Wo +ib +ib +ib +ib +ib GH LF LF @@ -1179,17 +1176,17 @@ su LF "} (9,1,1) = {" -Wo +ib rP wt -Wo -Wo +ib +ib en tR -Wo +ib tR -Wo -Wo +ib +ib GH LF LF @@ -1208,7 +1205,7 @@ CS su "} (10,1,1) = {" -Wo +ib iu wt Vv @@ -1216,8 +1213,8 @@ sd en VC DH -Wo -Wo +ib +ib DH GH LF @@ -1243,11 +1240,11 @@ hE hb JU Vs -Wo -Wo -Wo +ib +ib +ib dv -Wo +ib GH LF LF @@ -1324,7 +1321,7 @@ su qm "} (14,1,1) = {" -Wo +ib wW Pt Oa @@ -1332,7 +1329,7 @@ DH Pt UB wW -Wo +ib DH yB GH @@ -1353,13 +1350,13 @@ su su "} (15,1,1) = {" -Wo +ib zj wt Ie qO Pt -Wo +ib Qv Jv Ow @@ -1448,8 +1445,8 @@ Jv Pt ib At -Wo -Wo +ib +ib hV GH LF @@ -1500,15 +1497,15 @@ su (20,1,1) = {" SP wt -Wo +ib Ds Jv -Wo -Wo +ib +ib Sv Vv Jv -Wo +ib GH LF Gh @@ -1537,7 +1534,7 @@ fr Jv dv Jv -Wo +ib GH LF ox @@ -1556,16 +1553,16 @@ Bn su "} (22,1,1) = {" -Wo +ib wt -Wo +ib Oa nC jG CN DO -Wo -Wo +ib +ib Vv GH LF @@ -1592,9 +1589,9 @@ Of KV tt bN -Wo -Wo -Wo +ib +ib +ib OF GH LF @@ -1616,15 +1613,15 @@ su (24,1,1) = {" Jv Px -Wo +ib Of eh eh eh Jv Jv -Wo -Wo +ib +ib GH LF LF @@ -1681,8 +1678,8 @@ Dx ON Fq Jv -Wo -Wo +ib +ib GH VL VL @@ -1710,8 +1707,8 @@ GH OK en AQ -Wo -Wo +ib +ib GH GH GH @@ -1766,11 +1763,11 @@ xH xH GH Yq -Wo +ib VI bq Jv -Wo +ib Vv tv GH @@ -1800,7 +1797,7 @@ GH GH GH GH -Wo +ib sg GH wm diff --git a/_maps/modularmaps/big_red/bigredengineeringvar4.dmm b/_maps/modularmaps/big_red/bigredengineeringvar4.dmm index 8853d0c3f26..6d133c55249 100644 --- a/_maps/modularmaps/big_red/bigredengineeringvar4.dmm +++ b/_maps/modularmaps/big_red/bigredengineeringvar4.dmm @@ -697,9 +697,6 @@ /obj/item/tool/lighter/random, /turf/open/floor, /area/bigredv2/outside/engineering) -"OK" = ( -/turf/open/floor, -/area/bigredv2/outside/engineering) "OZ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/green/hidden{ @@ -979,9 +976,9 @@ vP Qe EF wG -OK +GK yH -OK +GK fh vP PW @@ -1007,9 +1004,9 @@ Ul De Qe cD -OK +GK Be -OK +GK Ek SH vP @@ -1061,8 +1058,8 @@ RB (5,1,1) = {" Qe xD -OK -OK +GK +GK Qe NI Mw @@ -1094,9 +1091,9 @@ dz ko Qe EF -OK +GK jg -OK +GK qy qy vP @@ -1146,17 +1143,17 @@ ZD ZD "} (8,1,1) = {" -OK +GK Rp Qe Qv CC PH -OK -OK -OK -OK -OK +GK +GK +GK +GK +GK vP ZD ZD @@ -1175,17 +1172,17 @@ RB ZD "} (9,1,1) = {" -OK +GK Ej Mw -OK -OK +GK +GK OZ JS -OK +GK JS -OK -OK +GK +GK vP ZD ZD @@ -1204,7 +1201,7 @@ Yb RB "} (10,1,1) = {" -OK +GK Rp Mw Ek @@ -1212,8 +1209,8 @@ RR OZ ta eH -OK -OK +GK +GK eH vP ZD @@ -1239,11 +1236,11 @@ Cu aZ Hz pq -OK -OK -OK +GK +GK +GK nu -OK +GK vP ZD ZD @@ -1320,7 +1317,7 @@ RB zc "} (14,1,1) = {" -OK +GK DP Qe PH @@ -1328,7 +1325,7 @@ eH Qe Zj DP -OK +GK eH LP vP @@ -1349,13 +1346,13 @@ RB RB "} (15,1,1) = {" -OK +GK xo Mw ky KR Qe -OK +GK vN jg bO @@ -1444,8 +1441,8 @@ jg Qe GK Pw -OK -OK +GK +GK rL vP ZD @@ -1496,15 +1493,15 @@ RB (20,1,1) = {" jb Mw -OK +GK EF jg -OK -OK +GK +GK TA Ek jg -OK +GK vP ZD fd @@ -1533,7 +1530,7 @@ pX jg nu jg -OK +GK vP ZD Au @@ -1552,16 +1549,16 @@ vs RB "} (22,1,1) = {" -OK +GK Mw -OK +GK PH Mx Xz Kz Ns -OK -OK +GK +GK Ek vP ZD @@ -1588,9 +1585,9 @@ km HC Pd OA -OK -OK -OK +GK +GK +GK AW vP ZD @@ -1612,15 +1609,15 @@ RB (24,1,1) = {" jg ax -OK +GK km yb yb yb jg jg -OK -OK +GK +GK vP ZD ZD @@ -1677,8 +1674,8 @@ BS SZ Db jg -OK -OK +GK +GK vP bf bf @@ -1706,8 +1703,8 @@ vP rN OZ Wy -OK -OK +GK +GK vP vP vP @@ -1762,11 +1759,11 @@ xM xM vP IN -OK +GK pV cI jg -OK +GK Ek YW vP @@ -1796,7 +1793,7 @@ vP vP vP vP -OK +GK tr vP qS diff --git a/_maps/modularmaps/big_red/bigredsouthetavar1.dmm b/_maps/modularmaps/big_red/bigredsouthetavar1.dmm index 9a3ab45ee00..0cfc6ea0b9d 100644 --- a/_maps/modularmaps/big_red/bigredsouthetavar1.dmm +++ b/_maps/modularmaps/big_red/bigredsouthetavar1.dmm @@ -1,7 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/closed/wall/indestructible/mineral, -/area/space) "ab" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/tile/dark/red2/corner, @@ -55,10 +52,6 @@ dir = 8 }, /area/bigredv2/caves/south) -"aj" = ( -/obj/effect/landmark/lv624/fog_blocker, -/turf/closed/mineral/bigred, -/area/bigredv2/caves/rock) "ak" = ( /obj/effect/landmark/weed_node, /obj/effect/ai_node, @@ -88,15 +81,6 @@ /obj/effect/landmark/weed_node, /turf/open/floor/tile/dark/red2/corner, /area/bigredv2/caves/south) -"aq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sandedge{ - dir = 4 - }, -/turf/open/floor/tile/dark/red2/corner{ - dir = 8 - }, -/area/bigredv2/caves/south) "ar" = ( /obj/effect/landmark/weed_node, /turf/open/floor/tile/dark/yellow2/corner, @@ -104,29 +88,11 @@ "as" = ( /turf/closed/wall/r_wall, /area/bigredv2/caves/south) -"at" = ( -/turf/closed/mineral/bigred, -/area/bigredv2/caves/rock) -"au" = ( -/obj/effect/landmark/weed_node, -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/south) "av" = ( /turf/open/floor/tile/dark/red2/corner{ dir = 8 }, /area/bigredv2/caves/south) -"aw" = ( -/obj/machinery/door/airlock/multi_tile/mainship/generic{ - dir = 2 - }, -/obj/effect/turf_decal/sandedge{ - dir = 8 - }, -/turf/open/floor/tile/dark/red2/corner{ - dir = 8 - }, -/area/bigredv2/caves/south) "ax" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -144,20 +110,10 @@ "aA" = ( /turf/closed/mineral/smooth/bigred, /area/bigredv2/caves/rock) -"aB" = ( -/obj/machinery/light, -/obj/effect/landmark/weed_node, -/turf/open/floor/tile/dark/red2/corner, -/area/bigredv2/caves/south) "aC" = ( /obj/effect/landmark/lv624/fog_blocker, /turf/closed/wall/r_wall, /area/bigredv2/outside/nanotrasen_lab/inside) -"aD" = ( -/obj/effect/landmark/corpsespawner/colonist, -/obj/effect/decal/cleanable/blood/oil, -/turf/open/floor/tile/dark/red2/corner, -/area/bigredv2/caves/south) "aE" = ( /obj/effect/landmark/corpsespawner/colonist, /obj/effect/decal/cleanable/blood/oil, @@ -184,10 +140,6 @@ /obj/effect/decal/cleanable/dirt, /turf/closed/wall/r_wall/unmeltable, /area/bigredv2/caves/south) -"aJ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/tile/dark/red2/corner, -/area/bigredv2/caves/south) "aK" = ( /turf/open/floor/tile/dark/yellow2/corner, /area/bigredv2/caves/south) @@ -199,11 +151,6 @@ dir = 8 }, /area/bigredv2/caves/south) -"aM" = ( -/obj/effect/landmark/corpsespawner/colonist, -/obj/effect/decal/cleanable/blood/oil, -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/south) "aN" = ( /obj/effect/ai_node, /turf/open/floor/plating/ground/mars/random/cave, @@ -221,44 +168,13 @@ /obj/item/storage/holster/belt/pistol, /turf/open/floor/tile/dark/red2/corner, /area/bigredv2/caves/south) -"aQ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall/unmeltable, -/area/bigredv2/caves/south) "aR" = ( /turf/closed/mineral/smooth/bigred/indestructible, /area/space) -"aS" = ( -/obj/effect/landmark/weed_node, -/obj/effect/ai_node, -/turf/open/floor/tile/dark/red2/corner{ - dir = 8 - }, -/area/bigredv2/caves/south) "aT" = ( /obj/effect/landmark/lv624/fog_blocker, /turf/closed/wall/r_wall, /area/bigredv2/caves/south) -"aU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/multi_tile/mainship/generic{ - dir = 2 - }, -/obj/effect/turf_decal/sandedge{ - dir = 4 - }, -/turf/open/floor/tile/dark/red2/corner{ - dir = 8 - }, -/area/bigredv2/caves/south) -"aV" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall, -/area/bigredv2/caves/south) -"aW" = ( -/obj/effect/ai_node, -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/south) "aX" = ( /obj/effect/landmark/weed_node, /turf/open/floor/tile/dark/red2/corner{ @@ -271,48 +187,6 @@ }, /turf/open/floor/plating/ground/mars/random/cave, /area/bigredv2/caves/south) -"aZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/storage/holster/belt/pistol/m4a3/full, -/obj/item/storage/holster/belt/pistol/m4a3/officer, -/turf/open/floor/tile/dark/red2/corner, -/area/bigredv2/caves/south) -"dW" = ( -/obj/effect/landmark/weed_node, -/turf/open/floor/tile/dark/red2/corner{ - dir = 8 - }, -/area/bigredv2/caves/south) -"fq" = ( -/obj/effect/landmark/lv624/fog_blocker, -/turf/closed/wall/r_wall, -/area/bigredv2/outside/nanotrasen_lab/inside) -"zG" = ( -/obj/effect/landmark/weed_node, -/turf/open/floor/tile/dark/yellow2/corner, -/area/bigredv2/caves/south) -"DZ" = ( -/obj/machinery/door/airlock/multi_tile/mainship/generic, -/obj/effect/ai_node, -/turf/open/floor/tile/dark/yellow2/corner, -/area/bigredv2/outside/nanotrasen_lab/inside) -"Ji" = ( -/obj/effect/landmark/lv624/fog_blocker, -/turf/closed/wall/r_wall, -/area/bigredv2/caves/south) -"PS" = ( -/obj/effect/turf_decal/sandedge{ - dir = 8 - }, -/turf/open/floor/tile/dark/red2/corner{ - dir = 8 - }, -/area/bigredv2/caves/south) -"SE" = ( -/obj/effect/landmark/lv624/fog_blocker, -/turf/open/floor/tile/dark/yellow2/corner, -/area/bigredv2/caves/south) "YJ" = ( /obj/effect/landmark/lv624/fog_blocker, /turf/closed/mineral/smooth/bigred, @@ -324,7 +198,7 @@ YJ as al ad -aU +ah al aI aA @@ -344,7 +218,7 @@ aR "} (3,1,1) = {" ay -Ji +aT as aP af @@ -355,8 +229,8 @@ aA aR "} (4,1,1) = {" -DZ -SE +ae +az aK av ak @@ -368,12 +242,12 @@ aR "} (5,1,1) = {" ao -SE -zG +az +ar ab ab ab -aZ +ax aI aA aR @@ -407,7 +281,7 @@ ay YJ as av -dW +aX av av aG @@ -419,8 +293,8 @@ ay YJ as as -PS -aw +aL +ai as aG aA @@ -446,7 +320,7 @@ am am am am -aM +aE aA aR "} @@ -456,8 +330,8 @@ YJ aA am aN -au -au +ag +ag am aA aR @@ -494,7 +368,7 @@ aA aA am am -au +ag aA aR "} @@ -504,7 +378,7 @@ YJ aA aA aA -au +ag am am aA @@ -576,14 +450,14 @@ YJ aA aA am -au +ag am aA aA aR "} (23,1,1) = {" -fq +aC YJ aA aA diff --git a/_maps/modularmaps/big_red/bigredsouthetavar4.dmm b/_maps/modularmaps/big_red/bigredsouthetavar4.dmm index d362b765162..6a17ecc1dde 100644 --- a/_maps/modularmaps/big_red/bigredsouthetavar4.dmm +++ b/_maps/modularmaps/big_red/bigredsouthetavar4.dmm @@ -1,7 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/closed/wall/indestructible/mineral, -/area/space) "ab" = ( /turf/open/floor/tile/dark/red2/corner{ dir = 8 @@ -21,9 +18,6 @@ dir = 8 }, /area/bigredv2/caves/south) -"af" = ( -/turf/closed/mineral/bigred, -/area/bigredv2/caves/rock) "ag" = ( /obj/effect/landmark/weed_node, /obj/effect/ai_node, @@ -79,25 +73,6 @@ dir = 8 }, /area/bigredv2/caves/south) -"ap" = ( -/obj/machinery/door/airlock/multi_tile/mainship/generic{ - dir = 2 - }, -/obj/effect/turf_decal/sandedge{ - dir = 8 - }, -/turf/open/floor/tile/dark/red2/corner{ - dir = 8 - }, -/area/bigredv2/caves/south) -"aq" = ( -/obj/effect/landmark/lv624/fog_blocker, -/turf/closed/mineral/bigred, -/area/bigredv2/caves/rock) -"ar" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall, -/area/bigredv2/caves/south) "as" = ( /obj/effect/landmark/lv624/fog_blocker, /turf/closed/wall/r_wall, @@ -142,10 +117,6 @@ /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/tile/dark/red2/corner, /area/bigredv2/caves/south) -"aC" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/tile/dark/red2/corner, -/area/bigredv2/caves/south) "aD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/sandedge{ @@ -164,16 +135,6 @@ "aF" = ( /turf/open/floor/tile/dark/red2/corner, /area/bigredv2/caves/south) -"aG" = ( -/obj/effect/landmark/corpsespawner/colonist, -/obj/effect/decal/cleanable/blood/oil, -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/south) -"aH" = ( -/obj/effect/landmark/corpsespawner/colonist, -/obj/effect/decal/cleanable/blood/oil, -/turf/open/floor/tile/dark/red2/corner, -/area/bigredv2/caves/south) "aI" = ( /turf/closed/mineral/smooth/bigred, /area/bigredv2/caves/rock) @@ -195,15 +156,6 @@ dir = 8 }, /area/bigredv2/caves/south) -"aN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sandedge{ - dir = 4 - }, -/turf/open/floor/tile/dark/red2/corner{ - dir = 8 - }, -/area/bigredv2/caves/south) "aO" = ( /obj/effect/landmark/lv624/fog_blocker, /turf/open/floor/plating/ground/mars/random/cave, @@ -220,25 +172,6 @@ "aR" = ( /turf/closed/wall/r_wall, /area/bigredv2/outside/nanotrasen_lab/inside) -"aS" = ( -/obj/effect/ai_node, -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/south) -"aT" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall/unmeltable, -/area/bigredv2/caves/south) -"aU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/storage/holster/belt/pistol/m4a3/full, -/obj/item/storage/holster/belt/pistol/m4a3/officer, -/turf/open/floor/tile/dark/red2/corner, -/area/bigredv2/caves/south) -"aV" = ( -/obj/effect/landmark/weed_node, -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/south) "aW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/multi_tile/mainship/generic{ @@ -251,23 +184,6 @@ dir = 8 }, /area/bigredv2/caves/south) -"aX" = ( -/obj/machinery/light, -/obj/effect/landmark/weed_node, -/turf/open/floor/tile/dark/red2/corner, -/area/bigredv2/caves/south) -"aY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/multi_tile/mainship/generic{ - dir = 2 - }, -/obj/effect/turf_decal/sandedge{ - dir = 4 - }, -/turf/open/floor/tile/dark/red2/corner{ - dir = 8 - }, -/area/bigredv2/caves/south) "aZ" = ( /obj/structure/table, /obj/machinery/computer/security, @@ -275,64 +191,18 @@ dir = 8 }, /area/bigredv2/caves/south) -"iV" = ( -/obj/effect/landmark/weed_node, -/turf/open/floor/tile/dark/red2/corner{ - dir = 8 - }, -/area/bigredv2/caves/south) -"oN" = ( -/obj/effect/landmark/lv624/fog_blocker, -/turf/closed/wall/r_wall, -/area/bigredv2/caves/south) -"rE" = ( -/obj/effect/landmark/lv624/fog_blocker, -/turf/open/floor/tile/dark/yellow2/corner, -/area/bigredv2/caves/south) -"xc" = ( -/obj/machinery/door/airlock/multi_tile/mainship/generic, -/obj/effect/ai_node, -/turf/open/floor/tile/dark/yellow2/corner, -/area/bigredv2/outside/nanotrasen_lab/inside) -"xQ" = ( -/obj/effect/landmark/lv624/fog_blocker, -/turf/open/floor/plating/ground/mars/random/cave, -/area/bigredv2/caves/south) "JO" = ( /obj/effect/landmark/lv624/fog_blocker, /turf/closed/mineral/smooth/bigred, /area/bigredv2/caves/rock) -"Rf" = ( -/obj/effect/landmark/lv624/fog_blocker, -/turf/closed/wall/r_wall, -/area/bigredv2/outside/nanotrasen_lab/inside) -"TA" = ( -/obj/effect/landmark/weed_node, -/obj/effect/ai_node, -/turf/open/floor/tile/dark/red2/corner{ - dir = 8 - }, -/area/bigredv2/caves/south) -"TK" = ( -/obj/effect/landmark/weed_node, -/turf/open/floor/tile/dark/yellow2/corner, -/area/bigredv2/caves/south) -"Xm" = ( -/obj/effect/turf_decal/sandedge{ - dir = 8 - }, -/turf/open/floor/tile/dark/red2/corner{ - dir = 8 - }, -/area/bigredv2/caves/south) (1,1,1) = {" aR JO ay aj -aN -aY +aD +aW aj av aI @@ -352,22 +222,22 @@ ah "} (3,1,1) = {" aR -oN +as ay aQ aF -aH +aB au av aI ah "} (4,1,1) = {" -xc -rE +at +an aK ab -TA +ag ab ay av @@ -376,11 +246,11 @@ ah "} (5,1,1) = {" aL -rE -TK -aC -aC -aC +an +ak +ad +ad +ad ax av aI @@ -415,7 +285,7 @@ aR JO ay ab -iV +am ab ab az @@ -427,8 +297,8 @@ aR JO ay ay -Xm -ap +al +ao ay az aI @@ -464,8 +334,8 @@ JO aI aA ac -aV -aV +aJ +aJ aA aI ah @@ -496,23 +366,23 @@ ah "} (15,1,1) = {" aR -xQ +aO aA aA aA aA aA -aV +aJ aI ah "} (16,1,1) = {" aR -xQ +aO aA aA aA -aV +aJ aA aA aI @@ -520,7 +390,7 @@ ah "} (17,1,1) = {" aR -xQ +aO aA aA aA @@ -568,7 +438,7 @@ ah "} (21,1,1) = {" aR -xQ +aO aA aA aA @@ -580,18 +450,18 @@ ah "} (22,1,1) = {" aR -xQ +aO aA aA aA -aV +aJ aA aI aI ah "} (23,1,1) = {" -Rf +aP JO aI aI diff --git a/_maps/modularmaps/oscaroutpost/oscarnorthvar1.dmm b/_maps/modularmaps/oscaroutpost/oscarnorthvar1.dmm index 495d6465d1e..c8ba370addc 100644 --- a/_maps/modularmaps/oscaroutpost/oscarnorthvar1.dmm +++ b/_maps/modularmaps/oscaroutpost/oscarnorthvar1.dmm @@ -4325,14 +4325,6 @@ dir = 4 }, /area/oscar_outpost/outside/northeast) -"Yr" = ( -/obj/structure/barricade/sandbags{ - dir = 8; - name = "trench lining"; - pixel_y = 1 - }, -/turf/open/floor/plating/ground/dirt2, -/area/oscar_outpost/outside/northeast) "Yu" = ( /turf/open/floor/plating/ground/dirtgrassborder/corner{ dir = 4 @@ -26887,7 +26879,7 @@ CE CE YZ sV -Yr +Rb Rb Rb Rb diff --git a/_maps/modularmaps/oscaroutpost/oscarnorthvar2.dmm b/_maps/modularmaps/oscaroutpost/oscarnorthvar2.dmm index c399f3a1349..12462f31569 100644 --- a/_maps/modularmaps/oscaroutpost/oscarnorthvar2.dmm +++ b/_maps/modularmaps/oscaroutpost/oscarnorthvar2.dmm @@ -4789,14 +4789,6 @@ /obj/structure/fence, /turf/open/ground/grass, /area/oscar_outpost/outside/northwest) -"Tj" = ( -/obj/structure/barricade/sandbags{ - dir = 4; - name = "trench lining"; - pixel_y = 1 - }, -/turf/open/floor/plating/ground/dirt2, -/area/oscar_outpost/outside/northwest) "Tn" = ( /turf/open/floor/plating/ground/dirtgrassborder/corner{ dir = 4 @@ -5387,14 +5379,6 @@ }, /turf/open/floor/plating/ground/dirt2, /area/oscar_outpost/outside/northeast) -"Yr" = ( -/obj/structure/barricade/sandbags{ - dir = 8; - name = "trench lining"; - pixel_y = 1 - }, -/turf/open/floor/plating/ground/dirt2, -/area/oscar_outpost/outside/northeast) "Yu" = ( /obj/structure/platform/rockcliff{ dir = 1 @@ -6378,7 +6362,7 @@ MU wR eC Oe -Tj +qC Rx eC eC @@ -6506,23 +6490,23 @@ Pv Pv Pv Tv -Tj -Tj -Tj +qC +qC +qC hz hz -Tj -Tj -Tj -Tj +qC +qC +qC +qC xu XP eC mP xu -Tj -Tj -Tj +qC +qC +qC xu XP eC @@ -6826,9 +6810,9 @@ eC eC eC ZD -Tj qC -Tj +qC +qC Rx eC eC @@ -6989,9 +6973,9 @@ qH Uw eC Oe -Tj -Tj -Tj +qC +qC +qC xu XP eC @@ -7590,15 +7574,15 @@ ym Fn Fn Fn -Tj -Tj -Tj -Tj -Tj -Tj -Tj -Tj -Tj +qC +qC +qC +qC +qC +qC +qC +qC +qC xu XP eC @@ -7613,9 +7597,9 @@ eC eC eC Oe -Tj -Tj -Tj +qC +qC +qC xu XP eC @@ -7628,7 +7612,7 @@ eC eC eC Oe -Tj +qC Rx eC eC @@ -8220,7 +8204,7 @@ eC eC eC RA -Tj +qC xu XP IQ @@ -8237,9 +8221,9 @@ Uw eC eC Oe -Tj -Tj -Tj +qC +qC +qC xu XP eC @@ -8693,7 +8677,7 @@ MU MU pp Oe -Tj +qC Rx Ly Ym @@ -8861,9 +8845,9 @@ eC eC Hz Oe -Tj -Tj -Tj +qC +qC +qC xu XP eC @@ -9484,8 +9468,8 @@ wK wK wK wK -Tj -Tj +qC +qC Qz XP eC @@ -9605,7 +9589,7 @@ vX os eC Oe -Tj +qC Rx eC Ly @@ -10541,8 +10525,8 @@ eC eC eC Oe -Tj -Tj +qC +qC RA qN qN @@ -10881,7 +10865,7 @@ wK wK xu xu -Tj +qC Rx eC eC @@ -11010,7 +10994,7 @@ eC eC Oe ll -Tj +qC mP XP IQ @@ -11026,7 +11010,7 @@ eC eC eC vg -Tj +qC Rx eC eC @@ -11345,7 +11329,7 @@ eC eC eC Oe -Tj +qC xu XP eC @@ -11962,10 +11946,10 @@ eC eC mP xu -Tj -Tj -Tj -Tj +qC +qC +qC +qC xu XP eC @@ -12406,13 +12390,13 @@ eC eC mP xu -Tj +qC Rx IQ MU MU Oe -Tj +qC Rx eC eC @@ -12578,9 +12562,9 @@ eC eC mP xu -Tj -Tj -Tj +qC +qC +qC Rx eC eC @@ -13016,15 +13000,15 @@ Pv Li gl Tv -Tj -Tj -Tj +qC +qC +qC hz hz -Tj -Tj -Tj -Tj +qC +qC +qC +qC zf eC eC @@ -13051,7 +13035,7 @@ eC eC mP xu -Tj +qC Rx eC eC @@ -13194,9 +13178,9 @@ eC eC mP xu -Tj -Tj -Tj +qC +qC +qC Rx eC tN @@ -13515,7 +13499,7 @@ eC eC eC Oe -Tj +qC xu XP eC @@ -13810,9 +13794,9 @@ eC eC mP xu -Tj -Tj -Tj +qC +qC +qC Rx eC eC @@ -14288,7 +14272,7 @@ wR eC eC vg -Tj +qC Rx eC mP @@ -14410,24 +14394,24 @@ ym Fn Fn Fn -Tj -Tj -Tj -Tj -Tj -Tj -Tj -Tj -Tj -Tj -Tj +qC +qC +qC +qC +qC +qC +qC +qC +qC +qC +qC xu xu -Tj -Tj -Tj -Tj -Tj +qC +qC +qC +qC +qC xu XP eC @@ -14739,9 +14723,9 @@ eC eC eC Oe -Tj -Tj -Tj +qC +qC +qC xu XP eC @@ -15066,7 +15050,7 @@ eC eC mP xu -Tj +qC Rx eC ut @@ -15363,8 +15347,8 @@ eC eC eC Oe -Tj -Tj +qC +qC xG xu XP @@ -15530,7 +15514,7 @@ ao Tt eC Oe -Tj +qC xu XP eC @@ -15822,7 +15806,7 @@ eC eC eC Oe -Tj +qC Rx eC eC @@ -15987,9 +15971,9 @@ eC eC eC Oe -Tj -Tj -Tj +qC +qC +qC xu XP Hz @@ -16610,12 +16594,12 @@ wK wK wK wK -Tj -Tj -Tj -Tj -Tj -Tj +qC +qC +qC +qC +qC +qC xu XP eC @@ -16758,7 +16742,7 @@ eC eC eC vg -Tj +qC Rx eC eC @@ -28051,7 +28035,7 @@ Pv Pv YZ FC -Yr +Az Az Az Kk 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 0acbce2693b..5f82d7892b0 100644 --- a/_maps/shuttles/tgs_bigbury.dmm +++ b/_maps/shuttles/tgs_bigbury.dmm @@ -442,7 +442,7 @@ /turf/open/floor/mainship, /area/shuttle/canterbury/cic) "bN" = ( -/obj/machinery/telecomms/relay/preset/telecomms, +/obj/machinery/telecomms/allinone/needs_power, /turf/open/floor/mainship/blue{ dir = 4 }, @@ -471,6 +471,7 @@ }, /area/shuttle/canterbury/cic) "bS" = ( +/obj/machinery/computer/supplycomp/crash, /turf/open/floor/mainship, /area/shuttle/canterbury/cic) "bT" = ( @@ -1013,6 +1014,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 +1522,7 @@ an ac FQ Fl -Fl +Uc bG an ma @@ -1590,7 +1595,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 f7c784c435b..80858bbab33 100644 --- a/_maps/shuttles/tgs_canterbury.dmm +++ b/_maps/shuttles/tgs_canterbury.dmm @@ -31,8 +31,7 @@ }, /area/shuttle/canterbury/cic) "ag" = ( -/obj/structure/table/mainship, -/obj/machinery/faxmachine/cic, +/obj/machinery/computer/supplycomp/crash, /turf/open/floor/mainship/blue{ dir = 1 }, @@ -91,10 +90,10 @@ }, /area/shuttle/canterbury/cic) "aq" = ( -/obj/machinery/telecomms/relay/preset/telecomms, /obj/machinery/air_alarm{ dir = 1 }, +/obj/machinery/telecomms/allinone/needs_power, /turf/open/floor/mainship/blue, /area/shuttle/canterbury/cic) "ar" = ( @@ -816,7 +815,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/action.dm b/code/__DEFINES/action.dm index 52b21e90cd8..aea454c92bd 100644 --- a/code/__DEFINES/action.dm +++ b/code/__DEFINES/action.dm @@ -30,6 +30,8 @@ #define VREF_MUTABLE_SAVAGE_COOLDOWN "VREF_SAVAGE_COOLDOWN" // extra define for jab charges #define VREF_MUTABLE_JAB "VREF_JAB" +// create spiderling charges +#define VREF_MUTABLE_SPIDERLING_CHARGES "VREF_SPIDERLING_CHARGES" /// Actions that toggle on click/trigger diff --git a/code/__DEFINES/actions.dm b/code/__DEFINES/actions.dm index a93178fd987..8b3b7851f95 100644 --- a/code/__DEFINES/actions.dm +++ b/code/__DEFINES/actions.dm @@ -13,6 +13,7 @@ #define ABILITY_IGNORE_DEAD_TARGET (1 << 13) // bypass checks of a dead target #define ABILITY_IGNORE_SELECTED_ABILITY (1 << 14) // bypass the check of the selected ability #define ABILITY_DO_AFTER_ATTACK (1 << 15) //Let the xeno attack the object and perform the ability. +#define ABILITY_USE_BURROWED (1 << 16) // ignore being burrowed #define ABILITY_TURF_TARGET (1 << 0) // ability targets turfs #define ABILITY_MOB_TARGET (1 << 1) // ability targets mobs 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 942bd35d524..c8e6617a852 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -28,6 +28,9 @@ #define COMSIG_GLOB_SHIP_SELF_DESTRUCT_ACTIVATED "!ship_self_destruct_activated" +///Gamemode has successfully loaded +#define COMSIG_GLOB_GAMEMODE_LOADED "!gamemode_loaded" + /// from /obj/machinery/setAnchored(): (machine, anchoredstate) #define COMSIG_GLOB_MACHINERY_ANCHORED_CHANGE "!machinery_anchored_change" @@ -349,7 +352,6 @@ #define COMSIG_ITEM_TOGGLE_ACTION "item_toggle_action" //from base of obj/item/ui_interact(): (/mob/user) #define COMSIG_ITEM_TOGGLE_ACTIVE "item_toggle_active" //from base of /obj/item/toggle_active(): (new_state) -#define COMSIG_ITEM_EXCLUSIVE_TOGGLE "item_exclusive_toggle" #define COMSIG_ITEM_MIDDLECLICKON "item_middleclickon" //from base of mob/living/carbon/human/MiddleClickOn(): (/atom, /mob) #define COMSIG_ITEM_SHIFTCLICKON "item_shiftclickon" //from base of mob/living/carbon/human/ShiftClickOn(): (/atom, /mob) @@ -413,6 +415,8 @@ #define COMSIG_MOB_GUN_AUTOFIRED "mob_gun_autofired" #define COMSIG_MOB_GUN_COOLDOWN "mob_gun_cooldown" +#define COMSIG_MAGAZINE_DROP "magazine_drop" + #define COMSIG_XENO_FIRE "xeno_fire" #define COMSIG_XENO_STOP_FIRE "xeno_stop_fire" #define COMSIG_XENO_AUTOFIREDELAY_MODIFIED "xeno_firedelay_modified" @@ -716,6 +720,7 @@ #define COMSIG_MECHABILITY_SKYFALL "mechability_skyfall" #define COMSIG_MECHABILITY_STRIKE "mechability_strike" +#define COMSIG_ACTION_EXCLUSIVE_TOGGLE "action_exclusive_toggle" // xeno abilities for keybindings #define COMSIG_XENOABILITY_REST "xenoability_rest" @@ -797,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" @@ -891,6 +899,19 @@ #define COMSIG_XENOABILITY_SEISMIC_FRACTURE "xenoability_seismic_fracture" #define COMSIG_XENOABILITY_PRIMAL_WRATH "xenoability_primal_wrath" +#define COMSIG_XENOABILITY_BURROW "xenoability_burrow" +#define COMSIG_XENOABILITY_LEASH_BALL "xenoability_leash_ball" +#define COMSIG_XENOABILITY_CREATE_SPIDERLING "xenoability_create_spiderling" +#define COMSIG_XENOABILITY_ATTACH_SPIDERLINGS "xenoability_attach_spiderlings" +#define COMSIG_XENOABILITY_WEB_SPIT "xenoability_web_spit" +#define COMSIG_XENOABILITY_CREATE_HUGGER "xenoability_create_hugger" +#define COMSIG_XENOABILITY_UNLEASH_SPIDERLINGS "xenoability_unleash_spiderlings" +#define COMSIG_XENOABILITY_RECALL_SPIDERLINGS "xenoability_recall_spiderlings" + +//spiderling +#define COMSIG_SPIDERLING_CHANGE_ORDER "spiderlingchangeorder" +#define COMSIG_SPIDERLING_CHANGE_ALL_ORDER "spiderlingglobalorder" + //sectoid abilities #define COMSIG_ABILITY_MINDMELD "ability_mindmeld" #define COMSIG_ABILITY_MINDFRAY "ability_mindfray" @@ -938,6 +959,14 @@ #define COMSIG_KB_RETREATORDER "keybind_retreatorder" #define COMSIG_KB_VEHICLEHONK "keybind_vehiclehonk" +//Item toggle keybinds +#define COMSIG_ITEM_TOGGLE_JETPACK "item_toggle_jetpack" +#define COMSIG_ITEM_TOGGLE_BLINKDRIVE "item_toggle_blinkdrive" + +//Weapon related ability keybinds +#define COMSIG_WEAPONABILITY_AXESWEEP "weaponability_axesweep" +#define COMSIG_WEAPONABILITY_SWORDLUNGE "weaponability_swordlunge" + // human modules signals for keybindings #define COMSIG_KB_VALI_CONFIGURE "keybinding_vali_configure" #define COMSIG_KB_VALI_HEAL "keybinding_vali_heal" @@ -986,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/is_helpers.dm b/code/__DEFINES/is_helpers.dm index a39d5e2d1ee..a8f2014d69b 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -101,6 +101,8 @@ #define isxenospitter(A) (istype(A, /mob/living/carbon/xenomorph/spitter)) #define isxenosentinel(A) (istype(A, /mob/living/carbon/xenomorph/sentinel)) #define isxenowarrior(A) (istype(A, /mob/living/carbon/xenomorph/warrior)) +#define isxenowidow(A) (istype(A, /mob/living/carbon/xenomorph/widow)) +#define isxenospiderling(A) (istype(A, /mob/living/carbon/xenomorph/spiderling)) #define isxenolarva(A) (istype(A, /mob/living/carbon/xenomorph/larva)) #define isxenoqueen(A) (istype(A, /mob/living/carbon/xenomorph/queen)) #define isxenoshrike(A) (istype(A, /mob/living/carbon/xenomorph/shrike)) @@ -311,7 +313,7 @@ #define isstealobjective(O) (istype(O, /datum/objective/steal)) #define isassassinateobjective(O) (istype(O, /datum/objective/assassinate)) -#define isresearcher(A) (ishuman(A) && A.job.title == "Medical Researcher") +#define isresearcher(A) (ishuman(A) && A.job.title == "Field Researcher") #define isyautja(H) (is_species(H, /datum/species/yautja)) #define ispredatorjob(J) (istype(J, /datum/job/predator)) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 86f5840a28d..efd176e83bd 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -20,7 +20,7 @@ #define JOB_DISPLAY_ORDER_SHIP_TECH 16 #define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 17 #define JOB_DISPLAY_ORDER_DOCTOR 18 -#define JOB_DISPLAY_ORDER_MEDICAL_RESEARCHER 19 +#define JOB_DISPLAY_ORDER_FIELD_RESEARCHER 19 #define JOB_DISPLAY_ORDER_AI 20 #define JOB_DISPLAY_ORDER_SYNTHETIC 21 #define JOB_DISPLAY_ORDER_SURVIVOR 22 @@ -57,7 +57,7 @@ #define SYNTHETIC "Synthetic" #define SHIP_TECH "Ship Technician" #define MEDICAL_DOCTOR "Medical Doctor" -#define MEDICAL_RESEARCHER "Medical Researcher" +#define FIELD_RESEARCHER "Field Researcher" #define SQUAD_LEADER "Squad Leader" #define SQUAD_SPECIALIST "Squad Specialist" #define SQUAD_SMARTGUNNER "Squad Smartgunner" @@ -92,11 +92,11 @@ GLOBAL_LIST_INIT(jobs_officers, list(CAPTAIN, FIELD_COMMANDER, STAFF_OFFICER, CO GLOBAL_LIST_INIT(jobs_support, list(PILOT_OFFICER, TRANSPORT_OFFICER, MECH_PILOT, ASSAULT_CREWMAN, TRANSPORT_CREWMAN, REQUISITIONS_OFFICER, SYNTHETIC, SILICON_AI)) GLOBAL_LIST_INIT(jobs_engineering, list(SQUAD_ENGINEER, SHIP_TECH)) GLOBAL_LIST_INIT(jobs_requisitions, list(REQUISITIONS_OFFICER, SHIP_TECH)) -GLOBAL_LIST_INIT(jobs_medical, list(CHIEF_MEDICAL_OFFICER, MEDICAL_DOCTOR, MEDICAL_RESEARCHER, SQUAD_CORPSMAN)) +GLOBAL_LIST_INIT(jobs_medical, list(CHIEF_MEDICAL_OFFICER, MEDICAL_DOCTOR, FIELD_RESEARCHER, SQUAD_CORPSMAN)) GLOBAL_LIST_INIT(jobs_marines, list(SQUAD_LEADER, SQUAD_SMARTGUNNER, SQUAD_CORPSMAN, SQUAD_ENGINEER, SQUAD_MARINE, SQUAD_ROBOT)) GLOBAL_LIST_INIT(jobs_regular_all, list(CAPTAIN, FIELD_COMMANDER, STAFF_OFFICER, PILOT_OFFICER, TRANSPORT_OFFICER, MECH_PILOT, REQUISITIONS_OFFICER, \ CHIEF_MEDICAL_OFFICER, SYNTHETIC, SILICON_AI, CORPORATE_LIAISON, SHIP_TECH, \ -MEDICAL_DOCTOR, MEDICAL_RESEARCHER, SQUAD_LEADER, SQUAD_SMARTGUNNER, SQUAD_CORPSMAN, SQUAD_ENGINEER, SQUAD_MARINE, SQUAD_ROBOT)) +MEDICAL_DOCTOR, FIELD_RESEARCHER, SQUAD_LEADER, SQUAD_SMARTGUNNER, SQUAD_CORPSMAN, SQUAD_ENGINEER, SQUAD_MARINE, SQUAD_ROBOT)) GLOBAL_LIST_INIT(jobs_xenos, list(ROLE_XENOMORPH, ROLE_XENO_QUEEN)) GLOBAL_LIST_INIT(jobs_fallen_marine, typecacheof(list(/datum/job/fallen/marine), TRUE)) @@ -109,7 +109,10 @@ GLOBAL_LIST_INIT(jobs_fallen_marine, typecacheof(list(/datum/job/fallen/marine), #define EXP_TYPE_MARINES "Marines" #define EXP_TYPE_REQUISITIONS "Requisitions" #define EXP_TYPE_SILICON "Silicon" -#define EXP_TYPE_SYNTHETIC "Medical/Engineering" // this define is used to limit synthetic to those who played at least medical or engineering +/// Used to limit synthetic to those who played at least medical or engineering. +#define EXP_TYPE_SYNTHETIC "Medical/Engineering" +/// Used to limit squad leader to those who played either marine or command. Also helps to unlock fc faster +#define EXP_TYPE_SL "Marines/Command" #define EXP_TYPE_XENO "Xenomorph" #define EXP_TYPE_GHOST "Ghost" #define EXP_TYPE_ADMIN "Admin" @@ -156,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/keybind.dm b/code/__DEFINES/keybind.dm index a3bde9d9734..2740ea4b8a3 100644 --- a/code/__DEFINES/keybind.dm +++ b/code/__DEFINES/keybind.dm @@ -8,6 +8,8 @@ #define CATEGORY_CARBON "CARBON" #define CATEGORY_HUMAN "HUMAN" #define CATEGORY_PSIONIC "PSIONIC" +#define CATEGORY_WEAPON "WEAPON" +#define CATEGORY_ITEM "ITEM" #define CATEGORY_MISC "MISC" #define CATEGORY_EMOTE "EMOTE" #define CATEGORY_CUSTOM_EMOTE "CUSTOM_EMOTE" diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm index ed6185f43ec..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" @@ -61,6 +90,7 @@ GLOBAL_LIST_INIT(marine_selector_cats, list( GLOBAL_LIST_INIT(marine_gear_listed_products, list( /obj/item/storage/backpack/marine/radiopack = list(CAT_MARINE, "Radio Pack", 5, "orange"), + /obj/item/storage/belt/marine/auto_catch = list(CAT_MARINE, "M344 pattern ammo load rig", 10, "orange"), /obj/item/stack/sandbags_empty/half = list(CAT_MARINE, "Sandbags x25", SANDBAG_PRICE_IN_GEAR_VENDOR, "orange"), /obj/item/fulton_extraction_pack = list(CAT_MARINE, "Fulton Extraction Pack", 5, "orange"), /obj/item/explosive/grenade = list(CAT_MARINE, "M40 HEDP grenade", 2, "orange3"), @@ -73,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"), @@ -83,16 +113,9 @@ GLOBAL_LIST_INIT(marine_gear_listed_products, list( GLOBAL_LIST_INIT(robot_gear_listed_products, list( /obj/item/tool/surgery/solderingtool = list(CAT_ESS, "Essential Soldering Tool", 0, "white"), - /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_rifle = list(CAT_ROBOT, "Terra Experimental laser rifle", 15, "red"), - /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_sniper = list(CAT_ROBOT, "Terra Experimental laser sniper rifle", 20, "red"), - /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine = list(CAT_ROBOT, "Terra Experimental laser carbine", 15, "red"), - /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_mlaser = list(CAT_ROBOT, "Terra Experimental laser machine gun", 20, "red"), - /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol = list(CAT_ROBOT, "Terra Experimental laser pistol", 10, "red"), - /obj/item/weapon/gun/energy/lasgun/lasrifle/tesla = list(CAT_ROBOT, "Terra Experimental tesla shock rifle", 25, "red"), /obj/item/cell/lasgun/lasrifle/recharger = list(CAT_ROBOT, "Terra Experimental recharger battery", 4, "orange2"), /obj/item/cell/lasgun/volkite/powerpack/marine_back = list(CAT_ROBOT, "Terra Experimental powerback", 20, "orange2"), /obj/item/tool/handheld_charger = list(CAT_ROBOT, "Hand-held cell charger", 5, "yellow"), - /obj/item/weapon/powerfist = list(CAT_ROBOT, "Powerfist", 10, "red"), )) GLOBAL_LIST_INIT(engineer_gear_listed_products, list( @@ -206,6 +229,7 @@ GLOBAL_LIST_INIT(leader_gear_listed_products, list( /obj/item/jetpack_marine = list(CAT_LEDSUP, "Jetpack", 5, "yellow"), /obj/item/storage/belt/grenade/b17 = list(CAT_LEDSUP, "High Capacity Grenade Belt", 5, "yellow"), /obj/structure/closet/bodybag/tarp = list(CAT_LEDSUP, "V1 thermal-dampening tarp", 2, "yellow"), + /obj/item/storage/belt/marine/auto_catch = list(CAT_LEDSUP, "M344 pattern ammo load rig", 10, "orange"), /obj/item/weapon/gun/flamer/big_flamer/marinestandard = list(CAT_LEDSUP, "FL-84 flamethrower", 6, "red"), /obj/item/ammo_magazine/flamer_tank/large = list(CAT_LEDSUP, "Flamethrower tank", 2, "orange2"), /obj/item/storage/holster/belt/revolver/mateba/full = list(CAT_LEDSUP, "Mateba Autorevolver belt", 10, "red"), @@ -247,6 +271,7 @@ GLOBAL_LIST_INIT(commander_gear_listed_products, list( /obj/item/armor_module/module/night_vision = list(CAT_FCSUP, "BE-35 night vision kit", 18, "blue"), /obj/item/clothing/glasses/night_vision = list(CAT_FCSUP, "BE-47 night vision goggles", 26, "blue"), /obj/item/cell/night_vision_battery = list(CAT_FCSUP, "night vision battery", 4, "blue"), + /obj/item/storage/belt/marine/auto_catch = list(CAT_FCSUP, "M344 pattern ammo load rig", 10, "orange"), /obj/item/explosive/plastique = list(CAT_FCSUP, "Plastique explosive", 2, "orange3"), /obj/item/detpack = list(CAT_FCSUP, "Detonation pack", 2, "orange3"), /obj/item/storage/box/visual/grenade/sticky = list(CAT_FCSUP, "M40 adhesive charge grenade box", 15, "blue"), @@ -340,6 +365,7 @@ GLOBAL_LIST_INIT(smartgunner_gear_listed_products, list( /obj/item/ammo_magazine/rifle/sg153/plasmaloss = list(CAT_SGSUP, "SG-153 Spotting Rifle Tanglefoot Magazine", 3, "orange2"), /obj/item/ammo_magazine/rifle/sg153/incendiary = list(CAT_SGSUP, "SG-153 Spotting Rifle Incendiary Magazine", 3, "orange2"), /obj/item/ammo_magazine/pistol/p14/smart_pistol = list(CAT_SGSUP, "SP-13 smart pistol ammo", 2, "orange2"), + /obj/item/storage/belt/marine/auto_catch = list(CAT_SGSUP, "M344 pattern ammo load rig", 10, "orange"), )) GLOBAL_LIST_INIT(synthetic_gear_listed_products, list( @@ -688,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"), @@ -912,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/mobs.dm b/code/__DEFINES/mobs.dm index cdaa243d4c3..ebf361b7ceb 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -733,6 +733,7 @@ GLOBAL_LIST_INIT(xenoupgradetiers, list(XENO_UPGRADE_BASETYPE, XENO_UPGRADE_INVA //Praetorian defines #define PRAE_CHARGEDISTANCE 6 + //misc #define STANDARD_SLOWDOWN_REGEN 0.3 diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index b524632a64d..a8e4d99fb85 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -12,6 +12,7 @@ #define MOVESPEED_ID_BOILER_DUMP "BOILER_DUMP" #define MOVESPEED_ID_OFF_GUARD_SLOWDOWN "OFF_GUARD_SLOWDOWN" #define MOVESPEED_ID_HUNTER_DISGUISE "HUNTER_DISGUISE" +#define MOVESPEED_ID_SPIDER_VENOM "WIDOW_SPIDER_VENOM" #define MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED "MOB_WALK_RUN" #define MOVESPEED_ID_MOB_PARACETAMOL_SPEED "MOB_PARACETAMOL_RUN" @@ -29,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/status_effects.dm b/code/__DEFINES/status_effects.dm index 23f1eabe99b..56afaa9acb7 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -60,6 +60,7 @@ #define STATUS_EFFECT_MINDMEND /datum/status_effect/mindmeld #define STATUS_EFFECT_REKNIT_FORM /datum/status_effect/reknit_form + ///////////// // DEBUFFS // ///////////// @@ -99,6 +100,8 @@ #define STATUS_EFFECT_MICROWAVE /datum/status_effect/stacking/microwave ///armor reduction #define STATUS_EFFECT_SHATTER /datum/status_effect/shatter +//widow's ability +#define STATUS_EFFECT_SPIDER_VENOM /datum/status_effect/incapacitating/spider_venom ///////////// // NEUTRAL // diff --git a/code/__DEFINES/supply.dm b/code/__DEFINES/supply.dm index a329e55f3d1..a5bcf950643 100644 --- a/code/__DEFINES/supply.dm +++ b/code/__DEFINES/supply.dm @@ -1,5 +1,5 @@ //Prices of items that are accounted for by the monitor #define B18_PRICE 1200 #define B17_PRICE 800 -#define MINIGUN_PRICE 800 +#define MINIGUN_PRICE 1200 #define SADAR_PRICE 800 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index e4e9145e5a6..7337cc06229 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -106,6 +106,7 @@ #define PETRIFY_ABILITY_TRAIT "petrify_ability_trait" #define SHATTERING_ROAR_ABILITY_TRAIT "shattering_roar_ability_trait" #define ZERO_FORM_BEAM_ABILITY_TRAIT "zero_form_beam_ability_trait" +#define WIDOW_ABILITY_TRAIT "widow_ability_trait" #define VALHALLA_TRAIT "valhalla" #define WEIGHTBENCH_TRAIT "weightbench" #define BOILER_ROOTED_TRAIT "boiler_rooted" @@ -160,10 +161,6 @@ #define TRAIT_BANISHED "banished" ///Mindmelded with another mob #define TRAIT_MINDMELDED "mindmelded" -///You swing axe good -#define TRAIT_AXE_EXPERT "axe_expert" -///You swing sword good -#define TRAIT_SWORD_EXPERT "sword_expert" ///Pain reduction light #define TRAIT_LIGHT_PAIN_RESIST "light_pain_resist" ///Pain reduction medium diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm index 2e126ba00da..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) @@ -238,3 +231,9 @@ GLOBAL_LIST_INIT(xeno_utility_upgrades, list( #define PRECRUSH_STOPPED -1 #define PRECRUSH_PLOWED -2 #define PRECRUSH_ENTANGLED -3 + +#define SPIDERLING_RECALL "recall spiderling" +#define SPIDERLING_SEEK_CLOSEST "seeking closest and attack order" //not xeno-usable +#define SPIDERLING_ATTACK "seek and attack order" + +#define SPIDERLING_WITHER_RANGE 15 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 12afd05a455..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, @@ -595,6 +599,7 @@ GLOBAL_LIST_INIT(bitfields, list( "ABILITY_IGNORE_DEAD_TARGET" = ABILITY_IGNORE_DEAD_TARGET, "ABILITY_IGNORE_SELECTED_ABILITY" = ABILITY_IGNORE_SELECTED_ABILITY, "ABILITY_DO_AFTER_ATTACK" = ABILITY_DO_AFTER_ATTACK, + "ABILITY_USE_BURROWED" = ABILITY_USE_BURROWED ), "pipe_flags" = list( "PIPING_ALL_LAYER" = PIPING_ALL_LAYER, diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 4aceca5217f..4214c01c7a4 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -117,12 +117,14 @@ GLOBAL_LIST_INIT(playable_icons, list( "researcher", "runner", "sentinel", + "spiderling", "spitter", "st", "staffofficer", "synth", "warlock", "warrior", + "widow", "xenoking", "xenominion", "xenoqueen", 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/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index d6e71edd50f..cd658c515d5 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -110,6 +110,7 @@ GLOBAL_LIST_INIT(all_xeno_types, list( /mob/living/carbon/xenomorph/mantis, /mob/living/carbon/xenomorph/scorpion, /mob/living/carbon/xenomorph/facehugger, + /mob/living/carbon/xenomorph/spiderling, )) GLOBAL_LIST_EMPTY_TYPED(hellhound_list, /mob/living/carbon/xenomorph/hellhound) @@ -143,6 +144,7 @@ GLOBAL_LIST_INIT(xeno_types_tier_three, list( /datum/xeno_caste/praetorian, /datum/xeno_caste/ravager, /datum/xeno_caste/warlock, + /datum/xeno_caste/widow, )) GLOBAL_LIST_INIT(xeno_types_tier_four, list( @@ -214,3 +216,16 @@ GLOBAL_LIST_INIT(hive_ui_static_data, init_hive_status_lists()) // init by make_ for(var/i in GLOB.mob_list) var/mob/M = i M.update_config_movespeed() + +///The actions given to all humans on init +GLOBAL_LIST_INIT(human_init_actions, list( + /datum/action/skill/toggle_orders, + /datum/action/skill/issue_order/move, + /datum/action/skill/issue_order/hold, + /datum/action/skill/issue_order/focus, + /datum/action/innate/order/attack_order/personal, + /datum/action/innate/order/defend_order/personal, + /datum/action/innate/order/retreat_order/personal, + /datum/action/innate/order/rally_order/personal, + /datum/action/innate/message_squad, +)) 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 bc6226c5d51..fd1fcd35dcf 100644 --- a/code/_onclick/hud/screen_objects/menu_text_objects.dm +++ b/code/_onclick/hud/screen_objects/menu_text_objects.dm @@ -73,11 +73,30 @@ maptext = "ПРИСОЕДИНИТЬСЯ" icon_state = "join" +/atom/movable/screen/text/lobby/clickable/join_game/Initialize(mapload, datum/hud/hud_owner) + . = ..() + update_text() + RegisterSignal(SSdcs, COMSIG_GLOB_GAMEMODE_LOADED, TYPE_PROC_REF(/atom/movable/screen/text/lobby, update_text)) + /atom/movable/screen/text/lobby/clickable/join_game/Click() . = ..() var/mob/new_player/player = hud.mymob - player.attempt_late_join() + if(SSticker?.current_state > GAME_STATE_PREGAME) + player.attempt_late_join() + return + player.toggle_ready() + update_text() +/atom/movable/screen/text/lobby/clickable/join_game/update_text() + if(SSticker?.current_state > GAME_STATE_PREGAME) + maptext = "ПРИСОЕДИНИТЬСЯ" + icon_state = "join" + return + if(!hud.mymob) + return + var/mob/new_player/player = hud.mymob + maptext = "ВЫ: [player.ready ? "" : "НЕ "]ГОТОВЫ" + icon_state = player.ready ? "ready" : "unready" /atom/movable/screen/text/lobby/clickable/observe maptext = "НАБЛЮДАТЬ" @@ -88,21 +107,6 @@ var/mob/new_player/player = hud.mymob player.try_to_observe() -/atom/movable/screen/text/lobby/clickable/ready - maptext = "ВЫ: НЕ ГОТОВЫ" - icon_state = "unready" - -/atom/movable/screen/text/lobby/clickable/ready/update_text() - var/mob/new_player/player = hud.mymob - maptext = "ВЫ: [player.ready ? "" : "НЕ "]ГОТОВЫ" - -/atom/movable/screen/text/lobby/clickable/ready/Click() - . = ..() - var/mob/new_player/player = hud.mymob - player.toggle_ready() - icon_state = player.ready ? "ready" : "unready" - update_text() - /atom/movable/screen/text/lobby/clickable/manifest maptext = "МАНИФЕСТ" icon_state = "manifest" 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/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 15b601163d3..e2c40eda063 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -178,9 +178,9 @@ SUBSYSTEM_DEF(ticker) CHECK_TICK PostSetup() + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_GAMEMODE_LOADED) return TRUE - /datum/controller/subsystem/ticker/proc/PostSetup() set waitfor = FALSE mode.post_setup() diff --git a/code/datums/actions/ability_actions.dm b/code/datums/actions/ability_actions.dm index f1f0109ac6b..5c8c7fbb02c 100644 --- a/code/datums/actions/ability_actions.dm +++ b/code/datums/actions/ability_actions.dm @@ -26,14 +26,18 @@ name = "[name] ([ability_cost])" countdown = new(button, src) +/datum/action/ability/Destroy() + if(cooldown_timer) + deltimer(cooldown_timer) + QDEL_NULL(countdown) + return ..() + /datum/action/ability/give_action(mob/living/L) . = ..() var/mob/living/carbon/carbon_owner = L carbon_owner.mob_abilities += src /datum/action/ability/remove_action(mob/living/L) - if(cooldown_timer) - deltimer(cooldown_timer) var/mob/living/carbon/carbon_owner = L if(!istype(carbon_owner)) stack_trace("/datum/action/ability/remove_action called with [L], expecting /mob/living/carbon.") @@ -95,6 +99,11 @@ to_chat(owner, span_warning("We can't do this while in a solid object!")) return FALSE + if(!(flags_to_check & ABILITY_USE_BURROWED) && HAS_TRAIT(carbon_owner, TRAIT_BURROWED)) + if(!silent) + carbon_owner.balloon_alert(carbon_owner, "Cannot while burrowed") + return FALSE + return TRUE /datum/action/ability/fail_activate() @@ -145,9 +154,9 @@ ///override this for cooldown completion /datum/action/ability/proc/on_cooldown_finish() cooldown_timer = null - if(!button) - CRASH("no button object on finishing ability action cooldown") countdown.stop() + if(!button) + return update_button_icon() ///Any changes when a xeno with this ability evolves @@ -159,10 +168,22 @@ /datum/action/ability/activable/Destroy() var/mob/living/carbon/carbon_owner = owner - if(carbon_owner.selected_ability == src) + if(carbon_owner?.selected_ability == src) deselect() return ..() +/datum/action/ability/activable/set_toggle(value) + . = ..() + if(!.) + return + if(!owner) + return + if(toggled) + SEND_SIGNAL(owner, COMSIG_ACTION_EXCLUSIVE_TOGGLE, owner) + RegisterSignal(owner, COMSIG_ACTION_EXCLUSIVE_TOGGLE, PROC_REF(deselect)) + else + UnregisterSignal(owner, COMSIG_ACTION_EXCLUSIVE_TOGGLE) + /datum/action/ability/activable/alternate_action_activate() INVOKE_ASYNC(src, PROC_REF(action_activate)) @@ -174,7 +195,7 @@ if(carbon_owner.selected_ability == src) return if(carbon_owner.selected_ability) - carbon_owner.selected_ability.deselect() + carbon_owner.selected_ability.deselect() //todo: make jetpack/blinkdrive etc activatables select() /datum/action/ability/activable/keybind_activation() @@ -188,6 +209,7 @@ action_activate() /datum/action/ability/activable/remove_action(mob/living/carbon/carbon_owner) + deselect() if(carbon_owner.selected_ability == src) carbon_owner.selected_ability = null return ..() @@ -216,17 +238,18 @@ return ///Setting this ability as the active ability -/datum/action/ability/activable/proc/select() +/datum/action/ability/activable/select() + . = ..() var/mob/living/carbon/carbon_owner = owner - set_toggle(TRUE) carbon_owner.selected_ability = src on_selection() ///Deselecting this ability for use -/datum/action/ability/activable/proc/deselect() - var/mob/living/carbon/carbon_owner = owner - set_toggle(FALSE) - carbon_owner.selected_ability = null +/datum/action/ability/activable/deselect() + . = ..() + if(owner) + var/mob/living/carbon/carbon_owner = owner + carbon_owner.selected_ability = null on_deselection() ///Any effects on selecting this ability @@ -250,7 +273,7 @@ /mob/living/carbon/proc/add_ability(datum/action/ability/new_ability) if(!new_ability) return - new_ability = new new_ability + new_ability = new new_ability(src) new_ability.give_action(src) ///Removes an ability from a mob diff --git a/code/datums/actions/action.dm b/code/datums/actions/action.dm index 505969808b3..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 @@ -48,9 +50,9 @@ KEYBINDINGS visual_references[VREF_MUTABLE_MAPTEXT] = maptext_list switch(action_type) if(ACTION_TOGGLE) - visual_references[VREF_MUTABLE_ACTIVE_FRAME] = mutable_appearance('icons/mob/actions.dmi', "active", ACTION_LAYER_ACTION_ICON_STATE, FLOAT_PLANE) + visual_references[VREF_MUTABLE_ACTIVE_FRAME] = mutable_appearance('icons/mob/actions.dmi', "active", ACTION_LAYER_SELECTED, FLOAT_PLANE) if(ACTION_SELECT) - visual_references[VREF_MUTABLE_SELECTED_FRAME] = mutable_appearance('icons/mob/actions.dmi', "selected_frame", ACTION_LAYER_ACTION_ICON_STATE, FLOAT_PLANE) + visual_references[VREF_MUTABLE_SELECTED_FRAME] = mutable_appearance('icons/mob/actions.dmi', "selected_frame", ACTION_LAYER_SELECTED, FLOAT_PLANE) visual_references[VREF_MUTABLE_ACTION_STATE] = mutable_appearance(action_icon, action_icon_state, HUD_LAYER, HUD_PLANE) button.add_overlay(visual_references[VREF_MUTABLE_ACTION_STATE]) @@ -63,29 +65,29 @@ KEYBINDINGS /datum/action/proc/clean_action() SIGNAL_HANDLER + 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) if(value == toggled) - return - if(value) - switch(action_type) - if(ACTION_SELECT) - button.add_overlay(visual_references[VREF_MUTABLE_SELECTED_FRAME]) - if(ACTION_TOGGLE) - button.add_overlay(visual_references[VREF_MUTABLE_ACTIVE_FRAME]) - toggled = TRUE - return - switch(action_type) - if(ACTION_SELECT) - button.cut_overlay(visual_references[VREF_MUTABLE_SELECTED_FRAME]) - if(ACTION_TOGGLE) - button.cut_overlay(visual_references[VREF_MUTABLE_ACTIVE_FRAME]) - toggled = FALSE + return FALSE + toggled = value + update_button_icon() + return TRUE + +///Setting this action as the active action +/datum/action/proc/select() + set_toggle(TRUE) + +///Deselecting this action for use +/datum/action/proc/deselect() + SIGNAL_HANDLER + set_toggle(FALSE) ///A handler used to update the maptext and show the change immediately. /datum/action/proc/update_map_text(key_string, key_signal) @@ -120,6 +122,17 @@ KEYBINDINGS button.add_overlay(action_appearence) if(background_icon_state != button.icon_state) button.icon_state = background_icon_state + switch(action_type) + if(ACTION_SELECT) + button.cut_overlay(visual_references[VREF_MUTABLE_SELECTED_FRAME]) + if(ACTION_TOGGLE) + button.cut_overlay(visual_references[VREF_MUTABLE_ACTIVE_FRAME]) + if(toggled) + switch(action_type) + if(ACTION_SELECT) + button.add_overlay(visual_references[VREF_MUTABLE_SELECTED_FRAME]) + if(ACTION_TOGGLE) + button.add_overlay(visual_references[VREF_MUTABLE_ACTIVE_FRAME]) handle_button_status_visuals() return TRUE @@ -176,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] @@ -187,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) @@ -197,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 f903661917c..5a4dbe99115 100644 --- a/code/datums/actions/item_action.dm +++ b/code/datums/actions/item_action.dm @@ -55,13 +55,17 @@ name = "Toggle [target]" button.name = name -/datum/action/item_action/toggle/suit_toggle - keybinding_signals = list(KEYBINDING_NORMAL = COMSIG_KB_SUITLIGHT) +/datum/action/item_action/toggle/action_activate() + . = ..() + set_toggle(!toggled) -/datum/action/item_action/toggle/suit_toggle/update_button_icon() - set_toggle(holder_item.light_on) +/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) + /datum/action/item_action/toggle/motion_detector/action_activate() . = ..() update_button_icon() @@ -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 new file mode 100644 index 00000000000..3d2b5bc30af --- /dev/null +++ b/code/datums/actions/item_toggles.dm @@ -0,0 +1,44 @@ +/datum/action/ability/activable/item_toggle + name = "" + /** + *the item that has this action in its list of actions. Is not necessarily the target + * e.g. gun attachment action: target = attachment, holder = gun. + */ + var/obj/item/holder_item + /// Defines wheter we overlay the image of the obj we are linked to + var/use_obj_appeareance = TRUE + +/datum/action/ability/activable/item_toggle/New(Target, obj/item/holder) + . = ..() + if(!holder) + holder = target + holder_item = holder + if(!name) + name = "Use [target]" + button.name = name + +/datum/action/ability/activable/item_toggle/Destroy() + holder_item = null + return ..() + +/datum/action/ability/activable/item_toggle/use_ability(atom/target) + holder_item.ui_action_click(owner, src, target) + succeed_activate() + add_cooldown() + +/datum/action/ability/activable/item_toggle/update_button_icon() + if(visual_references[VREF_MUTABLE_LINKED_OBJ]) + button.cut_overlay(visual_references[VREF_MUTABLE_LINKED_OBJ]) + if(use_obj_appeareance) + var/obj/item/I = target + // -0.5 so its below maptext and above the selected frames + var/item_image = mutable_appearance(I.icon, I.icon_state, ACTION_LAYER_IMAGE_ONTOP, FLOAT_PLANE) + visual_references[VREF_MUTABLE_LINKED_OBJ] = item_image + button.add_overlay(item_image) + 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 31874e6c3f2..887c5bd9a36 100644 --- a/code/datums/actions/order_action.dm +++ b/code/datums/actions/order_action.dm @@ -9,15 +9,15 @@ ///What skill is needed to have this action var/skill_name = SKILL_LEADERSHIP ///What minimum level in that skill is needed to have that action - var/skill_min = SKILL_LEAD_EXPERT + var/skill_min = SKILL_LEAD_TRAINED /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/actions/species_actions/sectoid_action.dm b/code/datums/actions/species_actions/sectoid_action.dm index 01d12f6463f..3dcdcc7e4fb 100644 --- a/code/datums/actions/species_actions/sectoid_action.dm +++ b/code/datums/actions/species_actions/sectoid_action.dm @@ -81,11 +81,12 @@ /// Ends the ability if the Enhancement buff is removed. /datum/action/ability/activable/sectoid/mindmeld/proc/end_ability() SIGNAL_HANDLER + UnregisterSignal(owner, COMSIG_MOB_DEATH) var/mob/living/carbon/carbon_owner = owner - add_cooldown() carbon_owner.remove_status_effect(STATUS_EFFECT_MINDMEND) if(!melded_mob) return + UnregisterSignal(melded_mob, COMSIG_MOB_DEATH) melded_mob.remove_status_effect(STATUS_EFFECT_MINDMEND) melded_mob = null diff --git a/code/datums/actions/weapon_actions.dm b/code/datums/actions/weapon_actions.dm new file mode 100644 index 00000000000..fe8e385fa0a --- /dev/null +++ b/code/datums/actions/weapon_actions.dm @@ -0,0 +1,30 @@ +//Stamina using weapon based abilities +/datum/action/ability/activable/weapon_skill + action_icon = 'icons/mob/actions.dmi' + ///Damage of this attack + var/damage + ///Penetration of this attack + var/penetration + +/datum/action/ability/activable/weapon_skill/New(Target, _damage, _penetration) + . = ..() + damage = _damage + penetration = _penetration + +/datum/action/ability/activable/weapon_skill/can_use_ability(atom/A, silent = FALSE, override_flags) + . = ..() + if(!.) + return + var/mob/living/carbon/carbon_owner = owner + if(carbon_owner.getStaminaLoss() > 0) //this specifically lets you use these abilities with no stamina, but not if you have actual stamina loss + if(!silent) + carbon_owner.balloon_alert(owner, "Catch your breath!") + return FALSE + +/datum/action/ability/activable/weapon_skill/succeed_activate(ability_cost_override) + if(QDELETED(owner)) + return + ability_cost_override = ability_cost_override? ability_cost_override : ability_cost + if(ability_cost_override > 0) + var/mob/living/carbon/carbon_owner = owner + carbon_owner.adjustStaminaLoss(ability_cost_override) 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/components/easy_restock.dm b/code/datums/components/easy_restock.dm new file mode 100644 index 00000000000..6e967c8f62e --- /dev/null +++ b/code/datums/components/easy_restock.dm @@ -0,0 +1,51 @@ +/datum/component/easy_restock + ///Parent storage. Use this over checking the item directly. + var/obj/item/storage/reloading_storage + +/datum/component/easy_restock/Initialize() + . = ..() + if(!isstorage(parent)) + return COMPONENT_INCOMPATIBLE + +/datum/component/easy_restock/Destroy(force, silent) + reloading_storage = null + return ..() + +/datum/component/easy_restock/RegisterWithParent() + reloading_storage = parent + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY_ALTERNATE, PROC_REF(on_parent_attackby_alternate)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + +/datum/component/easy_restock/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_ATOM_ATTACKBY_ALTERNATE, + COMSIG_ATOM_EXAMINE, + )) + +/datum/component/easy_restock/proc/on_examine(datum/source, mob/user, list/details) + SIGNAL_HANDLER + details += span_notice("You can easily restock magazines inside, right click on the belt with any ammo box.") + +/datum/component/easy_restock/proc/on_parent_attackby_alternate(datum/source, obj/item/ammo_magazine/ammo_box, mob/user, params) + SIGNAL_HANDLER + if(!istype(ammo_box)) + return + if(!reloading_storage) + CRASH("[user] attempted to reload [ammo_box] on [source], but it has no storage attached!") + INVOKE_ASYNC(src, PROC_REF(do_tac_reload), ammo_box, user, params) + +/datum/component/easy_restock/proc/do_tac_reload(obj/item/ammo_magazine/ammo_box, mob/user, params) + for(var/obj/item/ammo_magazine/item_to_restock in reloading_storage.contents) + var/amount_to_transfer = ammo_box.current_rounds + + if(!item_to_restock.can_transfer_ammo(ammo_box, user, amount_to_transfer, TRUE)) + continue + + if(item_to_restock.default_ammo != ammo_box.default_ammo) + if(item_to_restock.current_rounds == 0) + item_to_restock.transfer_ammo(ammo_box, user, amount_to_transfer, TRUE) + return COMPONENT_NO_AFTERATTACK + continue + + item_to_restock.transfer_ammo(ammo_box, user, amount_to_transfer) + return COMPONENT_NO_AFTERATTACK diff --git a/code/datums/components/harvester.dm b/code/datums/components/harvester.dm index 4c5ea82ab5a..cf0ac13dd21 100644 --- a/code/datums/components/harvester.dm +++ b/code/datums/components/harvester.dm @@ -221,7 +221,7 @@ if(/datum/reagent/medicine/kelotane) target.apply_damage(weapon.force*0.6, BRUTE, user.zone_selected) - target.fire_act(10) + target.fire_act(10, FLAME_COLOR_RED) if(/datum/reagent/medicine/tramadol) target.apply_damage(weapon.force*0.6, BRUTE, user.zone_selected) diff --git a/code/datums/components/magazine_catcher.dm b/code/datums/components/magazine_catcher.dm new file mode 100644 index 00000000000..c99c8565d2f --- /dev/null +++ b/code/datums/components/magazine_catcher.dm @@ -0,0 +1,46 @@ +/datum/component/magazine_catcher + var/mob/living/carbon/human/wearer + ///Parent storage in which we want to collect magazines + var/obj/item/storage/storage + +/datum/component/magazine_catcher/Initialize() + . = ..() + if(!isstorage(parent)) + return COMPONENT_INCOMPATIBLE + +/datum/component/magazine_catcher/Destroy(force, silent) + storage = null + wearer = null + return ..() + +/datum/component/magazine_catcher/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED_TO_SLOT, PROC_REF(equipped_to_slot)) + RegisterSignals(parent, list(COMSIG_ITEM_EQUIPPED_NOT_IN_SLOT, COMSIG_ITEM_DROPPED), PROC_REF(removed_from_slot)) + storage = parent + +/datum/component/magazine_catcher/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED_TO_SLOT, COMSIG_ITEM_EQUIPPED_NOT_IN_SLOT, COMSIG_ITEM_DROPPED)) + +/datum/component/magazine_catcher/proc/equipped_to_slot(datum/source, mob/user, slot) + SIGNAL_HANDLER + wearer = user + RegisterSignal(user, COMSIG_MAGAZINE_DROP, PROC_REF(try_to_catch_magazine)) + +/datum/component/magazine_catcher/proc/removed_from_slot(datum/source, mob/user) + SIGNAL_HANDLER + + if(!iscarbon(user)) + return + + if(!wearer) + return + + wearer = null + UnregisterSignal(user, COMSIG_MAGAZINE_DROP) + +/datum/component/magazine_catcher/proc/try_to_catch_magazine(datum/source, obj/item/mag) + if(!storage.can_be_inserted(mag, FALSE)) + return FALSE + return storage.handle_item_insertion(mag, TRUE) diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 0f654437a80..3d85e1c1edd 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -276,3 +276,76 @@ . = riding_offsets["[mob_type]"] else if(riding_offsets["[RIDING_OFFSET_ALL]"]) . = riding_offsets["[RIDING_OFFSET_ALL]"] + +// *************************************** +// *********** Widow +// *************************************** +/datum/component/riding/creature/widow + can_be_driven = FALSE + +/datum/component/riding/creature/widow/handle_specials() + . = ..() + var/mob/living/widow = parent + if(widow.stat == UNCONSCIOUS) //For spiderling guard + set_riding_offsets(1, list(TEXT_NORTH = list(0, 0), TEXT_SOUTH = list(0, 0), TEXT_EAST = list(0, 0), TEXT_WEST = list(0, 0))) + set_riding_offsets(2, list(TEXT_NORTH = list(16, 16), TEXT_SOUTH = list(16, 16), TEXT_EAST = list(16, 16), TEXT_WEST = list(16, 16))) + set_riding_offsets(3, list(TEXT_NORTH = list(-16, 16), TEXT_SOUTH = list(-16, 16), TEXT_EAST = list(-16, 16), TEXT_WEST = list(-16, 16))) + set_riding_offsets(4, list(TEXT_NORTH = list(16, 32), TEXT_SOUTH = list(16, -16), TEXT_EAST = list(16, -16), TEXT_WEST = list(16, -16))) + set_riding_offsets(5, list(TEXT_NORTH = list(0, -16), TEXT_SOUTH = list(-16, -16), TEXT_EAST = list(-16, -16), TEXT_WEST = list(-16, -16))) + set_vehicle_dir_layer(SOUTH, ABOVE_ALL_MOB_LAYER) + set_vehicle_dir_layer(NORTH, ABOVE_ALL_MOB_LAYER) + set_vehicle_dir_layer(EAST, ABOVE_ALL_MOB_LAYER) + set_vehicle_dir_layer(WEST, ABOVE_ALL_MOB_LAYER) + return + set_riding_offsets(1, list(TEXT_NORTH = list(-16, 9), TEXT_SOUTH = list(-16, 17), TEXT_EAST = list(-21, 7), TEXT_WEST = list(-6, 7))) + set_riding_offsets(2, list(TEXT_NORTH = list(16, 16), TEXT_SOUTH = list(16, 17), TEXT_EAST = list(21, 7), TEXT_WEST = list(6, 7))) + set_riding_offsets(3, list(TEXT_NORTH = list(8, 8), TEXT_SOUTH = list(-8, 21), TEXT_EAST = list(14, 11), TEXT_WEST = list(0, 2))) + set_riding_offsets(4, list(TEXT_NORTH = list(-8, 16), TEXT_SOUTH = list(-16, 13), TEXT_EAST = list(-21, 2), TEXT_WEST = list(6, 11))) + set_riding_offsets(5, list(TEXT_NORTH = list(8, 8), TEXT_SOUTH = list(8, 12), TEXT_EAST = list(21, 2), TEXT_WEST = list(-6, 11))) + set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER) + set_vehicle_dir_layer(NORTH, ABOVE_LYING_MOB_LAYER) + set_vehicle_dir_layer(EAST, ABOVE_LYING_MOB_LAYER) + set_vehicle_dir_layer(WEST, ABOVE_LYING_MOB_LAYER) + +/datum/component/riding/creature/widow/Initialize(mob/living/riding_mob, force = FALSE, check_loc, lying_buckle, hands_needed, target_hands_needed, silent) + . = ..() + riding_mob.density = FALSE + +// If we call parent here , we get registered for COMSIG_MOVABLE_BUMP, and when we do bump, there will be a bad index runtime +/datum/component/riding/creature/widow/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, PROC_REF(vehicle_turned)) + RegisterSignal(parent, COMSIG_MOVABLE_UNBUCKLE, PROC_REF(vehicle_mob_unbuckle)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(vehicle_moved)) + RegisterSignals(parent, list(COMSIG_XENOMORPH_ATTACK_LIVING, COMSIG_XENOMORPH_ATTACK_OBJ), PROC_REF(check_widow_attack)) + +/datum/component/riding/creature/widow/vehicle_mob_unbuckle(datum/source, mob/living/former_rider, force = FALSE) + unequip_buckle_inhands(parent) + former_rider.density = initial(former_rider.density) + REMOVE_TRAIT(former_rider, TRAIT_IMMOBILE, WIDOW_ABILITY_TRAIT) + return ..() + +/// If the widow gets knocked over, force the riding rounys off and see if someone got hurt +/datum/component/riding/creature/widow/proc/check_widow_attack(mob/living/carbon/xenomorph/widow/carrying_widow) + SIGNAL_HANDLER + for(var/mob/living/rider AS in carrying_widow.buckled_mobs) + carrying_widow.unbuckle_mob(rider) + REMOVE_TRAIT(rider, TRAIT_IMMOBILE, WIDOW_ABILITY_TRAIT) + +// Spiderlings latch on to crit widows when guarding and cannot be kicked off.. +/datum/component/riding/creature/widow/ride_check(mob/living/rider) + var/mob/living/widow = parent + return widow.stat == UNCONSCIOUS + +//..nor can they be laid under widow.. +/datum/component/riding/creature/widow/handle_vehicle_layer(dir) + var/mob/living/widow = parent + if(widow.stat == UNCONSCIOUS) + return + return ..() + +//..and nor will they change direction. +/datum/component/riding/creature/widow/handle_vehicle_offsets(dir) + var/mob/living/widow = parent + if(widow.stat == UNCONSCIOUS) + dir = SOUTH + return ..() diff --git a/code/datums/components/stun_mitigation.dm b/code/datums/components/stun_mitigation.dm index c881f1fb105..3ae59d1e2f1 100644 --- a/code/datums/components/stun_mitigation.dm +++ b/code/datums/components/stun_mitigation.dm @@ -90,7 +90,7 @@ ///Actually deactivates the mitigation effect /datum/component/stun_mitigation/proc/deactivate_with_user() - UnregisterSignal(affected, COMSIG_LIVING_PROJECTILE_STUN) + UnregisterSignal(affected, list(COMSIG_LIVING_PROJECTILE_STUN, COMSIG_LIVING_JETPACK_STUN)) ///Handles removing the mitigation from a user /datum/component/stun_mitigation/proc/shield_detach_from_user() diff --git a/code/datums/elements/limb_support.dm b/code/datums/elements/limb_support.dm index 5d5feb41bdc..b40670d59cc 100644 --- a/code/datums/elements/limb_support.dm +++ b/code/datums/elements/limb_support.dm @@ -37,7 +37,6 @@ var/mob/living/carbon/human/injured_mob = owner var/obj/item/clothing/worn_suit = injured_mob.wear_suit - for(var/datum/limb/limb in injured_mob.limbs) if(!(limbs_to_support & limb.body_part)) continue @@ -49,7 +48,13 @@ continue if(!dropped && ((limb.limb_status & LIMB_BROKEN) && !(limb.limb_status & LIMB_STABILIZED))) + if(limb.body_part == CHEST || limb.body_part == GROIN || limb.body_part == HEAD) + playsound(worn_suit, 'sound/voice/b18/fracture.ogg', 15, 0, 1) + else + playsound(worn_suit, 'sound/voice/b18/light_fracture.ogg', 15, 0, 1) limb.limb_status |= LIMB_STABILIZED - playsound(worn_suit, 'sound/voice/b18/fracture.ogg', 15, 0, 1) to_chat(injured_mob, span_notice("You feel [worn_suit] constrict about your [limb.display_name], stabilizing it.")) playsound(worn_suit, 'sound/machines/hydraulics_1.ogg', 15, 0, 1) + + if(!dropped && (limb.limb_status & LIMB_BLEEDING)) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), worn_suit, 'sound/voice/b18/ib_detected.ogg', 15, 0, 1), 2.2 SECONDS) diff --git a/code/datums/elements/riding.dm b/code/datums/elements/riding.dm index c89ad27ba62..c17f3ddb2b0 100644 --- a/code/datums/elements/riding.dm +++ b/code/datums/elements/riding.dm @@ -96,9 +96,6 @@ qdel(O) return TRUE - - - /obj/item/riding_offhand name = "offhand" icon = 'icons/obj/items/weapons.dmi' diff --git a/code/datums/elements/shrapnel_removal.dm b/code/datums/elements/shrapnel_removal.dm index 675434986ab..0e068d79240 100644 --- a/code/datums/elements/shrapnel_removal.dm +++ b/code/datums/elements/shrapnel_removal.dm @@ -43,7 +43,7 @@ if(skill < SKILL_MEDICAL_PRACTICED) user.visible_message(span_notice("[user] fumbles around with the [removaltool]."), span_notice("You fumble around figuring out how to use [removaltool].")) - if(!do_after(user, fumble_duration * (SKILL_MEDICAL_PRACTICED - skill), NONE, target, BUSY_ICON_UNSKILLED)) + if(!do_after(user, fumble_duration - (fumble_duration * 0.5 * skill), NONE, target, BUSY_ICON_UNSKILLED)) return user.visible_message(span_green("[user] starts searching for shrapnel in [target] with the [removaltool]."), span_green("You start searching for shrapnel in [target] with the [removaltool].")) if(!do_after(user, do_after_time, NONE, target, BUSY_ICON_FRIENDLY, BUSY_ICON_MEDICAL)) 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/_game_mode.dm b/code/datums/gamemodes/_game_mode.dm index 6d718ef3a64..0de7a051b96 100644 --- a/code/datums/gamemodes/_game_mode.dm +++ b/code/datums/gamemodes/_game_mode.dm @@ -517,7 +517,7 @@ GLOBAL_LIST_INIT(bioscan_locations, list( var/mob/living/carbon/human/H = i if(!istype(H)) // Small fix? continue - if(isyautja(H)) //RU TGMC EDIT + if(isyautja(H)) continue if(count_flags & COUNT_IGNORE_HUMAN_SSD && !H.client && H.afk_status == MOB_DISCONNECTED) continue @@ -534,7 +534,9 @@ GLOBAL_LIST_INIT(bioscan_locations, list( for(var/z in z_levels) for(var/i in GLOB.hive_datums[XENO_HIVE_NORMAL].xenos_by_zlevel["[z]"]) var/mob/living/carbon/xenomorph/X = i - if(!istype(X) || isxenohellhound(X)) // Small fix? and // RU TGMC EDIT + if(!istype(X)) // Small fix? + continue + if(isxenohellhound(X)) continue if(count_flags & COUNT_IGNORE_XENO_SSD && !X.client && X.afk_status == MOB_DISCONNECTED) continue diff --git a/code/datums/gamemodes/crash.dm b/code/datums/gamemodes/crash.dm index dc2df2e9f2c..0bfb3127a6c 100644 --- a/code/datums/gamemodes/crash.dm +++ b/code/datums/gamemodes/crash.dm @@ -84,14 +84,7 @@ /datum/game_mode/infestation/crash/post_setup() . = ..() for(var/i in GLOB.xeno_resin_silo_turfs) - //RUTGMC EDIT BEGIN - /* //ORIGINAL - new /obj/structure/xeno/silo(i) - new /obj/structure/xeno/pherotower(i) - */ new /obj/structure/xeno/silo/crash(i) - new /obj/structure/xeno/pherotower/crash(i) - //RUTGMC EDIT END for(var/obj/effect/landmark/corpsespawner/corpse AS in GLOB.corpse_landmarks_list) corpse.create_mob() @@ -121,14 +114,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 68d7b1008c0..202deec3d26 100644 --- a/code/datums/jobs/job/job.dm +++ b/code/datums/jobs/job/job.dm @@ -6,6 +6,7 @@ GLOBAL_LIST_INIT(exp_jobsmap, list( EXP_TYPE_MARINES = list("titles" = GLOB.jobs_marines), EXP_TYPE_REQUISITIONS = list("titles" = GLOB.jobs_requisitions), EXP_TYPE_SYNTHETIC = list("titles" = GLOB.jobs_engineering + GLOB.jobs_medical), + EXP_TYPE_SL = list("titles" = GLOB.jobs_marines + GLOB.jobs_command), EXP_TYPE_XENO = list("titles" = GLOB.jobs_xenos), )) @@ -180,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 @@ -221,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) @@ -231,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") @@ -322,7 +335,7 @@ GLOBAL_PROTECT(exp_specialmap) else equip_role_outfit(job) - if(SSdiscord.get_boosty_tier(player.ckey) >= BOOSTY_TIER_2) + if(SSdiscord.get_boosty_tier(player?.ckey) >= BOOSTY_TIER_2) equip_to_slot_or_del(new /obj/item/facepaint/premium, SLOT_IN_BACKPACK) if((job.job_flags & JOB_FLAG_ALLOWS_PREFS_GEAR) && player) diff --git a/code/datums/jobs/job/marines.dm b/code/datums/jobs/job/marines.dm index bd6e70ed058..267c50b2bf9 100644 --- a/code/datums/jobs/job/marines.dm +++ b/code/datums/jobs/job/marines.dm @@ -398,7 +398,7 @@ You can serve a variety of roles, so choose carefully."}) minimal_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_TADPOLE) skills_type = /datum/skills/sl - exp_type = EXP_TYPE_MARINES + exp_type = EXP_TYPE_SL exp_requirements = XP_REQ_INTERMEDIATE display_order = JOB_DISPLAY_ORDER_SQUAD_LEADER 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/job/shipside.dm b/code/datums/jobs/job/shipside.dm index 937f88f97ad..c1fa2875a82 100644 --- a/code/datums/jobs/job/shipside.dm +++ b/code/datums/jobs/job/shipside.dm @@ -971,7 +971,7 @@ You are also an expert when it comes to medication and treatment. If you do not //Researcher /datum/job/terragov/medical/researcher - title = MEDICAL_RESEARCHER + title = FIELD_RESEARCHER comm_title = "Rsr" paygrade = "CD" total_positions = 2 @@ -979,7 +979,7 @@ You are also an expert when it comes to medication and treatment. If you do not access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_RESEARCH, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_ENGINEERING, ACCESS_CIVILIAN_ENGINEERING) minimal_access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_RESEARCH, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_CARGO, ACCESS_MARINE_DROPSHIP) skills_type = /datum/skills/researcher - display_order = JOB_DISPLAY_ORDER_MEDICAL_RESEARCHER + display_order = JOB_DISPLAY_ORDER_FIELD_RESEARCHER outfit = /datum/outfit/job/medical/researcher exp_type = EXP_TYPE_MEDICAL exp_requirements = XP_REQ_UNSEASONED @@ -1025,7 +1025,7 @@ It is also recommended that you gear up like a regular marine, or your 'internsh /datum/outfit/job/medical/researcher - name = MEDICAL_RESEARCHER + name = FIELD_RESEARCHER jobtype = /datum/job/terragov/medical/researcher id = /obj/item/card/id diff --git a/code/datums/jobs/squads.dm b/code/datums/jobs/squads.dm index 06c31b6f23d..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]!") @@ -353,8 +349,8 @@ GLOBAL_LIST_EMPTY_TYPED(custom_squad_radio_freqs, /datum/squad) new_squad.faction = squad_faction if(new_squad.faction == FACTION_TERRAGOV) var/list/terragov_server_freqs = GLOB.telecomms_freq_listening_list[/obj/machinery/telecomms/server/presets/alpha] - var/list/terragov_bus_freqs = GLOB.telecomms_freq_listening_list[/obj/machinery/telecomms/bus/preset_three] - var/list/terragov_receiver_freqs = GLOB.telecomms_freq_listening_list[/obj/machinery/telecomms/receiver/preset_left] + var/list/terragov_bus_freqs = GLOB.telecomms_freq_listening_list[/obj/machinery/telecomms/bus/preset/three] + var/list/terragov_receiver_freqs = GLOB.telecomms_freq_listening_list[/obj/machinery/telecomms/receiver/preset/left] LAZYADDASSOCSIMPLE(terragov_server_freqs, 1, freq) LAZYADDASSOCSIMPLE(terragov_bus_freqs, 1, freq) LAZYADDASSOCSIMPLE(terragov_receiver_freqs, 1, freq) diff --git a/code/datums/keybinding/item_toggles.dm b/code/datums/keybinding/item_toggles.dm new file mode 100644 index 00000000000..0fbbe17c03d --- /dev/null +++ b/code/datums/keybinding/item_toggles.dm @@ -0,0 +1,17 @@ +/datum/keybinding/item + category = CATEGORY_ITEM + weight = WEIGHT_MOB + +/datum/keybinding/item/jetpack + name = "Jetpack" + full_name = "Toggle jetpack" + description = "Toggles your jetpack on, allowing you to fly a short distance." + keybind_signal = COMSIG_ITEM_TOGGLE_JETPACK + hotkey_keys = list("G") + +/datum/keybinding/item/blinkdrive + name = "Blink drive" + full_name = "Toggle blink drive" + description = "Toggles your blink drive on, allowing you to instantly teleport short distances." + keybind_signal = COMSIG_ITEM_TOGGLE_BLINKDRIVE + hotkey_keys = list("G") 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/weapons.dm b/code/datums/keybinding/weapons.dm new file mode 100644 index 00000000000..5a5077bf42e --- /dev/null +++ b/code/datums/keybinding/weapons.dm @@ -0,0 +1,17 @@ +/datum/keybinding/weapon + category = CATEGORY_WEAPON + weight = WEIGHT_MOB + +/datum/keybinding/weapon/axe_sweep + name = "Axe sweep" + full_name = "Breaching axe: Axe sweep" + description = "A powerful sweeping blow that hits foes in the direction you are facing. Cannot stun." + keybind_signal = COMSIG_WEAPONABILITY_AXESWEEP + hotkey_keys = list("G") + +/datum/keybinding/weapon/sword_lunge + name = "Lunging strike" + full_name = "Sword: Lunging strike" + description = "Dash a short distance to inflict a staggering blow on an opponent. Cannot stun." + keybind_signal = COMSIG_WEAPONABILITY_SWORDLUNGE + hotkey_keys = list("G") diff --git a/code/datums/keybinding/xeno.dm b/code/datums/keybinding/xeno.dm index ada9d94c96f..10a3a23f041 100644 --- a/code/datums/keybinding/xeno.dm +++ b/code/datums/keybinding/xeno.dm @@ -39,6 +39,7 @@ full_name = "Choose Weed" description = "Choose what weed you will drop." keybind_signal = COMSIG_XENOABILITY_CHOOSE_WEEDS + hotkey_keys = list("ShiftV") /datum/keybinding/xeno/secrete_resin name = "secrete_resin" @@ -101,7 +102,7 @@ full_name = "Spit" description = "Spit neurotoxin or acid at your target up to 7 tiles away." keybind_signal = COMSIG_XENOABILITY_XENO_SPIT - hotkey_keys = list("Q") + hotkey_keys = list("Z") /datum/keybinding/xeno/xenohide name = "xenohide" @@ -378,6 +379,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" @@ -439,6 +454,7 @@ full_name = "Defiler: Inject Egg (Neurogas)" description = "Inject an egg with neurogas, killing the little one inside" keybind_signal = COMSIG_XENOABILITY_INJECT_EGG_NEUROGAS + hotkey_keys = list("F") /datum/keybinding/xeno/acidic_salve name = "acidic_salve" @@ -753,13 +769,13 @@ full_name = "Ravager: Ravage" description = "" keybind_signal = COMSIG_XENOABILITY_RAVAGE - hotkey_keys = list("R") /datum/keybinding/xeno/ravage_select name = "ravage select" full_name = "Ravager: Select Ravage" description = "" keybind_signal = COMSIG_XENOABILITY_RAVAGE_SELECT + hotkey_keys = list("R") /datum/keybinding/xeno/pounce name = "pounce" @@ -827,7 +843,7 @@ full_name = "Shrike: Unrelenting Force" description = "" keybind_signal = COMSIG_XENOABILITY_UNRELENTING_FORCE - hotkey_keys = list("R") + hotkey_keys = list("Q") /datum/keybinding/xeno/unrelenting_force_select name = "unrelenting_force_select" @@ -856,7 +872,7 @@ full_name = "Spitter: Scatter Spit" description = "Fires a scattershot of 6 acid globules which create acid puddles on impact or at the end of their range." keybind_signal = COMSIG_XENOABILITY_SCATTER_SPIT - hotkey_keys = list("E") + hotkey_keys = list("V") /datum/keybinding/xeno/psychic_shield name = "Psychic Shield" @@ -897,7 +913,7 @@ full_name = "Warrior: Toggle Agility" description = "Toggles Agility mode. While in Agility mode, you move much more quickly but can't use abilities and your armor is greatly reduced." keybind_signal = COMSIG_XENOABILITY_TOGGLE_AGILITY - hotkey_keys = list("Space") + hotkey_keys = list("Shift") /datum/keybinding/xeno/lunge name = "lunge" @@ -911,7 +927,7 @@ full_name = "Warrior: Fling" description = "Quickly flings a target 4 tiles away and inflicts a short stun. Shared cooldown with Grapple Toss." keybind_signal = COMSIG_XENOABILITY_FLING - hotkey_keys = list("Q") + hotkey_keys = list("V") /datum/keybinding/xeno/grapple_toss name = "grapple_toss" @@ -925,14 +941,14 @@ full_name = "Warrior: Punch" description = "Punch a hostile creature, a structure or piece of machinery. Damage and status durations are doubled vs creatures you are grabbing. Damage is quadrupled vs structures and machinery." keybind_signal = COMSIG_XENOABILITY_PUNCH - hotkey_keys = list("R") + hotkey_keys = list("Z") /datum/keybinding/xeno/jab name = "jab" full_name = "Warrior: Jab" description = "Precisely strike your target from further away. Resets punch cooldown." keybind_signal = COMSIG_XENOABILITY_JAB - hotkey_keys = list("E") + hotkey_keys = list("C") /datum/keybinding/xeno/flurry name = "flurry" @@ -946,30 +962,35 @@ full_name = "Behemoth: Landslide" description = "Rush forward in the selected direction, damaging enemies caught in a wide path." keybind_signal = COMSIG_XENOABILITY_LANDSLIDE + hotkey_keys = list("Z") /datum/keybinding/xeno/earth_riser name = "Earth Riser" full_name = "Behemoth: Earth Riser" description = "Raise a pillar of earth at the selected location. This solid structure can be used for defense, and it interacts with other abilities for offensive usage." keybind_signal = COMSIG_XENOABILITY_EARTH_RISER + hotkey_keys = list("C") /datum/keybinding/xeno/earth_riser_alternate name = "Destroy Earth Pillar" full_name = "Behemoth: Destroy Earth Pillar" description = "Destroy active Earth Pillars created by Earth Riser, starting by the oldest one." keybind_signal = COMSIG_XENOABILITY_EARTH_RISER_ALTERNATE + hotkey_keys = list("ShiftC") /datum/keybinding/xeno/seismic_fracture name = "Seismic Fracture" full_name = "Behemoth: Seismic Fracture" description = "Blast the earth around the selected location, inflicting heavy damage in a large radius." keybind_signal = COMSIG_XENOABILITY_SEISMIC_FRACTURE + hotkey_keys = list("V") /datum/keybinding/xeno/primal_wrath name = "Primal Wrath" full_name = "Behemoth: Primal Wrath" description = "Unleash your wrath. Enhances your abilities, changing their functionality and allowing them to apply a damage over time debuff." keybind_signal = COMSIG_XENOABILITY_PRIMAL_WRATH + hotkey_keys = list("F") /datum/keybinding/xeno/tearing_tail name = "Tearing Tail" @@ -1075,4 +1096,60 @@ full_name = "Praetorian: Short Acid Spray" description = "Sprays some acid" keybind_signal = COMSIG_XENOABILITY_SHORT_SPRAY_ACID + hotkey_keys = list("C") + +/datum/keybinding/xeno/burrow + name = "burrow" + full_name = "Burrow" + description = "Dig to the ground, making you invisible." + keybind_signal = COMSIG_XENOABILITY_BURROW + hotkey_keys = list("C") + +/datum/keybinding/xeno/leash_ball + name = "Leash Ball" + full_name = "Widow: Leash Ball" + description = "Spit a huge web ball of web that snares groups of targets for a brief while." + keybind_signal = COMSIG_XENOABILITY_LEASH_BALL hotkey_keys = list("E") + +/datum/keybinding/xeno/create_spiderling + name = "Birth Spiderling" + full_name = "Widow: Birth Spiderling" + description = "Give birth to a spiderling after a short charge-up." + keybind_signal = COMSIG_XENOABILITY_CREATE_SPIDERLING + hotkey_keys = list("F") + +/datum/keybinding/xeno/attach_spiderlings + name = "Attach Spiderlings" + full_name = "Widow: Attach Spiderlings" + description = "Scoop up and carry your spawn with you." + keybind_signal = COMSIG_XENOABILITY_ATTACH_SPIDERLINGS + hotkey_keys = list("X") + +/datum/keybinding/xeno/web_spit + name = "Web Spit" + full_name = "Widow: Web Spit" + description = "Stun and blind the target with a web projectile" + keybind_signal = COMSIG_XENOABILITY_WEB_SPIT + hotkey_keys = list("R") + +/datum/keybinding/xeno/create_hugger + name = "Create Facehugger" + full_name = "Widow: Create Facehugger" + description = "Create a facehugger." + keybind_signal = COMSIG_XENOABILITY_CREATE_HUGGER + hotkey_keys = list("G") + +/datum/keybinding/xeno/widow_unleash + name = "Unleash Spiderlings" + full_name = "Widow: Unleash Spiderlings" + description = "Send out your spawn to attack nearby humans" + keybind_signal = COMSIG_XENOABILITY_UNLEASH_SPIDERLINGS + hotkey_keys = list("O") + +/datum/keybinding/xeno/widow_recall + name = "Recall Spiderlings" + full_name = "Widow: Recall Spiderlings" + description = "Recall your siderlings to follow you once more" + keybind_signal = COMSIG_XENOABILITY_RECALL_SPIDERLINGS + hotkey_keys = list("P") 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/skills.dm b/code/datums/skills.dm index 2b25bf06112..ff9d1d6f2e5 100644 --- a/code/datums/skills.dm +++ b/code/datums/skills.dm @@ -326,10 +326,8 @@ engineer, construction, leadership, medical, surgery, pilot, police, powerloader /datum/skills/researcher name = "Researcher" cqc = SKILL_CQC_WEAK - firearms = SKILL_FIREARMS_UNTRAINED medical = SKILL_MEDICAL_EXPERT surgery = SKILL_SURGERY_PROFESSIONAL - melee_weapons = SKILL_MELEE_WEAK /datum/skills/cmo name = "CMO" diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 3466f5a0eaf..8e82abff5f5 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -847,3 +847,19 @@ name = "Freezing" desc = "Space is very very cold, who would've thought?" icon_state = "cold3" + +/datum/status_effect/incapacitating/spider_venom + id = "spider_venom" + status_type = STATUS_EFFECT_REFRESH + duration = 1 SECONDS + var/slowdown = 2 + +/datum/status_effect/incapacitating/spider_venom/on_apply() + . = ..() + if(!.) + return + owner.add_movespeed_modifier(MOVESPEED_ID_SPIDER_VENOM, TRUE, 0, NONE, TRUE, slowdown) + +/datum/status_effect/incapacitating/spider_venom/on_remove() + owner.remove_movespeed_modifier(MOVESPEED_ID_SPIDER_VENOM) + return ..() diff --git a/code/datums/status_effects/sectoid.dm b/code/datums/status_effects/sectoid.dm index 3a5c17cc8a9..40351afc848 100644 --- a/code/datums/status_effects/sectoid.dm +++ b/code/datums/status_effects/sectoid.dm @@ -47,7 +47,14 @@ /datum/status_effect/mindmeld/on_remove() link_target.balloon_alert(link_target, "mindmeld inactive") REMOVE_TRAIT(link_target, TRAIT_MINDMELDED, TRAIT_STATUS_EFFECT(id)) - UnregisterSignal(link_target, COMSIG_MOB_DEATH) + link_target.UnregisterSignal(link_target, list( + COMSIG_LIVING_STATUS_STUN, + COMSIG_LIVING_STATUS_KNOCKDOWN, + COMSIG_LIVING_STATUS_PARALYZE, + COMSIG_LIVING_STATUS_UNCONSCIOUS, + COMSIG_LIVING_STATUS_CONFUSED, + COMSIG_LIVING_STATUS_STAGGER, + )) check_range() return ..() 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/datums/view.dm b/code/datums/view.dm index 60019bc4139..abf28f6726e 100644 --- a/code/datums/view.dm +++ b/code/datums/view.dm @@ -7,6 +7,11 @@ var/height = 0 ///Default view size, formatted as a string var/default = "" + /// This client's current zoom level, if it's not being supressed + /// If it's 0, we autoscale to the size of the window. Otherwise it's treated as the ratio between + /// the pixels on the map and output pixels. Only looks proper nice in increments of whole numbers (iirc) + /// Stored here so other parts of the code have a non blocking way of getting a user's functional zoom + var/zoom = 0 ///Bool that determines whether we want it to ignore any other changes after we applied some changes var/supress_changes = FALSE @@ -18,6 +23,10 @@ chief = owner apply() +/datum/view_data/Destroy() + chief = null + return ..() + ///sets the default view size froma string /datum/view_data/proc/set_default(string) default = string @@ -33,14 +42,17 @@ ///Resets the format type /datum/view_data/proc/assert_format() winset(chief, "mapwindow.map", "zoom=0") + zoom = 0 ///applies the current clients preferred pixel size setting /datum/view_data/proc/update_pixel_format() - winset(chief, "mapwindow.map", "zoom=[chief.prefs.pixel_size]") + zoom = chief?.prefs.pixel_size + winset(chief, "mapwindow.map", "zoom=[zoom]") + chief?.attempt_auto_fit_viewport() // If you change zoom mode, fit the viewport ///applies the preferred clients scaling method /datum/view_data/proc/update_zoom_mode() - winset(chief, "mapwindow.map", "zoom-mode=[chief.prefs.scaling_method]") + winset(chief, "mapwindow.map", "zoom-mode=[chief?.prefs.scaling_method]") ///Returns a boolean if the client has any form of zoom /datum/view_data/proc/is_zooming() @@ -100,7 +112,7 @@ ///applies all current outstanding changes to the client /datum/view_data/proc/apply() - chief.change_view(get_client_view_size()) + chief?.change_view(get_client_view_size()) safe_apply_formatting() ///supresses any further view changes until it is unsupressed diff --git a/code/game/area/bigred.dm b/code/game/area/bigred.dm index 395abb5058b..58920b6680c 100644 --- a/code/game/area/bigred.dm +++ b/code/game/area/bigred.dm @@ -78,6 +78,7 @@ icon_state = "yellow" ceiling = CEILING_DEEP_UNDERGROUND_METAL requires_power = TRUE + always_unpowered = FALSE /area/bigredv2/caves/secomplex name = "Underground research complex" diff --git a/code/game/atoms/_atom.dm b/code/game/atoms/_atom.dm index c922cc32c54..9783f8c1618 100644 --- a/code/game/atoms/_atom.dm +++ b/code/game/atoms/_atom.dm @@ -386,14 +386,14 @@ directive is properly returned. contents_explosion(severity, explosion_direction) ///Effects of fire -/atom/proc/fire_act(burn_level) +/atom/proc/fire_act(burn_level, flame_color) return ///Effects of lava. Return true where we want the lava to keep processing /atom/proc/lava_act() if(resistance_flags & INDESTRUCTIBLE) return FALSE - fire_act(LAVA_BURN_LEVEL) + fire_act(LAVA_BURN_LEVEL, FLAME_COLOR_RED) return TRUE /atom/proc/hitby(atom/movable/AM, speed = 5) diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index ed2bcdc0639..5279315aa8b 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -10,3 +10,7 @@ layer = ABOVE_TURF_LAYER mouse_opacity = MOUSE_OPACITY_TRANSPARENT icon = 'icons/turf/decals.dmi' + +/obj/effect/turf_decal/ex_act(severity) + if(prob(severity * 0.3)) + qdel(src) diff --git a/code/game/objects/effects/decals/turfdecals/markings.dm b/code/game/objects/effects/decals/turfdecals/markings.dm index ea9acc99c95..671c2c5241a 100644 --- a/code/game/objects/effects/decals/turfdecals/markings.dm +++ b/code/game/objects/effects/decals/turfdecals/markings.dm @@ -2,10 +2,6 @@ icon = 'icons/turf/decals.dmi' icon_state = "whitedecal" -/obj/effect/turf_decal/tile/ex_act(severity) - if(prob(severity * 0.3)) - qdel(src) - /obj/effect/turf_decal/tile/full icon_state = "floor_large" diff --git a/code/game/objects/effects/effect.dm b/code/game/objects/effects/effect.dm index b650a43e53d..bb1d9a765d5 100644 --- a/code/game/objects/effects/effect.dm +++ b/code/game/objects/effects/effect.dm @@ -5,3 +5,6 @@ /obj/effect/add_debris_element() //they're not hittable, and prevents recursions return + +/obj/effect/ex_act() + return diff --git a/code/game/objects/effects/effect_system/foam.dm b/code/game/objects/effects/effect_system/foam.dm index 06d461d9671..1e3822c1f61 100644 --- a/code/game/objects/effects/effect_system/foam.dm +++ b/code/game/objects/effects/effect_system/foam.dm @@ -101,7 +101,7 @@ // foam disolves when heated // except metal foams -/obj/effect/particle_effect/foam/fire_act(burn_level) +/obj/effect/particle_effect/foam/fire_act(burn_level, flame_color) if(!(foam_flags & METAL_FOAM|RAZOR_FOAM) && prob(min(burn_level * 3, 100))) kill_foam() @@ -173,6 +173,6 @@ SMOOTH_GROUP_FOAM_WALL, ) -/obj/structure/foamedmetal/fire_act(burn_level) +/obj/structure/foamedmetal/fire_act(burn_level, flame_color) take_damage(burn_level, BURN, FIRE) diff --git a/code/game/objects/effects/landmarks/landmarks.dm b/code/game/objects/effects/landmarks/landmarks.dm index 129a4de7528..c6dbbaef515 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 @@ -389,7 +389,7 @@ /obj/item/weapon/gun/shotgun/pump/trenchgun, /obj/item/weapon/gun/flamer/big_flamer, /obj/item/weapon/gun/pistol/auto9, - /obj/item/weapon/gun/rifle/sniper/antimaterial/sr127, + /obj/item/weapon/gun/rifle/sr127, /obj/item/weapon/gun/rifle/ar11, /obj/item/weapon/gun/rifle/ar21, /obj/item/weapon/gun/rifle/mkh, @@ -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/overlays.dm b/code/game/objects/effects/overlays.dm index 4bd51f895a0..88f8bb5052d 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -152,16 +152,16 @@ if(ishuman(user)) . += span_danger("It's a laser to designate CAS targets, get away from it!") -/obj/effect/overlay/temp/laser_target/OB //This is a subtype of CAS so that CIC gets cameras on the lase +/obj/effect/overlay/temp/laser_target/ob //This is a subtype of CAS so that CIC gets cameras on the lase icon_state = "laser_target2" lasertype = LASER_TYPE_OB -/obj/effect/overlay/temp/laser_target/OB/Initialize(mapload, effect_duration, named, assigned_squad) +/obj/effect/overlay/temp/laser_target/ob/Initialize(mapload, effect_duration, named, assigned_squad) . = ..() linked_cam = new(src, name) GLOB.active_laser_targets += src -/obj/effect/overlay/temp/laser_target/OB/Destroy() +/obj/effect/overlay/temp/laser_target/ob/Destroy() GLOB.active_laser_targets -= src return ..() diff --git a/code/game/objects/effects/spawners/random/random_set.dm b/code/game/objects/effects/spawners/random/random_set.dm index 244fd45a010..132704d2952 100644 --- a/code/game/objects/effects/spawners/random/random_set.dm +++ b/code/game/objects/effects/spawners/random/random_set.dm @@ -72,7 +72,7 @@ /obj/item/ammo_magazine/rifle/br64, /obj/item/ammo_magazine/rifle/br64, ), - list(/obj/item/weapon/gun/rifle/sniper/antimaterial/sr127, + list(/obj/item/weapon/gun/rifle/sr127, /obj/item/ammo_magazine/rifle/sr127, /obj/item/ammo_magazine/rifle/sr127, /obj/item/ammo_magazine/rifle/sr127, diff --git a/code/game/objects/effects/spawners/random/weaponry.dm b/code/game/objects/effects/spawners/random/weaponry.dm index 13a04f678a3..32eb738a40b 100644 --- a/code/game/objects/effects/spawners/random/weaponry.dm +++ b/code/game/objects/effects/spawners/random/weaponry.dm @@ -14,7 +14,7 @@ /obj/item/weapon/gun/rifle/type71, /obj/item/weapon/gun/rifle/dmr37, /obj/item/weapon/gun/rifle/br64, - /obj/item/weapon/gun/rifle/sniper/antimaterial/sr127, + /obj/item/weapon/gun/rifle/sr127, /obj/item/weapon/gun/shotgun/pump/bolt/unscoped, /obj/item/weapon/gun/shotgun/double/martini, /obj/item/weapon/gun/pistol/p14, 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/explosion_recursive.dm b/code/game/objects/explosion_recursive.dm index 68a657093fd..a4915763a7e 100644 --- a/code/game/objects/explosion_recursive.dm +++ b/code/game/objects/explosion_recursive.dm @@ -73,10 +73,13 @@ explosion resistance exactly as much as their health epicenter.explosion_spread(src, power, null) - spawn(2) //just in case something goes wrong - if(explosion_in_progress) - explosion_damage() - QDEL_IN(src, 2 SECONDS) + addtimer(CALLBACK(src, PROC_REF(explosion_delete)), 0.2 SECONDS) + +/obj/effect/explosion/proc/explosion_delete() + if(!explosion_in_progress) + return + explosion_damage() + QDEL_IN(src, 2 SECONDS) //direction is the direction that the spread took to come to this tile. So it is pointing in the main blast direction - meaning where this tile should spread most of it's force. /turf/proc/explosion_spread(obj/effect/explosion/Controller, power, direction) @@ -97,11 +100,7 @@ explosion resistance exactly as much as their health var/obj/effect/step_trigger/teleporter/our_tp = our_atom var/turf/our_turf = locate(our_tp.x + our_tp.teleport_x, our_tp.y + our_tp.teleport_y, our_tp.z) if(our_turf) - spawn(0) - our_turf.explosion_spread(Controller, power, direction) - Controller.active_spread_num-- - if(Controller.active_spread_num <= 0 && Controller.explosion_in_progress) - Controller.explosion_damage() + INVOKE_ASYNC(our_turf, PROC_REF(explosion_step)) return if(istype(our_atom, /obj/structure/ladder)) //check for ladders @@ -116,81 +115,85 @@ explosion resistance exactly as much as their health Controller.reflected_power += max(0, min(resistance, power)) power -= resistance + INVOKE_ASYNC(src, PROC_REF(explosion_spread_power), Controller, power, direction, our_ladder) + +/turf/proc/explosion_spread_power(obj/effect/explosion/Controller, power, direction, obj/structure/ladder/our_ladder) + //spread in each ordinal direction + var/direction_angle = dir2angle(direction) + for(var/spread_direction in GLOB.alldirs) + var/spread_power = power + + if(direction) //false if, for example, this turf was the explosion source + var/spread_direction_angle = dir2angle(spread_direction) + + var/angle = 180 - abs( abs( direction_angle - spread_direction_angle ) - 180 ) // the angle difference between the spread direction and initial direction + + switch(angle) //this reduces power when the explosion is going around corners + if(0) + EMPTY_BLOCK_GUARD //no change + if(45) + if(spread_power >= 0) + spread_power *= 0.75 + else + spread_power *= 1.25 + if(90) + if(spread_power >= 0) + spread_power *= 0.50 + else + spread_power *= 1.5 + else //turns out angles greater than 90 degrees almost never happen. This bit also prevents trying to spread backwards + continue + + switch(spread_direction) + if(NORTH, SOUTH, EAST, WEST) + spread_power -= Controller.falloff + else + spread_power -= Controller.falloff * 1.414 //diagonal spreading + + if(spread_power <= Controller.minimum_spread_power) + continue + + var/turf/T = get_step(src, spread_direction) - //spawn(0) is important because it paces the explosion in an expanding circle, rather than a series of squiggly lines constantly checking overlap. Reduces lag by a lot. Note that INVOKE_ASYNC doesn't have the same effect as spawn(0) for this purpose. - spawn(0) - - //spread in each ordinal direction - var/direction_angle = dir2angle(direction) - for(var/spread_direction in GLOB.alldirs) - var/spread_power = power - - if(direction) //false if, for example, this turf was the explosion source - var/spread_direction_angle = dir2angle(spread_direction) - - var/angle = 180 - abs( abs( direction_angle - spread_direction_angle ) - 180 ) // the angle difference between the spread direction and initial direction - - switch(angle) //this reduces power when the explosion is going around corners - if (0) - EMPTY_BLOCK_GUARD //no change - if (45) - if(spread_power >= 0) - spread_power *= 0.75 - else - spread_power *= 1.25 - if (90) - if(spread_power >= 0) - spread_power *= 0.50 - else - spread_power *= 1.5 - else //turns out angles greater than 90 degrees almost never happen. This bit also prevents trying to spread backwards - continue - - switch(spread_direction) - if(NORTH,SOUTH,EAST,WEST) - spread_power -= Controller.falloff - else - spread_power -= Controller.falloff * 1.414 //diagonal spreading - - if (spread_power <= Controller.minimum_spread_power) - continue - - var/turf/T = get_step(src, spread_direction) - - if(!T) //prevents trying to spread into "null" (edge of the map?) - continue - - T.explosion_spread(Controller, spread_power, spread_direction) - - - //spreading up/down ladders - if(our_ladder) - var/ladder_spread_power - if(direction) - if(power >= 0) - ladder_spread_power = power * 0.75 - Controller.falloff - else - ladder_spread_power = power * 1.25 - Controller.falloff + if(!T) //prevents trying to spread into "null" (edge of the map?) + continue + + T.explosion_spread(Controller, spread_power, spread_direction) + + //spreading up/down ladders + if(our_ladder) + var/ladder_spread_power + if(direction) + if(power >= 0) + ladder_spread_power = power * 0.75 - Controller.falloff else - if(power >= 0) - ladder_spread_power = power * 0.5 - Controller.falloff - else - ladder_spread_power = power * 1.5 - Controller.falloff - - if(ladder_spread_power > Controller.minimum_spread_power) - if(our_ladder.up) - var/turf/T_up = get_turf(our_ladder.up) - if(T_up) - T_up.explosion_spread(Controller, ladder_spread_power, null) - if(our_ladder.down) - var/turf/T_down = get_turf(our_ladder.down) - if(T_down) - T_down.explosion_spread(Controller, ladder_spread_power, null) - - //if this is the last explosion spread, initiate explosion damage - Controller.active_spread_num-- - if(Controller.active_spread_num <= 0 && Controller.explosion_in_progress) - Controller.explosion_damage() + ladder_spread_power = power * 1.25 - Controller.falloff + else + if(power >= 0) + ladder_spread_power = power * 0.5 - Controller.falloff + else + ladder_spread_power = power * 1.5 - Controller.falloff + + if(ladder_spread_power > Controller.minimum_spread_power) + if(our_ladder.up) + var/turf/T_up = get_turf(our_ladder.up) + if(T_up) + T_up.explosion_spread(Controller, ladder_spread_power, null) + if(our_ladder.down) + var/turf/T_down = get_turf(our_ladder.down) + if(T_down) + T_down.explosion_spread(Controller, ladder_spread_power, null) + + //if this is the last explosion spread, initiate explosion damage + Controller.active_spread_num-- + if(Controller.active_spread_num <= 0 && Controller.explosion_in_progress) + Controller.explosion_damage() + +/turf/proc/explosion_step(obj/effect/explosion/Controller, power, direction) + explosion_spread(Controller, power, direction) + Controller.active_spread_num-- + if(Controller.active_spread_num <= 0 && Controller.explosion_in_progress) + Controller.explosion_damage() /obj/effect/explosion/proc/explosion_damage() //This step applies the ex_act effects for the explosion explosion_in_progress = 0 @@ -223,20 +226,18 @@ explosion resistance exactly as much as their health our_turf = locate(x, y, z) for(var/atom/our_atom in our_turf) - spawn(0) - log_game("Explosion with power of [power] and falloff of [falloff] at [AREACOORD(our_turf)]!") - if(is_mainship_level(our_turf.z)) - message_admins("Explosion with power of [power] and falloff of [falloff] in [ADMIN_VERBOSEJMP(our_turf)]!") - - our_atom.ex_act(severity, direction) - + INVOKE_ASYNC(src, PROC_REF(explosion_damage_logging), our_atom, severity, direction) tiles_processed++ if(tiles_processed >= increment) tiles_processed = 0 sleep(0.1 SECONDS) + QDEL_IN(src, 0.8 SECONDS) - spawn(8) - qdel(src) +/obj/effect/explosion/proc/explosion_damage_logging(atom/our_atom, severity, direction) + log_game("Explosion with power of [power] and falloff of [falloff] at [AREACOORD(src)]!") + if(is_mainship_level(z)) + message_admins("Explosion with power of [power] and falloff of [falloff] in [ADMIN_VERBOSEJMP(src)]!") + our_atom.ex_act(severity, direction) /atom/proc/get_explosion_resistance() return 0 @@ -260,18 +261,18 @@ explosion resistance exactly as much as their health if(!direction) direction = pick(GLOB.alldirs) - var/range = min(round(severity * 0.2, 1), 14) + var/range = min(round(severity * 0.07, 1), 14) if(!direction) range = round(range * 0.5, 1) if(range < 1) return - var/speed = max(range * 2.5, 4) + var/speed = max(range, 3) var/atom/target = get_ranged_target_turf(src, direction, range) if(range >= 2) - var/scatter = range / 4 * scatter_multiplier + var/scatter = range * 0.25 * scatter_multiplier var/scatter_x = rand(-scatter, scatter) var/scatter_y = rand(-scatter, scatter) target = locate(target.x + round(scatter_x, 1), target.y + round(scatter_y, 1), target.z) //Locate an adjacent turf. diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4bb47694b0a..728c761485b 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -955,7 +955,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. A.update_button_icon() /obj/item/proc/extinguish(atom/target, mob/user) - if (reagents.total_volume < 1) + if(reagents.total_volume < 1) to_chat(user, span_warning("\The [src]'s water reserves are empty.")) return @@ -964,91 +964,95 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. playsound(user.loc, 'sound/effects/extinguish.ogg', 52, 1, 7) - var/direction = get_dir(user,target) - - if(user.buckled && isobj(user.buckled) && !user.buckled.anchored ) - spawn(0) - var/obj/structure/bed/chair/C = null - if(istype(user.buckled, /obj/structure/bed/chair)) - C = user.buckled - var/obj/B = user.buckled - var/movementdirection = REVERSE_DIR(direction) - if(C) - C.propelled = 4 - B.Move(get_step(user,movementdirection), movementdirection) - sleep(0.1 SECONDS) - B.Move(get_step(user,movementdirection), movementdirection) - if(C) - C.propelled = 3 - sleep(0.1 SECONDS) - B.Move(get_step(user,movementdirection), movementdirection) - sleep(0.1 SECONDS) - B.Move(get_step(user,movementdirection), movementdirection) - if(C) - C.propelled = 2 - sleep(0.2 SECONDS) - B.Move(get_step(user,movementdirection), movementdirection) - if(C) - C.propelled = 1 - sleep(0.2 SECONDS) - B.Move(get_step(user,movementdirection), movementdirection) - if(C) - C.propelled = 0 - sleep(0.3 SECONDS) - B.Move(get_step(user,movementdirection), movementdirection) - sleep(0.3 SECONDS) - B.Move(get_step(user,movementdirection), movementdirection) - sleep(0.3 SECONDS) - B.Move(get_step(user,movementdirection), movementdirection) + var/direction = get_dir(user, target) - var/turf/T = get_turf(target) - var/turf/T1 = get_step(T,turn(direction, 90)) - var/turf/T2 = get_step(T,turn(direction, -90)) + if(user.buckled && isobj(user.buckled) && !user.buckled.anchored) + INVOKE_ASYNC(src, PROC_REF(propelle), target, user, direction) - var/list/the_targets = list(T,T1,T2) - - for(var/a=0, a<7, a++) - spawn(0) - var/obj/effect/particle_effect/water/W = new /obj/effect/particle_effect/water( get_turf(user) ) - var/turf/my_target = pick(the_targets) - var/datum/reagents/R = new/datum/reagents(5) - if(!W) - return - W.reagents = R - R.my_atom = WEAKREF(W) - if(!W || !src) - return - reagents.trans_to(W,1) - for(var/b=0, b<7, b++) - step_towards(W,my_target) - if(!(W?.reagents)) - return - W.reagents.reaction(get_turf(W)) - for(var/atom/atm in get_turf(W)) - if(!W) - return - if(!W.reagents) - break - W.reagents.reaction(atm) - if(isfire(atm)) - var/obj/fire/FF = atm - FF.set_fire(FF.burn_ticks - EXTINGUISH_AMOUNT) - continue - if(isliving(atm)) //For extinguishing mobs on fire - var/mob/living/M = atm - M.ExtinguishMob() - for(var/obj/item/clothing/mask/cigarette/C in M.contents) - if(C.item_state == C.icon_on) - C.die() - if(W.loc == my_target) - break - sleep(0.2 SECONDS) - qdel(W) + for(var/a = 0, a < 7, a++) + INVOKE_ASYNC(src, PROC_REF(extinguish_stage_two), target, user, direction) if(isspaceturf(user.loc)) user.inertia_dir = get_dir(target, user) step(user, user.inertia_dir) +/obj/item/proc/propelle(atom/target, mob/user, direction) + var/obj/structure/bed/chair/C = null + if(istype(user.buckled, /obj/structure/bed/chair)) + C = user.buckled + var/obj/B = user.buckled + var/movementdirection = REVERSE_DIR(direction) + if(C) + C.propelled = 4 + B.Move(get_step(user, movementdirection), movementdirection) + sleep(0.1 SECONDS) + B.Move(get_step(user, movementdirection), movementdirection) + if(C) + C.propelled = 3 + sleep(0.1 SECONDS) + B.Move(get_step(user, movementdirection), movementdirection) + sleep(0.1 SECONDS) + B.Move(get_step(user, movementdirection), movementdirection) + if(C) + C.propelled = 2 + sleep(0.2 SECONDS) + B.Move(get_step(user, movementdirection), movementdirection) + if(C) + C.propelled = 1 + sleep(0.2 SECONDS) + B.Move(get_step(user, movementdirection), movementdirection) + if(C) + C.propelled = 0 + sleep(0.3 SECONDS) + B.Move(get_step(user, movementdirection), movementdirection) + sleep(0.3 SECONDS) + B.Move(get_step(user, movementdirection), movementdirection) + sleep(0.3 SECONDS) + B.Move(get_step(user, movementdirection), movementdirection) + +/obj/item/proc/extinguish_stage_two(atom/target, mob/user, direction) + var/turf/T = get_turf(target) + var/turf/T1 = get_step(T, turn(direction, 90)) + var/turf/T2 = get_step(T, turn(direction, -90)) + + var/list/the_targets = list(T, T1, T2) + + var/obj/effect/particle_effect/water/W = new /obj/effect/particle_effect/water( get_turf(user) ) + var/turf/my_target = pick(the_targets) + var/datum/reagents/R = new/datum/reagents(5) + if(!W) + return + W.reagents = R + R.my_atom = WEAKREF(W) + if(!W || !src) + return + reagents.trans_to(W, 1) + for(var/b = 0, b < 7, b++) + step_towards(W,my_target) + if(!(W?.reagents)) + return + W.reagents.reaction(get_turf(W)) + for(var/atom/atm in get_turf(W)) + if(!W) + return + if(!W.reagents) + break + W.reagents.reaction(atm) + if(isfire(atm)) + var/obj/fire/FF = atm + FF.set_fire(FF.burn_ticks - EXTINGUISH_AMOUNT) + continue + if(isliving(atm)) //For extinguishing mobs on fire + var/mob/living/M = atm + M.ExtinguishMob() + for(var/obj/item/clothing/mask/cigarette/C in M.contents) + if(C.item_state != C.icon_on) + continue + C.die() + if(W.loc == my_target) + break + sleep(0.2 SECONDS) + qdel(W) // Called when a mob tries to use the item as a tool. // Handles most checks. @@ -1265,8 +1269,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. basic_spin_trick(arglist(arguments)) if(7) if(istype(double)) - spawn(0) - double.throw_catch_trick(user) + INVOKE_ASYNC(double, PROC_REF(throw_catch_trick), user) throw_catch_trick(user) else throw_catch_trick(user) diff --git a/code/game/objects/items/autopsy_scanner.dm b/code/game/objects/items/autopsy_scanner.dm index f4231813c6e..5a4ef605680 100644 --- a/code/game/objects/items/autopsy_scanner.dm +++ b/code/game/objects/items/autopsy_scanner.dm @@ -1,6 +1,7 @@ /obj/item/autopsy_scanner name = "autopsy scanner" desc = "Extracts information on wounds." + icon = 'icons/obj/items/surgery_tools.dmi' icon_state = "autopsy_scanner" flags_atom = CONDUCT w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/binoculars.dm b/code/game/objects/items/binoculars.dm index cc296f64e84..302d8b1e588 100644 --- a/code/game/objects/items/binoculars.dm +++ b/code/game/objects/items/binoculars.dm @@ -289,7 +289,7 @@ if(!targ_area) to_chat(user, "[icon2html(src, user)] [span_warning("No target detected!")]") else - var/obj/effect/overlay/temp/laser_target/OB/OBL = new (TU, 0, laz_name, S) + var/obj/effect/overlay/temp/laser_target/ob/OBL = new (TU, 0, laz_name, S) laser = OBL playsound(src, 'sound/effects/binoctarget.ogg', 35) if(!do_after(user, 15 SECONDS, NONE, user, BUSY_ICON_GENERIC)) diff --git a/code/game/objects/items/blink_drive.dm b/code/game/objects/items/blink_drive.dm index 4d5f031511e..69f65e79c99 100644 --- a/code/game/objects/items/blink_drive.dm +++ b/code/game/objects/items/blink_drive.dm @@ -19,14 +19,18 @@ light_color = LIGHT_COLOR_BLUE ///Number of teleport charges you currently have var/charges = 3 - ///True if you can use shift click/middle click to use it - var/selected = FALSE ///The timer for recharging the drive var/charge_timer ///The mob wearing the blink drive. Needed for item updates. var/mob/equipped_user + ///Controlling action + var/datum/action/ability/activable/item_toggle/blink_drive/blink_action COOLDOWN_DECLARE(blink_stability_cooldown) +/obj/item/blink_drive/Initialize(mapload) + . = ..() + blink_action = new(src) + /obj/item/blink_drive/update_icon() . = ..() equipped_user?.update_inv_back() @@ -52,68 +56,28 @@ . = ..() equipped_user = user if(slot == SLOT_BACK) - RegisterSignal(user, COMSIG_MOB_CLICK_ALT_RIGHT, PROC_REF(can_use)) - var/datum/action/item_action/toggle/action = new(src) - action.give_action(user) + blink_action.give_action(user) /obj/item/blink_drive/dropped(mob/user) . = ..() - UnregisterSignal(user, list(COMSIG_MOB_CLICK_ALT_RIGHT, COMSIG_MOB_MIDDLE_CLICK)) - UnregisterSignal(user, COMSIG_ITEM_EXCLUSIVE_TOGGLE) - selected = FALSE + blink_action.remove_action(user) equipped_user = null - LAZYCLEARLIST(actions) -/obj/item/blink_drive/ui_action_click(mob/user, datum/action/item_action/action) - if(selected) - UnregisterSignal(user, COMSIG_MOB_MIDDLE_CLICK) - action.set_toggle(FALSE) - UnregisterSignal(user, COMSIG_ITEM_EXCLUSIVE_TOGGLE) - else - RegisterSignal(user, COMSIG_MOB_MIDDLE_CLICK, PROC_REF(can_use)) - action.set_toggle(TRUE) - SEND_SIGNAL(user, COMSIG_ITEM_EXCLUSIVE_TOGGLE, user) - RegisterSignal(user, COMSIG_ITEM_EXCLUSIVE_TOGGLE, PROC_REF(unselect)) - selected = !selected /obj/item/blink_drive/apply_custom(mutable_appearance/standing, inhands, icon_used, state_used) . = ..() var/mutable_appearance/emissive_overlay = emissive_appearance(icon_used, "[state_used]_emissive") standing.overlays.Add(emissive_overlay) -///Signal handler for making it impossible to use middleclick to use the blink drive -/obj/item/blink_drive/proc/unselect(datum/source, mob/user) - SIGNAL_HANDLER - if(!selected) - return - selected = FALSE - UnregisterSignal(user, COMSIG_MOB_MIDDLE_CLICK) - UnregisterSignal(user, COMSIG_ITEM_EXCLUSIVE_TOGGLE) - - for(var/action in user.actions) - if(!istype(action, /datum/action/item_action)) - continue - var/datum/action/item_action/iaction = action - if(iaction?.holder_item == src) - iaction.set_toggle(FALSE) - -///Check if we can use the blink drive and give feedback to the user -/obj/item/blink_drive/proc/can_use(datum/source, atom/A) - SIGNAL_HANDLER - var/mob/living/carbon/human/human_user = usr - if(human_user.incapacitated() || human_user.lying_angle) - return - if(is_mainship_level(human_user.z)) - human_user.balloon_alert(human_user, "can't use here") - return - if(charges <= 0) - human_user.balloon_alert(human_user, "no charge") - playsound(src, 'sound/items/blink_empty.ogg', 25, 1) - return - INVOKE_ASYNC(src, PROC_REF(teleport), A, human_user) +/obj/item/blink_drive/ui_action_click(mob/user, datum/action/item_action/action, target) + teleport(target, user) ///Handles the actual teleportation /obj/item/blink_drive/proc/teleport(atom/A, mob/user) + if(charges <= 0) + user.balloon_alert(user, "no charge") + playsound(src, 'sound/items/blink_empty.ogg', 25, 1) + return var/turf/target_turf = get_turf(A) if(target_turf == user.loc) @@ -219,3 +183,19 @@ traits += "Shared use:
If the user has grabbed another mob when activating the drive, the grabbed mob will be teleported with them.
" . += jointext(traits, "
") + +/datum/action/ability/activable/item_toggle/blink_drive + name = "Use Blink Drive" + action_icon_state = "axe_sweep" + desc = "Teleport a short distance instantly." + keybind_flags = ABILITY_USE_STAGGERED|ABILITY_USE_BUSY + keybinding_signals = list(KEYBINDING_NORMAL = COMSIG_ITEM_TOGGLE_BLINKDRIVE) + +/datum/action/ability/activable/item_toggle/blink_drive/can_use_ability(silent, override_flags, selecting) + var/mob/living/carbon/carbon_owner = owner + if(carbon_owner.incapacitated() || carbon_owner.lying_angle) + return FALSE + if(is_mainship_level(carbon_owner.z)) + carbon_owner.balloon_alert(carbon_owner, "can't use here") + return FALSE + return ..() 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/explosives/grenades/marines.dm b/code/game/objects/items/explosives/grenades/marines.dm index 25041b934da..734b097ed05 100644 --- a/code/game/objects/items/explosives/grenades/marines.dm +++ b/code/game/objects/items/explosives/grenades/marines.dm @@ -517,8 +517,8 @@ light_color = LIGHT_COLOR_FLARE G_throw_sound = null var/fuel = 0 - var/lower_fuel_limit = 450 - var/upper_fuel_limit = 750 + var/lower_fuel_limit = 60 + var/upper_fuel_limit = 75 /obj/item/explosive/grenade/flare/dissolvability(acid_strength) return 2 diff --git a/code/game/objects/items/flashlight.dm b/code/game/objects/items/flashlight.dm index c5c1137cd34..a1dc5d91768 100644 --- a/code/game/objects/items/flashlight.dm +++ b/code/game/objects/items/flashlight.dm @@ -209,4 +209,5 @@ raillight_compatible = FALSE /obj/item/flashlight/lantern/turned_on + icon_state = "lantern-on" light_on = TRUE diff --git a/code/game/objects/items/jetpack.dm b/code/game/objects/items/jetpack.dm index 2ae8a9f9396..10f1f7ed39c 100644 --- a/code/game/objects/items/jetpack.dm +++ b/code/game/objects/items/jetpack.dm @@ -26,11 +26,12 @@ var/speed = 1 ///True when jetpack has flame overlay var/lit = FALSE - ///True if you can use shift click/middle click to use it - var/selected = FALSE + ///Controlling action + var/datum/action/ability/activable/item_toggle/jetpack/toggle_action /obj/item/jetpack_marine/Initialize(mapload) . = ..() + toggle_action = new(src) update_icon() /obj/item/jetpack_marine/examine(mob/user, distance, infix, suffix) @@ -45,40 +46,14 @@ /obj/item/jetpack_marine/equipped(mob/user, slot) . = ..() if(slot == SLOT_BACK) - var/datum/action/item_action/toggle/action = new(src) - action.give_action(user) + toggle_action.give_action(user) /obj/item/jetpack_marine/dropped(mob/user) . = ..() - UnregisterSignal(user, list(COMSIG_MOB_MIDDLE_CLICK, COMSIG_MOB_CLICK_ALT_RIGHT, COMSIG_ITEM_EXCLUSIVE_TOGGLE)) - selected = FALSE - LAZYCLEARLIST(actions) - -/obj/item/jetpack_marine/ui_action_click(mob/user, datum/action/item_action/action) - if(selected) - UnregisterSignal(user, list(COMSIG_MOB_MIDDLE_CLICK, COMSIG_MOB_CLICK_ALT_RIGHT, COMSIG_ITEM_EXCLUSIVE_TOGGLE)) - action.set_toggle(FALSE) - else - RegisterSignals(user, list(COMSIG_MOB_MIDDLE_CLICK, COMSIG_MOB_CLICK_ALT_RIGHT), PROC_REF(can_use_jetpack)) - SEND_SIGNAL(user, COMSIG_ITEM_EXCLUSIVE_TOGGLE, user) - RegisterSignal(user, COMSIG_ITEM_EXCLUSIVE_TOGGLE, PROC_REF(unselect)) - action.set_toggle(TRUE) - selected = !selected - -///Signal handler for making it impossible to use middleclick to use the jetpack -/obj/item/jetpack_marine/proc/unselect(datum/source, mob/user) - SIGNAL_HANDLER - if(!selected) - return - selected = FALSE - UnregisterSignal(user, list(COMSIG_MOB_MIDDLE_CLICK, COMSIG_MOB_CLICK_ALT_RIGHT, COMSIG_ITEM_EXCLUSIVE_TOGGLE)) - for(var/action in user.actions) - if (!istype(action, /datum/action/item_action)) - continue - var/datum/action/item_action/iaction = action - if(iaction?.holder_item == src) - iaction.set_toggle(FALSE) + toggle_action.remove_action(user) +/obj/item/jetpack_marine/ui_action_click(mob/user, datum/action/item_action/action, target) + use_jetpack(target, user) ///remove the flame overlay /obj/item/jetpack_marine/proc/reset_flame(mob/living/carbon/human/human_user) @@ -122,21 +97,6 @@ if(1.2 to INFINITY)//heavy armor with shield and tyr mk2 return 2 -///Check if we can use the jetpack and give feedback to the users -/obj/item/jetpack_marine/proc/can_use_jetpack(datum/source, atom/A) - SIGNAL_HANDLER - var/mob/living/carbon/human/human_user = usr - if(human_user.incapacitated() || human_user.lying_angle) - return - var/time_left = S_TIMER_COOLDOWN_TIMELEFT(src, COOLDOWN_JETPACK) - if(time_left) - balloon_alert(human_user, "[time_left * 0.1] seconds") - return - if(fuel_left < FUEL_USE) - balloon_alert(human_user, "No fuel") - return - INVOKE_ASYNC(src, PROC_REF(use_jetpack), A, human_user) - /obj/item/jetpack_marine/update_overlays() . = ..() switch(fuel_indicator) @@ -206,6 +166,28 @@ balloon_alert(user, "Refilled") update_icon() +/datum/action/ability/activable/item_toggle/jetpack + name = "Use jetpack" + action_icon_state = "axe_sweep" + desc = "Briefly fly using your jetpack." + keybind_flags = ABILITY_USE_STAGGERED|ABILITY_USE_BUSY + keybinding_signals = list(KEYBINDING_NORMAL = COMSIG_ITEM_TOGGLE_JETPACK) + use_state_flags = ABILITY_USE_STAGGERED + +/datum/action/ability/activable/item_toggle/jetpack/New(Target, obj/item/holder) + . = ..() + var/obj/item/jetpack_marine/jetpack = Target + cooldown_duration = jetpack.cooldown_time + +/datum/action/ability/activable/item_toggle/jetpack/can_use_ability(silent, override_flags, selecting) + var/mob/living/carbon/carbon_owner = owner + if(carbon_owner.incapacitated() || carbon_owner.lying_angle) + return FALSE + var/obj/item/jetpack_marine/jetpack = holder_item + if(jetpack.fuel_left < FUEL_USE) + carbon_owner.balloon_alert(carbon_owner, "No fuel") + return + return ..() /obj/item/jetpack_marine/heavy name = "heavy lift jetpack" diff --git a/code/game/objects/items/power_cells.dm b/code/game/objects/items/power_cells.dm index 27dd09a990a..1bfdc6d7f42 100644 --- a/code/game/objects/items/power_cells.dm +++ b/code/game/objects/items/power_cells.dm @@ -90,9 +90,11 @@ var/mob/living/carbon/C = user C.throw_mode_on() overlays += new/obj/effect/overlay/danger - spawn(rand(3,50)) - spark_system.start(src) - explode() + addtimer(CALLBACK(src, PROC_REF(delayed_explosion), spark_system), rand(3, 50)) + +/obj/item/cell/proc/delayed_explosion(datum/effect_system/spark_spread/spark_system) + spark_system.start(src) + explode() /obj/item/cell/attackby(obj/item/I, mob/user, params) . = ..() 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/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index 040a474a61f..0b941ab097e 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -545,21 +545,25 @@ icon_state = "donkpocket" filling_color = "#DEDEAB" list_reagents = list(/datum/reagent/consumable/nutriment = 4) - var/warm = 0 tastes = list("meat" = 2, "dough" = 2, "laziness" = 1) + var/warm = FALSE /obj/item/reagent_containers/food/snacks/donkpocket/proc/cooltime() - if(warm) - spawn( 4200 ) - if(!gc_destroyed) //not cdel'd - warm = 0 - reagents.del_reagent(/datum/reagent/medicine/tricordrazine) - name = "donk-pocket" + if(!warm) + return + addtimer(CALLBACK(src, PROC_REF(cool_down)), 7 MINUTES) + +/obj/item/reagent_containers/food/snacks/donkpocket/proc/cool_down() + if(QDELETED(src)) + return + warm = FALSE + reagents.del_reagent(/datum/reagent/medicine/tricordrazine) + name = "donk-pocket" /obj/item/reagent_containers/food/snacks/human + filling_color = "#D63C3C" var/hname = "" var/job = null - filling_color = "#D63C3C" /obj/item/reagent_containers/food/snacks/omelette name = "Omelette Du Fromage" diff --git a/code/game/objects/items/reagent_containers/spray.dm b/code/game/objects/items/reagent_containers/spray.dm index ddec7099e39..218ef32af4b 100644 --- a/code/game/objects/items/reagent_containers/spray.dm +++ b/code/game/objects/items/reagent_containers/spray.dm @@ -58,26 +58,26 @@ /obj/item/reagent_containers/spray/proc/Spray_at(atom/A) var/obj/effect/decal/chempuff/D = new/obj/effect/decal/chempuff(get_turf(src)) D.create_reagents(amount_per_transfer_from_this) - reagents.trans_to(D, amount_per_transfer_from_this, 1/spray_size) + reagents.trans_to(D, amount_per_transfer_from_this, 1 / spray_size) D.color = mix_color_from_reagents(D.reagents.reagent_list) - var/turf/A_turf = get_turf(A)//BS12 + INVOKE_ASYNC(src, PROC_REF(spray_step), A, D) +/obj/item/reagent_containers/spray/proc/spray_step(atom/our_atom, obj/effect/decal/chempuff/our_decal) + var/turf/A_turf = get_turf(our_atom)//BS12 var/spray_dist = spray_size - spawn(0) - for(var/i=0, i= reagents.maximum_volume && mode==SYRINGE_INJECT) - mode = SYRINGE_DRAW - update_icon() + if(!do_after(user, 0.5 SECONDS, NONE, target, BUSY_ICON_DANGER, BUSY_ICON_DANGER)) + return + var/trans = reagents.trans_to(target, amount_per_transfer_from_this) + if(iscarbon(target) && locate(/datum/reagent/blood) in reagents.reagent_list) + var/mob/living/carbon/C = target + C.inject_blood(src, amount_per_transfer_from_this) + else + reagents.reaction(target, INJECT) + trans = reagents.trans_to(target, amount_per_transfer_from_this) + to_chat(user, span_notice("You inject [trans] units of the solution. The syringe now contains [reagents.total_volume] units.")) + if(reagents.total_volume >= reagents.maximum_volume && mode == SYRINGE_INJECT) + mode = SYRINGE_DRAW + update_icon() //////////////////////////////////////////////////////////////////////////////// /// Syringes. END diff --git a/code/game/objects/items/scanners.dm b/code/game/objects/items/scanners.dm index a6b76dd3a19..e7eb800107a 100644 --- a/code/game/objects/items/scanners.dm +++ b/code/game/objects/items/scanners.dm @@ -53,13 +53,15 @@ REAGENT SCANNER if(O.invisibility == INVISIBILITY_MAXIMUM) O.invisibility = 0 O.alpha = 128 - spawn(10) - if(O && !O.gc_destroyed) - var/turf/U = O.loc - if(U.intact_tile) - O.invisibility = INVISIBILITY_MAXIMUM - O.alpha = 255 + addtimer(CALLBACK(src, PROC_REF(scan_for_items), O), 1 SECONDS) +/obj/item/t_scanner/proc/scan_for_items(obj/our_object) + if(our_object.gc_destroyed) + return + var/turf/U = our_object.loc + if(U.intact_tile) + our_object.invisibility = INVISIBILITY_MAXIMUM + our_object.alpha = 255 /obj/item/healthanalyzer name = "\improper HF2 health analyzer" @@ -499,6 +501,7 @@ REAGENT SCANNER /obj/item/reagent_scanner name = "reagent scanner" desc = "A hand-held reagent scanner which identifies chemical agents." + icon = 'icons/obj/device.dmi' icon_state = "spectrometer" item_state = "analyzer" w_class = WEIGHT_CLASS_SMALL @@ -511,6 +514,11 @@ REAGENT SCANNER var/details = FALSE var/recent_fail = FALSE +/obj/item/reagent_scanner/adv + name = "advanced reagent scanner" + icon_state = "adv_spectrometer" + details = TRUE + /obj/item/reagent_scanner/afterattack(obj/O, mob/user as mob, proximity) if(!proximity) return @@ -537,8 +545,3 @@ REAGENT SCANNER else recent_fail = TRUE to_chat(user, span_notice("Chemicals found: [dat]")) - -/obj/item/reagent_scanner/adv - name = "advanced reagent scanner" - icon_state = "adv_spectrometer" - details = TRUE diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 7c440bcb3f5..301d98394df 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -111,7 +111,7 @@ //Step two - washing..... it's actually in washing machine code. //Step three - drying -/obj/item/stack/sheet/wetleather/fire_act(burn_level) +/obj/item/stack/sheet/wetleather/fire_act(burn_level, flame_color) . = ..() if(!wetness) return 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 e0885293991..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." @@ -439,17 +469,18 @@ /obj/item/reagent_containers/food/snacks, ) -/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/auto_catch + name = "\improper M344 pattern ammo load rig" + icon_state = "autocathbelt" + desc = "The M344 is the modern load-bearing equipment of the TGMC. It consists of a modular belt with various clips. Allows you to quickly obtain and use equipment during combat operations." + storage_slots = 4 -/obj/item/storage/belt/marine/ar12/Initialize(mapload) +/obj/item/storage/belt/marine/auto_catch/Initialize(mapload, ...) . = ..() + AddComponent(/datum/component/magazine_catcher) + AddComponent(/datum/component/easy_restock) + +/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) @@ -457,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) @@ -466,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) @@ -475,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) @@ -484,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) @@ -493,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) @@ -502,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) @@ -511,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) @@ -520,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) @@ -529,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) @@ -538,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) @@ -547,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) @@ -556,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) @@ -565,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) @@ -581,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) @@ -596,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) @@ -605,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) @@ -614,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) @@ -623,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) @@ -632,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) @@ -641,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) @@ -650,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) @@ -659,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) @@ -668,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) @@ -721,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)) @@ -753,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) @@ -770,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) @@ -791,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) @@ -808,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) @@ -830,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) @@ -847,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) @@ -875,7 +883,7 @@ flags_atom = DIRLOCK -/obj/item/storage/belt/shotgun/martini/Initialize(mapload, ...) +/obj/item/storage/belt/shotgun/martini/Initialize(mapload) . = ..() update_icon() @@ -926,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) @@ -950,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) @@ -966,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) @@ -985,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) @@ -1031,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) @@ -1060,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/boxes.dm b/code/game/objects/items/storage/boxes.dm index 42d3ef926f5..99430fda68f 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1120,7 +1120,7 @@ spawn_type = /obj/item/explosive/grenade/smokebomb/drain closed_overlay = "grenade_box_overlay_drain" -/obj/item/storage/box/visual/grenade/drain +/obj/item/storage/box/visual/grenade/drain/sticky name = "\improper M45-T grenade box" desc = "A secure box holding 25 M40-T gas grenades. 100% safe to use around masked marines." spawn_number = 25 diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm index e5f6027560a..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, @@ -578,10 +579,13 @@ /obj/item/storage/holster/belt/pistol name = "generic pistol belt" desc = "A pistol belt that is not a revolver belt" + flags_equip_slot = ITEM_SLOT_BELT|ITEM_SLOT_SUITSTORE /obj/item/storage/holster/belt/pistol/Initialize(mapload, ...) . = ..() AddComponent(/datum/component/tac_reload_storage) + AddComponent(/datum/component/magazine_catcher) + AddComponent(/datum/component/easy_restock) /obj/item/storage/holster/belt/pistol/m4a3 name = "\improper M4A3 holster rig" @@ -1047,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/storage/storage.dm b/code/game/objects/items/storage/storage.dm index bd81a515a77..ae2a01f306a 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -565,6 +565,9 @@ if(Adjacent(user) && !isxeno(user)) open(user) +/obj/item/storage/CtrlShiftClick(mob/living/user) // Take left object in inventory + attempt_draw_object(user, TRUE) + ///Refills the storage from the refill_types item /obj/item/storage/proc/do_refill(obj/item/storage/refiller, mob/user) if(!length(refiller.contents)) diff --git a/code/game/objects/items/tools/kitchen_tools.dm b/code/game/objects/items/tools/kitchen_tools.dm index 19f7f062794..406675cbbf3 100644 --- a/code/game/objects/items/tools/kitchen_tools.dm +++ b/code/game/objects/items/tools/kitchen_tools.dm @@ -200,11 +200,7 @@ I.loc = M.loc carrying.Remove(I) if(isturf(I.loc)) - spawn() - for(var/i = 1, i <= rand(1,2), i++) - if(I) - step(I, pick(NORTH,SOUTH,EAST,WEST)) - sleep(rand(2,4)) + drop_tray_contents(I) var/mob/living/carbon/human/H = M ///////////////////////////////////// /Let's have this ready for later. @@ -339,7 +335,7 @@ overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer) /obj/item/tool/kitchen/tray/dropped(mob/user) - ..() + . = ..() var/mob/living/M for(M in src.loc) //to handle hand switching return @@ -356,8 +352,11 @@ carrying.Remove(I) if(!foundtable && isturf(loc)) // if no table, presume that the person just shittily dropped the tray on the ground and made a mess everywhere! - spawn() - for(var/i = 1, i <= rand(1,2), i++) - if(I) - step(I, pick(NORTH,SOUTH,EAST,WEST)) - sleep(rand(2,4)) + INVOKE_ASYNC(src, PROC_REF(drop_tray_contents), I) + +/obj/item/tool/kitchen/tray/proc/drop_tray_contents(obj/item/our_item) + for(var/i = 1, i <= rand(1, 2), i++) + if(!our_item) + break + step(our_item, pick(GLOB.cardinals)) + sleep(rand(2,4)) 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/tools/misc_tools.dm b/code/game/objects/items/tools/misc_tools.dm index b9b8df77ce6..d7da5ecba96 100644 --- a/code/game/objects/items/tools/misc_tools.dm +++ b/code/game/objects/items/tools/misc_tools.dm @@ -46,6 +46,8 @@ var/str = reject_bad_text(stripped_input(user, "Label text?", "Set label","", MAX_NAME_LEN)) if(!str) to_chat(user, span_notice("Invalid label.")) + on = !on + icon_state = "labeler[on]" return label = str to_chat(user, span_notice("You set the label text to '[str]'.")) diff --git a/code/game/objects/items/toys/toy_weapons.dm b/code/game/objects/items/toys/toy_weapons.dm index 589a30318b0..603f2f37005 100644 --- a/code/game/objects/items/toys/toy_weapons.dm +++ b/code/game/objects/items/toys/toy_weapons.dm @@ -106,7 +106,7 @@ if(!isturf(target.loc) || target == user) return if(flag) return - if (locate (/obj/structure/table, src.loc)) + if(locate (/obj/structure/table, src.loc)) return else if (bullets) var/turf/trg = get_turf(target) @@ -116,14 +116,17 @@ D.name = "foam dart" playsound(user.loc, 'sound/items/syringeproj.ogg', 15, 1) - for(var/i=0, i<6, i++) - if (D) - if(D.loc == trg) break - step_towards(D,trg) + for(var/i = 0, i < 6, i++) + if(D) + if(D.loc == trg) + break + step_towards(D, trg) for(var/mob/living/M in D.loc) - if(!istype(M,/mob/living)) continue - if(M == user) continue + if(!istype(M, /mob/living)) + continue + if(M == user) + continue visible_message(span_warning("[M] was hit by the foam dart!"), visible_message_flags = COMBAT_MESSAGE) new /obj/item/toy/crossbow_ammo(M.loc) qdel(D) @@ -137,10 +140,7 @@ sleep(0.1 SECONDS) - spawn(10) - if(D) - new /obj/item/toy/crossbow_ammo(D.loc) - qdel(D) + addtimer(CALLBACK(src, PROC_REF(convert_proj_to_item), D), 1 SECONDS) return else if(!bullets && isliving(user)) @@ -148,6 +148,12 @@ L.Paralyze(10 SECONDS) visible_message(span_warning("[user] realized they were out of ammo and starting scrounging for some!")) +/obj/item/toy/crossbow/proc/convert_proj_to_item(obj/effect/foam_dart_dummy/dart) + if(!dart) + return + new /obj/item/toy/crossbow_ammo(dart.loc) + qdel(dart) + /obj/item/toy/crossbow/attack(mob/M as mob, mob/user as mob) diff --git a/code/game/objects/items/toys/toys.dm b/code/game/objects/items/toys/toys.dm index b8718803ac1..6b867e46725 100644 --- a/code/game/objects/items/toys/toys.dm +++ b/code/game/objects/items/toys/toys.dm @@ -206,7 +206,7 @@ if (istype(A, /obj/item/storage/backpack )) return - else if (locate (/obj/structure/table, src.loc)) + else if (locate (/obj/structure/table, loc)) return else if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1) @@ -215,34 +215,35 @@ return else if (src.reagents.total_volume < 1) - src.empty = 1 + empty = 1 to_chat(user, span_notice("Your flower has run dry!")) return else - src.empty = 0 + empty = 0 var/obj/effect/decal/D = new/obj/effect/decal/(get_turf(src)) D.name = "water" D.icon = 'icons/obj/items/chemistry.dmi' D.icon_state = "chempuff" D.create_reagents(5) - src.reagents.trans_to(D, 1) - playsound(src.loc, 'sound/effects/spray3.ogg', 15, 1, 3) - - spawn(0) - for(var/i=0, i<1, i++) - step_towards(D,A) - D.reagents.reaction(get_turf(D)) - for(var/atom/T in get_turf(D)) - D.reagents.reaction(T) - if(ismob(T) && T:client) - to_chat(T:client, span_warning("[user] has sprayed you with water!")) - sleep(0.4 SECONDS) - qdel(D) + reagents.trans_to(D, 1) + playsound(loc, 'sound/effects/spray3.ogg', 15, 1, 3) + INVOKE_ASYNC(src, PROC_REF(spray_water), A, D, user) return +/obj/item/toy/waterflower/proc/spray_water(atom/our_atom, obj/effect/decal/our_decal, mob/user) + for(var/i = 0, i < 1, i++) + step_towards(our_decal, our_atom) + our_decal.reagents.reaction(get_turf(our_decal)) + for(var/atom/T in get_turf(our_decal)) + our_decal.reagents.reaction(T) + if(ismob(T) && T:client) + to_chat(T:client, span_warning("[user] has sprayed you with water!")) + sleep(0.4 SECONDS) + qdel(our_decal) + /obj/item/toy/waterflower/examine(mob/user) . = ..() . += "[reagents.total_volume] units of water left!" diff --git a/code/game/objects/items/weapons/blades.dm b/code/game/objects/items/weapons/blades.dm index 503d12d1b80..17381822bc1 100644 --- a/code/game/objects/items/weapons/blades.dm +++ b/code/game/objects/items/weapons/blades.dm @@ -30,10 +30,82 @@ edge = 1 w_class = WEIGHT_CLASS_NORMAL attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + hitsound = 'sound/weapons/bladeslice.ogg' + ///Special attack action granted to users with the right trait + var/datum/action/ability/activable/weapon_skill/sword_lunge/special_attack /obj/item/weapon/claymore/Initialize(mapload) . = ..() AddElement(/datum/element/scalping) + special_attack = new(src, force, penetration) + +/obj/item/weapon/claymore/Destroy() + QDEL_NULL(special_attack) + return ..() + +/obj/item/weapon/claymore/equipped(mob/user, slot) + . = ..() + if(user.skills.getRating(SKILL_MELEE_WEAPONS) > SKILL_MELEE_DEFAULT) + special_attack.give_action(user) + +/obj/item/weapon/claymore/dropped(mob/user) + . = ..() + special_attack?.remove_action(user) + +//Special attack +/datum/action/ability/activable/weapon_skill/sword_lunge + name = "Lunging strike" + action_icon_state = "sword_lunge" + desc = "A powerful leaping strike. Cannot stun." + ability_cost = 8 + cooldown_duration = 6 SECONDS + keybinding_signals = list( + KEYBINDING_NORMAL = COMSIG_WEAPONABILITY_SWORDLUNGE, + ) + +/datum/action/ability/activable/weapon_skill/sword_lunge/use_ability(atom/A) + var/mob/living/carbon/carbon_owner = owner + + RegisterSignal(carbon_owner, COMSIG_MOVABLE_MOVED, PROC_REF(movement_fx)) + RegisterSignals(carbon_owner, list(COMSIG_MOVABLE_IMPACT, COMSIG_MOVABLE_BUMP), PROC_REF(lunge_impact)) + RegisterSignal(carbon_owner, COMSIG_MOVABLE_POST_THROW, PROC_REF(charge_complete)) + + carbon_owner.visible_message(span_danger("[carbon_owner] charges towards \the [A]!")) + playsound(owner, "sound/effects/alien_tail_swipe2.ogg", 50, 0, 4) + carbon_owner.throw_at(A, 2, 1, carbon_owner) + succeed_activate() + add_cooldown() + +///Create an after image +/datum/action/ability/activable/weapon_skill/sword_lunge/proc/movement_fx() + SIGNAL_HANDLER + new /obj/effect/temp_visual/xenomorph/afterimage(get_turf(owner), owner) + +///Unregisters signals after lunge complete +/datum/action/ability/activable/weapon_skill/sword_lunge/proc/charge_complete() + SIGNAL_HANDLER + UnregisterSignal(owner, list(COMSIG_MOVABLE_IMPACT, COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_POST_THROW, COMSIG_MOVABLE_MOVED)) + +///Sig handler for atom impacts during lunge +/datum/action/ability/activable/weapon_skill/sword_lunge/proc/lunge_impact(datum/source, obj/target, speed) + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(do_lunge_impact), source, target) + charge_complete() + +///Actual effects of lunge impact +/datum/action/ability/activable/weapon_skill/sword_lunge/proc/do_lunge_impact(datum/source, obj/target) + var/mob/living/carbon/carbon_owner = source + if(isobj(target)) + var/obj/obj_victim = target + obj_victim.take_damage(damage, BRUTE, MELEE, TRUE, TRUE, get_dir(obj_victim, carbon_owner), penetration, carbon_owner) + if(!obj_victim.anchored && obj_victim.move_resist < MOVE_FORCE_VERY_STRONG) + obj_victim.knockback(carbon_owner, 1, 2) + else if(ishuman(target)) + var/mob/living/carbon/human/human_victim = target + human_victim.apply_damage(damage, BRUTE, BODY_ZONE_CHEST, MELEE, TRUE, TRUE, TRUE, penetration) + human_victim.adjust_stagger(1 SECONDS) + playsound(human_victim, "sound/weapons/wristblades_hit.ogg", 25, 0, 5) + shake_camera(human_victim, 2, 1) /obj/item/weapon/claymore/mercsword name = "combat sword" 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 3809ce7da60..c978f0e3c86 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -131,16 +131,14 @@ else wield(user) - ///////////OFFHAND/////////////// /obj/item/weapon/twohanded/offhand - w_class = WEIGHT_CLASS_HUGE - icon_state = "offhand" name = "offhand" + icon_state = "offhand" + w_class = WEIGHT_CLASS_HUGE flags_item = DELONDROP|TWOHANDED|WIELDED resistance_flags = RESIST_ALL - /obj/item/weapon/twohanded/offhand/Destroy() if(ismob(loc)) var/mob/user = loc @@ -215,24 +213,97 @@ penetration = 35 flags_equip_slot = ITEM_SLOT_BACK attack_speed = 15 + ///Special attack action granted to users with the right trait + var/datum/action/ability/activable/weapon_skill/axe_sweep/special_attack /obj/item/weapon/twohanded/fireaxe/som/Initialize(mapload) . = ..() AddComponent(/datum/component/shield, SHIELD_TOGGLE|SHIELD_PURE_BLOCKING, shield_cover = list(MELEE = 45, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0)) AddComponent(/datum/component/stun_mitigation, SHIELD_TOGGLE, shield_cover = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 60, BIO = 60, FIRE = 60, ACID = 60)) AddElement(/datum/element/strappable) + special_attack = new(src, force_wielded, penetration) + +/obj/item/weapon/twohanded/fireaxe/som/Destroy() + QDEL_NULL(special_attack) + return ..() /obj/item/weapon/twohanded/fireaxe/som/wield(mob/user) . = ..() if(!.) return toggle_item_bump_attack(user, TRUE) + if(user.skills.getRating(SKILL_MELEE_WEAPONS) > SKILL_MELEE_DEFAULT) + special_attack.give_action(user) /obj/item/weapon/twohanded/fireaxe/som/unwield(mob/user) . = ..() if(!.) return toggle_item_bump_attack(user, FALSE) + special_attack.remove_action(user) + +//Special attack +/datum/action/ability/activable/weapon_skill/axe_sweep + name = "Sweeping blow" + action_icon_state = "axe_sweep" + desc = "A powerful sweeping blow that hits foes in the direction you are facing. Cannot stun." + ability_cost = 10 + cooldown_duration = 6 SECONDS + keybinding_signals = list( + KEYBINDING_NORMAL = COMSIG_WEAPONABILITY_AXESWEEP, + ) + /// Used for particles. Holds the particles instead of the mob. See particle_holder for documentation. + var/obj/effect/abstract/particle_holder/particle_holder + +/datum/action/ability/activable/weapon_skill/axe_sweep/use_ability(atom/A) + succeed_activate() + add_cooldown() + var/mob/living/carbon/carbon_owner = owner + carbon_owner.Move(get_step_towards(carbon_owner, A), get_dir(src, A)) + carbon_owner.face_atom(A) + activate_particles(owner.dir) + playsound(owner, "sound/effects/alien_tail_swipe3.ogg", 50, 0, 5) + owner.visible_message(span_danger("[owner] Swing their weapon in a deadly arc!")) + + var/list/atom/movable/atoms_to_ravage = get_step(owner, owner.dir).contents.Copy() + atoms_to_ravage += get_step(owner, turn(owner.dir, -45)).contents + atoms_to_ravage += get_step(owner, turn(owner.dir, 45)).contents + for(var/atom/movable/victim AS in atoms_to_ravage) + if((victim.resistance_flags & INDESTRUCTIBLE)) + continue + if(!ishuman(victim)) + var/obj/obj_victim = victim + obj_victim.take_damage(damage, BRUTE, MELEE, TRUE, TRUE, get_dir(obj_victim, carbon_owner), penetration, carbon_owner) + if(!obj_victim.anchored && obj_victim.move_resist < MOVE_FORCE_VERY_STRONG) + obj_victim.knockback(owner, 1, 2) + continue + var/mob/living/carbon/human/human_victim = victim + if(human_victim.lying_angle) + continue + human_victim.apply_damage(damage, BRUTE, BODY_ZONE_CHEST, MELEE, TRUE, TRUE, TRUE, penetration) + human_victim.knockback(owner, 1, 2) + human_victim.adjust_stagger(1 SECONDS) + playsound(human_victim, "sound/weapons/wristblades_hit.ogg", 25, 0, 5) + shake_camera(human_victim, 2, 1) + +/// Handles the activation and deactivation of particles, as well as their appearance. +/datum/action/ability/activable/weapon_skill/axe_sweep/proc/activate_particles(direction) + particle_holder = new(get_turf(owner), /particles/ravager_slash) + QDEL_NULL_IN(src, particle_holder, 5) + particle_holder.particles.rotation += dir2angle(direction) + switch(direction) // There's no shared logic here because sprites are magical. + if(NORTH) // Gotta define stuff for each angle so it looks good. + particle_holder.particles.position = list(8, 4) + particle_holder.particles.velocity = list(0, 20) + if(EAST) + particle_holder.particles.position = list(3, -8) + particle_holder.particles.velocity = list(20, 0) + if(SOUTH) + particle_holder.particles.position = list(-9, -3) + particle_holder.particles.velocity = list(0, -20) + if(WEST) + particle_holder.particles.position = list(-4, 9) + particle_holder.particles.velocity = list(-20, 0) /* * Double-Bladed Energy Swords - Cheridan @@ -521,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/bioprinter.dm b/code/game/objects/machinery/bioprinter.dm index 9f6c94d5de6..a6b664d7f27 100644 --- a/code/game/objects/machinery/bioprinter.dm +++ b/code/game/objects/machinery/bioprinter.dm @@ -47,16 +47,17 @@ to_chat(user, span_notice("\The [src] is now printing the selected organ. Please hold.")) working = 1 update_icon() - spawn(products[choice][4]) //Time - var/new_organ = products[choice][1] - new new_organ(get_turf(src)) - working = 0 - visible_message("The bio/synthetic printer spits out a new organ.") - update_icon() - + addtimer(CALLBACK(src, PROC_REF(spawn_new_organ), choice), products[choice][4]) else to_chat(user, "There is not enough materials in the printer.") +/obj/machinery/bioprinter/proc/spawn_new_organ(choice) + var/new_organ = products[choice][1] + new new_organ(get_turf(src)) + working = 0 + visible_message("The bio/synthetic printer spits out a new organ.") + update_icon() + /obj/machinery/bioprinter/attackby(obj/item/I, mob/user, params) . = ..() if(istype(I, /obj/item/reagent_containers/glass/beaker)) diff --git a/code/game/objects/machinery/camera/tracking.dm b/code/game/objects/machinery/camera/tracking.dm index 78d1a899d5e..e562eea4256 100644 --- a/code/game/objects/machinery/camera/tracking.dm +++ b/code/game/objects/machinery/camera/tracking.dm @@ -95,40 +95,40 @@ to_chat(src, span_notice("Now tracking [target.get_visible_name()] on camera.")) + INVOKE_ASYNC(src, PROC_REF(start_tracking), target) + +/mob/living/silicon/ai/proc/start_tracking(mob/living/target) var/cameraticks = 0 - spawn(0) - while(cameraFollow == target) - if(cameraFollow == null) + while(cameraFollow == target) + if(cameraFollow == null) + return + + if(!target.can_track(src)) + tracking = TRUE + if(!cameraticks) + to_chat(src, span_warning("Target is not near any active cameras. Attempting to reacquire...")) + cameraticks++ + if(cameraticks > 9) + cameraFollow = null + to_chat(src, span_warning("Unable to reacquire, cancelling track...")) + tracking = FALSE return - - if(!target.can_track(src)) - tracking = TRUE - if(!cameraticks) - to_chat(src, span_warning("Target is not near any active cameras. Attempting to reacquire...")) - cameraticks++ - if(cameraticks > 9) - cameraFollow = null - to_chat(src, span_warning("Unable to reacquire, cancelling track...")) - tracking = FALSE - return - else - sleep(1 SECONDS) - continue - else - cameraticks = 0 - tracking = FALSE - - if(eyeobj) - eyeobj.setLoc(get_turf(target)) + sleep(1 SECONDS) + continue + else + cameraticks = 0 + tracking = FALSE - else - view_core() - cameraFollow = null - return + if(eyeobj) + eyeobj.setLoc(get_turf(target)) - sleep(1 SECONDS) + else + view_core() + cameraFollow = null + return + sleep(1 SECONDS) /proc/near_camera(mob/living/M) if(!isturf(M.loc)) diff --git a/code/game/objects/machinery/computer/area_air_control.dm b/code/game/objects/machinery/computer/area_air_control.dm index d609fb2bd46..4e22333b94a 100644 --- a/code/game/objects/machinery/computer/area_air_control.dm +++ b/code/game/objects/machinery/computer/area_air_control.dm @@ -87,20 +87,21 @@ var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber = locate(href_list["scrub"]) if(!validscrubber(scrubber)) - spawn(20) - status = "ERROR: Couldn't connect to scrubber! (timeout)" - connectedscrubbers -= scrubber - src.updateUsrDialog() + addtimer(CALLBACK(src, PROC_REF(send_error_message), scrubber), 2 SECONDS) return scrubber.on = text2num(href_list["toggle"]) scrubber.update_icon() -/obj/machinery/computer/area_atmos/proc/validscrubber( obj/machinery/portable_atmospherics/scrubber/huge/scrubber as obj ) - if(!isobj(scrubber) || get_dist(scrubber.loc, src.loc) > src.range || scrubber.loc.z != src.loc.z) - return 0 +/obj/machinery/computer/area_atmos/proc/send_error_message(obj/machinery/portable_atmospherics/scrubber/huge/scrubber) + status = "ERROR: Couldn't connect to scrubber! (timeout)" + connectedscrubbers -= scrubber + updateUsrDialog() - return 1 +/obj/machinery/computer/area_atmos/proc/validscrubber(obj/machinery/portable_atmospherics/scrubber/huge/scrubber as obj) + if(!isobj(scrubber) || get_dist(scrubber.loc, src.loc) > src.range || scrubber.loc.z != src.loc.z) + return FALSE + return TRUE /obj/machinery/computer/area_atmos/proc/scanscrubbers() connectedscrubbers = new() diff --git a/code/game/objects/machinery/computer/communications.dm b/code/game/objects/machinery/computer/communications.dm index 4571f2daceb..a720f27ed7d 100644 --- a/code/game/objects/machinery/computer/communications.dm +++ b/code/game/objects/machinery/computer/communications.dm @@ -98,11 +98,14 @@ if("announce") if(authenticated == 2) + if(TIMER_COOLDOWN_CHECK(usr, COOLDOWN_HUD_ORDER)) + to_chat(usr, span_warning("You've sent an announcement or message too recently!")) + return if(world.time < cooldown_message + COOLDOWN_COMM_MESSAGE) to_chat(usr, span_warning("Please allow at least [COOLDOWN_COMM_MESSAGE*0.1] second\s to pass between announcements.")) return FALSE - var/input = tgui_input_text(usr, "Please write a message to announce to the station crew.", "Priority Announcement", "",multiline = TRUE, encode = FALSE) + var/input = tgui_input_text(usr, "Please write a message to announce to the station crew.", "Priority Announcement", "",multiline = TRUE, encode = FALSE, max_length = 100) if(!input || !(usr in view(1,src)) || authenticated != 2 || world.time < cooldown_message + COOLDOWN_COMM_MESSAGE) return FALSE @@ -121,6 +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, CIC_ORDER_COOLDOWN) cooldown_message = world.time if("award") @@ -177,14 +181,8 @@ if(!SSevacuation.cancel_evacuation()) to_chat(usr, span_warning("You are unable to cancel the evacuation right now!")) return FALSE - - spawn(35)//some time between AI announcements for evac cancel and SD cancel. - if(SSevacuation.evac_status == EVACUATION_STATUS_STANDING_BY)//nothing changed during the wait - //if the self_destruct is active we try to cancel it (which includes lowering alert level to red) - if(!SSevacuation.cancel_self_destruct(1)) - //if SD wasn't active (likely canceled manually in the SD room), then we lower the alert level manually. - GLOB.marine_main_ship.set_security_level(SEC_LEVEL_RED, TRUE) //both SD and evac are inactive, lowering the security level. - + //some time between AI announcements for evac cancel and SD cancel. + addtimer(CALLBACK(src, PROC_REF(evacuation_cancel)), 3.5 SECONDS) log_game("[key_name(usr)] has canceled the emergency evacuation.") message_admins("[ADMIN_TPMONTY(usr)] has canceled the emergency evacuation.") return TRUE @@ -232,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 @@ -328,6 +326,14 @@ updateUsrDialog() +/obj/machinery/computer/communications/proc/evacuation_cancel() + if(SSevacuation.evac_status != EVACUATION_STATUS_STANDING_BY) // nothing changed during the wait + return + //if the self_destruct is active we try to cancel it (which includes lowering alert level to red) + if(SSevacuation.cancel_self_destruct(TRUE)) + return + //if SD wasn't active (likely canceled manually in the SD room), then we lower the alert level manually. + GLOB.marine_main_ship.set_security_level(SEC_LEVEL_RED, TRUE) //both SD and evac are inactive, lowering the security level. /obj/machinery/computer/communications/interact(mob/user) . = ..() 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/doors/airlock.dm b/code/game/objects/machinery/doors/airlock.dm index 6c7ac223929..229553d728e 100644 --- a/code/game/objects/machinery/doors/airlock.dm +++ b/code/game/objects/machinery/doors/airlock.dm @@ -55,8 +55,7 @@ if(!justzap) if(shock(user, 100)) justzap = TRUE - spawn(openspeed) - justzap = FALSE + addtimer(VARSET_CALLBACK(src, justzap, FALSE), openspeed) return else /*if(justzap)*/ return @@ -208,14 +207,16 @@ /obj/machinery/door/airlock/do_animate(animation) switch(animation) if("opening") - if(overlays) overlays.Cut() + if(overlays) + overlays.Cut() if(CHECK_BITFIELD(machine_stat, PANEL_OPEN)) spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond. flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking else flick("door_opening", src) if("closing") - if(overlays) overlays.Cut() + if(overlays) + overlays.Cut() if(CHECK_BITFIELD(machine_stat, PANEL_OPEN)) flick("o_door_closing", src) else diff --git a/code/game/objects/machinery/doors/door.dm b/code/game/objects/machinery/doors/door.dm index dcb34c58043..76bbe4f2c16 100644 --- a/code/game/objects/machinery/doors/door.dm +++ b/code/game/objects/machinery/doors/door.dm @@ -140,8 +140,7 @@ if(prob(40/severity)) if(secondsElectrified == 0) secondsElectrified = -1 - spawn(300) - secondsElectrified = 0 + addtimer(VARSET_CALLBACK(src, secondsElectrified, 0), 30 SECONDS) return ..() /obj/machinery/door/ex_act(severity) diff --git a/code/game/objects/machinery/doors/firedoor.dm b/code/game/objects/machinery/doors/firedoor.dm index eb41d9fb34c..236fa75ec29 100644 --- a/code/game/objects/machinery/doors/firedoor.dm +++ b/code/game/objects/machinery/doors/firedoor.dm @@ -136,10 +136,12 @@ to_chat(xeno_attacker, span_warning("\The [src] is welded shut.")) return FALSE if(density) //Make sure it's still closed - spawn(0) - open(1) - xeno_attacker.visible_message(span_danger("\The [xeno_attacker] pries \the [src] open."), \ - span_danger("We pry \the [src] open."), null, 5) + INVOKE_ASYNC(src, PROC_REF(xeno_open), xeno_attacker) + +/obj/machinery/door/firedoor/proc/xeno_open(mob/living/carbon/xenomorph/xeno_attacker) + open(TRUE) + xeno_attacker.visible_message(span_danger("\The [xeno_attacker] pries \the [src] open."), \ + span_danger("We pry \the [src] open."), null, 5) /obj/machinery/door/firedoor/attack_hand(mob/living/user) . = ..() @@ -187,14 +189,16 @@ close() if(needs_to_close) - spawn(50) - alarmed = FALSE - for(var/area/A in areas_added) //Just in case a fire alarm is turned off while the firedoor is going through an autoclose cycle - if(A.flags_alarm_state & ALARM_WARNING_FIRE || A.air_doors_activated) - alarmed = TRUE - if(alarmed) - nextstate = FIREDOOR_CLOSED - close() + addtimer(CALLBACK(src, PROC_REF(closing_process)), 5 SECONDS) + +/obj/machinery/door/firedoor/proc/closing_process() + var/alarmed = FALSE + for(var/area/A in areas_added) // Just in case a fire alarm is turned off while the firedoor is going through an autoclose cycle + if(A.flags_alarm_state & ALARM_WARNING_FIRE || A.air_doors_activated) + alarmed = TRUE + if(alarmed) + nextstate = FIREDOOR_CLOSED + close() /obj/machinery/door/firedoor/attackby(obj/item/I, mob/user, params) . = ..() diff --git a/code/game/objects/machinery/fire_alarm.dm b/code/game/objects/machinery/fire_alarm.dm index aab95bc9892..498d250372e 100644 --- a/code/game/objects/machinery/fire_alarm.dm +++ b/code/game/objects/machinery/fire_alarm.dm @@ -83,7 +83,7 @@ if(A.flags_alarm_state & ALARM_WARNING_FIRE) . += mutable_appearance(icon, "fire_o1") -/obj/machinery/firealarm/fire_act(burn_level) +/obj/machinery/firealarm/fire_act(burn_level, flame_color) if(!detecting) return alarm() @@ -128,13 +128,15 @@ to_chat(user, span_warning("You need 5 pieces of cable to do wire \the [src].")) return else if(iscrowbar(I)) - to_chat(user, "You pry out the circuit!") + to_chat(user, "You start prying out the circuit!") playsound(loc, 'sound/items/crowbar.ogg', 25, 1) - spawn(20) - new /obj/item/circuitboard/firealarm(loc) - electronics = null - buildstage = 0 - update_icon() + + if(!do_after(user, 2 SECONDS, NONE, src, BUSY_ICON_BUILD)) + return + new /obj/item/circuitboard/firealarm(loc) + electronics = null + buildstage = 0 + update_icon() if(0) if(istype(I, /obj/item/circuitboard/firealarm)) to_chat(user, "You insert the circuit!") diff --git a/code/game/objects/machinery/hologram.dm b/code/game/objects/machinery/hologram.dm index 9e02e1a1bd6..dbd45017db1 100644 --- a/code/game/objects/machinery/hologram.dm +++ b/code/game/objects/machinery/hologram.dm @@ -246,7 +246,6 @@ updateUsrDialog() -//do not allow AIs to answer calls or people will use it to meta the AI sattelite /obj/machinery/holopad/attack_ai(mob/living/silicon/ai/user) if (!istype(user)) return diff --git a/code/game/objects/machinery/kitchen/smartfridge.dm b/code/game/objects/machinery/kitchen/smartfridge.dm index a7b045e0a83..214015960b9 100644 --- a/code/game/objects/machinery/kitchen/smartfridge.dm +++ b/code/game/objects/machinery/kitchen/smartfridge.dm @@ -193,30 +193,27 @@ /obj/machinery/smartfridge/proc/throw_item() var/obj/throw_item = null - var/mob/living/target = locate() in view(7,src) + var/mob/living/target = locate() in view(7, src) if(!target) - return 0 + return FALSE - for (var/O in item_quants) + for(var/O in item_quants) if(item_quants[O] <= 0) //Try to use a record that actually has something to dump. continue item_quants[O]-- for(var/obj/T in contents) - if(T.name == O) - T.loc = src.loc - throw_item = T - break + if(T.name != O) + continue + T.loc = loc + throw_item = T + break break if(!throw_item) - return 0 - spawn(0) - throw_item.throw_at(target,16,3,src) - src.visible_message(span_danger("[src] launches [throw_item.name] at [target.name]!")) - return 1 - - - + return FALSE + INVOKE_ASYNC(throw_item, TYPE_PROC_REF(/atom/movable, throw_at), target, 16, 3, src) + visible_message(span_danger("[src] launches [throw_item.name] at [target.name]!")) + return TRUE /******************** * Smartfridge types diff --git a/code/game/objects/machinery/overwatch.dm b/code/game/objects/machinery/overwatch.dm index 7fbe86dbe85..9411f2a0039 100644 --- a/code/game/objects/machinery/overwatch.dm +++ b/code/game/objects/machinery/overwatch.dm @@ -8,7 +8,6 @@ #define SPOTLIGHT_COOLDOWN_DURATION 6 MINUTES #define SPOTLIGHT_DURATION 2 MINUTES - #define MESSAGE_SINGLE "Message this marine" #define ASL "Set or un-set as aSL" #define SWITCH_SQUAD "Switch this marine's squad" @@ -23,6 +22,9 @@ #define MESSAGE_SQUAD "Message all marines in a squad" #define SWITCH_SQUAD_NEAR "Move all nearby marines to a squad" +/// The maximum length we should use for sending messages with stuff like `message_member`, +/// `message_squad` etc. +#define MAX_COMMAND_MESSAGE_LENGTH 100 GLOBAL_LIST_EMPTY(active_orbital_beacons) GLOBAL_LIST_EMPTY(active_laser_targets) @@ -69,7 +71,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets) ///Overrides the minimap action minimap and marker flags var/map_flags = MINIMAP_FLAG_MARINE ///Ref of the lase that's had an OB warning mark placed on the minimap - var/obj/effect/overlay/temp/laser_target/OB/marked_lase + var/obj/effect/overlay/temp/laser_target/ob/marked_lase ///Static list of CIC radial options for the camera when clicking on a marine var/static/list/human_radial_options = list( MESSAGE_SINGLE = image(icon = 'icons/mob/radial.dmi', icon_state = "cic_message_single"), @@ -296,18 +298,8 @@ GLOBAL_LIST_EMPTY(active_cas_targets) state = OW_MAIN if("monitor") state = OW_MONITOR - if("monitoralpha_squad") - state = OW_MONITOR - current_squad = get_squad_by_id(ALPHA_SQUAD) - if("monitorbravo_squad") - state = OW_MONITOR - current_squad = get_squad_by_id(BRAVO_SQUAD) - if("monitorcharlie_squad") - state = OW_MONITOR - current_squad = get_squad_by_id(CHARLIE_SQUAD) - if("monitordelta_squad") - state = OW_MONITOR - current_squad = get_squad_by_id(DELTA_SQUAD) + if(href_list["squad_id"]) + current_squad = get_squad_by_id(href_list["squad_id"]) if("change_operator") if(operator != usr) if(current_squad) @@ -363,7 +355,10 @@ GLOBAL_LIST_EMPTY(active_cas_targets) attack_hand(operator) if("message") if(current_squad && operator == usr) - var/input = tgui_input_text(operator, "Please write a message to announce to the squad:", "Squad Message") + if(TIMER_COOLDOWN_CHECK(operator, COOLDOWN_HUD_ORDER)) + to_chat(operator, span_warning("You've sent an announcement or message too recently!")) + return + var/input = tgui_input_text(operator, "Please write a message to announce to the squad:", "Squad Message", max_length = MAX_COMMAND_MESSAGE_LENGTH) if(input) current_squad.message_squad(input, operator) //message, adds username if(issilicon(operator)) @@ -371,14 +366,18 @@ GLOBAL_LIST_EMPTY(active_cas_targets) visible_message(span_boldnotice("Message sent to all Marines of squad '[current_squad]'.")) if("sl_message") if(current_squad && operator == usr) - var/input = tgui_input_text(operator, "Please write a message to announce to the squad leader:", "SL Message") + if(TIMER_COOLDOWN_CHECK(operator, COOLDOWN_HUD_ORDER)) + to_chat(operator, span_warning("You've sent an announcement or message too recently!")) + 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, 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]'.")) visible_message(span_boldnotice("Message sent to Squad Leader [current_squad.squad_leader] of squad '[current_squad]'.")) if("set_primary") - var/input = tgui_input_text(operator, "What will be the squad's primary objective?", "Primary Objective") + var/input = tgui_input_text(operator, "What will be the squad's primary objective?", "Primary Objective", max_length = MAX_COMMAND_MESSAGE_LENGTH * 0.75) if( is_ic_filtered(input) || NON_ASCII_CHECK(input)) to_chat(operator, span_boldnotice("Message invalid. Check your message does not contain filtered words or characters.")) return @@ -388,7 +387,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets) to_chat(operator, span_boldnotice("Primary objective of squad '[current_squad]' set.")) visible_message(span_boldnotice("Primary objective of squad '[current_squad]' set.")) if("set_secondary") - var/input = tgui_input_text(operator, "What will be the squad's secondary objective?", "Secondary Objective") + var/input = tgui_input_text(operator, "What will be the squad's secondary objective?", "Secondary Objective", max_length = MAX_COMMAND_MESSAGE_LENGTH * 0.75) if( is_ic_filtered(input) || NON_ASCII_CHECK(input)) to_chat(operator, span_boldnotice("Message invalid. Check your message does not contain filtered words or characters.")) return @@ -468,13 +467,13 @@ GLOBAL_LIST_EMPTY(active_cas_targets) state = OW_MAIN if("use_cam") selected_target = locate(href_list["selected_target"]) + var/atom/cam_target = locate(href_list["cam_target"]) + if(!cam_target) + return + var/turf/cam_target_turf = get_turf(cam_target) + if(!cam_target_turf) + return if(!isAI(operator)) - var/atom/cam_target = locate(href_list["cam_target"]) - if(!cam_target) - return - var/turf/cam_target_turf = get_turf(cam_target) - if(!cam_target_turf) - return open_prompt(operator) eyeobj.setLoc(cam_target_turf) if(isliving(cam_target)) @@ -482,6 +481,14 @@ GLOBAL_LIST_EMPTY(active_cas_targets) track(L) else to_chat(operator, "[icon2html(src, operator)] [span_notice("Jumping to the latest available location of [cam_target].")]") + else + // If we are an AI + to_chat(operator, "[icon2html(src, operator)] [span_notice("Jumping to the latest available location of [cam_target].")]") + var/turf/T = get_turf(cam_target) + if(T) + var/mob/living/silicon/ai/recipientai = operator + recipientai.eyeobj.setLoc(T) + // operator.eyeobj.setLoc(get_turf(src)) updateUsrDialog() @@ -511,7 +518,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets) dat += "Squad Overwatch: [S.overwatch_officer.name]
" else dat += "Squad Overwatch: NONE
" - dat += "[S.name] Squad Monitor
" + dat += "[S.name] Squad Monitor
" dat += "----------------------
" dat += "Orbital Bombardment Control
" dat += "Current Cannon Status: " @@ -579,7 +586,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets) dat += "Squad Overwatch: [S.overwatch_officer.name]
" else dat += "Squad Overwatch: NONE
" - dat += "[S.name] Squad Monitor
" + dat += "[S.name] Squad Monitor
" if(OW_MONITOR)//Info screen. dat += get_squad_info() @@ -633,7 +640,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets) addtimer(CALLBACK(src, PROC_REF(do_fire_bombard), T, operator), 3.1 SECONDS) ///Lets anyone using an overwatch console know that an OB has just been lased -/obj/machinery/computer/camera_advanced/overwatch/proc/alert_lase(datum/source, obj/effect/overlay/temp/laser_target/OB/incoming_laser) +/obj/machinery/computer/camera_advanced/overwatch/proc/alert_lase(datum/source, obj/effect/overlay/temp/laser_target/ob/incoming_laser) SIGNAL_HANDLER if(!operator) return @@ -740,7 +747,9 @@ GLOBAL_LIST_EMPTY(active_cas_targets) /obj/machinery/computer/camera_advanced/overwatch/proc/message_member(mob/living/target, message, mob/living/carbon/human/sender) if(!target.client) return - target.play_screen_text("CIC MESSAGE FROM [sender.real_name]:
" + message, /atom/movable/screen/text/screen_text/command_order) + target.playsound_local(target, "sound/machines/dotprinter.ogg", 35) + to_chat(target, span_notice("New message from [sender.real_name]: [message]")) + target.play_screen_text("CIC MESSAGE FROM [sender.real_name]:
" + message, /atom/movable/screen/text/screen_text/command_order, "#32cd32") return TRUE ///Signal handler for radial menu @@ -751,14 +760,14 @@ GLOBAL_LIST_EMPTY(active_cas_targets) ///Quick-select radial menu for Overwatch /obj/machinery/computer/camera_advanced/overwatch/proc/do_radial(datum/source, atom/A, params) var/mob/living/carbon/human/human_target - var/obj/effect/overlay/temp/laser_target/OB/laser_target + var/obj/effect/overlay/temp/laser_target/ob/laser_target var/turf/turf_target var/choice if(ishuman(A)) human_target = A choice = show_radial_menu(source, human_target, human_radial_options, null, 48, null, FALSE, TRUE) - else if(istype(A, /obj/effect/overlay/temp/laser_target/OB)) + else if(istype(A, /obj/effect/overlay/temp/laser_target/ob)) laser_target = A choice = show_radial_menu(source, laser_target, bombardment_radial_options, null, 48, null, FALSE, TRUE) else @@ -767,8 +776,12 @@ GLOBAL_LIST_EMPTY(active_cas_targets) switch(choice) if(MESSAGE_SINGLE) - var/input = tgui_input_text(source, "Please write a message to announce to this marine:", "CIC Message") + if(TIMER_COOLDOWN_CHECK(operator, COOLDOWN_HUD_ORDER)) + to_chat(operator, span_warning("You've sent an announcement or message too recently!")) + 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, CIC_ORDER_COOLDOWN) if(ASL) if(human_target == human_target.assigned_squad.squad_leader) human_target.assigned_squad.demote_leader() @@ -789,7 +802,10 @@ GLOBAL_LIST_EMPTY(active_cas_targets) if(ORBITAL_SPOTLIGHT) attempt_spotlight(source, turf_target, params) if(MESSAGE_NEAR) - var/input = tgui_input_text(source, "Please write a message to announce to all marines nearby:", "CIC Proximity Message") + if(TIMER_COOLDOWN_CHECK(operator, COOLDOWN_HUD_ORDER)) + to_chat(operator, span_warning("You've sent an announcement or message too recently!")) + return + var/input = tgui_input_text(source, "Please write a message to announce to all marines nearby:", "CIC Proximity Message", max_length = MAX_COMMAND_MESSAGE_LENGTH) for(var/mob/living/carbon/human/target in GLOB.alive_human_list_faction[faction]) if(!target) return @@ -797,14 +813,19 @@ GLOBAL_LIST_EMPTY(active_cas_targets) continue message_member(target, input, source) message_member(source, input, source) + 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) switch(choice) if(MESSAGE_SQUAD) - var/input = tgui_input_text(source, "Please write a message to announce to the squad:", "Squad Message") + if(TIMER_COOLDOWN_CHECK(operator, COOLDOWN_HUD_ORDER)) + to_chat(operator, span_warning("You've sent an announcement or message too recently!")) + return + 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, 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) @@ -892,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 @@ -904,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 @@ -912,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) @@ -932,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 @@ -943,21 +960,35 @@ 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" - skill_name = SKILL_LEADERSHIP action_icon = 'icons/mob/order_icons.dmi' + skill_name = SKILL_LEADERSHIP 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 @@ -970,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 @@ -1000,8 +1035,8 @@ GLOBAL_LIST_EMPTY(active_cas_targets) name = "Show/Hide Order Options" skill_name = SKILL_LEADERSHIP skill_min = SKILL_LEAD_TRAINED - var/orders_visible = TRUE action_icon_state = "hide_order" + var/orders_visible = TRUE /datum/action/skill/toggle_orders/action_activate() var/mob/living/carbon/human/H = owner @@ -1010,17 +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) @@ -1189,3 +1221,4 @@ GLOBAL_LIST_EMPTY(active_cas_targets) #undef OW_MAIN #undef OW_MONITOR +#undef MAX_COMMAND_MESSAGE_LENGTH 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/telecomms/machines/allinone.dm b/code/game/objects/machinery/telecomms/machines/allinone.dm index db409ecf552..463d9c4550c 100644 --- a/code/game/objects/machinery/telecomms/machines/allinone.dm +++ b/code/game/objects/machinery/telecomms/machines/allinone.dm @@ -10,7 +10,6 @@ use_power = NO_POWER_USE idle_power_usage = 0 - /obj/machinery/telecomms/allinone/receive_signal(datum/signal/subspace/signal) if(!istype(signal) || signal.transmission_method != TRANSMISSION_SUBSPACE) // receives on subspace only return @@ -28,7 +27,9 @@ return signal.broadcast() - /obj/machinery/telecomms/allinone/attackby(obj/item/P, mob/user, params) if(ismultitool(P)) return attack_hand(user) + +/obj/machinery/telecomms/allinone/needs_power + use_power = IDLE_POWER_USE diff --git a/code/game/objects/machinery/telecomms/machines/broadcaster.dm b/code/game/objects/machinery/telecomms/machines/broadcaster.dm index 0e346ae40ee..14d399caaba 100644 --- a/code/game/objects/machinery/telecomms/machines/broadcaster.dm +++ b/code/game/objects/machinery/telecomms/machines/broadcaster.dm @@ -52,13 +52,14 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages if(!GLOB.message_delay) GLOB.message_delay = 1 - spawn(10) - GLOB.message_delay = 0 - GLOB.recentmessages = list() + addtimer(CALLBACK(src, PROC_REF(clear_recent_messages)), 1 SECONDS) /* --- Do a snazzy animation! --- */ flick("broadcaster_send", src) +/obj/machinery/telecomms/broadcaster/proc/clear_recent_messages() + GLOB.message_delay = 0 + GLOB.recentmessages = list() /obj/machinery/telecomms/broadcaster/Destroy() // In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore. @@ -67,20 +68,21 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages return ..() //Preset Broadcasters + +/obj/machinery/telecomms/broadcaster/preset + network = "tcommsat" + //--PRESET LEFT--// -/obj/machinery/telecomms/broadcaster/preset_left +/obj/machinery/telecomms/broadcaster/preset/left id = "Broadcaster A" - network = "tcommsat" autolinkers = list("broadcasterA") //--PRESET RIGHT--// -/obj/machinery/telecomms/broadcaster/preset_right +/obj/machinery/telecomms/broadcaster/preset/right id = "Broadcaster B" - network = "tcommsat" autolinkers = list("broadcasterB") //proper cicbackup broadcaster -/obj/machinery/telecomms/broadcaster/preset_right/cicbackup +/obj/machinery/telecomms/broadcaster/preset/right/cicbackup id = "Backup Broadcaster B" - network = "tcommsat" autolinkers = list("broadcasterB") diff --git a/code/game/objects/machinery/telecomms/machines/bus.dm b/code/game/objects/machinery/telecomms/machines/bus.dm index a37107c0282..585a4782ea9 100644 --- a/code/game/objects/machinery/telecomms/machines/bus.dm +++ b/code/game/objects/machinery/telecomms/machines/bus.dm @@ -48,42 +48,37 @@ //Preset Buses -/obj/machinery/telecomms/bus/preset_one - id = "Bus 1" +/obj/machinery/telecomms/bus/preset network = "tcommsat" + +/obj/machinery/telecomms/bus/preset/one + id = "Bus 1" freq_listening = list(FREQ_COMMAND, FREQ_CAS, FREQ_MEDICAL, FREQ_ENGINEERING, FREQ_REQUISITIONS) autolinkers = list("processor1", "command", "firesupport", "medical", "engineering", "requisitions") - -/obj/machinery/telecomms/bus/preset_two +/obj/machinery/telecomms/bus/preset/two id = "Bus 2" - network = "tcommsat" freq_listening = list(FREQ_PMC, FREQ_COLONIST, FREQ_USL, FREQ_DEATHSQUAD, FREQ_IMPERIAL, FREQ_SOM, FREQ_SECTOID, FREQ_ECHO, YAUT_FREQ) autolinkers = list("processor2", "ert") - -/obj/machinery/telecomms/bus/preset_three +/obj/machinery/telecomms/bus/preset/three id = "Bus 3" - network = "tcommsat" freq_listening = list(FREQ_ALPHA, FREQ_BRAVO, FREQ_CHARLIE, FREQ_DELTA, FREQ_ECHO) autolinkers = list("processor3", "alpha", "bravo", "charlie", "delta", "echo") - -/obj/machinery/telecomms/bus/preset_four +/obj/machinery/telecomms/bus/preset/four id = "Bus 4" - network = "tcommsat" freq_listening = list(FREQ_COMMON) autolinkers = list("processor4", "common") +/obj/machinery/telecomms/bus/preset/four/Initialize(mapload) + . = ..() + for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2) + freq_listening |= i + //proper cicbackup bus -/obj/machinery/telecomms/bus/preset_four/cicbackup +/obj/machinery/telecomms/bus/preset/four/cicbackup on = 0 id = "Backup Bus 4" - network = "tcommsat" freq_listening = list(FREQ_COMMON) autolinkers = list("processor4", "common") - -/obj/machinery/telecomms/bus/preset_four/Initialize(mapload) - . = ..() - for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2) - freq_listening |= i diff --git a/code/game/objects/machinery/telecomms/machines/processor.dm b/code/game/objects/machinery/telecomms/machines/processor.dm index d7e80c2683d..9079a8f1dfc 100644 --- a/code/game/objects/machinery/telecomms/machines/processor.dm +++ b/code/game/objects/machinery/telecomms/machines/processor.dm @@ -30,34 +30,27 @@ signal.data["slow"] += rand(5, 10) // slow the signal down relay_information(signal, signal.server_type) - //Preset Processors -/obj/machinery/telecomms/processor/preset_one - id = "Processor 1" +/obj/machinery/telecomms/processor/preset network = "tcommsat" - autolinkers = list("processor1") // processors are sort of isolated; they don't need backward links +/obj/machinery/telecomms/processor/preset/one + id = "Processor 1" + autolinkers = list("processor1")// processors are sort of isolated; they don't need backward links -/obj/machinery/telecomms/processor/preset_two +/obj/machinery/telecomms/processor/preset/two id = "Processor 2" - network = "tcommsat" autolinkers = list("processor2") - -/obj/machinery/telecomms/processor/preset_three +/obj/machinery/telecomms/processor/preset/three id = "Processor 3" - network = "tcommsat" autolinkers = list("processor3") - -/obj/machinery/telecomms/processor/preset_four +/obj/machinery/telecomms/processor/preset/four id = "Processor 4" - network = "tcommsat" autolinkers = list("processor4") //proper backup server for CIC -/obj/machinery/telecomms/processor/preset_four/cicbackup - on = 0 +/obj/machinery/telecomms/processor/preset/four/cicbackup + on = FALSE id = "Backup Processor 4" - network = "tcommsat" - autolinkers = list("processor4") diff --git a/code/game/objects/machinery/telecomms/machines/receiver.dm b/code/game/objects/machinery/telecomms/machines/receiver.dm index 9ce8cf277e1..896c67d51a0 100644 --- a/code/game/objects/machinery/telecomms/machines/receiver.dm +++ b/code/game/objects/machinery/telecomms/machines/receiver.dm @@ -41,38 +41,36 @@ return FALSE - //Preset Receivers + +/obj/machinery/telecomms/receiver/preset + network = "tcommsat" + //--PRESET LEFT--// -/obj/machinery/telecomms/receiver/preset_left + +/obj/machinery/telecomms/receiver/preset/left id = "Receiver A" - network = "tcommsat" autolinkers = list("receiverA") // link to relay freq_listening = list(FREQ_MEDICAL, FREQ_REQUISITIONS, FREQ_ALPHA, FREQ_BRAVO, FREQ_CHARLIE, FREQ_DELTA, FREQ_COMMAND, FREQ_ENGINEERING, FREQ_CAS, FREQ_PMC, FREQ_COLONIST, FREQ_USL, FREQ_DEATHSQUAD, FREQ_IMPERIAL, FREQ_SOM, FREQ_SECTOID, FREQ_ECHO, YAUT_FREQ) //--PRESET RIGHT--// -/obj/machinery/telecomms/receiver/preset_right +/obj/machinery/telecomms/receiver/preset/right id = "Receiver B" - network = "tcommsat" autolinkers = list("receiverB") // link to relay freq_listening = list(FREQ_COMMON) //proper cicbackup reciver -/obj/machinery/telecomms/receiver/preset_right/cicbackup - on = 0 +/obj/machinery/telecomms/receiver/preset/right/cicbackup + on = FALSE id = "Backup Receiver B" - network = "tcommsat" - autolinkers = list("receiverB") // link to relay - freq_listening = list(FREQ_COMMON) -/obj/machinery/telecomms/receiver/preset_right/som +/obj/machinery/telecomms/receiver/preset/right/som id = "Receiver B som" autolinkers = list("receiverB_som") // link to relay freq_listening = list(FREQ_SOM) - //Common and other radio frequencies for people to freely use -/obj/machinery/telecomms/receiver/preset_right/Initialize(mapload) +/obj/machinery/telecomms/receiver/preset/right/Initialize(mapload) . = ..() for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2) freq_listening |= i diff --git a/code/game/objects/machinery/telecomms/machines/server.dm b/code/game/objects/machinery/telecomms/machines/server.dm index 50e8a7cc3c6..3db65d8bd7e 100644 --- a/code/game/objects/machinery/telecomms/machines/server.dm +++ b/code/game/objects/machinery/telecomms/machines/server.dm @@ -16,7 +16,6 @@ var/list/log_entries = list() var/totaltraffic = 0 // gigabytes (if > 1024, divide by 1024 -> terrabytes) - /obj/machinery/telecomms/server/receive_information(datum/signal/subspace/vocal/signal, obj/machinery/telecomms/machine_from) // can't log non-vocal signals if(!istype(signal) || !signal.data["message"] || !is_freq_listening(signal)) @@ -53,72 +52,60 @@ if(!can_send) relay_information(signal, /obj/machinery/telecomms/broadcaster) - // Simple log entry datum /datum/comm_log_entry var/input_type = "Speech File" var/name = "data packet (#)" var/parameters = list() // copied from signal.data above - // Preset Servers /obj/machinery/telecomms/server/presets network = "tcommsat" - /obj/machinery/telecomms/server/presets/Initialize(mapload) . = ..() name = id - /obj/machinery/telecomms/server/presets/medical id = "Medical Server" freq_listening = list(FREQ_MEDICAL) autolinkers = list("medical") - /obj/machinery/telecomms/server/presets/requisitions id = "Requisitions Server" freq_listening = list(FREQ_REQUISITIONS) autolinkers = list("requisitions") - /obj/machinery/telecomms/server/presets/alpha id = "Alpha Server" freq_listening = list(FREQ_ALPHA) autolinkers = list("alpha") - /obj/machinery/telecomms/server/presets/bravo id = "Bravo Server" freq_listening = list(FREQ_BRAVO) autolinkers = list("bravo") - /obj/machinery/telecomms/server/presets/charlie id = "Charlie Server" freq_listening = list(FREQ_CHARLIE) autolinkers = list("charlie") - /obj/machinery/telecomms/server/presets/delta id = "Delta Server" freq_listening = list(FREQ_DELTA) autolinkers = list("delta") - /obj/machinery/telecomms/server/presets/command id = "Command Server" freq_listening = list(FREQ_COMMAND) autolinkers = list("command") - /obj/machinery/telecomms/server/presets/engineering id = "Engineering Server" freq_listening = list(FREQ_ENGINEERING) autolinkers = list("engineering") - /obj/machinery/telecomms/server/presets/cas id = "Fire Support Server" freq_listening = list(FREQ_CAS) 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 915a3ff5f5c..a1de33614e8 100644 --- a/code/game/objects/machinery/vending/marine_vending.dm +++ b/code/game/objects/machinery/vending/marine_vending.dm @@ -9,11 +9,15 @@ isshared = TRUE products = list( - "Rifles" = list( + "Винтовки" = list( /obj/item/weapon/gun/rifle/ar12 = -1, /obj/item/ammo_magazine/rifle/ar12 = -1, /obj/item/ammo_magazine/rifle/ar12/ap = -1, /obj/item/ammo_magazine/rifle/ar12/hp = -1, + /obj/item/weapon/gun/rifle/ar18 = -1, + /obj/item/ammo_magazine/rifle/ar18 = -1, + /obj/item/ammo_magazine/rifle/ar18/ap = -1, + /obj/item/ammo_magazine/rifle/ar18/hp = -1, /obj/item/weapon/gun/shotgun/pump/lever/repeater = -1, /obj/item/ammo_magazine/packet/p4570 = -1, /obj/item/weapon/gun/shotgun/double/martini = -1, @@ -28,21 +32,30 @@ /obj/item/ammo_magazine/rifle/ar21/ap = -1, /obj/item/ammo_magazine/rifle/ar21/hp = -1, ), - "SMGs" = list( + "Пистолеты-пулемёты" = list( /obj/item/weapon/gun/smg/vector = -1, /obj/item/ammo_magazine/smg/vector = -1, /obj/item/ammo_magazine/smg/vector/ap = -1, /obj/item/ammo_magazine/smg/vector/hp = -1, ), - "Marksman" = list( + "Снайперские винтовки" = list( /obj/item/weapon/gun/rifle/dmr37 = -1, /obj/item/ammo_magazine/rifle/dmr37 = -1, - /obj/item/weapon/gun/rifle/sniper/antimaterial/sr127= -1, + /obj/item/weapon/gun/rifle/sr127= -1, /obj/item/ammo_magazine/rifle/sr127 = -1, /obj/item/weapon/gun/rifle/sniper/svd = -1, /obj/item/ammo_magazine/sniper/svd = -1, ), - "Shotgun" = list( + "Энергетическое" = list( + /obj/item/cell/lasgun/lasrifle = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_rifle = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_sniper = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_mlaser = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/tesla = -1, + ), + "Дробовики" = list( /obj/item/weapon/gun/shotgun/pump/t35 = -1, /obj/item/weapon/gun/shotgun/combat/standardmarine = -1, /obj/item/weapon/gun/shotgun/combat/shq6 = -1, @@ -55,13 +68,17 @@ /obj/item/ammo_magazine/rifle/sh15_slug = -1, /obj/item/storage/holster/belt/ts34/full = 5, ), - "Machinegun" = list( + "Пулемёты" = list( /obj/item/weapon/gun/rifle/mg60 = -1, /obj/item/ammo_magazine/mg60 = -1, /obj/item/weapon/gun/mg27 = 5, /obj/item/ammo_magazine/mg27 = -1, + /obj/item/storage/box/hsg102 = 1, + /obj/item/weapon/gun/hmg08 = 1, + /obj/item/ammo_magazine/hmg08 = 5, + /obj/item/ammo_magazine/hmg08/small = 10, ), - "Melee" = list( + "Ближний бой" = list( /obj/item/weapon/combat_knife = -1, /obj/item/attachable/bayonetknife = -1, /obj/item/stack/throwing_knife = -1, @@ -71,12 +88,13 @@ /obj/item/storage/holster/blade/harvester/full = -1, /obj/item/weapon/twohanded/spear/tactical = -1, /obj/item/weapon/twohanded/spear/tactical/harvester = -1, + /obj/item/weapon/powerfist = -1, /obj/item/weapon/twohanded/glaive/harvester = -1, /obj/item/weapon/shield/riot/marine = 6, /obj/item/weapon/shield/riot/marine/deployable = 6, /obj/item/weapon/combat_knife/harvester = 12, ), - "Sidearm" = list( + "Пистолеты" = list( /obj/item/weapon/gun/revolver/r44 = 5, /obj/item/ammo_magazine/revolver/r44 = -1, /obj/item/storage/box/t500case = 10, @@ -93,7 +111,7 @@ /obj/item/weapon/gun/shotgun/double/derringer = -1, /obj/item/ammo_magazine/pistol/derringer = -1, ), - "Grenades" = list( + "Гранаты" = list( /obj/item/weapon/gun/grenade_launcher/single_shot = 4, /obj/item/weapon/gun/rifle/tx54 = 2, /obj/item/ammo_magazine/rifle/tx54 = 10, @@ -113,8 +131,8 @@ /obj/item/storage/box/m94 = -1, /obj/item/storage/box/m94/cas = -1, ), - "Specialized" = list( - /obj/item/cell/lasgun/lasrifle = -1, + "Специализированное" = list( + /obj/item/storage/box/crate/sentry = 4, /obj/item/weapon/gun/rifle/pepperball = 4, /obj/item/ammo_magazine/rifle/pepperball = -1, /obj/item/weapon/gun/flamer/big_flamer/marinestandard = 4, @@ -127,14 +145,7 @@ /obj/item/mortar_kit/knee = 4, /obj/item/mortal_shell/knee = 40, ), - "Heavy Weapons" = list( - /obj/item/storage/box/crate/sentry = 4, - /obj/item/storage/box/hsg102 = 1, - /obj/item/weapon/gun/hmg08 = 1, - /obj/item/ammo_magazine/hmg08 = 5, - /obj/item/ammo_magazine/hmg08/small = 10, - ), - "Attachments" = list( + "Модули" = list( /obj/item/attachable/bayonet = -1, /obj/item/attachable/compensator = -1, /obj/item/attachable/extended_barrel = -1, @@ -168,9 +179,10 @@ /obj/item/attachable/flamer_nozzle/wide = -1, /obj/item/attachable/flamer_nozzle/long = -1, ), - "Boxes" = list( + "Коробки" = list( /obj/item/ammo_magazine/packet/p9mm = -1, /obj/item/ammo_magazine/packet/p9mm/ap = -1, + /obj/item/ammo_magazine/packet/p9mm/hp = -1, /obj/item/ammo_magazine/packet/acp = -1, /obj/item/ammo_magazine/packet/acp/ap = -1, /obj/item/ammo_magazine/packet/acp/hp = -1, @@ -213,7 +225,7 @@ /obj/structure/closet/crate/mass_produced_crate/supply = 5, /obj/structure/closet/crate/mass_produced_crate/weapon = 5, ), - "Utility" = list( + "Утилити" = list( /obj/item/flashlight/combat = -1, /obj/item/weapon/gun/grenade_launcher/single_shot/flare/marine = -1, /obj/item/tool/shovel/etool = -1, @@ -229,17 +241,21 @@ ) seasonal_items = list( - SEASONAL_GUNS = "Seasonal", - SEASONAL_HEAVY = "Operational Weapons", + SEASONAL_GUNS = "Сезонное", + SEASONAL_HEAVY = "Сезонное тяжёлое вооружение", ) /obj/machinery/vending/weapon/crash products = list( - "Rifles" = list( + "Винтовки" = list( /obj/item/weapon/gun/rifle/ar12 = -1, /obj/item/ammo_magazine/rifle/ar12 = -1, /obj/item/ammo_magazine/rifle/ar12/ap = -1, /obj/item/ammo_magazine/rifle/ar12/hp = -1, + /obj/item/weapon/gun/rifle/ar18 = -1, + /obj/item/ammo_magazine/rifle/ar18 = -1, + /obj/item/ammo_magazine/rifle/ar18/ap = -1, + /obj/item/ammo_magazine/rifle/ar18/hp = -1, /obj/item/weapon/gun/shotgun/pump/lever/repeater = -1, /obj/item/ammo_magazine/packet/p4570 = -1, /obj/item/weapon/gun/shotgun/double/martini = -1, @@ -253,24 +269,34 @@ /obj/item/ammo_magazine/rifle/ar21 = -1, /obj/item/ammo_magazine/rifle/ar21/ap = -1, /obj/item/ammo_magazine/rifle/ar21/hp = -1, + /obj/item/weapon/gun/revolver/r44/coltrifle = -1, + /obj/item/ammo_magazine/revolver/rifle = -1, + ), - "SMGs" = list( + "Пистолеты-пулемёты" = list( /obj/item/weapon/gun/smg/vector = -1, /obj/item/ammo_magazine/smg/vector = -1, /obj/item/ammo_magazine/smg/vector/ap = -1, /obj/item/ammo_magazine/smg/vector/hp = -1, ), - "Marksman" = list( + "Энергетическое" = list( + /obj/item/cell/lasgun/lasrifle = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_rifle = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_sniper = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_mlaser = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/tesla = -1, + ), + "Снайперские винтовки" = list( /obj/item/weapon/gun/rifle/dmr37 = -1, /obj/item/ammo_magazine/rifle/dmr37 = -1, - /obj/item/weapon/gun/rifle/sniper/antimaterial/sr127= -1, + /obj/item/weapon/gun/rifle/sr127= -1, /obj/item/ammo_magazine/rifle/sr127 = -1, - /obj/item/weapon/gun/revolver/r44/coltrifle = -1, - /obj/item/ammo_magazine/revolver/rifle = -1, /obj/item/weapon/gun/rifle/sniper/svd = -1, /obj/item/ammo_magazine/sniper/svd = -1, ), - "Shotgun" = list( + "Дробовики" = list( /obj/item/weapon/gun/shotgun/pump/t35 = -1, /obj/item/weapon/gun/shotgun/combat/standardmarine = -1, /obj/item/weapon/gun/shotgun/combat/shq6 = -1, @@ -283,13 +309,13 @@ /obj/item/ammo_magazine/rifle/sh15_slug = -1, /obj/item/storage/holster/belt/ts34/full = 5, ), - "Machinegun" = list( + "Пулемёты" = list( /obj/item/weapon/gun/rifle/mg60 = -1, /obj/item/ammo_magazine/mg60 = -1, /obj/item/weapon/gun/mg27 = 5, /obj/item/ammo_magazine/mg27 = -1, ), - "Melee" = list( + "Ближний бой" = list( /obj/item/weapon/combat_knife = -1, /obj/item/attachable/bayonetknife = -1, /obj/item/stack/throwing_knife = -1, @@ -305,7 +331,7 @@ /obj/item/weapon/shield/riot/marine/deployable = 6, /obj/item/weapon/combat_knife/harvester = 12, ), - "Sidearm" = list( + "Пистолеты" = list( /obj/item/weapon/gun/revolver/r44 = 5, /obj/item/ammo_magazine/revolver/r44 = -1, /obj/item/storage/box/t500case = 10, @@ -322,22 +348,22 @@ /obj/item/weapon/gun/shotgun/double/derringer = -1, /obj/item/ammo_magazine/pistol/derringer = -1, ), - "Grenades" = list( + "Гранаты" = list( /obj/item/weapon/gun/grenade_launcher/single_shot = 4, /obj/item/explosive/grenade = 50, /obj/item/explosive/grenade/m15 = 10, /obj/item/explosive/grenade/sticky = 25, /obj/item/explosive/grenade/incendiary = 50, + /obj/item/explosive/grenade/sticky/trailblazer = 25, /obj/item/explosive/grenade/smokebomb/cloak = 25, /obj/item/explosive/grenade/smokebomb/drain = 10, /obj/item/explosive/grenade/mirage = 100, - /obj/item/storage/box/m94 = 200, - /obj/item/storage/box/m94/cas = 50, + /obj/item/storage/box/m94 = -1, + /obj/item/storage/box/m94/cas = -1, ), - "Specialized" = list( - /obj/item/cell/lasgun/lasrifle = -1, + "Специализированное" = list( /obj/item/weapon/gun/rifle/pepperball = 4, - /obj/item/ammo_magazine/rifle/pepperball = 40, + /obj/item/ammo_magazine/rifle/pepperball = -1, /obj/item/weapon/gun/flamer/big_flamer/marinestandard = 4, /obj/item/ammo_magazine/flamer_tank/large = 30, /obj/item/ammo_magazine/flamer_tank/large/G = 15, @@ -345,7 +371,7 @@ /obj/item/ammo_magazine/flamer_tank/water = -1, /obj/item/jetpack_marine = 3, ), - "Attachments" = list( + "Модули" = list( /obj/item/attachable/bayonet = -1, /obj/item/attachable/compensator = -1, /obj/item/attachable/extended_barrel = -1, @@ -379,7 +405,7 @@ /obj/item/attachable/flamer_nozzle/wide = -1, /obj/item/attachable/flamer_nozzle/long = -1, ), - "Boxes" = list( + "Коробки" = list( /obj/item/ammo_magazine/packet/p9mm = -1, /obj/item/ammo_magazine/packet/p9mm/ap = -1, /obj/item/ammo_magazine/packet/p9mm/hp = -1, @@ -394,6 +420,11 @@ /obj/item/ammo_magazine/packet/t500/slavs = -1, /obj/item/ammo_magazine/packet/p10x20mm = -1, /obj/item/ammo_magazine/packet/p10x24mm = -1, + /obj/item/ammo_magazine/packet/p10x24mm/ap = -1, + /obj/item/ammo_magazine/packet/p10x24mm/hp = -1, + /obj/item/ammo_magazine/packet/p10x25mm = -1, + /obj/item/ammo_magazine/packet/p10x25mm/ap = -1, + /obj/item/ammo_magazine/packet/p10x25mm/hp = -1, /obj/item/ammo_magazine/packet/groza = -1, /obj/item/ammo_magazine/packet/groza/ap = -1, /obj/item/ammo_magazine/packet/groza/hp = -1, @@ -401,6 +432,7 @@ /obj/item/ammo_magazine/packet/p10x26mm = -1, /obj/item/ammo_magazine/packet/p10x27mm = -1, /obj/item/ammo_magazine/packet/p86x70mm = -1, + /obj/item/ammo_magazine/packet/svd762x54mmR = -1, /obj/item/ammo_magazine/packet/standardautoshotgun = -1, /obj/item/ammo_magazine/packet/standardautoshotgun/flechette = -1, /obj/item/ammo_magazine/packet/p4570 = -1, @@ -419,7 +451,7 @@ /obj/structure/closet/crate/mass_produced_crate/supply = 5, /obj/structure/closet/crate/mass_produced_crate/weapon = 5, ), - "Utility" = list( + "Утилити" = list( /obj/item/flashlight/combat = -1, /obj/item/weapon/gun/grenade_launcher/single_shot/flare/marine = -1, /obj/item/tool/shovel/etool = -1, @@ -435,18 +467,22 @@ ) seasonal_items = list( - SEASONAL_GUNS = "Seasonal", + SEASONAL_GUNS = "Сезонное", ) /obj/machinery/vending/weapon/valhalla resistance_flags = INDESTRUCTIBLE use_power = NO_POWER_USE products = list( - "Rifles" = list( + "Винтовки" = list( /obj/item/weapon/gun/rifle/ar12 = -1, /obj/item/ammo_magazine/rifle/ar12 = -1, /obj/item/ammo_magazine/rifle/ar12/ap = -1, /obj/item/ammo_magazine/rifle/ar12/hp = -1, + /obj/item/weapon/gun/rifle/ar18 = -1, + /obj/item/ammo_magazine/rifle/ar18 = -1, + /obj/item/ammo_magazine/rifle/ar18/ap = -1, + /obj/item/ammo_magazine/rifle/ar18/hp = -1, /obj/item/weapon/gun/shotgun/pump/lever/repeater = -1, /obj/item/ammo_magazine/packet/p4570 = -1, /obj/item/weapon/gun/shotgun/double/martini = -1, @@ -461,33 +497,33 @@ /obj/item/ammo_magazine/rifle/ar21/ap = -1, /obj/item/ammo_magazine/rifle/ar21/hp = -1, ), - "Energy Weapons" = list( - /obj/item/cell/lasgun/lasrifle = -1, - /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_rifle = -1, - /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_sniper = -1, - /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine = -1, - /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_mlaser = -1, - /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol = -1, - /obj/item/weapon/gun/energy/lasgun/lasrifle/tesla = -1, - ), - "SMGs" = list( + "Пистолеты-пулемёты" = list( /obj/item/weapon/gun/smg/vector = -1, /obj/item/ammo_magazine/smg/vector = -1, /obj/item/ammo_magazine/smg/vector/ap = -1, /obj/item/ammo_magazine/smg/vector/hp = -1, /obj/item/ammo_magazine/smg/vector/incendiary = -1, ), - "Marksman" = list( + "Снайперские винтовки" = list( /obj/item/weapon/gun/rifle/dmr37 = -1, /obj/item/ammo_magazine/rifle/dmr37 = -1, - /obj/item/weapon/gun/rifle/sniper/antimaterial/sr127= -1, + /obj/item/weapon/gun/rifle/sr127= -1, /obj/item/ammo_magazine/rifle/sr127 = -1, /obj/item/weapon/gun/rifle/sniper/svd = -1, /obj/item/ammo_magazine/sniper/svd = -1, /obj/item/weapon/gun/revolver/r44/coltrifle = -1, /obj/item/ammo_magazine/revolver/rifle = -1, ), - "Shotgun" = list( + "Энергетическое" = list( + /obj/item/cell/lasgun/lasrifle = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_rifle = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_sniper = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_mlaser = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol = -1, + /obj/item/weapon/gun/energy/lasgun/lasrifle/tesla = -1, + ), + "Дробовики" = list( /obj/item/weapon/gun/shotgun/pump/t35 = -1, /obj/item/weapon/gun/shotgun/combat/standardmarine = -1, /obj/item/weapon/gun/shotgun/combat/shq6 = -1, @@ -501,13 +537,17 @@ /obj/item/weapon/gun/shotgun/double/marine = -1, /obj/item/storage/holster/belt/ts34/full = -1, ), - "Machinegun" = list( + "Пулемёты" = list( /obj/item/weapon/gun/rifle/mg60 = -1, /obj/item/ammo_magazine/mg60 = -1, /obj/item/weapon/gun/mg27 = -1, /obj/item/ammo_magazine/mg27 = -1, + /obj/item/storage/box/hsg102 = -1, + /obj/item/weapon/gun/hmg08 = -1, + /obj/item/ammo_magazine/hmg08 = -1, + /obj/item/ammo_magazine/hmg08/small = -1, ), - "Melee" = list( + "Ближний бой" = list( /obj/item/weapon/combat_knife = -1, /obj/item/attachable/bayonetknife = -1, /obj/item/stack/throwing_knife = -1, @@ -523,7 +563,7 @@ /obj/item/weapon/shield/riot/marine/deployable = -1, /obj/item/weapon/combat_knife/harvester = -1, ), - "Sidearm" = list( + "Пистолеты" = list( /obj/item/weapon/gun/revolver/r44 = -1, /obj/item/ammo_magazine/revolver/r44 = -1, /obj/item/storage/box/t500case = -1, @@ -540,7 +580,7 @@ /obj/item/weapon/gun/shotgun/double/derringer = -1, /obj/item/ammo_magazine/pistol/derringer = -1, ), - "Grenades" = list( + "Гранаты" = list( /obj/item/weapon/gun/grenade_launcher/single_shot = -1, /obj/item/weapon/gun/grenade_launcher/multinade_launcher/unloaded = -1, /obj/item/weapon/gun/rifle/tx54 = -1, @@ -563,7 +603,7 @@ /obj/item/storage/box/m94 = -1, /obj/item/storage/box/m94/cas = -1, ), - "Specialized" = list( + "Специализированное" = list( /obj/item/weapon/gun/rifle/pepperball = -1, /obj/item/ammo_magazine/rifle/pepperball = -1, /obj/item/weapon/gun/flamer/big_flamer/marinestandard = -1, @@ -575,15 +615,12 @@ /obj/item/mortar_kit/knee = 4, /obj/item/mortal_shell/knee = 40, ), - "Heavy Weapons" = list( + "Тяжёлое вооружение" = list( /obj/structure/closet/crate/mortar_ammo/mortar_kit = -1, /obj/structure/closet/crate/mortar_ammo/howitzer_kit = -1, /obj/structure/largecrate/supply/weapons/at36 = -1, /obj/item/storage/box/crate/sentry = -1, /obj/item/sentry_upgrade_kit = -1, - /obj/item/storage/box/hsg102 = -1, - /obj/item/weapon/gun/hmg08 = -1, - /obj/item/ammo_magazine/hmg08 = -1, /obj/item/storage/holster/backholster/rpg/full = -1, /obj/item/ammo_magazine/rocket/recoilless = -1, /obj/item/ammo_magazine/rocket/recoilless/light = -1, @@ -592,7 +629,7 @@ /obj/item/ammo_magazine/rocket/recoilless/smoke = -1, /obj/item/ammo_magazine/rocket/recoilless/plasmaloss = -1, ), - "Attachments" = list( + "Модули" = list( /obj/item/attachable/bayonet = -1, /obj/item/attachable/compensator = -1, /obj/item/attachable/extended_barrel = -1, @@ -626,7 +663,7 @@ /obj/item/attachable/flamer_nozzle/wide = -1, /obj/item/attachable/flamer_nozzle/long = -1, ), - "Boxes" = list( + "Коробки" = list( /obj/item/ammo_magazine/packet/p9mm = -1, /obj/item/ammo_magazine/packet/p9mm/ap = -1, /obj/item/ammo_magazine/packet/p9mm/hp = -1, @@ -672,7 +709,7 @@ /obj/structure/closet/crate/mass_produced_crate/supply = -1, /obj/structure/closet/crate/mass_produced_crate/weapon = -1, ), - "Utility" = list( + "Утилити" = list( /obj/item/flashlight/combat = -1, /obj/item/weapon/gun/grenade_launcher/single_shot/flare/marine = -1, /obj/item/tool/shovel/etool = -1, @@ -760,11 +797,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/machinery/vending/vending.dm b/code/game/objects/machinery/vending/vending.dm index d26262b8afe..f3adae81c46 100644 --- a/code/game/objects/machinery/vending/vending.dm +++ b/code/game/objects/machinery/vending/vending.dm @@ -480,10 +480,8 @@ vend_ready = 0 //One thing at a time!! R.amount-- - if(((src.last_reply + (src.vend_delay + 200)) <= world.time) && src.vend_reply) - spawn(0) - src.speak(src.vend_reply) - src.last_reply = world.time + if(((last_reply + (src.vend_delay + 200)) <= world.time) && vend_reply) + INVOKE_ASYNC(src, PROC_REF(speak_on_vend)) var/obj/item/new_item = release_item(R, vend_delay) @@ -491,6 +489,10 @@ new_item.on_vend(user, faction, fill_container = TRUE) vend_ready = 1 +/obj/machinery/vending/proc/speak_on_vend() + speak(vend_reply) + last_reply = world.time + /obj/machinery/vending/proc/release_item(datum/vending_product/R, delay_vending = 0, dump_product = 0) if(delay_vending) if(powered(power_channel)) @@ -649,6 +651,7 @@ var/obj/item/storage/S = item_to_stock.loc S.remove_from_storage(item_to_stock, user.loc, user) + item_to_stock.removed_from_inventory(user) qdel(item_to_stock) if(amount >= 0) //R negative means infinite item, no need to restock @@ -778,8 +781,7 @@ break if (!throw_item) return FALSE - spawn(0) - throw_item.throw_at(target, 16, 3, src) + INVOKE_ASYNC(throw_item, TYPE_PROC_REF(/atom/movable, throw_at), target, 16, 3, src) src.visible_message(span_warning("[src] launches [throw_item.name] at [target]!")) . = TRUE diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 206d0fc7001..385b963e518 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -68,7 +68,7 @@ return FALSE if(QDELETED(src)) return FALSE - fire_act(LAVA_BURN_LEVEL) + fire_act(LAVA_BURN_LEVEL, FLAME_COLOR_RED) return TRUE /obj/hitby(atom/movable/AM, speed = 5) diff --git a/code/game/objects/structures/barricade.dm b/code/game/objects/structures/barricade.dm index e18c35d6c0a..41229db0680 100644 --- a/code/game/objects/structures/barricade.dm +++ b/code/game/objects/structures/barricade.dm @@ -151,18 +151,20 @@ return ..() /obj/structure/barricade/ex_act(severity, direction) + if(QDELETED(src)) + return for(var/obj/structure/barricade/barricade in get_step(src, dir)) //discourage double-stacking barricades by removing health from opposing barricade - if(barricade.dir == REVERSE_DIR(dir)) - spawn(1) - if(barricade) - barricade.ex_act(severity, direction) + if(barricade.dir != REVERSE_DIR(dir)) + continue + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, ex_act), severity, direction) take_damage(severity, BRUTE, BOMB, attack_dir = direction) update_icon() /obj/structure/barricade/on_explosion_destruction(severity, direction) create_shrapnel(get_turf(src), rand(2,5), direction, shrapnel_type = /datum/ammo/bullet/shrapnel/light) if(prob(50)) // no message spam pls - visible_message(span_warning("[src] blows apart in the explosion, sending shards flying!")) + return + visible_message(span_warning("[src] blows apart in the explosion, sending shards flying!")) /obj/structure/barricade/get_explosion_resistance(direction) if(!density || direction == turn(dir, 90) || direction == turn(dir, -90)) diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index 69449f3b73a..2d3beb7b887 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -2,17 +2,18 @@ /obj/structure/closet/fireaxecabinet name = "Fire Axe Cabinet" desc = "There is small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if." - var/obj/item/weapon/twohanded/fireaxe/fireaxe = new/obj/item/weapon/twohanded/fireaxe icon_state = "fireaxe1000" icon_closed = "fireaxe1000" icon_opened = "fireaxe1100" anchored = TRUE density = FALSE - var/localopened = 0 //Setting this to keep it from behaviouring like a normal closet and obstructing movement in the map. -Agouri opened = 1 - var/hitstaken = 0 locked = TRUE + var/hitstaken = 0 + ///Setting this to keep it from behaviouring like a normal closet and obstructing movement in the map. -Agouri + var/localopened = 0 var/smashed = 0 + var/obj/item/weapon/twohanded/fireaxe/fireaxe = new/obj/item/weapon/twohanded/fireaxe /obj/structure/closet/fireaxecabinet/attackby(obj/item/O, mob/user) //Marker -Agouri //..() //That's very useful, Erro @@ -21,7 +22,7 @@ if(fireaxe) hasaxe = 1 - if (locked) + if(locked) if(ismultitool(O)) to_chat(user, span_warning("Resetting circuitry...")) playsound(user, 'sound/machines/lockreset.ogg', 25, 1) @@ -32,65 +33,62 @@ return else if(!(O.flags_item & NOBLUDGEON) && O.force) var/obj/item/W = O - if(src.smashed || src.localopened) + if(smashed || localopened) if(localopened) localopened = 0 icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]closing" - spawn(10) update_icon() + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 1 SECONDS) return else playsound(user, 'sound/effects/Glasshit.ogg', 25, 1) //We don't want this playing every time if(W.force < 15) to_chat(user, span_notice("The cabinet's protective glass glances off the hit.")) else - src.hitstaken++ - if(src.hitstaken == 4) + hitstaken++ + if(hitstaken == 4) playsound(user, 'sound/effects/glassbr3.ogg', 50, 1) //Break cabinet, receive goodies. Cabinet's fucked for life after that. - src.smashed = 1 - src.locked = 0 - src.localopened = 1 + smashed = 1 + locked = 0 + localopened = 1 update_icon() return - if (istype(O, /obj/item/weapon/twohanded/fireaxe) && src.localopened) + if(istype(O, /obj/item/weapon/twohanded/fireaxe) && localopened) if(!fireaxe) if(O.flags_item & WIELDED) to_chat(user, span_warning("Unwield the axe first.")) return fireaxe = O user.drop_held_item() - src.contents += O - to_chat(user, span_notice("You place the fire axe back in the [src.name].")) + contents += O + to_chat(user, span_notice("You place the fire axe back in the [name].")) update_icon() else - if(src.smashed) + if(smashed) return else localopened = !localopened if(localopened) icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]opening" - spawn(10) - update_icon() + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 1 SECONDS) else icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]closing" - spawn(10) - update_icon() + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 1 SECONDS) else - if(src.smashed) + if(smashed) return if(ismultitool(O)) if(localopened) localopened = 0 icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]closing" - spawn(10) - update_icon() + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 1 SECONDS) return else to_chat(user, span_warning("Resetting circuitry...")) sleep(5 SECONDS) - src.locked = 1 + locked = 1 to_chat(user, span_notice("You re-enable the locking modules.")) playsound(user, 'sound/machines/lockenable.ogg', 25, 1) - if(do_after(user,20, NONE, src, BUSY_ICON_BUILD)) + if(do_after(user, 20, NONE, src, BUSY_ICON_BUILD)) locked = TRUE to_chat(user, " You re-enable the locking modules.") return @@ -98,22 +96,17 @@ localopened = !localopened if(localopened) icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]opening" - spawn(10) - update_icon() + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 1 SECONDS) else icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]closing" - spawn(10) - update_icon() - - - + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 1 SECONDS) /obj/structure/closet/fireaxecabinet/attack_hand(mob/user as mob) var/hasaxe = 0 if(fireaxe) hasaxe = 1 if(!ishuman(user)) return - if(src.locked) + if(locked) to_chat(user, span_warning("The cabinet won't budge!")) return if(localopened) @@ -123,38 +116,34 @@ to_chat(user, span_notice("You take the fire axe from the [name].")) update_icon() else - if(src.smashed) + if(smashed) return else localopened = !localopened if(localopened) - src.icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]opening" - spawn(10) - update_icon() + icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]opening" + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 1 SECONDS) else - src.icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]closing" - spawn(10) - update_icon() + icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]closing" + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 1 SECONDS) else - localopened = !localopened //I'm pretty sure we don't need an if(src.smashed) in here. In case I'm wrong and it fucks up teh cabinet, **MARKER**. -Agouri + localopened = !localopened //I'm pretty sure we don't need an if(smashed) in here. In case I'm wrong and it fucks up teh cabinet, **MARKER**. -Agouri if(localopened) - src.icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]opening" - spawn(10) - update_icon() + icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]opening" + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 1 SECONDS) else - src.icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]closing" - spawn(10) - update_icon() + icon_state = "fireaxe[hasaxe][localopened][hitstaken][smashed]closing" + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 1 SECONDS) /obj/structure/closet/fireaxecabinet/verb/toggle_openness() //nice name, huh? HUH?! -Erro //YEAH -Agouri set name = "Open/Close" set category = "Object" if (locked || smashed) - if(src.locked) + if(locked) to_chat(usr, span_warning("The cabinet won't budge!")) - else if(src.smashed) + else if(smashed) to_chat(usr, span_notice("The protective glass is broken!")) return @@ -165,22 +154,22 @@ set name = "Remove Fire Axe" set category = "Object" - if (istype(usr, /mob/living/carbon/xenomorph)) + if(istype(usr, /mob/living/carbon/xenomorph)) return - if (localopened) + if(localopened) if(fireaxe) usr.put_in_hands(fireaxe) fireaxe = null to_chat(usr, span_notice("You take the Fire axe from the [name].")) else - to_chat(usr, span_notice("The [src.name] is empty.")) + to_chat(usr, span_notice("The [name] is empty.")) else - to_chat(usr, span_notice("The [src.name] is closed.")) + to_chat(usr, span_notice("The [name] is closed.")) update_icon() /obj/structure/closet/fireaxecabinet/attack_ai(mob/user as mob) - if(src.smashed) + if(smashed) to_chat(user, span_warning("The security of the cabinet is compromised.")) return else diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 66933b9cb5f..cc9cbb66fc5 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -160,6 +160,28 @@ icon_opened = "open_medical" icon_closed = "closed_medical" +/obj/structure/closet/crate/mounted + name = "mounted weapon crate" + desc = "A robust crate containing stationary weapons." + icon_state = "closed_mounted_weapon" + icon_opened = "open_mounted_weapon" + icon_closed = "closed_mounted_weapon" + +/obj/structure/closet/crate/smart + name = "smart weapon crate" + desc = "A robust crate containing high-tech smartgun weapons and ammunitions." + icon_state = "closed_smart" + overlay_welded = "welded_smart" + icon_opened = "open_smart" + icon_closed = "closed_smart" + +/obj/structure/closet/crate/operations + name = "operations crate" + desc = "A robust crate containing support stuff." + icon_state = "close_operate" + icon_opened = "open_operate" + icon_closed = "close_operate" + /obj/structure/closet/crate/plastic name = "plastic crate" desc = "A rectangular plastic crate." diff --git a/code/game/objects/structures/crates_lockers/secure_crates.dm b/code/game/objects/structures/crates_lockers/secure_crates.dm index ac69840f78c..97483d65894 100644 --- a/code/game/objects/structures/crates_lockers/secure_crates.dm +++ b/code/game/objects/structures/crates_lockers/secure_crates.dm @@ -32,7 +32,6 @@ /obj/structure/closet/crate/secure/can_open() return !locked - /obj/structure/closet/crate/secure/verb/verb_togglelock() set src in oview(1) // One square distance set category = "Object" @@ -42,28 +41,30 @@ return togglelock(usr) - /obj/structure/closet/crate/secure/emp_act(severity) for(var/obj/O in src) O.emp_act(severity) - if(!broken && !opened && prob(50/severity)) + if(!broken && !opened && prob(50 / severity)) if(!locked) locked = 1 else overlays.Cut() overlays += sparks - spawn(6) overlays -= sparks //Tried lots of stuff but nothing works right. so i have to use this *sadface* + addtimer(CALLBACK(src, PROC_REF(clear_sparks)), 0.6 SECONDS) playsound(src.loc, 'sound/effects/sparks4.ogg', 25, 1) locked = 0 update_icon() - if(!opened && prob(20/severity)) + if(!opened && prob(20 / severity)) if(!locked) open() else req_access = list() req_access += pick(ALL_ACCESS) - ..() + return ..() +/// Used in emp_act to clear sparks with delay +/obj/structure/closet/crate/secure/proc/clear_sparks() + overlays -= sparks //------------------------------------ // Secure Crates diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 5f8b89f5a62..1fc932f21ec 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -128,7 +128,7 @@ to_chat(user, span_notice("You place the [WD] on [src].")) WD.update_icon() -/obj/structure/grille/fire_act(burn_level) +/obj/structure/grille/fire_act(burn_level, flame_color) if(obj_integrity <= integrity_failure) return take_damage(1, BURN, FIRE) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 869b506bc49..9e94dfb7949 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -51,22 +51,12 @@ qdel(src) /obj/structure/lattice/proc/updateOverlays() - //if(!isspaceturf(loc)) - // qdel(src) - spawn(1) - overlays = list() - - var/dir_sum = 0 - - for (var/direction in GLOB.cardinals) - if(locate(/obj/structure/lattice, get_step(src, direction))) - dir_sum += direction - else - if(!isspaceturf(get_step(src, direction))) - dir_sum += direction - - icon_state = "lattice[dir_sum]" - return + var/dir_sum = 0 + for(var/direction in GLOB.cardinals) + if(!locate(/obj/structure/lattice, get_step(src, direction)) || isspaceturf(get_step(src, direction))) + continue + dir_sum += direction + icon_state = "lattice[dir_sum]" /obj/structure/catwalk icon = 'icons/obj/smooth_objects/catwalk.dmi' diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 6084c8ac4b7..f6f0a4af0b4 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -184,7 +184,7 @@ return ..() -/obj/structure/mineral_door/transparent/phoron/fire_act(burn_level) +/obj/structure/mineral_door/transparent/phoron/fire_act(burn_level, flame_color) if(burn_level > 30) var/turf/T = get_turf(src) T.ignite(25, 25) 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/objects/structures/prop.dm b/code/game/objects/structures/prop.dm index 83fd045c1d3..f176732ce41 100644 --- a/code/game/objects/structures/prop.dm +++ b/code/game/objects/structures/prop.dm @@ -2066,34 +2066,34 @@ desc = "A water filter specifically designed to separate micro-organisms, such as viruses and bacteria, from water." icon = 'icons/obj/structures/pipe_multiple.dmi' icon_state = "solo_tank_water" + layer = ABOVE_FLY_LAYER density = TRUE -/obj/machinery/filtration_pipes/water/update_overlays() +/obj/machinery/filtration_pipes/Initialize(mapload) . = ..() - . += image(icon, src, "tank_water_top", layer = ABOVE_ALL_MOB_LAYER, pixel_x = 31) + add_large_transparency() + +/// We add the largetransparency component in here, but we need different parameters +/obj/machinery/filtration_pipes/proc/add_large_transparency() + AddComponent(/datum/component/largetransparency) /obj/machinery/filtration_pipes/empty icon_state = "solo_tank_empty" -/obj/machinery/filtration_pipes/empty/update_overlays() - . = ..() - . += image(icon, src, "tank_water_empty", layer = ABOVE_ALL_MOB_LAYER, pixel_x = 31) - /obj/machinery/filtration_pipes/waste icon_state = "solo_tank_waste" -/obj/machinery/filtration_pipes/waste/update_overlays() - . = ..() - . += image(icon, src, "tank_waste_top", layer = ABOVE_ALL_MOB_LAYER, pixel_x = 31) - /obj/machinery/filtration_pipes/multiple icon_state = "disinfection" bound_width = 96 bound_height = 64 +/obj/machinery/filtration_pipes/multiple/add_large_transparency() + AddComponent(/datum/component/largetransparency, 0, 1, 3, 2) + /obj/machinery/filtration_pipes/multiple/update_overlays() . = ..() - . += image(icon, src, "disinfectiontop", layer = ABOVE_ALL_MOB_LAYER, pixel_x = 63) + . += image(icon, src, "disinfectiontop", layer = ABOVE_FLY_LAYER, pixel_y = 63) /obj/structure/prop/mainship/errorprop name = "ERROR" diff --git a/code/game/objects/structures/reagent_dispensers.dm b/code/game/objects/structures/reagent_dispensers.dm index 44d61aca7f1..223f1131fe7 100644 --- a/code/game/objects/structures/reagent_dispensers.dm +++ b/code/game/objects/structures/reagent_dispensers.dm @@ -186,7 +186,7 @@ flame_radius(round(reagents.total_volume * 0.005), loc) qdel(src) -/obj/structure/reagent_dispensers/fueltank/fire_act(burn_level) +/obj/structure/reagent_dispensers/fueltank/fire_act(burn_level, flame_color) explode() /obj/structure/reagent_dispensers/fueltank/Moved(atom/old_loc, movement_dir, forced, list/old_locs) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 1d163702727..f97f5249979 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -153,19 +153,17 @@ new buildstacktype (loc, buildstackamount) qdel(src) +/obj/structure/bed/wrench_act(mob/living/user, obj/item/I) + if(!buildstacktype) + return + playsound(loc, 'sound/items/ratchet.ogg', 25, 1) + if(dropmetal) + new buildstacktype(loc, buildstackamount) + qdel(src) + /obj/structure/bed/attackby(obj/item/I, mob/user, params) . = ..() - - if(iswrench(I)) - if(!buildstacktype) - return - - playsound(loc, 'sound/items/ratchet.ogg', 25, 1) - if(dropmetal) - new buildstacktype(loc, buildstackamount) - qdel(src) - - else if(istype(I, /obj/item/grab) && !LAZYLEN(buckled_mobs) && !buckled_bodybag) + if(istype(I, /obj/item/grab) && !LAZYLEN(buckled_mobs) && !buckled_bodybag) var/obj/item/grab/G = I if(!ismob(G.grabbed_thing)) return diff --git a/code/game/objects/structures/supplypod.dm b/code/game/objects/structures/supplypod.dm index 4feff8ff194..5d8bbf52f8a 100644 --- a/code/game/objects/structures/supplypod.dm +++ b/code/game/objects/structures/supplypod.dm @@ -248,7 +248,6 @@ GLOBAL_LIST_INIT(pod_styles, list(\ return ..() - /obj/effect/DPtarget name = "Landing Zone Indicator" desc = "A holographic projection designating the landing zone of something. It's probably best to stand back." @@ -258,11 +257,6 @@ GLOBAL_LIST_INIT(pod_styles, list(\ var/obj/effect/temp_visual/fallingPod var/obj/structure/closet/supplypod/pod - -/obj/effect/ex_act() - return - - /obj/effect/DPtarget/Initialize(mapload, podParam, single_order) . = ..() if(!podParam) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index b546c2c910b..ad608ce8c3f 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -234,21 +234,27 @@ if(watertemp == WATER_TEMP_FREEZING) return if(!ismist) - spawn(50) - if(src && on) - ismist = TRUE - mymist = new /obj/effect/mist(loc) + addtimer(CALLBACK(src, PROC_REF(spawn_mist)), 5 SECONDS) else ismist = TRUE mymist = new /obj/effect/mist(loc) else if(ismist) ismist = TRUE mymist = new /obj/effect/mist(loc) - spawn(250) - if(src && !on) - qdel(mymist) - mymist = null - ismist = FALSE + addtimer(CALLBACK(src, PROC_REF(clean_mist)), 25 SECONDS) + +/obj/machinery/shower/proc/spawn_mist() + if(!on) + return + ismist = TRUE + mymist = new /obj/effect/mist(loc) + +/obj/machinery/shower/proc/clean_mist() + if(on) + return + qdel(mymist) + mymist = null + ismist = FALSE /obj/machinery/shower/update_overlays() . = ..() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 9bc46b88902..2e97ee97191 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -301,7 +301,7 @@ explosion_block = EXPLOSION_BLOCK_PROC real_explosion_block = 4 -/obj/structure/window/phoronreinforced/fire_act(burn_level) +/obj/structure/window/phoronreinforced/fire_act(burn_level, flame_color) return /obj/structure/window/reinforced @@ -722,25 +722,21 @@ icon = 'icons/obj/smooth_objects/kutjevo_window_orange.dmi' /obj/structure/window/framed/kutjevo/reinforced - name = "window" + name = "reinforced window" icon = 'icons/obj/smooth_objects/kutjevo_window_blue_reinforced.dmi' icon_state = "window-reinforced" - base_icon_state = "chigusa_wall" - window_frame = /obj/structure/window_frame/kutjevo + max_integrity = 100 + reinf = TRUE + window_frame = /obj/structure/window_frame/kutjevo/reinforced /obj/structure/window/framed/kutjevo/reinforced/orange - name = "window" icon = 'icons/obj/smooth_objects/kutjevo_window_orange_reinforced.dmi' - icon_state = "window-reinforced" - base_icon_state = "chigusa_wall" - window_frame = /obj/structure/window_frame/kutjevo /obj/structure/window/framed/kutjevo/reinforced/hull name = "hull window" icon = 'icons/obj/smooth_objects/kutjevo_window_orange_reinforced.dmi' desc = "A glass window with a special rod matrice inside a wall frame. This one was made out of exotic materials to prevent hull breaches. No way to get through here." icon_state = "window-invincible" - base_icon_state = "chigusa_wall" resistance_flags = RESIST_ALL //pred diff --git a/code/game/objects/structures/window_frame.dm b/code/game/objects/structures/window_frame.dm index 241b2ebf735..80fb08ccad8 100644 --- a/code/game/objects/structures/window_frame.dm +++ b/code/game/objects/structures/window_frame.dm @@ -167,6 +167,15 @@ base_icon_state = "col_window_frame" basestate = "col_window_frame" +/obj/structure/window_frame/kutjevo/reinforced + name = "reinforced window frame" + icon = 'icons/obj/smooth_objects/kutjevo_window_frame_reinforced.dmi' + icon_state = "col_rwindow_frame-0" + base_icon_state = "col_rwindow_frame" + basestate = "col_rwindow_frame" + reinforced = TRUE + max_integrity = 300 + /obj/structure/window_frame/wood icon = 'icons/obj/smooth_objects/wood_window_frame.dmi' icon_state = "wood_window_frame-0" 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/game/turfs/floor.dm b/code/game/turfs/floor.dm index 8feee5b0cc8..cff2727aa38 100644 --- a/code/game/turfs/floor.dm +++ b/code/game/turfs/floor.dm @@ -35,7 +35,7 @@ break_tile() return ..() -/turf/open/floor/fire_act(burn_level) +/turf/open/floor/fire_act(burn_level, flame_color) if(hull_floor) return if(!burnt && prob(5)) diff --git a/code/game/turfs/floor_ground.dm b/code/game/turfs/floor_ground.dm index 06be18e2d1b..871fb521586 100644 --- a/code/game/turfs/floor_ground.dm +++ b/code/game/turfs/floor_ground.dm @@ -11,7 +11,7 @@ /turf/open/floor/plating/ground/burnt_states() return icon_state -/turf/open/floor/plating/ground/fire_act(burn_level) +/turf/open/floor/plating/ground/fire_act(burn_level, flame_color) return /turf/open/floor/plating/ground/dirt diff --git a/code/game/turfs/floor_types.dm b/code/game/turfs/floor_types.dm index 04857157c53..f1f97d03357 100644 --- a/code/game/turfs/floor_types.dm +++ b/code/game/turfs/floor_types.dm @@ -166,7 +166,7 @@ /turf/open/floor/mainship/empty/is_weedable() return FALSE -/turf/open/floor/mainship/empty/fire_act(burn_level) +/turf/open/floor/mainship/empty/fire_act(burn_level, flame_color) return /turf/open/floor/mainship/empty/attackby(obj/item/I, mob/user, params) //This should fix everything else. No cables, etc diff --git a/code/game/turfs/plating.dm b/code/game/turfs/plating.dm index 0c20dd16944..182951ef0fa 100644 --- a/code/game/turfs/plating.dm +++ b/code/game/turfs/plating.dm @@ -17,7 +17,7 @@ /turf/open/floor/plating/make_plating() return //we don't dig past plating -/turf/open/floor/plating/fire_act(burn_level) +/turf/open/floor/plating/fire_act(burn_level, flame_color) if(hull_floor) return if(!burnt && prob(5)) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index d5c5f485530..1e8a6abafaf 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -411,44 +411,41 @@ /turf/proc/ceiling_debris(size = 1) //debris falling in response to airstrikes, etc var/area/A = get_area(src) if(!A.ceiling) return - - var/amount = size - var/spread = round(sqrt(size)*1.5) + var/spread = round(sqrt(size) * 1.5) var/list/turfs = list() - for(var/turf/open/floor/F in range(src,spread)) + for(var/turf/open/floor/F in range(src, spread)) turfs += F + var/drop_message + var/list/debris_list switch(A.ceiling) + if(CEILING_NONE) + return if(CEILING_GLASS) playsound(src, 'sound/effects/glassbr1.ogg', 60, 1) - spawn(8) - if(amount >1) - visible_message(span_boldnotice("Shards of glass rain down from above!")) - for(var/i=1, i<=amount, i++) - new /obj/item/shard(pick(turfs)) - new /obj/item/shard(pick(turfs)) + drop_message = "Shards of glass rain down from above!" + debris_list = list(/obj/item/shard, /obj/item/shard) if(CEILING_METAL, CEILING_OBSTRUCTED) playsound(src, 'sound/effects/metal_crash.ogg', 30, 1) - spawn(8) - if(amount >1) - visible_message(span_boldnotice("Pieces of metal crash down from above!")) - for(var/i=1, i<=amount, i++) - new /obj/item/stack/sheet/metal(pick(turfs)) + drop_message = "Pieces of metal crash down from above!" + debris_list = list(/obj/item/stack/sheet/metal) if(CEILING_UNDERGROUND, CEILING_DEEP_UNDERGROUND) playsound(src, 'sound/effects/meteorimpact.ogg', 60, 1) - spawn(8) - if(amount >1) - visible_message(span_boldnotice("Chunks of rock crash down from above!")) - for(var/i = 1, i <= amount, i++) - new /obj/item/ore(pick(turfs)) - new /obj/item/ore(pick(turfs)) + drop_message = "Chunks of rock crash down from above!" + debris_list = list(/obj/item/ore, /obj/item/ore) if(CEILING_UNDERGROUND_METAL, CEILING_DEEP_UNDERGROUND_METAL) playsound(src, 'sound/effects/metal_crash.ogg', 60, 1) - spawn(8) - for(var/i = 1, i <= amount, i++) - new /obj/item/stack/sheet/metal(pick(turfs)) - new /obj/item/ore(pick(turfs)) + debris_list = list(/obj/item/stack/sheet/metal, /obj/item/ore) + addtimer(CALLBACK(src, PROC_REF(drop_ceiling_debris), debris_list, size, drop_message, turfs), 0.8 SECONDS) + +/// Drop amount of listed stuff in listed turfs, with a message if amount is more than 1 +/turf/proc/drop_ceiling_debris(list/stuff_to_drop, amount, drop_message, list/turfs) + if(amount > 1 && drop_message) + visible_message(span_boldnotice(drop_message)) + for(var/i = 1, i <= amount, i++) + for(var/item_to_drop AS in stuff_to_drop) + new item_to_drop(pick(turfs)) /turf/proc/ceiling_desc() var/area/A = get_area(src) diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 313ed85745d..97b414a6c35 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -507,8 +507,23 @@ // Calculate desired pixel width using window size and aspect ratio var/sizes = params2list(winget(src, "mainwindow.split;mapwindow", "size")) var/map_size = splittext(sizes["mapwindow.size"], "x") - var/height = text2num(map_size[2]) - var/desired_width = round(height * aspect_ratio) + // Gets the type of zoom we're currently using from our view datum + // If it's 0 we do our pixel calculations based off the size of the mapwindow + // If it's not, we already know how big we want our window to be, since zoom is the exact pixel ratio of the map + var/zoom_value = src.view_size?.zoom || 0 + + var/desired_width = 0 + if(zoom_value) + desired_width = round(view_size[1] * zoom_value * world.icon_size) + else + + // Looks like we expect mapwindow.size to be "ixj" where i and j are numbers. + // If we don't get our expected 2 outputs, let's give some useful error info. + if(length(map_size) != 2) + CRASH("map_size of incorrect length --- map_size var: [map_size] --- map_size length: [length(map_size)]") + var/height = text2num(map_size[2]) + desired_width = round(height * aspect_ratio) + if (text2num(map_size[1]) == desired_width) // Nothing to do return @@ -541,6 +556,14 @@ pct += delta winset(src, "mainwindow.split", "splitter=[pct]") +/// Attempt to automatically fit the viewport, assuming the user wants it +/client/proc/attempt_auto_fit_viewport() + if (!prefs.auto_fit_viewport) + return + if(fully_created) + INVOKE_ASYNC(src, .verb/fit_viewport) + else //Delayed to avoid wingets from Login calls. + INVOKE_NEXT_TICK(src, VERB_REF(fit_viewport), 1 SECONDS) //Delayed to avoid wingets from Login calls. /client/verb/policy() set name = "Show Policy" 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/panels/player_panel.dm b/code/modules/admin/panels/player_panel.dm index 1fb5918bfb2..c06d8416323 100644 --- a/code/modules/admin/panels/player_panel.dm +++ b/code/modules/admin/panels/player_panel.dm @@ -492,6 +492,7 @@ Crusher | Gorger | Warlock | + Widow | Behemoth |
Alien Tier 4: Queen | diff --git a/code/modules/admin/server_verbs.dm b/code/modules/admin/server_verbs.dm index 086f4e6ba2b..8fcddcdabe2 100644 --- a/code/modules/admin/server_verbs.dm +++ b/code/modules/admin/server_verbs.dm @@ -444,6 +444,9 @@ if(!check_rights(R_SERVER)) return + if(tgui_alert(usr, "Are you sure you want to reload admins?", "Reload admins", list("No", "Yes")) != "Yes") + return + load_admins() log_admin("[key_name(src)] manually reloaded admins.") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 2221010ae8a..6ee96c37c7c 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -432,6 +432,8 @@ Status: [status ? status : "Unknown"] | Damage: [health ? health : "None"] newmob = M.change_mob_type(/mob/living/carbon/xenomorph/gorger, location, null, delmob) if("warlock") newmob = M.change_mob_type(/mob/living/carbon/xenomorph/warlock, location, null, delmob) + if("widow") + newmob = M.change_mob_type(/mob/living/carbon/xenomorph/widow, location, null, delmob) if("shrike") newmob = M.change_mob_type(/mob/living/carbon/xenomorph/shrike, location, null, delmob) if("hivemind") @@ -653,7 +655,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/ai/ai_behaviors/ai_behavior.dm b/code/modules/ai/ai_behaviors/ai_behavior.dm index 0771c6f2d54..86a7430165c 100644 --- a/code/modules/ai/ai_behaviors/ai_behavior.dm +++ b/code/modules/ai/ai_behaviors/ai_behavior.dm @@ -345,6 +345,9 @@ These are parameter based so the ai behavior can choose to (un)register the sign /datum/ai_behavior/proc/ai_do_move() if(!mob_parent?.canmove || mob_parent.do_actions) return + //This allows minions to be buckled to their atom_to_escort without disrupting the movement of atom_to_escort + if(current_action == ESCORTING_ATOM && (get_dist(mob_parent, atom_to_walk_to) <= 0)) //todo: Entirely remove this shitcode snowflake check for one specific interaction that doesn't specifically relate to ai_behavior + return mob_parent.next_move_slowdown = 0 var/step_dir if(get_dist(mob_parent, atom_to_walk_to) == distance_to_maintain) @@ -359,6 +362,7 @@ These are parameter based so the ai behavior can choose to (un)register the sign SEND_SIGNAL(mob_parent, COMSIG_OBSTRUCTED_MOVE, step_dir) else if(ISDIAGONALDIR(step_dir)) mob_parent.next_move_slowdown += (DIAG_MOVEMENT_ADDED_DELAY_MULTIPLIER - 1) * mob_parent.cached_multiplicative_slowdown //Not perfect but good enough + mob_parent.set_glide_size(DELAY_TO_GLIDE_SIZE(mob_parent.cached_multiplicative_slowdown)) return if(prob(sidestep_prob)) step_dir = pick(LeftAndRightOfDir(get_dir(mob_parent, atom_to_walk_to))) @@ -367,6 +371,7 @@ These are parameter based so the ai behavior can choose to (un)register the sign SEND_SIGNAL(mob_parent, COMSIG_OBSTRUCTED_MOVE, step_dir) else if(ISDIAGONALDIR(step_dir)) mob_parent.next_move_slowdown += (DIAG_MOVEMENT_ADDED_DELAY_MULTIPLIER - 1) * mob_parent.cached_multiplicative_slowdown + mob_parent.set_glide_size(DELAY_TO_GLIDE_SIZE(mob_parent.cached_multiplicative_slowdown)) return if(get_dist(mob_parent, atom_to_walk_to) < distance_to_maintain) //We're too close, back it up step_dir = get_dir(atom_to_walk_to, mob_parent) diff --git a/code/modules/animations/animation_library.dm b/code/modules/animations/animation_library.dm index ad35e283ead..21ce7ed07d2 100644 --- a/code/modules/animations/animation_library.dm +++ b/code/modules/animations/animation_library.dm @@ -52,9 +52,7 @@ Instead of being uniform, it starts out a littler slower, goes fast in the middl A.status_flags |= INCORPOREAL var/initial_matrix = A.transform animate(A, transform = matrix(0, 4, MATRIX_SCALE), alpha = 0, time = speed, easing = BACK_EASING) - spawn(speed) - A.transform = initial_matrix - A.status_flags &= ~INCORPOREAL + addtimer(CALLBACK(A, PROC_REF(transform_initial_matrix), A, initial_matrix), speed) return speed //We want to make sure to reset color here as it can be changed by other animations. @@ -64,9 +62,7 @@ Instead of being uniform, it starts out a littler slower, goes fast in the middl A.transform = matrix(0, 4, MATRIX_SCALE) A.alpha = 0 //Start with transparency, just in case. animate(A, alpha = 255, transform = null, color = "#FFFFFF", time = speed, easing = BACK_EASING) - spawn(speed) - A.transform = initial_matrix - A.status_flags &= ~INCORPOREAL + addtimer(CALLBACK(A, PROC_REF(transform_initial_matrix), A, initial_matrix), speed) return speed /*A magical teleport animation, for when the person is transported with some magic. Good for Halloween type events. @@ -79,10 +75,8 @@ Can look good elsewhere as well.*/ animate(alpha = 0, time = speed) var/image/I = image('icons/effects/effects.dmi',A,"sparkle") flick_overlay_view(I, A, 9) - spawn(speed) - A.transform = initial_matrix - A.status_flags &= ~INCORPOREAL - return speed*3 + addtimer(CALLBACK(A, PROC_REF(transform_initial_matrix), A, initial_matrix), speed) + return speed * 3 /proc/animation_teleport_magic_in(atom/A, speed = 6) A.status_flags |= INCORPOREAL @@ -94,9 +88,7 @@ Can look good elsewhere as well.*/ animate(transform = null, time = speed-1) var/image/I = image('icons/effects/effects.dmi',A,"sparkle") flick_overlay_view(I, A, 10) - spawn(speed) - A.transform = initial_matrix - A.status_flags &= ~INCORPOREAL + addtimer(CALLBACK(A, PROC_REF(transform_initial_matrix), A, initial_matrix), speed) return speed //A spooky teleport for evil dolls, horrors, and whatever else. Halloween type stuff. @@ -108,9 +100,7 @@ Can look good elsewhere as well.*/ animate(alpha = 0, time = speed) var/image/I = image('icons/effects/effects.dmi',A,"spooky") flick_overlay_view(I, A, 9) - spawn(speed) - A.transform = initial_matrix - A.status_flags &= ~INCORPOREAL + addtimer(CALLBACK(A, PROC_REF(transform_initial_matrix), A, initial_matrix), speed) return speed*3 /proc/animation_teleport_spooky_in(atom/A, speed = 4) @@ -122,9 +112,7 @@ Can look good elsewhere as well.*/ animate(transform = null, color = "#FFFFFF", time = speed, easing = QUAD_EASING|EASE_OUT) var/image/I = image('icons/effects/effects.dmi',A,"spooky") flick_overlay_view(I, A, 10) - spawn(speed) - A.transform = initial_matrix - A.status_flags &= ~INCORPOREAL + addtimer(CALLBACK(A, PROC_REF(transform_initial_matrix), A, initial_matrix), speed) return speed //Regular fadeout disappear, for most objects. @@ -166,3 +154,7 @@ Can look good elsewhere as well.*/ animate(src, transform = matrix_list[1], time = speed, loop_amount) for(var/i in 2 to sections) animate(transform = matrix_list[i], time = speed) + +/proc/transform_initial_matrix(atom/our_atom, initial_matrix) + our_atom.transform = initial_matrix + our_atom.status_flags &= ~INCORPOREAL diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index afb2c3381cb..75f5c56a2b3 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -139,3 +139,6 @@ /// The direction we WANT to move, based off our keybinds /// Will be udpated to be the actual direction later on var/intended_direction = NONE + + /// If this client has been fully initialized or not + var/fully_created = FALSE diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index a188beb687f..9e7275b0a53 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -364,6 +364,7 @@ Master.UpdateTickRate() + fully_created = TRUE ////////////////// @@ -877,8 +878,7 @@ apply_clickcatcher() mob.reload_fullscreens() - if(prefs.auto_fit_viewport) - INVOKE_NEXT_TICK(src, VERB_REF(fit_viewport), 1 SECONDS) //Delayed to avoid wingets from Login calls. + attempt_auto_fit_viewport() ///Change the fullscreen setting of the client /client/proc/set_fullscreen(fullscreen_mode) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index f0917608b8d..b85f6ddc9f0 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -77,10 +77,14 @@ return storage_attachment.storage.do_quick_equip(user) return src -//Updates the icons of the mob wearing the clothing item, if any. +///Updates the icons of the mob wearing the clothing item, if any. /obj/item/clothing/proc/update_clothing_icon() return +///Change the look of the clothing, when it's antihug reaches 0 +/obj/item/clothing/proc/on_hugger_damage() + return + /obj/item/clothing/update_greyscale() . = ..() if(!greyscale_config) @@ -188,7 +192,6 @@ flags_armor_features ^= ARMOR_LAMP_ON playsound(src, 'sound/items/flashlight.ogg', 15, TRUE) update_icon() - update_action_button_icons() /obj/item/clothing/suit/update_clothing_icon() if(ismob(loc)) diff --git a/code/modules/clothing/glasses/thermal.dm b/code/modules/clothing/glasses/thermal.dm index f93bbc91c8c..d34cc6edc93 100644 --- a/code/modules/clothing/glasses/thermal.dm +++ b/code/modules/clothing/glasses/thermal.dm @@ -15,10 +15,7 @@ if(M.glasses == src) M.blind_eyes(3) M.blur_eyes(5) - M.disabilities |= NEARSIGHTED - spawn(100) - M.disabilities &= ~NEARSIGHTED - ..() + return ..() /obj/item/clothing/glasses/thermal/yautja name = "bio-mask thermal" @@ -37,14 +34,14 @@ /obj/item/clothing/glasses/thermal/yautja/dropped(mob/living/carbon/human/user) if(istype(user) && user.glasses == src) user.clear_fullscreen("machine", 5) - ..() + return ..() /obj/item/clothing/glasses/thermal/yautja/equipped(mob/living/carbon/human/user, slot) if(slot == SLOT_GLASSES) user.overlay_fullscreen("machine", /atom/movable/screen/fullscreen/machine/pred) - ..() + return ..() /obj/item/clothing/glasses/thermal/yautja/unequipped(mob/living/carbon/human/user, slot) if(slot == SLOT_GLASSES) user.clear_fullscreen("machine", 5) - ..() + return ..() diff --git a/code/modules/clothing/head/head.dm b/code/modules/clothing/head/head.dm index 0a7471c49cb..e7caed60523 100644 --- a/code/modules/clothing/head/head.dm +++ b/code/modules/clothing/head/head.dm @@ -11,6 +11,7 @@ blood_sprite_state = "helmetblood" attachments_by_slot = list(ATTACHMENT_SLOT_BADGE) attachments_allowed = list(/obj/item/armor_module/armor/badge) + soft_armor = MARINE_HAT_ARMOR var/anti_hug = 0 /obj/item/clothing/head/update_clothing_icon() @@ -49,7 +50,6 @@ icon_state = "beanie_cargo" flags_inv_hide = HIDETOPHAIR species_exception = list(/datum/species/robot) - soft_armor = MARINE_HAT_ARMOR /obj/item/clothing/head/tgmcberet name = "\improper Dark gray beret" @@ -60,7 +60,6 @@ slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', slot_r_hand_str = 'icons/mob/items_righthand_1.dmi',) icon_state = "beret" - soft_armor = MARINE_HAT_ARMOR flags_item_map_variant = NONE flags_armor_features = ARMOR_NO_DECAP @@ -108,7 +107,6 @@ name = "\improper Command Master at Arms beret" desc = "A beret with the lieutenant insignia emblazoned on it. It shines with the glow of corrupt authority and a smudge of doughnut." icon_state = "beretwo" - soft_armor = MARINE_HAT_ARMOR flags_item_map_variant = NONE /obj/item/clothing/head/tgmcberet/fc @@ -128,7 +126,6 @@ slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', slot_r_hand_str = 'icons/mob/items_righthand_1.dmi',) species_exception = list(/datum/species/robot) - soft_armor = MARINE_HAT_ARMOR var/flipped_cap = FALSE var/base_cap_icon flags_item_map_variant = (ITEM_ICE_VARIANT) @@ -174,7 +171,6 @@ icon_state = "booniehat" item_state = "booniehat" species_exception = list(/datum/species/robot) - soft_armor = MARINE_HAT_ARMOR /obj/item/clothing/head/ornamented_cap name = "\improper ornamented cap" @@ -184,7 +180,6 @@ item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/marine_hats.dmi',) species_exception = list(/datum/species/robot) - soft_armor = MARINE_HAT_ARMOR flags_armor_features = ARMOR_NO_DECAP /obj/item/clothing/head/slouch @@ -196,7 +191,6 @@ slot_head_str = 'icons/mob/clothing/headwear/marine_hats.dmi', ) species_exception = list(/datum/species/robot) - soft_armor = MARINE_HAT_ARMOR /obj/item/clothing/head/headband name = "\improper Cyan headband" @@ -208,7 +202,6 @@ slot_r_hand_str = 'icons/mob/items_righthand_1.dmi',) icon_state = "headband" species_exception = list(/datum/species/robot) - soft_armor = MARINE_HAT_ARMOR flags_armor_features = ARMOR_NO_DECAP /obj/item/clothing/head/headband/red @@ -249,7 +242,6 @@ name = "marine officer beret" desc = "A beret with the TGMC insignia emblazoned on it. It radiates respect and authority." icon_state = "hosberet" - soft_armor = MARINE_HAT_ARMOR flags_inventory = BLOCKSHARPOBJ /obj/item/clothing/head/beret/marine/captain @@ -276,7 +268,6 @@ icon_state = "ushankadown" item_state = "ushankadown" species_exception = list(/datum/species/robot) - soft_armor = list(MELEE = 35, BULLET = 35, LASER = 20, ENERGY = 10, BOMB = 10, BIO = 0, FIRE = 10, ACID = 10) flags_cold_protection = HEAD min_cold_protection_temperature = ICE_PLANET_MIN_COLD_PROTECTION_TEMPERATURE flags_inventory = BLOCKSHARPOBJ @@ -415,7 +406,6 @@ icon = 'icons/obj/clothing/headwear/ert_headwear.dmi' icon_state = "straw_hat" species_exception = list(/datum/species/robot) - soft_armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 15, BIO = 10, FIRE = 20, ACID = 20) /obj/item/clothing/head/squad_headband name = "\improper Squad headband" @@ -623,7 +613,6 @@ item_icons = list( slot_head_str = 'icons/mob/clothing/headwear/marine_hats.dmi') icon_state = "cap_black" - soft_armor = MARINE_HAT_ARMOR flags_inventory = BLOCKSHARPOBJ flags_armor_features = ARMOR_NO_DECAP species_exception = list(/datum/species/robot) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 9ca5b62b411..c7bfef122e6 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -89,6 +89,12 @@ siemens_coefficient = 0.7 flags_armor_protection = FACE|EYES +/obj/item/clothing/mask/gas/swat/on_hugger_damage() + name = "\improper torn SWAT mask" + icon_state = "swat_torn" + update_clothing_icon() + playsound(src, 'sound/items/velpro_rip.ogg', 25) + /obj/item/clothing/mask/gas/syndicate name = "syndicate mask" desc = "A close-fitting tactical mask that can be connected to an air supply." diff --git a/code/modules/clothing/modular_armor/attachments.dm b/code/modules/clothing/modular_armor/attachments.dm index 779cff9f0c4..2f1f9de34ef 100644 --- a/code/modules/clothing/modular_armor/attachments.dm +++ b/code/modules/clothing/modular_armor/attachments.dm @@ -119,7 +119,6 @@ /obj/item/armor_module/ui_action_click(mob/user, datum/action/item_action/toggle/action) action.set_toggle(activate(user)) - action.update_button_icon() ///Called on ui_action_click. Used for activating the module. /obj/item/armor_module/proc/activate(mob/living/user) 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/storage.dm b/code/modules/clothing/modular_armor/attachments/storage.dm index 8ec92eac84d..19983e0bc95 100644 --- a/code/modules/clothing/modular_armor/attachments/storage.dm +++ b/code/modules/clothing/modular_armor/attachments/storage.dm @@ -363,6 +363,7 @@ /obj/item/storage/internal/modular/integrated bypass_w_limit = list() + cant_hold = list() storage_slots = null max_storage_space = 15 max_w_class = WEIGHT_CLASS_NORMAL 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/modular.dm b/code/modules/clothing/modular_armor/modular.dm index ac656e7bea4..28b0aa1aec2 100644 --- a/code/modules/clothing/modular_armor/modular.dm +++ b/code/modules/clothing/modular_armor/modular.dm @@ -156,7 +156,6 @@ return FALSE return ..() - /obj/item/clothing/suit/modular/attack_self(mob/user) . = ..() if(.) 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/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index 1da5cd8857d..497d330dc88 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -16,52 +16,51 @@ . = ..() machine_id = "EFTPOS #[GLOB.num_financial_terminals++]" access_code = rand(1111,111111) - spawn(0) - print_reference() - - //create a short manual as well - var/obj/item/paper/R = new(src.loc) - R.name = "Steps to success: Correct EFTPOS Usage" - /* - R.info += "When first setting up your EFTPOS device:" - R.info += "1. Memorise your EFTPOS command code (provided with all EFTPOS devices).
" - R.info += "2. Confirm that your EFTPOS device is connected to your local accounts database. For additional assistance with this step, contact NanoTrasen IT Support
" - R.info += "3. Confirm that your EFTPOS device has been linked to the account that you wish to recieve funds for all transactions processed on this device.
" - R.info += "When starting a new transaction with your EFTPOS device:" - R.info += "1. Ensure the device is UNLOCKED so that new data may be entered.
" - R.info += "2. Enter a sum of money and reference message for the new transaction.
" - R.info += "3. Lock the transaction, it is now ready for your customer.
" - R.info += "4. If at this stage you wish to modify or cancel your transaction, you may simply reset (unlock) your EFTPOS device.
" - R.info += "5. Give your EFTPOS device to the customer, they must authenticate the transaction by swiping their ID card and entering their PIN number.
" - R.info += "6. If done correctly, the transaction will be logged to both accounts with the reference you have entered, the terminal ID of your EFTPOS device and the money transferred across accounts.
" - */ - //Temptative new manual: - R.info += "First EFTPOS setup:
" - R.info += "1. Memorise your EFTPOS command code (provided with all EFTPOS devices).
" - R.info += "2. Connect the EFTPOS to the account in which you want to receive the funds.

" - R.info += "When starting a new transaction:
" - R.info += "1. Enter the amount of money you want to charge and a purpose message for the new transaction.
" - R.info += "2. Lock the new transaction. If you want to modify or cancel the transaction, you simply have to reset your EFTPOS device.
" - R.info += "3. Give the EFTPOS device to your customer, he/she must finish the transaction by swiping their ID card or a charge card with enough funds.
" - R.info += "4. If everything is done correctly, the money will be transferred. To unlock the device you will have to reset the EFTPOS device.
" - - - //stamp the paper - var/image/stampoverlay = image('icons/obj/items/paper.dmi') - stampoverlay.icon_state = "paper_stamp-cent" - if(!R.stamped) - R.stamped = new - R.offset_x += 0 - R.offset_y += 0 - R.ico += "paper_stamp-cent" - R.stamped += /obj/item/tool/stamp - R.overlays += stampoverlay - R.stamps += "
This paper has been stamped by the EFTPOS device." - + INVOKE_ASYNC(src, PROC_REF(print_paper)) //by default, connect to the station account //the user of the EFTPOS device can change the target account though, and no-one will be the wiser (except whoever's being charged) linked_account = GLOB.station_account +/obj/item/eftpos/proc/print_paper() + print_reference() + //create a short manual as well + var/obj/item/paper/R = new(src.loc) + R.name = "Steps to success: Correct EFTPOS Usage" + /* + R.info += "When first setting up your EFTPOS device:" + R.info += "1. Memorise your EFTPOS command code (provided with all EFTPOS devices).
" + R.info += "2. Confirm that your EFTPOS device is connected to your local accounts database. For additional assistance with this step, contact NanoTrasen IT Support
" + R.info += "3. Confirm that your EFTPOS device has been linked to the account that you wish to recieve funds for all transactions processed on this device.
" + R.info += "When starting a new transaction with your EFTPOS device:" + R.info += "1. Ensure the device is UNLOCKED so that new data may be entered.
" + R.info += "2. Enter a sum of money and reference message for the new transaction.
" + R.info += "3. Lock the transaction, it is now ready for your customer.
" + R.info += "4. If at this stage you wish to modify or cancel your transaction, you may simply reset (unlock) your EFTPOS device.
" + R.info += "5. Give your EFTPOS device to the customer, they must authenticate the transaction by swiping their ID card and entering their PIN number.
" + R.info += "6. If done correctly, the transaction will be logged to both accounts with the reference you have entered, the terminal ID of your EFTPOS device and the money transferred across accounts.
" + */ + //Temptative new manual: + R.info += "First EFTPOS setup:
" + R.info += "1. Memorise your EFTPOS command code (provided with all EFTPOS devices).
" + R.info += "2. Connect the EFTPOS to the account in which you want to receive the funds.

" + R.info += "When starting a new transaction:
" + R.info += "1. Enter the amount of money you want to charge and a purpose message for the new transaction.
" + R.info += "2. Lock the new transaction. If you want to modify or cancel the transaction, you simply have to reset your EFTPOS device.
" + R.info += "3. Give the EFTPOS device to your customer, he/she must finish the transaction by swiping their ID card or a charge card with enough funds.
" + R.info += "4. If everything is done correctly, the money will be transferred. To unlock the device you will have to reset the EFTPOS device.
" + + //stamp the paper + var/image/stampoverlay = image('icons/obj/items/paper.dmi') + stampoverlay.icon_state = "paper_stamp-cent" + if(!R.stamped) + R.stamped = new + R.offset_x += 0 + R.offset_y += 0 + R.ico += "paper_stamp-cent" + R.stamped += /obj/item/tool/stamp + R.overlays += stampoverlay + R.stamps += "
This paper has been stamped by the EFTPOS device." + /obj/item/eftpos/proc/print_reference() var/obj/item/paper/R = new(src.loc) R.name = "Reference: [eftpos_name]" diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index e1c233a5dc9..178669835ef 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -64,21 +64,13 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) CE = /datum/config_entry/number/error_silence_time configured_error_silence_time = initial(CE.config_entry_value) - //Each occurence of a unique error adds to its cooldown time... cooldown = max(0, cooldown - (world.time - last_seen)) + configured_error_cooldown // ... which is used to silence an error if it occurs too often, too fast if(cooldown > configured_error_cooldown * configured_error_limit) cooldown = -1 silencing = TRUE - spawn(0) //Has to be used here - usr = null - sleep(configured_error_silence_time) //Has to be used here - var/skipcount = abs(error_cooldown[erroruid]) - 1 - error_cooldown[erroruid] = 0 - if(skipcount > 0) - SEND_TEXT(world.log, "\[[time_stamp()]] Skipped [skipcount] runtimes in [E.file],[E.line].") - GLOB.error_cache.log_error(E, skip_count = skipcount) + INVOKE_ASYNC(src, PROC_REF(log_errors), configured_error_silence_time, error_cooldown, erroruid, E) error_last_seen[erroruid] = world.time error_cooldown[erroruid] = cooldown @@ -125,6 +117,14 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) GLOB.current_test.Fail("[main_line]\n[desclines.Join("\n")]") #endif - // This writes the regular format (unwrapping newlines and inserting timestamps as needed). log_runtime("runtime error: [E.name]\n[E.desc]") + +/world/proc/log_errors(silence_time, error_cooldown, erroruid, exception/our_exception) + usr = null + sleep(silence_time) //Has to be used here + var/skipcount = abs(error_cooldown[erroruid]) - 1 + error_cooldown[erroruid] = 0 + if(skipcount > 0) + SEND_TEXT(world.log, "\[[time_stamp()]] Skipped [skipcount] runtimes in [our_exception.file], [our_exception.line].") + GLOB.error_cache.log_error(our_exception, skip_count = skipcount) 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/hydroponics/vines.dm b/code/modules/hydroponics/vines.dm index 4910bcb06ad..6cb041df313 100644 --- a/code/modules/hydroponics/vines.dm +++ b/code/modules/hydroponics/vines.dm @@ -205,7 +205,7 @@ die() // Hotspots kill vines. -/obj/effect/plantsegment/fire_act(burn_level) +/obj/effect/plantsegment/fire_act(burn_level, flame_color) qdel(src) /obj/effect/plantsegment/proc/die() 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/login.dm b/code/modules/mob/dead/observer/login.dm index e72b354e1d5..51eb4f53c37 100644 --- a/code/modules/mob/dead/observer/login.dm +++ b/code/modules/mob/dead/observer/login.dm @@ -35,18 +35,17 @@ for(var/path in subtypesof(/datum/action/observer_action)) if(!actions_by_path[path]) - var/datum/action/observer_action/A = new path() + var/datum/action/observer_action/A = new path(src) A.give_action(src) client.AddComponent(/datum/component/larva_queue) if(!actions_by_path[/datum/action/minimap/observer]) - var/datum/action/minimap/observer/mini = new + var/datum/action/minimap/observer/mini = new(src) mini.give_action(src) if(length(GLOB.offered_mob_list)) to_chat(src, span_boldnotice("There's mobs available for taking! Ghost > Take Offered Mob")) -//RUTGMC EDIT + if(SSticker.mode && SSticker.mode.flags_round_type & MODE_PREDATOR) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), src, "This is a PREDATOR ROUND! If you are whitelisted, you may Join the Hunt!"), 2 SECONDS) -//RUTGMC EDIT 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/inventory.dm b/code/modules/mob/inventory.dm index d31395e6682..21b4372887d 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -55,7 +55,10 @@ if(!l_hand) W.forceMove(src) l_hand = W - W.layer = ABOVE_HUD_LAYER + if(istype(W, /obj/item/weapon/twohanded/offhand) || istype(W, /obj/item/riding_offhand)) + W.layer = ABOVE_HUD_LAYER - 0.1 // so it doesn't cover items inhands + else + W.layer = ABOVE_HUD_LAYER W.plane = ABOVE_HUD_PLANE update_inv_l_hand() W.pixel_x = initial(W.pixel_x) @@ -83,7 +86,10 @@ if(!r_hand) W.forceMove(src) r_hand = W - W.layer = ABOVE_HUD_LAYER + if(istype(W, /obj/item/weapon/twohanded/offhand) || istype(W, /obj/item/riding_offhand)) + W.layer = ABOVE_HUD_LAYER - 0.1 // so it doesn't cover items inhands + else + W.layer = ABOVE_HUD_LAYER W.plane = ABOVE_HUD_PLANE update_inv_r_hand() W.pixel_x = initial(W.pixel_x) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 7731e685e58..d7a3b2fa053 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -202,7 +202,7 @@ user.dropItemToGround(src, TRUE) return src -/mob/living/carbon/fire_act(burn_level) +/mob/living/carbon/fire_act(burn_level, flame_color) . = ..() adjust_bodytemperature(100, 0, BODYTEMP_HEAT_DAMAGE_LIMIT_ONE+10) 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 1ff71b195a7..1af8d9e277a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -13,24 +13,9 @@ if(z) LAZYADD(GLOB.humans_by_zlevel["[z]"], src) - var/datum/action/skill/toggle_orders/toggle_orders_action = new - toggle_orders_action.give_action(src) - var/datum/action/skill/issue_order/move/issue_order_move = new - issue_order_move.give_action(src) - var/datum/action/skill/issue_order/hold/issue_order_hold = new - issue_order_hold.give_action(src) - var/datum/action/skill/issue_order/focus/issue_order_focus = new - issue_order_focus.give_action(src) - var/datum/action/innate/order/attack_order/personal/send_attack_order = new - send_attack_order.give_action(src) - var/datum/action/innate/order/defend_order/personal/send_defend_order = new - send_defend_order.give_action(src) - var/datum/action/innate/order/retreat_order/personal/send_retreat_order = new - send_retreat_order.give_action(src) - var/datum/action/innate/order/rally_order/personal/send_rally_order = new - send_rally_order.give_action(src) - var/datum/action/innate/message_squad/screen_orders = new - screen_orders.give_action(src) + for(var/action in GLOB.human_init_actions) + var/datum/action/human_action = new action(src) + human_action.give_action(src) //makes order hud visible var/datum/atom_hud/H = GLOB.huds[DATA_HUD_ORDER] @@ -662,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 03c67abf64b..ba5cc47514a 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities.dm @@ -366,10 +366,15 @@ return if(X.selected_resin == /obj/structure/bed/nest) - for(var/obj/structure/bed/nest/xeno_nest in range (2,T)) + for(var/obj/structure/bed/nest/xeno_nest in range(2, T)) owner.balloon_alert(owner, span_notice("Another nest is too close!")) return + if(X.selected_resin == /obj/structure/mineral_door/resin) + for(var/obj/structure/mineral_door/resin/door in range(2, T)) + owner.balloon_alert(owner, span_notice("Another door is too close!")) + return + var/atom/new_resin if(ispath(X.selected_resin, /turf)) // We should change turfs, not spawn them in directly var/list/baseturfs = islist(T.baseturfs) ? T.baseturfs : list(T.baseturfs) @@ -392,6 +397,10 @@ for(var/obj/structure/bed/nest/xeno_nest in range (2, T)) owner.balloon_alert(owner, span_notice("Another nest is too close!")) return + if(X.selected_resin == /obj/structure/mineral_door/resin) + for(var/obj/structure/mineral_door/resin/door in range(2, T)) + owner.balloon_alert(owner, span_notice("Another door is too close!")) + return switch(is_valid_for_resin_structure(T, X.selected_resin == /obj/structure/mineral_door/resin, X.selected_resin)) if(ERROR_CANT_WEED) owner.balloon_alert(owner, span_notice("This spot cannot support a garden!")) @@ -505,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" @@ -1159,7 +1161,7 @@ /mob/living/carbon/xenomorph/proc/add_abilities() for(var/action_path in xeno_caste.actions) - var/datum/action/ability/xeno_action/action = new action_path() + var/datum/action/ability/xeno_action/action = new action_path(src) if(!SSticker.mode || SSticker.mode.flags_xeno_abilities & action.gamemode_flags) action.give_action(src) @@ -1373,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/behemoth/abilities_behemoth.dm b/code/modules/mob/living/carbon/xenomorph/castes/behemoth/abilities_behemoth.dm index 9247bf8bd9c..766f348870f 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/behemoth/abilities_behemoth.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/behemoth/abilities_behemoth.dm @@ -1004,14 +1004,12 @@ RU TGMC EDIT */ block_overlay = new(null, src) owner.vis_contents += block_overlay START_PROCESSING(SSprocessing, src) - RegisterSignals(owner, list(COMSIG_QDELETING, COMSIG_MOB_DEATH, COMSIG_XENOMORPH_EVOLVED, COMSIG_XENOMORPH_DEEVOLVED), PROC_REF(stop_ability)) + RegisterSignals(owner, list(COMSIG_MOB_DEATH, COMSIG_XENOMORPH_EVOLVED, COMSIG_XENOMORPH_DEEVOLVED), PROC_REF(stop_ability)) RegisterSignals(owner, list(COMSIG_XENOMORPH_BRUTE_DAMAGE, COMSIG_XENOMORPH_BURN_DAMAGE), PROC_REF(taking_damage)) -/datum/action/ability/xeno_action/primal_wrath/remove_action(mob/living/L) - . = ..() - stop_ability() - /datum/action/ability/xeno_action/primal_wrath/process() + if(!owner) + return PROCESS_KILL var/mob/living/carbon/xenomorph/xeno_owner = owner if(xeno_owner.hivenumber == XENO_HIVE_FALLEN) if(xeno_owner.wrath_stored < xeno_owner.xeno_caste.wrath_max) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/behemoth/castedatum_behemoth.dm b/code/modules/mob/living/carbon/xenomorph/castes/behemoth/castedatum_behemoth.dm index 1e8c83b10fe..acae7a1d41f 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/behemoth/castedatum_behemoth.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/behemoth/castedatum_behemoth.dm @@ -23,13 +23,13 @@ max_health = 750 // *** Flags *** // - caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_IS_STRONG|CASTE_STAGGER_RESISTANT|CASTE_ACID_BLOOD + caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_IS_STRONG|CASTE_STAGGER_RESISTANT can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER caste_traits = null // *** Defense *** // soft_armor = list(MELEE = 20, BULLET = 40, LASER = 40, ENERGY = 20, BOMB = 50, BIO = 50, FIRE = 20, ACID = 50) - hard_armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + hard_armor = list(MELEE = 0, BULLET = 12, LASER = 6, ENERGY = 10, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) // *** Minimap Icon *** // minimap_icon = "behemoth" diff --git a/code/modules/mob/living/carbon/xenomorph/castes/bull/castedatum_bull.dm b/code/modules/mob/living/carbon/xenomorph/castes/bull/castedatum_bull.dm index b25f20c7742..9fa72b2183e 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/bull/castedatum_bull.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/bull/castedatum_bull.dm @@ -28,7 +28,7 @@ evolution_threshold = 225 // *** Flags *** // - caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_ACID_BLOOD + caste_flags = CASTE_EVOLUTION_ALLOWED can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER caste_traits = null 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 37d58819815..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 @@ -37,7 +37,7 @@ GLOBAL_LIST_INIT(hugger_images_list, list( keybinding_signals = list( KEYBINDING_NORMAL = COMSIG_XENOABILITY_THROW_HUGGER, ) - cooldown_duration = 3 SECONDS + cooldown_duration = 2 SECONDS /datum/action/ability/activable/xeno/throw_hugger/get_cooldown() var/mob/living/carbon/xenomorph/carrier/caster = owner @@ -150,7 +150,7 @@ GLOBAL_LIST_INIT(hugger_images_list, list( action_icon_state = "spawn_hugger" desc = "Spawn a facehugger that is stored on your body." ability_cost = 100 - cooldown_duration = 10 SECONDS + cooldown_duration = 5 SECONDS keybinding_signals = list( KEYBINDING_NORMAL = COMSIG_XENOABILITY_SPAWN_HUGGER, ) @@ -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() @@ -378,7 +378,7 @@ GLOBAL_LIST_INIT(hugger_images_list, list( action_icon_state = "call_younger" desc = "Appeals to the larva inside the Marine. The Marine loses his balance, and larva's progress accelerates." ability_cost = 150 - cooldown_duration = 20 SECONDS + cooldown_duration = 10 SECONDS keybinding_signals = list( KEYBINDING_NORMAL = COMSIG_XENOABILITY_CALL_YOUNGER, ) @@ -456,3 +456,56 @@ GLOBAL_LIST_INIT(hugger_images_list, list( succeed_activate() add_cooldown() + +// *************************************** +// *********** Build nest +// *************************************** + +/datum/action/ability/xeno_action/build_nest + name = "Build nest" + action_icon_state = ALIEN_NEST + desc = "Build nest for host" + ability_cost = 200 + cooldown_duration = 20 SECONDS + keybinding_signals = list( + KEYBINDING_NORMAL = COMSIG_XENOABILITY_SECRETE_RESIN, + ) + +/datum/action/ability/xeno_action/build_nest/can_use_action(silent, override_flags) + . = ..() + var/turf/T = get_turf(owner) + var/mob/living/carbon/xenomorph/blocker = locate() in T + if(blocker && blocker != owner && blocker.stat != DEAD) + if(!silent) + to_chat(owner, span_xenowarning("You cannot build with [blocker] in the way!")) + return FALSE + + if(!T.is_weedable()) + return FALSE + + var/mob/living/carbon/xenomorph/owner_xeno = owner + if(!owner_xeno.loc_weeds_type) + if(!silent) + to_chat(owner, span_xenowarning("No weeds here!")) + return FALSE + + if(!T.check_alien_construction(owner, silent, /obj/structure/bed/nest) || !T.check_disallow_alien_fortification(owner)) + return FALSE + +/datum/action/ability/xeno_action/build_nest/action_activate() + + var/turf/T = get_turf(owner) + for(var/obj/structure/bed/nest/nest in range(2, T)) + owner.balloon_alert(owner, "Another nest too close!") + return FALSE + + if(!do_after(owner, 2 SECONDS, NONE, owner, BUSY_ICON_BUILD)) + return FALSE + + if(!can_use_action()) + return FALSE + + new /obj/structure/bed/nest(T) + playsound(T, "alien_resin_build", 25) + succeed_activate() + add_cooldown() diff --git a/code/modules/mob/living/carbon/xenomorph/castes/carrier/carrier.dm b/code/modules/mob/living/carbon/xenomorph/castes/carrier/carrier.dm index 38d6163e646..7b7390f21c7 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/carrier/carrier.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/carrier/carrier.dm @@ -9,8 +9,6 @@ health = 200 maxHealth = 200 plasma_stored = 50 - ///Number of huggers the carrier is currently carrying - var/huggers = 0 tier = XENO_TIER_TWO upgrade = XENO_UPGRADE_NORMAL pixel_x = -16 //Needed for 2x2 @@ -18,6 +16,8 @@ inherent_verbs = list( /mob/living/carbon/xenomorph/proc/vent_crawl, ) + ///Number of huggers the carrier is currently carrying + var/huggers = 0 ///Facehuggers overlay var/mutable_appearance/hugger_overlays_icon ///The number of huggers the carrier reserves against observer possession. @@ -28,7 +28,7 @@ // *************************************** /mob/living/carbon/xenomorph/carrier/Initialize(mapload) . = ..() - hugger_overlays_icon = mutable_appearance('icons/Xeno/castes/carrier/effects.dmi',"empty") + hugger_overlays_icon = mutable_appearance(effects_icon, "empty") /mob/living/carbon/xenomorph/carrier/get_status_tab_items() . = ..() @@ -47,19 +47,17 @@ return ///Dispayed number of huggers - var/displayed = round(( huggers / xeno_caste.huggers_max ) * 3.999) + 1 - + var/displayed = round((huggers / xeno_caste.huggers_max) * 3.999) + 1 for(var/i = 1; i <= displayed; i++) if(stat == DEAD) - hugger_overlays_icon.overlays += mutable_appearance(icon, "clinger_[i] Knocked Down") + hugger_overlays_icon.overlays += mutable_appearance(effects_icon, "clinger_[i] Knocked Down") else if(lying_angle) if((resting || IsSleeping()) && (!IsParalyzed() && !IsUnconscious() && health > 0)) - hugger_overlays_icon.overlays += mutable_appearance(icon, "clinger_[i] Sleeping") + hugger_overlays_icon.overlays += mutable_appearance(effects_icon, "clinger_[i] Sleeping") else - hugger_overlays_icon.overlays +=mutable_appearance(icon, "clinger_[i] Knocked Down") + hugger_overlays_icon.overlays += mutable_appearance(effects_icon, "clinger_[i] Knocked Down") else - hugger_overlays_icon.overlays +=mutable_appearance(icon, "clinger_[i]") - + hugger_overlays_icon.overlays += mutable_appearance(effects_icon, "clinger_[i]") overlays += hugger_overlays_icon //Observers can become playable facehuggers by clicking on the carrier diff --git a/code/modules/mob/living/carbon/xenomorph/castes/carrier/castedatum_carrier.dm b/code/modules/mob/living/carbon/xenomorph/castes/carrier/castedatum_carrier.dm index 1c0c767aaaf..4f765ad68aa 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/carrier/castedatum_carrier.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/carrier/castedatum_carrier.dm @@ -11,29 +11,29 @@ wound_type = "carrier" //used to match appropriate wound overlays // *** Melee Attacks *** // - melee_damage = 20 + melee_damage = 22 // *** Speed *** // speed = -0.4 // *** Plasma *** // - plasma_max = 800 - plasma_gain = 38 + plasma_max = 1000 + plasma_gain = 45 // *** Health *** // - max_health = 325 + max_health = 425 // *** Evolution *** // evolution_threshold = 225 // *** Flags *** // - caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_ACID_BLOOD + caste_flags = CASTE_EVOLUTION_ALLOWED can_hold_eggs = CAN_HOLD_ONE_HAND can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_HOLD_FACEHUGGERS|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER|CASTE_CAN_HOLD_JELLY caste_traits = null // *** Defense *** // - soft_armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 0, BIO = 5, FIRE = 0, ACID = 5) + soft_armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 0, BIO = 5, FIRE = 25, ACID = 5) // *** Pheromones *** // aura_strength = 2.5 @@ -42,8 +42,8 @@ minimap_icon = "carrier" // *** Carrier Abilities *** // - huggers_max = 7 - hugger_delay = 1.5 SECONDS + huggers_max = 9 + hugger_delay = 1.25 SECONDS actions = list( /datum/action/ability/xeno_action/xeno_resting, @@ -61,6 +61,7 @@ /datum/action/ability/xeno_action/pheromones/emit_warding, /datum/action/ability/xeno_action/pheromones/emit_frenzy, /datum/action/ability/xeno_action/carrier_panic, + /datum/action/ability/xeno_action/build_nest, /datum/action/ability/xeno_action/choose_hugger_type, /datum/action/ability/xeno_action/set_hugger_reserve, ) @@ -90,6 +91,7 @@ /datum/action/ability/xeno_action/pheromones/emit_warding, /datum/action/ability/xeno_action/pheromones/emit_frenzy, /datum/action/ability/xeno_action/carrier_panic, + /datum/action/ability/xeno_action/build_nest, /datum/action/ability/xeno_action/choose_hugger_type, /datum/action/ability/xeno_action/set_hugger_reserve, /datum/action/ability/xeno_action/build_hugger_turret, diff --git a/code/modules/mob/living/carbon/xenomorph/castes/crusher/castedatum_crusher.dm b/code/modules/mob/living/carbon/xenomorph/castes/crusher/castedatum_crusher.dm index b9249ffac33..0357165bf18 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/crusher/castedatum_crusher.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/crusher/castedatum_crusher.dm @@ -21,14 +21,14 @@ plasma_gain = 30 // *** Health *** // - max_health = 400 + max_health = 500 // *** Flags *** // can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER caste_traits = list(TRAIT_STOPS_TANK_COLLISION) // *** Defense *** // - soft_armor = list(MELEE = 90, BULLET = 80, LASER = 80, ENERGY = 75, BOMB = 130, BIO = 100, FIRE = 10, ACID = 100) + soft_armor = list(MELEE = 50, BULLET = 80, LASER = 65, ENERGY = 75, BOMB = 130, BIO = 100, FIRE = 10, ACID = 100) // *** Sunder *** // sunder_multiplier = 0.5 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..9803fbf4327 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 = 5 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 4880522dcd5..f1a0fe9ec83 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 @@ -21,18 +21,19 @@ plasma_gain = 15 // *** Health *** // - max_health = 320 + max_health = 410 // *** Evolution *** // evolution_threshold = 100 // *** Flags *** // - caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_ACID_BLOOD + caste_flags = CASTE_EVOLUTION_ALLOWED can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER|CASTE_CAN_HOLD_FACEHUGGERS|CASTE_CAN_HOLD_JELLY caste_traits = null // *** Defense *** // soft_armor = list(MELEE = 40, BULLET = 45, LASER = 45, ENERGY = 40, BOMB = 20, BIO = 30, FIRE = 10, ACID = 30) + hard_armor = list(MELEE = 0, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) // *** Minimap Icon *** // minimap_icon = "defender" @@ -52,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 @@ -71,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/defiler/castedatum_defiler.dm b/code/modules/mob/living/carbon/xenomorph/castes/defiler/castedatum_defiler.dm index e3b9f5f3e5c..b5b42e8e978 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/defiler/castedatum_defiler.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/defiler/castedatum_defiler.dm @@ -27,7 +27,7 @@ sunder_multiplier = 0.8 // *** Flags *** // - caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_ACID_BLOOD + caste_flags = CASTE_EVOLUTION_ALLOWED can_hold_eggs = CAN_HOLD_ONE_HAND can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER|CASTE_CAN_HOLD_JELLY caste_traits = list(TRAIT_CAN_VENTCRAWL) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/drone/abilities_drone.dm b/code/modules/mob/living/carbon/xenomorph/castes/drone/abilities_drone.dm index fe6ce450b2b..f0929e9bab1 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/drone/abilities_drone.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/drone/abilities_drone.dm @@ -144,7 +144,7 @@ KEYBINDING_NORMAL = COMSIG_XENOABILITY_ENHANCEMENT, ) /// References Essence Link and its vars. - var/datum/action/ability/activable/xeno/essence_link/essence_link_action + var/datum/action/ability/activable/xeno/essence_link/essence_link_action //todo: All this link stuff is handled in a stinky way /// Used to determine whether Enhancement is already active or not. Also allows access to its vars. var/datum/status_effect/drone_enhancement/existing_enhancement /// Damage bonus given by this ability. @@ -152,12 +152,14 @@ /// Speed bonus given by this ability. var/speed_addition = -0.4 +/datum/action/ability/xeno_action/enhancement/New(Target) + . = ..() + INVOKE_NEXT_TICK(src, PROC_REF(link_essence_action)) + /datum/action/ability/xeno_action/enhancement/can_use_action() - var/mob/living/carbon/xenomorph/X = owner - essence_link_action = X.actions_by_path[/datum/action/ability/activable/xeno/essence_link] if(existing_enhancement) return TRUE - if(!HAS_TRAIT(X, TRAIT_ESSENCE_LINKED)) + if(!HAS_TRAIT(owner, TRAIT_ESSENCE_LINKED)) return FALSE if(!essence_link_action.existing_link.was_within_range) return FALSE @@ -174,6 +176,21 @@ existing_enhancement = essence_link_action.linked_target.has_status_effect(STATUS_EFFECT_XENO_ENHANCEMENT) succeed_activate() +///Links this action to +/datum/action/ability/xeno_action/enhancement/proc/link_essence_action() + if(essence_link_action) + return + var/mob/living/carbon/xenomorph/X = owner + essence_link_action = X.actions_by_path[/datum/action/ability/activable/xeno/essence_link] + if(!essence_link_action) + CRASH("[type] loaded with a drone_enhancement to link to") + RegisterSignal(essence_link_action, COMSIG_QDELETING, PROC_REF(unlink_essence_action)) + +///Signal proc to delink essence_link. Should only happen when the owner is being deleted to begin with +/datum/action/ability/xeno_action/enhancement/proc/unlink_essence_action() + SIGNAL_HANDLER + essence_link_action = null + /// Ends the ability if the Enhancement buff is removed. /datum/action/ability/xeno_action/enhancement/proc/end_ability() if(existing_enhancement) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/drone/castedatum_drone.dm b/code/modules/mob/living/carbon/xenomorph/castes/drone/castedatum_drone.dm index 449b4850f6f..2778a6b853b 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/drone/castedatum_drone.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/drone/castedatum_drone.dm @@ -29,7 +29,7 @@ evolution_threshold = 100 // *** Flags *** // - caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_IS_BUILDER|CASTE_ACID_BLOOD + caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_IS_BUILDER can_hold_eggs = CAN_HOLD_TWO_HANDS can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_HOLD_FACEHUGGERS|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER|CASTE_CAN_HOLD_JELLY|CASTE_CAN_RIDE_CRUSHER caste_traits = list(TRAIT_CAN_VENTCRAWL) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/hellhound/hellhound.dm b/code/modules/mob/living/carbon/xenomorph/castes/hellhound/hellhound.dm index 9e66cb44ad6..fdab28b8b3b 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/hellhound/hellhound.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/hellhound/hellhound.dm @@ -8,7 +8,7 @@ wound_type = "" upgrade_name = "" - caste_flags = CASTE_INNATE_HEALING|CASTE_INNATE_PLASMA_REGEN|CASTE_ACID_BLOOD + caste_flags = CASTE_INNATE_HEALING|CASTE_INNATE_PLASMA_REGEN // *** Melee Attacks *** // melee_damage = 35 diff --git a/code/modules/mob/living/carbon/xenomorph/castes/hivelord/castedatum_hivelord.dm b/code/modules/mob/living/carbon/xenomorph/castes/hivelord/castedatum_hivelord.dm index 556e9d73035..f73f6340c0d 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/hivelord/castedatum_hivelord.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/hivelord/castedatum_hivelord.dm @@ -27,7 +27,7 @@ evolution_threshold = 225 // *** Flags *** // - caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_IS_BUILDER|CASTE_ACID_BLOOD + caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_IS_BUILDER can_hold_eggs = CAN_HOLD_TWO_HANDS can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_HOLD_FACEHUGGERS|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER|CASTE_CAN_HOLD_JELLY caste_traits = null 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 754ae1ab179..e1bb75a2393 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 @@ -572,7 +572,7 @@ var/swap_used = FALSE /datum/action/ability/xeno_action/mirage/remove_action() - clean_illusions() + illusions = list() //the actual illusions fade on their own, and the cooldown object may be qdel'd return ..() /datum/action/ability/xeno_action/mirage/can_use_action(silent = FALSE, override_flags) @@ -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,16 +654,13 @@ 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 // *************************************** /datum/action/ability/xeno_action/crippling_strike/hunter additional_damage = 1 - heal_amount = 0 + heal_amount = 12 plasma_gain = 20 decay_time = 15 SECONDS diff --git a/code/modules/mob/living/carbon/xenomorph/castes/hunter/castedatum_hunter.dm b/code/modules/mob/living/carbon/xenomorph/castes/hunter/castedatum_hunter.dm index e800c3a099c..12c65c549a1 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/hunter/castedatum_hunter.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/hunter/castedatum_hunter.dm @@ -31,7 +31,7 @@ evolution_threshold = 225 // *** Flags *** // - caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_ACID_BLOOD + caste_flags = CASTE_EVOLUTION_ALLOWED can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER|CASTE_CAN_HOLD_FACEHUGGERS|CASTE_CAN_HOLD_JELLY caste_traits = list(TRAIT_CAN_VENTCRAWL) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/king/castedatum_king.dm b/code/modules/mob/living/carbon/xenomorph/castes/king/castedatum_king.dm index 8893b4c653c..6fd7f4176ec 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/king/castedatum_king.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/king/castedatum_king.dm @@ -31,7 +31,7 @@ death_evolution_delay = 7 MINUTES // *** Flags *** // - caste_flags = CASTE_IS_INTELLIGENT|CASTE_STAGGER_RESISTANT|CASTE_LEADER_TYPE|CASTE_INSTANT_EVOLUTION|CASTE_ACID_BLOOD + caste_flags = CASTE_IS_INTELLIGENT|CASTE_STAGGER_RESISTANT|CASTE_LEADER_TYPE|CASTE_INSTANT_EVOLUTION can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER|CASTE_CAN_CORRUPT_GENERATOR|CASTE_CAN_HOLD_FACEHUGGERS|CASTE_CAN_HOLD_JELLY caste_traits = null 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/larva/castedatum_larva.dm b/code/modules/mob/living/carbon/xenomorph/castes/larva/castedatum_larva.dm index b3ebdc2ed85..5eaad6751e5 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/larva/castedatum_larva.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/larva/castedatum_larva.dm @@ -28,7 +28,7 @@ evolution_threshold = 50 // *** Flags *** // - caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_INNATE_HEALING|CASTE_ACID_BLOOD + caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_INNATE_HEALING can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_RIDE_CRUSHER caste_traits = list(TRAIT_CAN_VENTCRAWL) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/larva/larva.dm b/code/modules/mob/living/carbon/xenomorph/castes/larva/larva.dm index 80ff507dc2f..8ab84dd1a33 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/larva/larva.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/larva/larva.dm @@ -131,7 +131,7 @@ evolution_threshold = 50 // *** Flags *** // - caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_INNATE_HEALING|CASTE_ACID_BLOOD + caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_INNATE_HEALING can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_RIDE_CRUSHER caste_traits = list(TRAIT_CAN_VENTCRAWL) @@ -206,4 +206,4 @@ . = list() if(HAS_TRAIT(src, TRAIT_CASTE_SWAP) || HAS_TRAIT(src, TRAIT_REGRESSING)) return - return list(/mob/living/carbon/xenomorph/predalien) + return list(/datum/xeno_caste/predalien) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/panther/abilities_panther.dm b/code/modules/mob/living/carbon/xenomorph/castes/panther/abilities_panther.dm index 464ae4e8f0b..15cefd0b167 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/panther/abilities_panther.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/panther/abilities_panther.dm @@ -6,14 +6,16 @@ keybinding_signals = list( KEYBINDING_NORMAL = COMSIG_XENOABILITY_PANTHER_POUNCE, ) - cooldown_duration = 13 SECONDS - ability_cost = 20 - var/pantherplasmaheal = 45 + cooldown_duration = 8 SECONDS + ability_cost = 15 + var/pantherplasmaheal = 35 + var/pantherlifesteal = 25 /datum/action/ability/activable/xeno/pounce/panther/mob_hit(datum/source, mob/living/M) . = ..() var/mob/living/carbon/xenomorph/xenomorph_owner = owner xenomorph_owner.plasma_stored += pantherplasmaheal + HEAL_XENO_DAMAGE(xenomorph_owner, pantherlifesteal, FALSE) /////////////////////////////////// // *************************************** @@ -24,8 +26,8 @@ name = "Tearing tail" action_icon_state = "tearing_tail" desc = "Hit all nearby enemies around you, poisoning them with selected toxin and healing you for each target hit." - ability_cost = 50 - cooldown_duration = 15 SECONDS + ability_cost = 35 + cooldown_duration = 10 SECONDS var/tearing_tail_reagent keybind_flags = ABILITY_KEYBIND_USE_ABILITY keybinding_signals = list( @@ -52,7 +54,7 @@ affecting = human_target.get_limb("chest") //Gotta have a torso?! human_target.apply_damage(damage, BRUTE, affecting, MELEE) xenomorph_owner.plasma_stored += 25 - xenomorph_owner.heal_overall_damage(25, 25, updating_health = TRUE) + xenomorph_owner.heal_overall_damage(35, 35, updating_health = TRUE) if(human_target.can_sting()) tearing_tail_reagent = xenomorph_owner.selected_reagent var/reagent_amount = (xenomorph_owner.selected_reagent == /datum/reagent/toxin/xeno_ozelomelyn) ? PANTHER_TEARING_TAIL_REAGENT_AMOUNT * 0.5 : PANTHER_TEARING_TAIL_REAGENT_AMOUNT @@ -82,8 +84,8 @@ name = "Adrenaline Jump" action_icon_state = "adrenaline_jump" desc = "Jump from some distance to target, knocking them down and pulling them to you, only works if you are at least from 3 to 8 meters away from the target, this ability sends Pounce on cooldown." - ability_cost = 15 - cooldown_duration = 12 SECONDS + ability_cost = 10 + cooldown_duration = 8 SECONDS keybinding_signals = list( KEYBINDING_NORMAL = COMSIG_XENOABILITY_ADRENALINE_JUMP, ) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/panther/panther.dm b/code/modules/mob/living/carbon/xenomorph/castes/panther/panther.dm index 9d2f082ed87..ba7bcf8a676 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/panther/panther.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/panther/panther.dm @@ -61,3 +61,6 @@ if(prob(44.81)) new /obj/item/reagent_containers/food/drinks/pantherheart(loc) gib() + +/mob/living/carbon/xenomorph/panther/set_frenzy_aura(new_aura) + return diff --git a/code/modules/mob/living/carbon/xenomorph/castes/praetorian/castedatum_praetorian.dm b/code/modules/mob/living/carbon/xenomorph/castes/praetorian/castedatum_praetorian.dm index 9141f6de69a..056b30b5ed5 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/praetorian/castedatum_praetorian.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/praetorian/castedatum_praetorian.dm @@ -19,14 +19,15 @@ plasma_gain = 80 // *** Health *** // - max_health = 460 + max_health = 570 // *** Flags *** // can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER|CASTE_CAN_HOLD_FACEHUGGERS|CASTE_CAN_HOLD_JELLY caste_traits = null + caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_ACID_BLOOD // *** Defense *** // - soft_armor = list(MELEE = 45, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 40, FIRE = 20, ACID = 40) + soft_armor = list(MELEE = 45, BULLET = 25, LASER = 15, ENERGY = 50, BOMB = 10, BIO = 40, FIRE = 20, ACID = 40) // *** Ranged Attack *** // spit_delay = 1 SECONDS diff --git a/code/modules/mob/living/carbon/xenomorph/castes/predalien/abilities_predalien.dm b/code/modules/mob/living/carbon/xenomorph/castes/predalien/abilities_predalien.dm index de0646270f2..2b1215319b2 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/predalien/abilities_predalien.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/predalien/abilities_predalien.dm @@ -190,10 +190,7 @@ carbon.apply_damage(base_damage + damage_scale * min(xeno.life_kills_total, xeno.max_bonus_life_kills), BRUTE, "chest", MELEE, FALSE, FALSE, TRUE, 20) xeno.do_attack_animation(carbon, ATTACK_EFFECT_CLAW) - spawn() - for(var/x in 1 to 4) - sleep(1) - xeno.setDir(turn(xeno.dir, 90)) + INVOKE_ASYNC(src, PROC_REF(ability_spin)) xeno.do_attack_animation(carbon, ATTACK_EFFECT_BITE) playsound(xeno, 'sound/voice/alien/predalien/growl.ogg', 75, 0) @@ -207,3 +204,9 @@ add_cooldown() succeed_activate() + +/datum/action/ability/activable/xeno/devastate/proc/ability_spin() + var/mob/living/carbon/xenomorph/predalien/xeno = owner + for(var/x in 1 to 4) + sleep(1) + xeno.setDir(turn(xeno.dir, 90)) 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/ravager/castedatum_ravager.dm b/code/modules/mob/living/carbon/xenomorph/castes/ravager/castedatum_ravager.dm index f664ffaa5ef..bdc42b7f001 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/ravager/castedatum_ravager.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/ravager/castedatum_ravager.dm @@ -25,7 +25,7 @@ max_health = 350 // *** Flags *** // - caste_flags = CASTE_INNATE_PLASMA_REGEN|CASTE_PLASMADRAIN_IMMUNE|CASTE_EVOLUTION_ALLOWED|CASTE_ACID_BLOOD + caste_flags = CASTE_INNATE_PLASMA_REGEN|CASTE_PLASMADRAIN_IMMUNE|CASTE_EVOLUTION_ALLOWED can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_LEADER caste_traits = null diff --git a/code/modules/mob/living/carbon/xenomorph/castes/runner/castedatum_runner.dm b/code/modules/mob/living/carbon/xenomorph/castes/runner/castedatum_runner.dm index de779a05336..c0ea6a08265 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/runner/castedatum_runner.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/runner/castedatum_runner.dm @@ -29,7 +29,7 @@ evolution_threshold = 100 // *** Flags *** // - caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_ACID_BLOOD + caste_flags = CASTE_EVOLUTION_ALLOWED can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER|CASTE_CAN_RIDE_CRUSHER caste_traits = list(TRAIT_CAN_VENTCRAWL) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/runner/runner.dm b/code/modules/mob/living/carbon/xenomorph/castes/runner/runner.dm index 251db0fb576..378bd2759b5 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/runner/runner.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/runner/runner.dm @@ -55,3 +55,6 @@ holder.pixel_x = 24 holder.pixel_y = 24 hud_list[XENO_EVASION_HUD] = holder + +/mob/living/carbon/xenomorph/runner/set_frenzy_aura(new_aura) + return diff --git a/code/modules/mob/living/carbon/xenomorph/castes/sentinel/abilities_sentinel.dm b/code/modules/mob/living/carbon/xenomorph/castes/sentinel/abilities_sentinel.dm index 1954859ba08..42f6c894b19 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/sentinel/abilities_sentinel.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/sentinel/abilities_sentinel.dm @@ -28,6 +28,7 @@ if(C.has_status_effect(STATUS_EFFECT_INTOXICATED)) var/datum/status_effect/stacking/intoxicated/debuff = C.has_status_effect(STATUS_EFFECT_INTOXICATED) debuff.add_stacks(intoxication_stacks) + return C.apply_status_effect(STATUS_EFFECT_INTOXICATED, intoxication_stacks) // *************************************** @@ -65,6 +66,7 @@ particle_holder = new(owner, /particles/toxic_slash) particle_holder.pixel_x = 9 particle_holder.pixel_y = 2 + xeno_owner.soft_armor = xeno_owner.soft_armor.modifyRating(bullet = 60) succeed_activate() add_cooldown() @@ -80,7 +82,8 @@ if(xeno_target.has_status_effect(STATUS_EFFECT_INTOXICATED)) var/datum/status_effect/stacking/intoxicated/debuff = xeno_target.has_status_effect(STATUS_EFFECT_INTOXICATED) debuff.add_stacks(intoxication_stacks) - xeno_target.apply_status_effect(STATUS_EFFECT_INTOXICATED, intoxication_stacks) + else + xeno_target.apply_status_effect(STATUS_EFFECT_INTOXICATED, intoxication_stacks) remaining_slashes-- //Decrement the toxic slash count if(!remaining_slashes) //Deactivate if we have no toxic slashes remaining toxic_slash_deactivate(xeno_owner) @@ -95,6 +98,7 @@ xeno_owner.balloon_alert(xeno_owner, "Toxic Slash over") //Let the user know xeno_owner.playsound_local(xeno_owner, 'sound/voice/alien/hiss8.ogg', 25) action_icon_state = "neuroclaws_off" + xeno_owner.soft_armor = xeno_owner.soft_armor.modifyRating(bullet = -60) /datum/action/ability/xeno_action/toxic_slash/on_cooldown_finish() owner.playsound_local(owner, 'sound/effects/alien/newlarva.ogg', 25, 0, 1) @@ -204,14 +208,18 @@ ///Type of nade to be thrown var/nade_type = /obj/item/explosive/grenade/smokebomb/xeno -/datum/action/ability/activable/xeno/toxic_grenade/use_ability(atom/A) +/datum/action/ability/activable/xeno/toxic_grenade/use_ability(atom/our_atom) . = ..() succeed_activate() add_cooldown() + grenade_act(our_atom) + +/// All the grenade activations go here, so we don't overwrite the use_ability +/datum/action/ability/activable/xeno/toxic_grenade/proc/grenade_act(atom/our_atom) var/obj/item/explosive/grenade/smokebomb/xeno/nade = new nade_type(get_turf(owner)) - nade.throw_at(A, 5, 1, owner, TRUE) + nade.throw_at(our_atom, 5, 1, owner, TRUE) nade.activate(owner) - owner.visible_message(span_warning("[owner] vomits up a bulbous lump and throws it at [A]!"), span_warning("We vomit up a bulbous lump and throw it at [A]!")) + owner.visible_message(span_warning("[owner] vomits up a bulbous lump and throws it at [our_atom]!"), span_warning("We vomit up a bulbous lump and throw it at [our_atom]!")) /obj/item/explosive/grenade/smokebomb/xeno name = "toxic grenade" @@ -224,6 +232,7 @@ smoketype = /datum/effect_system/smoke_spread/xeno/toxic arm_sound = 'sound/voice/alien/yell_alt.ogg' smokeradius = 3 + overlay_type = null /obj/item/explosive/grenade/smokebomb/xeno/update_overlays() . = ..() diff --git a/code/modules/mob/living/carbon/xenomorph/castes/sentinel/castedatum_sentinel.dm b/code/modules/mob/living/carbon/xenomorph/castes/sentinel/castedatum_sentinel.dm index 24766973096..8f8e44cc2bd 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/sentinel/castedatum_sentinel.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/sentinel/castedatum_sentinel.dm @@ -21,7 +21,7 @@ plasma_gain = 21 // *** Health *** // - max_health = 300 + max_health = 400 // *** Evolution *** // evolution_threshold = 100 @@ -89,7 +89,7 @@ // *** Ranged Attack *** // spit_delay = 1 SECONDS - spit_types = list(/datum/ammo/xeno/toxin, /datum/ammo/xeno/acid/passthrough) + spit_types = list(/datum/ammo/xeno/tox_loss, /datum/ammo/xeno/acid/passthrough) actions = list( /datum/action/ability/xeno_action/xeno_resting, diff --git a/code/modules/mob/living/carbon/xenomorph/castes/shrike/castedatum_shrike.dm b/code/modules/mob/living/carbon/xenomorph/castes/shrike/castedatum_shrike.dm index a2107b74ae4..317064f7cfe 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/shrike/castedatum_shrike.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/shrike/castedatum_shrike.dm @@ -27,7 +27,7 @@ maximum_active_caste = 1 // *** Flags *** // - caste_flags = CASTE_IS_INTELLIGENT|CASTE_IS_STRONG|CASTE_IS_BUILDER|CASTE_INSTANT_EVOLUTION|CASTE_EVOLUTION_ALLOWED|CASTE_LEADER_TYPE|CASTE_ACID_BLOOD + caste_flags = CASTE_IS_INTELLIGENT|CASTE_IS_STRONG|CASTE_IS_BUILDER|CASTE_INSTANT_EVOLUTION|CASTE_EVOLUTION_ALLOWED|CASTE_LEADER_TYPE can_hold_eggs = CAN_HOLD_TWO_HANDS can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_HOLD_FACEHUGGERS|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER|CASTE_CAN_CORRUPT_GENERATOR|CASTE_CAN_HOLD_JELLY caste_traits = null 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 new file mode 100644 index 00000000000..6f2b52206c3 --- /dev/null +++ b/code/modules/mob/living/carbon/xenomorph/castes/spiderling/castedatum_spiderling.dm @@ -0,0 +1,25 @@ +/datum/xeno_caste/spiderling + caste_name = "spiderling" + display_name = "spiderling" + upgrade_name = "" + caste_desc = "An anthropod xenomorph without any qualms to obey their widow, even if it will never grow up and will face death." + wound_type = "" + caste_type_path = /mob/living/carbon/xenomorph/spiderling + tier = XENO_TIER_MINION + upgrade = XENO_UPGRADE_BASETYPE + // *** Melee Attacks *** // + melee_damage = 8 + // *** Speed *** // + speed = -0.6 + // *** Plasma *** // + plasma_max = 200 + plasma_gain = 1 + // *** Health *** // + 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 *** // + minimap_icon = "spiderling" + // *** Defense *** // + soft_armor = list(MELEE = 15, BULLET = 0, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + diff --git a/code/modules/mob/living/carbon/xenomorph/castes/spiderling/spiderling.dm b/code/modules/mob/living/carbon/xenomorph/castes/spiderling/spiderling.dm new file mode 100644 index 00000000000..7b35567b085 --- /dev/null +++ b/code/modules/mob/living/carbon/xenomorph/castes/spiderling/spiderling.dm @@ -0,0 +1,246 @@ +/mob/living/carbon/xenomorph/spiderling + caste_base_type = /datum/xeno_caste/spiderling + name = "Spiderling" + desc = "A widow spawn, it chitters angrily without any sense of self-preservation, only to obey the widow's will." + icon = 'icons/Xeno/Effects.dmi' + icon_state = "Spiderling Running" + health = 150 + maxHealth = 150 + plasma_stored = 200 + tier = XENO_TIER_MINION + upgrade = XENO_UPGRADE_BASETYPE + pull_speed = -2 + allow_pass_flags = PASS_XENO + pass_flags = PASS_XENO|PASS_LOW_STRUCTURE + density = FALSE + /// The widow that this spiderling belongs to + var/mob/living/carbon/xenomorph/spidermother + +/mob/living/carbon/xenomorph/spiderling/Initialize(mapload, mob/living/carbon/xenomorph/mother) + . = ..() + spidermother = mother + if(spidermother) + AddComponent(/datum/component/ai_controller, /datum/ai_behavior/spiderling, spidermother) + transfer_to_hive(spidermother.get_xeno_hivenumber()) + else + AddComponent(/datum/component/ai_controller, /datum/ai_behavior/xeno) + +/mob/living/carbon/xenomorph/spiderling/on_death() + //We QDEL them as cleanup and preventing them from being sold + QDEL_IN(src, TIME_TO_DISSOLVE) + spidermother = null + return ..() + +/mob/living/carbon/xenomorph/spiderling/Destroy() + spidermother = null + return ..() + +///If we're covering our widow, any clicks should be transferred to them +/mob/living/carbon/xenomorph/spiderling/attack_alien(mob/living/carbon/xenomorph/xeno_attacker, damage_amount = xeno_attacker.xeno_caste.melee_damage, damage_type = BRUTE, armor_type = MELEE, effects = TRUE, isrightclick = FALSE) + if(!get_dist(src, spidermother) && isxeno(x)) + spidermother.attack_alien(xeno_attacker, damage_amount, damage_type, armor_type, effects, isrightclick) + return + return ..() + +/mob/living/carbon/xenomorph/spiderling/Life(seconds_per_tick, times_fired) + . = ..() + if(!spidermother) + return + if(get_dist(src, spidermother) > SPIDERLING_WITHER_RANGE) + adjustBruteLoss(25) + +// *************************************** +// *********** Spiderling AI Section +// *************************************** +/datum/ai_behavior/spiderling + target_distance = 1 + base_action = ESCORTING_ATOM + identifier = IDENTIFIER_XENO + ///should we go back to escorting the widow if we stray too far + var/too_far_escort = TRUE + ///weakref to our mother + var/datum/weakref/master_ref + +/datum/ai_behavior/spiderling/New(loc, parent_to_assign, escorted_atom) + . = ..() + master_ref = WEAKREF(escorted_atom) + change_order(null, SPIDERLING_RECALL) + +///starts AI and registers obstructed move signal +/datum/ai_behavior/spiderling/start_ai() + var/master = master_ref?.resolve() + if(master) + RegisterSignal(master, COMSIG_SPIDERLING_CHANGE_ALL_ORDER, PROC_REF(change_order)) + RegisterSignal(mob_parent, COMSIG_OBSTRUCTED_MOVE, PROC_REF(deal_with_obstacle)) + RegisterSignal(mob_parent, COMSIG_SPIDERLING_CHANGE_ORDER, PROC_REF(change_order)) + RegisterSignal(escorted_atom, COMSIG_XENOMORPH_REST, PROC_REF(start_resting)) + RegisterSignal(escorted_atom, COMSIG_XENOMORPH_UNREST, PROC_REF(stop_resting)) + RegisterSignal(escorted_atom, COMSIG_ELEMENT_JUMP_STARTED, PROC_REF(do_jump)) + RegisterSignal(escorted_atom, COMSIG_LIVING_DO_RESIST, PROC_REF(parent_resist)) + RegisterSignal(escorted_atom, COMSIG_XENOMORPH_RESIN_JELLY_APPLIED, PROC_REF(apply_spiderling_jelly)) + return ..() + +///cleans up signals and unregisters obstructed move signal +/datum/ai_behavior/spiderling/cleanup_signals() + . = ..() + UnregisterSignal(mob_parent, list(COMSIG_OBSTRUCTED_MOVE,COMSIG_SPIDERLING_CHANGE_ORDER)) + var/master = master_ref?.resolve() + if(master) + UnregisterSignal(master, COMSIG_SPIDERLING_CHANGE_ALL_ORDER) + +///Signal handler to try to attack our target +///Attack our current atom we are moving to, if targetted is specified attack that instead +/datum/ai_behavior/spiderling/proc/attack_target(datum/source, atom/targetted) + SIGNAL_HANDLER + if(world.time < mob_parent.next_move) + return + var/atom/target = targetted ? targetted : atom_to_walk_to + if(!mob_parent.Adjacent(target)) + return + if(mob_parent.z != target.z) + return + mob_parent.face_atom(target) + mob_parent.UnarmedAttack(target, mob_parent) + +///looks for a new state, handles recalling if too far and some AI shenanigans +/datum/ai_behavior/spiderling/look_for_new_state() + switch(current_action) + if(ESCORTING_ATOM) + if(!escorted_atom && master_ref) + escorted_atom = master_ref.resolve() + if(MOVING_TO_ATOM) + if(isliving(atom_to_walk_to)) + var/mob/living/target = atom_to_walk_to + if(target.stat == DEAD) + change_order(null, SPIDERLING_RECALL) + if(QDELETED(atom_to_walk_to)) + change_order(null, SPIDERLING_RECALL) + return ..() + +///override for MOVING_TO_ATOM to register signals for maintaining distance with our target and attacking +/datum/ai_behavior/spiderling/register_action_signals(action_type) + if(action_type == MOVING_TO_ATOM) + RegisterSignal(mob_parent, COMSIG_STATE_MAINTAINED_DISTANCE, PROC_REF(attack_target)) + RegisterSignals(atom_to_walk_to, list(COMSIG_MOB_DEATH, COMSIG_QDELETING), PROC_REF(look_for_new_state)) + return ..() + +///override for MOVING_TO_ATOM to unregister signals for maintaining distance with our target and attacking +/datum/ai_behavior/spiderling/unregister_action_signals(action_type) + if(action_type == MOVING_TO_ATOM) + UnregisterSignal(mob_parent, COMSIG_STATE_MAINTAINED_DISTANCE) + if(!isnull(atom_to_walk_to)) + UnregisterSignal(atom_to_walk_to, list(COMSIG_MOB_DEATH, COMSIG_QDELETING)) + return ..() + +///attack the first closest human, by moving towards it +/datum/ai_behavior/spiderling/proc/seek_and_attack_closest(mob/living/source) + var/victim = get_nearest_target(mob_parent, target_distance, TARGET_HUMAN, mob_parent.faction) + if(!victim) + return FALSE + change_action(MOVING_TO_ATOM, victim) + return TRUE + +///seeks a living humans in a 9 tile range near our parent, picks one, then changes our action to move towards it and attack. +/datum/ai_behavior/spiderling/proc/seek_and_attack() + var/list/possible_victims = list() + for(var/mob/living/carbon/human/victim in cheap_get_humans_near(mob_parent, 9)) + if(victim.stat == DEAD) + continue + if(HAS_TRAIT(victim, TRAIT_STEALTH)) + continue + possible_victims += victim + + for(var/atom/nearby_turret AS in GLOB.marine_turrets) + if(mob_parent.z != nearby_turret.z) + continue + if(!(get_dist(mob_parent, nearby_turret) < 9)) + continue + possible_victims += nearby_turret + + if(!length(possible_victims)) + return FALSE + + change_action(MOVING_TO_ATOM, pick(possible_victims)) + return TRUE + +///changes our current behavior with a define (order), optionally with a target, FALSE means fail and TRUE means success +/datum/ai_behavior/spiderling/proc/change_order(mob/living/source, order, atom/target) + SIGNAL_HANDLER + if(!order) + stack_trace("spiderling AI was somehow passed a null order") + return FALSE + switch(order) + if(SPIDERLING_SEEK_CLOSEST) //internal order, to attack closest enemy + return seek_and_attack_closest() + if(SPIDERLING_RECALL) //reset our escorted atom to master_ref and change our action to escorting it, and turn on recalling if out of range. + escorted_atom = master_ref?.resolve() + base_action = ESCORTING_ATOM + change_action(ESCORTING_ATOM, escorted_atom) + too_far_escort = TRUE + return TRUE + if(SPIDERLING_ATTACK) //turns on recalling out of range, if there is a target, attacks it, otherwise seeks and attacks one + too_far_escort = TRUE + source?.unbuckle_all_mobs() + if(target) + change_action(MOVING_TO_ATOM, target) + return TRUE + else + return seek_and_attack() + +///behavior to deal with obstacles +/datum/ai_behavior/spiderling/deal_with_obstacle(datum/source, direction) + var/turf/obstacle_turf = get_step(mob_parent, direction) + if(obstacle_turf.flags_atom & AI_BLOCKED) + return + for(var/thing in obstacle_turf.contents) + if(istype(thing, /obj/structure/window_frame)) //if its a window, climb it after 2 seconds + LAZYINCREMENT(mob_parent.do_actions, obstacle_turf) + addtimer(CALLBACK(src, PROC_REF(climb_window_frame), obstacle_turf), 2 SECONDS) + return COMSIG_OBSTACLE_DEALT_WITH + if(istype(thing, /obj/alien)) //dont attack resin and such + return + if(isobj(thing)) //otherwise smash it if its damageable + var/obj/obstacle = thing + if(obstacle.resistance_flags & XENO_DAMAGEABLE) + INVOKE_ASYNC(src, PROC_REF(attack_target), null, obstacle) + return COMSIG_OBSTACLE_DEALT_WITH + if(ISDIAGONALDIR(direction) && ((deal_with_obstacle(null, turn(direction, -45)) & COMSIG_OBSTACLE_DEALT_WITH) || (deal_with_obstacle(null, turn(direction, 45)) & COMSIG_OBSTACLE_DEALT_WITH))) + return COMSIG_OBSTACLE_DEALT_WITH + +///makes our parent climb over a turf with a window by setting its location to it +/datum/ai_behavior/spiderling/proc/climb_window_frame(turf/window_turf) + mob_parent.loc = window_turf + mob_parent.last_move_time = world.time + LAZYDECREMENT(mob_parent.do_actions, window_turf) + +/// rest when widow does +/datum/ai_behavior/spiderling/proc/start_resting(mob/source) + SIGNAL_HANDLER + var/mob/living/living = mob_parent + living?.set_resting(TRUE) + +/// stop resting when widow does +/datum/ai_behavior/spiderling/proc/stop_resting(mob/source) + SIGNAL_HANDLER + var/mob/living/living = mob_parent + living?.set_resting(FALSE) + source?.unbuckle_all_mobs() + +/// jump when widow does +/datum/ai_behavior/spiderling/proc/do_jump() + SIGNAL_HANDLER + var/datum/component/jump/spider_jump = mob_parent.GetComponent(/datum/component/jump) + spider_jump?.do_jump(mob_parent) + +/// resist when widow does +/datum/ai_behavior/spiderling/proc/parent_resist() + SIGNAL_HANDLER + var/mob/living/carbon/xenomorph/spiderling/spiderling_parent = mob_parent + spiderling_parent?.do_resist() + +/// Signal handler to apply resin jelly to the spiderling whenever widow gets it +/datum/ai_behavior/spiderling/proc/apply_spiderling_jelly() + SIGNAL_HANDLER + var/mob/living/carbon/xenomorph/spiderling/beno_to_coat = mob_parent + beno_to_coat?.apply_status_effect(STATUS_EFFECT_RESIN_JELLY_COATING) + diff --git a/code/modules/mob/living/carbon/xenomorph/castes/spitter/abilities_spitter.dm b/code/modules/mob/living/carbon/xenomorph/castes/spitter/abilities_spitter.dm index 50f04fac227..2d235079b67 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/spitter/abilities_spitter.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/spitter/abilities_spitter.dm @@ -137,3 +137,57 @@ to_chat(owner, span_xenodanger("Our auxiliary sacks fill to bursting; we can use scatter spit again.")) owner.playsound_local(owner, 'sound/voice/alien/drool1.ogg', 25, 0, 1) return ..() + +// *************************************** +// *********** Sticky Grenade ************ +// *************************************** +/datum/action/ability/activable/xeno/toxic_grenade/sticky + name = "Slime grenade" + desc = "Throws a lump of compressed acid to stick to a target, which will leave a trail of acid behind them." + ability_cost = 75 + cooldown_duration = 45 SECONDS + nade_type = /obj/item/explosive/grenade/sticky/xeno + +/datum/action/ability/activable/xeno/toxic_grenade/sticky/grenade_act(atom/our_atom) + var/obj/item/explosive/grenade/sticky/xeno/nade = new nade_type(get_turf(owner)) + nade.throw_at(our_atom, 5, 1, owner, TRUE) + nade.activate(owner) + owner.visible_message(span_warning("[owner] vomits up a sticky lump and throws it at [our_atom]!"), span_warning("We vomit up a sticky lump and throw it at [our_atom]!")) + +/obj/item/explosive/grenade/sticky/xeno + name = "\improper slime grenade" + desc = "A fleshy mass oozing acid. It appears to be rapidly decomposing." + greyscale_colors = "#42A500" + greyscale_config = /datum/greyscale_config/xenogrenade + self_sticky = TRUE + arm_sound = 'sound/voice/alien/yell_alt.ogg' + overlay_type = null + var/acid_spray_damage = 15 + +/obj/item/explosive/grenade/sticky/xeno/update_overlays() + . = ..() + if(active) + . += image('icons/obj/items/grenade.dmi', "xenonade_active") + +/obj/item/explosive/grenade/sticky/xeno/prime() + for(var/turf/acid_tile AS in RANGE_TURFS(1, loc)) + new /obj/effect/temp_visual/acid_splatter(acid_tile) //SFX + new /obj/effect/xenomorph/spray(acid_tile, 5 SECONDS, acid_spray_damage) + playsound(loc, "acid_bounce", 35) + if(stuck_to) + clean_refs() + qdel(src) + +/obj/item/explosive/grenade/sticky/xeno/stuck_to(atom/hit_atom) + . = ..() + RegisterSignal(stuck_to, COMSIG_MOVABLE_MOVED, PROC_REF(drop_acid)) + new /obj/effect/xenomorph/spray(get_turf(src), 5 SECONDS, acid_spray_damage) + +///causes acid tiles underneath target when stuck_to +/obj/item/explosive/grenade/sticky/xeno/proc/drop_acid(datum/source, old_loc, movement_dir, forced, old_locs) + SIGNAL_HANDLER + new /obj/effect/xenomorph/spray(get_turf(src), 5 SECONDS, acid_spray_damage) + +/obj/item/explosive/grenade/sticky/xeno/clean_refs() + UnregisterSignal(stuck_to, COMSIG_MOVABLE_MOVED) + return ..() diff --git a/code/modules/mob/living/carbon/xenomorph/castes/spitter/castedatum_spitter.dm b/code/modules/mob/living/carbon/xenomorph/castes/spitter/castedatum_spitter.dm index 5a8f8a8067c..956681905ed 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/spitter/castedatum_spitter.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/spitter/castedatum_spitter.dm @@ -19,7 +19,7 @@ plasma_gain = 50 // *** Health *** // - max_health = 310 + max_health = 450 // *** Evolution *** // evolution_threshold = 225 @@ -30,7 +30,7 @@ caste_traits = list(TRAIT_CAN_VENTCRAWL) // *** Defense *** // - soft_armor = list(MELEE = 25, BULLET = 35, LASER = 35, ENERGY = 35, BOMB = 0, BIO = 20, FIRE = 10, ACID = 20) + soft_armor = list(MELEE = 25, BULLET = 20, LASER = 10, ENERGY = 35, BOMB = 0, BIO = 20, FIRE = 10, ACID = 20) // *** Minimap Icon *** // minimap_icon = "spitter" @@ -67,3 +67,15 @@ spit_delay = 0.3 SECONDS spit_types = list(/datum/ammo/xeno/acid/medium/passthrough, /datum/ammo/xeno/acid/auto) + + // *** Abilities *** // + 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/activable/xeno/corrosive_acid/strong, + /datum/action/ability/activable/xeno/xeno_spit, + /datum/action/ability/activable/xeno/scatter_spit, + /datum/action/ability/activable/xeno/spray_acid/line, + /datum/action/ability/activable/xeno/toxic_grenade/sticky, + ) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/warlock/castedatum_warlock.dm b/code/modules/mob/living/carbon/xenomorph/castes/warlock/castedatum_warlock.dm index 8cd84249642..409eeb19c2f 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/warlock/castedatum_warlock.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/warlock/castedatum_warlock.dm @@ -15,7 +15,7 @@ max_health = 375 spit_types = list(/datum/ammo/energy/xeno/psy_blast) - can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER|CASTE_ACID_BLOOD + can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER caste_traits = null soft_armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 40, BOMB = 10, BIO = 35, FIRE = 10, ACID = 35) shield_strength = 650 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/warrior/castedatum_warrior.dm b/code/modules/mob/living/carbon/xenomorph/castes/warrior/castedatum_warrior.dm index 3b10cf1f75a..73601de48a2 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/warrior/castedatum_warrior.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/warrior/castedatum_warrior.dm @@ -28,7 +28,7 @@ evolution_threshold = 225 // *** Flags *** // - caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_IS_STRONG|CASTE_ACID_BLOOD + caste_flags = CASTE_EVOLUTION_ALLOWED|CASTE_IS_STRONG can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER|CASTE_CAN_HOLD_FACEHUGGERS|CASTE_CAN_HOLD_JELLY caste_traits = null 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 new file mode 100644 index 00000000000..54b00ff12b7 --- /dev/null +++ b/code/modules/mob/living/carbon/xenomorph/castes/widow/abilities_widow.dm @@ -0,0 +1,434 @@ + +// *************************************** +// *********** Leash Ball +// *************************************** + +/datum/action/ability/activable/xeno/leash_ball + name = "Leash Ball" + desc = "Spit a huge web ball that snares groups of targets for a brief while." + action_icon_state = "leash_ball" + action_icon = 'icons/Xeno/actions.dmi' + ability_cost = 75 + cooldown_duration = 15 SECONDS + keybinding_signals = list( + KEYBINDING_NORMAL = COMSIG_XENOABILITY_LEASH_BALL, + ) + +/datum/action/ability/activable/xeno/leash_ball/use_ability(atom/A) + var/turf/target = get_turf(A) + var/mob/living/carbon/xenomorph/X = owner + X.face_atom(target) + if(!do_after(X, 0.5 SECONDS, IGNORE_LOC_CHANGE, X, BUSY_ICON_DANGER)) + return fail_activate() + var/datum/ammo/xeno/leash_ball = GLOB.ammo_list[/datum/ammo/xeno/leash_ball] + leash_ball.hivenumber = X.hivenumber + var/obj/projectile/newspit = new (get_turf(X)) + + newspit.generate_bullet(leash_ball) + newspit.fire_at(target, X, X, newspit.ammo.max_range) + succeed_activate() + add_cooldown() + +/obj/structure/xeno/aoe_leash + name = "Snaring Web" + icon = 'icons/Xeno/Effects.dmi' + icon_state = "aoe_leash" + desc = "Sticky and icky. Destroy it when you are stuck!" + destroy_sound = 'sound/effects/alien/resin_break1.ogg' + max_integrity = 150 + layer = ABOVE_ALL_MOB_LAYER + anchored = TRUE + allow_pass_flags = NONE + density = FALSE + obj_flags = CAN_BE_HIT | PROJ_IGNORE_DENSITY + /// How long the leash ball lasts untill it dies + var/leash_life = 10 SECONDS + /// Radius for how far the leash should affect humans and how far away they may walk + var/leash_radius = 3 + /// List of beams to be removed on obj_destruction + var/list/obj/effect/ebeam/beams = list() + /// List of victims to unregister aoe_leash is destroyed + var/list/mob/living/carbon/human/leash_victims = list() + +/// Humans caught get beamed and registered for proc/check_dist, aoe_leash also gains increased integrity for each caught human +/obj/structure/xeno/aoe_leash/Initialize(mapload, _hivenumber) + . = ..() + for(var/mob/living/carbon/human/victim in GLOB.humans_by_zlevel["[z]"]) + if(get_dist(src, victim) > leash_radius) + continue + if(victim.stat == DEAD) /// Add || CONSCIOUS after testing + continue + if(HAS_TRAIT(victim, TRAIT_LEASHED)) + continue + if(!check_path(src, victim, projectile = TRUE)) + continue + leash_victims += victim + for(var/mob/living/carbon/human/snared_victim AS in leash_victims) + ADD_TRAIT(snared_victim, TRAIT_LEASHED, src) + beams += beam(snared_victim, "beam_web", 'icons/effects/beam.dmi', INFINITY, INFINITY) + RegisterSignal(snared_victim, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(check_dist)) + if(!length(beams)) + return INITIALIZE_HINT_QDEL + QDEL_IN(src, leash_life) + +/// To remove beams after the leash_ball is destroyed and also unregister all victims +/obj/structure/xeno/aoe_leash/Destroy() + for(var/mob/living/carbon/human/victim AS in leash_victims) + UnregisterSignal(victim, COMSIG_MOVABLE_PRE_MOVE) + REMOVE_TRAIT(victim, TRAIT_LEASHED, src) + leash_victims = null + QDEL_LIST(beams) + return ..() + +/// Humans caught in the aoe_leash will be pulled back if they leave it's radius +/obj/structure/xeno/aoe_leash/proc/check_dist(datum/leash_victim, atom/newloc) + SIGNAL_HANDLER + if(get_dist(newloc, src) >= leash_radius) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + +/// This is so that xenos can remove leash balls +/obj/structure/xeno/aoe_leash/attack_alien(mob/living/carbon/xenomorph/xeno_attacker, damage_amount = xeno_attacker.xeno_caste.melee_damage, damage_type = BRUTE, armor_type = MELEE, effects = TRUE, armor_penetration, isrightclick = FALSE) + if(xeno_attacker.status_flags & INCORPOREAL) + return + xeno_attacker.visible_message(span_xenonotice("\The [xeno_attacker] starts tearing down \the [src]!"), \ + span_xenonotice("We start to tear down \the [src].")) + if(!do_after(xeno_attacker, 1 SECONDS, NONE, xeno_attacker, BUSY_ICON_GENERIC) || QDELETED(src)) + return + xeno_attacker.do_attack_animation(src, ATTACK_EFFECT_CLAW) + xeno_attacker.visible_message(span_xenonotice("\The [xeno_attacker] tears down \the [src]!"), \ + span_xenonotice("We tear down \the [src].")) + playsound(src, destroy_sound, 25) + take_damage(max_integrity) + +// *************************************** +// *********** Spiderling Section +// *************************************** + +/datum/action/ability/xeno_action/create_spiderling + name = "Birth Spiderling" + desc = "Give birth to a spiderling after a short charge-up. The spiderlings will follow you until death. You can only deploy 5 spiderlings at one time." + action_icon_state = "spawn_spiderling" + ability_cost = 80 + cooldown_duration = 15 SECONDS + use_state_flags = ABILITY_USE_LYING|ABILITY_IGNORE_COOLDOWN + keybinding_signals = list( + KEYBINDING_NORMAL = COMSIG_XENOABILITY_CREATE_SPIDERLING, + ) + var/current_charges = 5 + + /// List of all our spiderlings + var/list/mob/living/carbon/xenomorph/spiderling/spiderlings = list() + +/datum/action/ability/xeno_action/create_spiderling/give_action(mob/living/L) + . = ..() + var/mob/living/carbon/xenomorph/X = L + var/max_spiderlings = X?.xeno_caste.max_spiderlings ? X.xeno_caste.max_spiderlings : 5 + desc = "Give birth to a spiderling after a short charge-up. The spiderlings will follow you until death. You can only deploy [max_spiderlings] spiderlings at one time." + + var/mutable_appearance/counter_maptext = mutable_appearance(icon = null, icon_state = null, layer = ACTION_LAYER_MAPTEXT) + counter_maptext.pixel_x = 16 + counter_maptext.pixel_y = -4 + counter_maptext.maptext = MAPTEXT("[current_charges]/[initial(current_charges)]") + visual_references[VREF_MUTABLE_SPIDERLING_CHARGES] = counter_maptext + +/datum/action/ability/xeno_action/create_spiderling/remove_action(mob/living/carbon/xenomorph/X) + . = ..() + button.cut_overlay(visual_references[VREF_MUTABLE_SPIDERLING_CHARGES]) + visual_references[VREF_MUTABLE_SPIDERLING_CHARGES] = null + +/datum/action/ability/xeno_action/create_spiderling/update_button_icon() + button.cut_overlay(visual_references[VREF_MUTABLE_SPIDERLING_CHARGES]) + var/mutable_appearance/number = visual_references[VREF_MUTABLE_SPIDERLING_CHARGES] + number?.maptext = MAPTEXT("[current_charges]/[initial(current_charges)]") + visual_references[VREF_MUTABLE_SPIDERLING_CHARGES] = number + button.add_overlay(visual_references[VREF_MUTABLE_SPIDERLING_CHARGES]) + return ..() + +/datum/action/ability/xeno_action/create_spiderling/on_cooldown_finish() + current_charges = clamp(current_charges+1, 0, initial(current_charges)) + update_button_icon() + if(current_charges < initial(current_charges)) + cooldown_timer = addtimer(CALLBACK(src, PROC_REF(on_cooldown_finish)), cooldown_duration, TIMER_STOPPABLE) + return + return ..() + +/datum/action/ability/xeno_action/create_spiderling/can_use_action(silent = FALSE, override_flags) + . = ..() + if(cooldown_timer && current_charges) + return TRUE + +/// The action to create spiderlings +/datum/action/ability/xeno_action/create_spiderling/action_activate() + . = ..() + + 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") + return fail_activate() + + if(!do_after(owner, 0.5 SECONDS, IGNORE_LOC_CHANGE, owner, BUSY_ICON_DANGER)) + return fail_activate() + + current_charges-- + add_spiderling() + succeed_activate() + add_cooldown() + +/// Adds spiderlings to spiderling list and registers them for death so we can remove them later +/datum/action/ability/xeno_action/create_spiderling/proc/add_spiderling() + /// This creates and stores the spiderling so we can reassign the owner for spider swarm and cap how many spiderlings you can have at once + var/mob/living/carbon/xenomorph/spiderling/new_spiderling = new(owner.loc, owner, owner) + RegisterSignals(new_spiderling, list(COMSIG_MOB_DEATH, COMSIG_QDELETING), PROC_REF(remove_spiderling)) + spiderlings += new_spiderling + new_spiderling.pixel_x = rand(-8, 8) + new_spiderling.pixel_y = rand(-8, 8) + return TRUE + +/// Removes spiderling from spiderling list and unregisters death signal +/datum/action/ability/xeno_action/create_spiderling/proc/remove_spiderling(datum/source) + SIGNAL_HANDLER + spiderlings -= source + UnregisterSignal(source, list(COMSIG_MOB_DEATH, COMSIG_QDELETING)) + + +// *************************************** +// *********** Burrow +// *************************************** + +/datum/action/ability/xeno_action/burrow + name = "Burrow" + desc = "Burrow into the ground, allowing you and your active spiderlings to hide in plain sight. You cannot use abilities, attack nor move while burrowed. Use the ability again to unburrow if you're already burrowed." + action_icon_state = "burrow" + ability_cost = 0 + cooldown_duration = 20 SECONDS + keybinding_signals = list( + KEYBINDING_NORMAL = COMSIG_XENOABILITY_BURROW, + ) + use_state_flags = ABILITY_USE_BURROWED + +/datum/action/ability/xeno_action/burrow/action_activate() + . = ..() + /// We need the list of spiderlings so that we can burrow them + var/datum/action/ability/xeno_action/create_spiderling/create_spiderling_action = owner.actions_by_path[/datum/action/ability/xeno_action/create_spiderling] + /// Here we make every single spiderling that we have also burrow and assign a signal so that they unburrow too + for(var/mob/living/carbon/xenomorph/spiderling/spiderling AS in create_spiderling_action?.spiderlings) + /// Here we trigger the burrow proc, the registering happens there + var/datum/action/ability/xeno_action/burrow/spiderling_burrow = spiderling.actions_by_path[/datum/action/ability/xeno_action/burrow] + spiderling_burrow.xeno_burrow() + xeno_burrow() + succeed_activate() + +/// Burrow code for xenomorphs +/datum/action/ability/xeno_action/burrow/proc/xeno_burrow() + SIGNAL_HANDLER + var/mob/living/carbon/xenomorph/X = owner + if(!HAS_TRAIT(X, TRAIT_BURROWED)) + to_chat(X, span_xenowarning("We start burrowing into the ground...")) + INVOKE_ASYNC(src, PROC_REF(xeno_burrow_doafter)) + return + UnregisterSignal(X, COMSIG_XENOMORPH_TAKING_DAMAGE) + X.soft_armor = X.soft_armor.modifyRating(fire = -100) + X.hard_armor = X.hard_armor.modifyRating(fire = -100) + REMOVE_TRAIT(X, TRAIT_NON_FLAMMABLE, initial(name)) + X.mouse_opacity = initial(X.mouse_opacity) + X.density = TRUE + X.allow_pass_flags &= ~PASSABLE + REMOVE_TRAIT(X, TRAIT_IMMOBILE, WIDOW_ABILITY_TRAIT) + REMOVE_TRAIT(X, TRAIT_BURROWED, WIDOW_ABILITY_TRAIT) + REMOVE_TRAIT(X, TRAIT_HANDS_BLOCKED, WIDOW_ABILITY_TRAIT) + X.update_icons() + add_cooldown() + owner.unbuckle_all_mobs(TRUE) + +/// Called by xeno_burrow only when burrowing +/datum/action/ability/xeno_action/burrow/proc/xeno_burrow_doafter() + if(!do_after(owner, 3 SECONDS, NONE, null, BUSY_ICON_DANGER)) + return + to_chat(owner, span_xenowarning("We are now burrowed, hidden in plain sight and ready to strike.")) + // This part here actually burrows the xeno + owner.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + owner.density = FALSE + owner.allow_pass_flags |= PASSABLE + // Here we prevent the xeno from moving or attacking or using abilities until they unburrow by clicking the ability + ADD_TRAIT(owner, TRAIT_IMMOBILE, WIDOW_ABILITY_TRAIT) + ADD_TRAIT(owner, TRAIT_BURROWED, WIDOW_ABILITY_TRAIT) + ADD_TRAIT(owner, TRAIT_HANDS_BLOCKED, WIDOW_ABILITY_TRAIT) + // We register for movement so that we unburrow if bombed + var/mob/living/carbon/xenomorph/X = owner + ADD_TRAIT(X, TRAIT_NON_FLAMMABLE, initial(name)) + X.soft_armor = X.soft_armor.modifyRating(fire = 100) + X.hard_armor = X.hard_armor.modifyRating(fire = 100) + // Update here without waiting for life + X.update_icons() + RegisterSignal(X, COMSIG_XENOMORPH_TAKING_DAMAGE, PROC_REF(xeno_burrow)) + +// *************************************** +// *********** Attach Spiderlings +// *************************************** +/datum/action/ability/xeno_action/attach_spiderlings + name = "Attach Spiderlings" + desc = "Attach your current spiderlings to you " + action_icon_state = "attach_spiderling" + ability_cost = 0 + cooldown_duration = 0 SECONDS + keybinding_signals = list( + KEYBINDING_NORMAL = COMSIG_XENOABILITY_ATTACH_SPIDERLINGS, + ) + ///the attached spiderlings + var/list/mob/living/carbon/xenomorph/spiderling/attached_spiderlings = list() + ///how many times we attempt to attach adjacent spiderligns + var/attach_attempts = 5 + +/datum/action/ability/xeno_action/attach_spiderlings/action_activate() + . = ..() + if(owner.buckled_mobs) + /// yeet off all spiderlings if we are carrying any + owner.unbuckle_all_mobs(TRUE) + return + var/mob/living/carbon/xenomorph/widow/X = owner + var/datum/action/ability/xeno_action/create_spiderling/create_spiderling_action = X.actions_by_path[/datum/action/ability/xeno_action/create_spiderling] + if(!(length(create_spiderling_action.spiderlings))) + X.balloon_alert(X, "No spiderlings") + return fail_activate() + var/list/mob/living/carbon/xenomorph/spiderling/remaining_spiderlings = create_spiderling_action.spiderlings.Copy() + // First make the spiderlings stop what they are doing and return to the widow + for(var/mob/spider in remaining_spiderlings) + var/datum/component/ai_controller/AI = spider.GetComponent(/datum/component/ai_controller) + AI?.ai_behavior.change_action(ESCORTING_ATOM, AI.ai_behavior.escorted_atom) + grab_spiderlings(remaining_spiderlings, attach_attempts) + succeed_activate() + +/// this proc scoops up adjacent spiderlings and then calls ride_widow on them +/datum/action/ability/xeno_action/attach_spiderlings/proc/grab_spiderlings(list/mob/living/carbon/xenomorph/spiderling/remaining_list, number_of_attempts_left) + if(number_of_attempts_left <= 0) + return + for(var/mob/living/carbon/xenomorph/spiderling/remaining_spiderling AS in remaining_list) + SEND_SIGNAL(owner, COMSIG_SPIDERLING_CHANGE_ALL_ORDER, SPIDERLING_RECALL) //So spiderlings move towards the buckle + if(!owner.Adjacent(remaining_spiderling)) + continue + remaining_list -= remaining_spiderling + owner.buckle_mob(remaining_spiderling, TRUE, TRUE, 90, FALSE, FALSE) + ADD_TRAIT(remaining_spiderling, TRAIT_IMMOBILE, WIDOW_ABILITY_TRAIT) + addtimer(CALLBACK(src, PROC_REF(grab_spiderlings), remaining_list, number_of_attempts_left - 1), 1) + +// *************************************** +// *********** Web Spit +// *************************************** + +/datum/action/ability/activable/xeno/web_spit + name = "Web Spit" + desc = "Stun and blind the target with a web projectile" + action_icon_state = "web_projectile" + action_icon = 'icons/Xeno/actions.dmi' + ability_cost = 100 + cooldown_duration = 15 SECONDS + keybinding_signals = list( + KEYBINDING_NORMAL = COMSIG_XENOABILITY_WEB_SPIT, + ) + +/datum/action/ability/activable/xeno/web_spit/use_ability(atom/target) + var/mob/living/carbon/xenomorph/X = owner + var/datum/ammo/xeno/web_projectile/web = GLOB.ammo_list[/datum/ammo/xeno/web_projectile] + var/obj/projectile/newspit = new /obj/projectile(get_turf(X)) + + newspit.generate_bullet(web) + newspit.def_zone = X.get_limbzone_target() + + newspit.fire_at(target, X, X, newspit.ammo.max_range) + succeed_activate() + add_cooldown() + +/datum/action/ability/xeno_action/create_hugger + name = "Create Hugger" + action_icon_state = "larval hugger" + desc = "Create a facehugger." + ability_cost = 60 + cooldown_duration = 20 SECONDS + keybinding_signals = list( + KEYBINDING_NORMAL = COMSIG_XENOABILITY_CREATE_HUGGER, + ) + +/datum/action/ability/xeno_action/create_hugger/can_use_action(silent = FALSE, override_flags) + . = ..() + if(!.) + return + if(owner.l_hand || owner.r_hand) + if(!silent) + owner.balloon_alert(owner, "Need empty hands") + return FALSE + +/datum/action/ability/xeno_action/create_hugger/action_activate() + if(!do_after(owner, 1 SECONDS, IGNORE_LOC_CHANGE, owner, BUSY_ICON_HOSTILE)) + return FALSE + var/obj/item/clothing/mask/facehugger/hugger = new(owner.loc) + hugger.hivenumber = owner.get_xeno_hivenumber() + owner.put_in_hands(hugger) + add_cooldown() + succeed_activate() + +// *************************************** +// *********** Unleash spiderlings +// *************************************** +/datum/action/ability/xeno_action/widow_unleash + name = "Unleash Spiderlings" + action_icon_state = "unleash" + action_icon = 'icons/Xeno/actions.dmi' + desc = "Send out your spiderlings to attack nearby humans" + keybinding_signals = list( + KEYBINDING_NORMAL = COMSIG_XENOABILITY_UNLEASH_SPIDERLINGS, + ) + +/datum/action/ability/xeno_action/widow_unleash/action_activate(mob/living/victim) + if(SEND_SIGNAL(owner, COMSIG_SPIDERLING_CHANGE_ALL_ORDER, SPIDERLING_ATTACK)) + owner.balloon_alert(owner, "attacking") + else + owner.balloon_alert(owner, "fail") + +// *************************************** +// *********** Recall spiderlings +// *************************************** +/datum/action/ability/xeno_action/widow_recall + name = "Recall Spiderlings" + action_icon = 'icons/Xeno/actions.dmi' + action_icon_state = "recall" + desc = "Recall your siderlings to follow you once more" + keybinding_signals = list( + KEYBINDING_NORMAL = COMSIG_XENOABILITY_RECALL_SPIDERLINGS, + ) + +/datum/action/ability/xeno_action/widow_recall/action_activate(mob/living/victim) + if(SEND_SIGNAL(owner, COMSIG_SPIDERLING_CHANGE_ALL_ORDER, SPIDERLING_RECALL)) + owner.balloon_alert(owner, "recalling") + else + owner.balloon_alert(owner, "fail") + +/datum/action/ability/xeno_action/spider_venom + name = "Widow's Poison" + desc = "Poison your target with incapacitating venom" + 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) + . = ..() + RegisterSignal(L, COMSIG_XENOMORPH_ATTACK_LIVING, PROC_REF(on_bite)) + +/datum/action/ability/xeno_action/spider_venom/remove_action(mob/living/L) + . = ..() + UnregisterSignal(L, COMSIG_XENOMORPH_ATTACK_LIVING) + +/datum/action/ability/xeno_action/spider_venom/proc/on_bite(datum/source, mob/living/target) + SIGNAL_HANDLER + if(target.stat == DEAD) + return + if(!ishuman(target)) + return + + target.apply_status_effect(STATUS_EFFECT_SPIDER_VENOM) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/widow/castedatum_widow.dm b/code/modules/mob/living/carbon/xenomorph/castes/widow/castedatum_widow.dm new file mode 100644 index 00000000000..592a89bc391 --- /dev/null +++ b/code/modules/mob/living/carbon/xenomorph/castes/widow/castedatum_widow.dm @@ -0,0 +1,84 @@ +/datum/xeno_caste/widow + caste_name = "Widow" + display_name = "Widow" + upgrade_name = "" + caste_desc = "You don't think you've seen a tarantula this giant before." + caste_type_path = /mob/living/carbon/xenomorph/widow + tier = XENO_TIER_THREE + upgrade = XENO_UPGRADE_BASETYPE + wound_type = "widow" + + // *** Melee Attacks *** // + melee_damage = 18 + + // *** Speed *** // + speed = -0.5 + + // *** Plasma *** // + plasma_max = 600 + plasma_gain = 55 + + // *** Health *** // + max_health = 550 + + // *** Flags *** // + caste_flags = CASTE_EVOLUTION_ALLOWED + can_flags = CASTE_CAN_BE_QUEEN_HEALED|CASTE_CAN_BE_GIVEN_PLASMA|CASTE_CAN_BE_LEADER|CASTE_CAN_HOLD_FACEHUGGERS|CASTE_CAN_HOLD_JELLY + caste_traits = null + + // *** Defense *** // + soft_armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 15, BIO = 10, FIRE = 15, ACID = 10) + + // *** Minimap Icon *** // + minimap_icon = "widow" + + // *** Widow Abilities *** // + max_spiderlings = 5 + + // *** Abilities *** /// + 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/activable/xeno/cocoon, + /datum/action/ability/xeno_action/create_hugger, + /datum/action/ability/xeno_action/widow_unleash, + /datum/action/ability/xeno_action/widow_recall, + /datum/action/ability/activable/xeno/web_spit, + /datum/action/ability/activable/xeno/leash_ball, + /datum/action/ability/xeno_action/create_spiderling, + /datum/action/ability/xeno_action/attach_spiderlings, + ) + +/datum/xeno_caste/widow/on_caste_applied(mob/xenomorph) + . = ..() + xenomorph.AddElement(/datum/element/ridable, /datum/component/riding/creature/widow) + +/datum/xeno_caste/widow/on_caste_removed(mob/xenomorph) + . = ..() + xenomorph.RemoveElement(/datum/element/ridable, /datum/component/riding/creature/widow) + +/datum/xeno_caste/widow/normal + upgrade = XENO_UPGRADE_NORMAL + +/datum/xeno_caste/widow/primordial + upgrade_name = "Primordial" + caste_desc = "At times, life is just like a web. You fall, and a spider called accident, at the center, takes you to hell." + primordial_message = "We weave the threads of fate that our victims life hangs from." + upgrade = XENO_UPGRADE_PRIMO + + // *** Abilities *** /// + 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/activable/xeno/cocoon, + /datum/action/ability/xeno_action/create_hugger, + /datum/action/ability/xeno_action/widow_unleash, + /datum/action/ability/xeno_action/widow_recall, + /datum/action/ability/activable/xeno/web_spit, + /datum/action/ability/activable/xeno/leash_ball, + /datum/action/ability/xeno_action/create_spiderling, + /datum/action/ability/xeno_action/attach_spiderlings, + /datum/action/ability/xeno_action/spider_venom, + ) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/widow/widow.dm b/code/modules/mob/living/carbon/xenomorph/castes/widow/widow.dm new file mode 100644 index 00000000000..7c5846082dd --- /dev/null +++ b/code/modules/mob/living/carbon/xenomorph/castes/widow/widow.dm @@ -0,0 +1,61 @@ +/mob/living/carbon/xenomorph/widow + caste_base_type = /datum/xeno_caste/widow + name = "Widow" + desc = "A large arachnid xenomorph, with fangs ready to bear and crawling with many little spiderlings ready to grow." + icon = 'icons/Xeno/castes/widow/basic.dmi' + effects_icon = 'icons/Xeno/castes/widow/effects.dmi' + icon_state = "Widow Walking" + bubble_icon = "alienroyal" + health = 200 + maxHealth = 200 + plasma_stored = 150 + tier = XENO_TIER_THREE + upgrade = XENO_UPGRADE_NORMAL + buckle_flags = CAN_BUCKLE + pixel_x = -16 + old_x = -16 + max_buckled_mobs = 5 + +/mob/living/carbon/xenomorph/widow/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_LIGHT_STEP, XENO_TRAIT) + RegisterSignals(src, list(COMSIG_XENOMORPH_POSTATTACK_LIVING, COMSIG_XENOMORPH_ATTACK_OBJ), PROC_REF(postattack)) + +/mob/living/carbon/xenomorph/widow/proc/postattack(mob/living/source, atom/target, damage) + SIGNAL_HANDLER + SEND_SIGNAL(src, COMSIG_SPIDERLING_CHANGE_ALL_ORDER, SPIDERLING_ATTACK, target) + SEND_SIGNAL(src, COMSIG_SPIDERLING_CHANGE_ALL_ORDER, SPIDERLING_ATTACK, target) + +/mob/living/carbon/xenomorph/widow/buckle_mob(mob/living/buckling_mob, force = FALSE, check_loc = TRUE, lying_buckle = FALSE, hands_needed = 0, target_hands_needed = 0, silent) + if(!force) + return FALSE + return ..() + +/mob/living/carbon/xenomorph/widow/post_unbuckle_mob(mob/living/M) + M.layer = initial(M.layer) + M.pixel_x = rand(-8, 8) + M.pixel_y = rand(-8, 8) + +//Prevents humans unbuckling spiderlings +/mob/living/carbon/xenomorph/widow/user_unbuckle_mob(mob/living/buckled_mob, mob/user, silent) + if(ishuman(user)) + return + return ..() + +/mob/living/carbon/xenomorph/widow/death(gibbing, deathmessage, silent) + unbuckle_all_mobs(TRUE) //RELEASE THE HORDE + return ..() + +/mob/living/carbon/xenomorph/widow/transfer_to_hive(hivenumber) + . = ..() + var/mob/living/carbon/xenomorph/widow/X = src + var/datum/action/ability/xeno_action/create_spiderling/create_spiderling_action = X.actions_by_path[/datum/action/ability/xeno_action/create_spiderling] + for(var/mob/living/carbon/xenomorph/spider AS in create_spiderling_action.spiderlings) + spider.transfer_to_hive(hivenumber) + +/mob/living/carbon/xenomorph/widow/on_eord(turf/destination) + . = ..() + var/datum/action/ability/xeno_action/create_spiderling/create_spiderling_action = actions_by_path[/datum/action/ability/xeno_action/create_spiderling] + for(var/mob/living/carbon/xenomorph/spider AS in create_spiderling_action.spiderlings) + spider.revive(TRUE) + spider.forceMove(destination) 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 c84b898d281..01ceed82799 100644 --- a/code/modules/mob/living/carbon/xenomorph/embryo.dm +++ b/code/modules/mob/living/carbon/xenomorph/embryo.dm @@ -86,7 +86,7 @@ counter += 2.5 //Doubles larval growth progress. Burst time in ~3 min. adjust_boost_timer(-1) - if(stage < 5 && counter >= 120) + if(stage < 5 && counter >= 100) counter = 0 stage++ log_combat(affected_mob, null, "had their embryo advance to stage [stage]") @@ -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/facehuggers.dm b/code/modules/mob/living/carbon/xenomorph/facehuggers.dm index 61e3a882ba7..a5d19a964ac 100644 --- a/code/modules/mob/living/carbon/xenomorph/facehuggers.dm +++ b/code/modules/mob/living/carbon/xenomorph/facehuggers.dm @@ -448,9 +448,6 @@ if(species?.species_flags & (IS_SYNTHETIC|ROBOTIC_LIMBS)) return FALSE - if(on_fire) - return FALSE - if(check_mask) if(wear_mask) var/obj/item/W = wear_mask @@ -473,82 +470,86 @@ ///////////////////////////// // ATTACHING AND IMPREGNATION ////////////////////////////// -/obj/item/clothing/mask/facehugger/proc/Attach(mob/living/carbon/M, can_catch = TRUE) +/obj/item/clothing/mask/facehugger/proc/Attach(mob/living/carbon/hugged_carbon, can_catch = TRUE) set_throwing(FALSE) leaping = FALSE update_icon() - if(!istype(M)) + if(!istype(hugged_carbon)) return FALSE if(attached) return TRUE - if(M.status_flags & XENO_HOST || M.status_flags & GODMODE || isxeno(M)) + if(hugged_carbon.status_flags & XENO_HOST || hugged_carbon.status_flags & GODMODE || isxeno(hugged_carbon)) return FALSE if(isxeno(loc)) //Being carried? Drop it - var/mob/living/carbon/xenomorph/X = loc - X.dropItemToGround(src) - X.update_icons() + var/mob/living/carbon/xenomorph/carrier = loc + carrier.dropItemToGround(src) + carrier.update_icons() - if(M.in_throw_mode && M.dir != dir && !M.incapacitated() && !M.get_active_held_item() && can_catch) + if(hugged_carbon.in_throw_mode && hugged_carbon.dir != dir && !hugged_carbon.incapacitated() && !hugged_carbon.get_active_held_item() && can_catch) var/catch_chance = 50 - if(M.dir == REVERSE_DIR(dir)) + if(hugged_carbon.dir == REVERSE_DIR(dir)) catch_chance += 20 - catch_chance -= M.painloss * 0.3 - if(M.get_inactive_held_item()) + catch_chance -= hugged_carbon.painloss * 0.3 + if(hugged_carbon.get_inactive_held_item()) catch_chance -= 25 if(prob(catch_chance)) - M.visible_message(span_notice("[M] snatches [src] out of the air and [pickweight(list("clobbers" = 30, "kills" = 30, "squashes" = 25, "dunks" = 10, "dribbles" = 5))] it!")) + hugged_carbon.visible_message(span_notice("[hugged_carbon] snatches [src] out of the air and [pickweight(list("clobbers" = 30, "kills" = 30, "squashes" = 25, "dunks" = 10, "dribbles" = 5))] it!")) kill_hugger() return TRUE var/blocked = null //To determine if the hugger just rips off the protection or can infect. - if(ishuman(M)) - var/mob/living/carbon/human/H = M + if(ishuman(hugged_carbon)) + var/mob/living/carbon/human/hugged_human = hugged_carbon - if(!H.has_limb(HEAD)) - visible_message(span_warning("[src] looks for a face to hug on [H], but finds none!")) + if(!hugged_human.has_limb(HEAD)) + visible_message(span_warning("[src] looks for a face to hug on [hugged_human], but finds none!")) return FALSE - if(H.head) - var/obj/item/clothing/head/D = H.head - if(istype(D)) - if(D.anti_hug > 0 || HAS_TRAIT(D, TRAIT_NODROP)) - blocked = D - D.anti_hug = max(0, --D.anti_hug) - H.visible_message(span_danger("[src] smashes against [H]'s [D.name], damaging it!")) + if(hugged_human.head) + var/obj/item/clothing/head/headwear = hugged_human.head + if(istype(headwear)) + if(headwear.anti_hug > 0 || HAS_TRAIT(headwear, TRAIT_NODROP)) + blocked = headwear + headwear.anti_hug = max(0, --headwear.anti_hug) + hugged_human.visible_message(span_danger("[src] smashes against [hugged_human]'s [headwear.name], damaging it!")) + if(headwear.anti_hug == 0) + headwear.on_hugger_damage() return FALSE else - H.update_inv_head() + hugged_human.update_inv_head() - if(M.wear_mask) - var/obj/item/clothing/mask/W = M.wear_mask - if(istype(W)) - if(istype(W, /obj/item/clothing/mask/facehugger)) - var/obj/item/clothing/mask/facehugger/hugger = W + if(hugged_carbon.wear_mask) + var/obj/item/clothing/mask/worn_mask = hugged_carbon.wear_mask + if(istype(worn_mask)) + if(istype(worn_mask, /obj/item/clothing/mask/facehugger)) + var/obj/item/clothing/mask/facehugger/hugger = worn_mask if(hugger.stat != DEAD) return FALSE - if(W.anti_hug > 0 || HAS_TRAIT(W, TRAIT_NODROP)) + if(worn_mask.anti_hug > 0 || HAS_TRAIT(worn_mask, TRAIT_NODROP)) if(!blocked) - blocked = W - W.anti_hug = max(0, --W.anti_hug) - M.visible_message(span_danger("[src] smashes against [M]'s [blocked]!")) + blocked = worn_mask + worn_mask.anti_hug = max(0, --worn_mask.anti_hug) + hugged_carbon.visible_message(span_danger("[src] smashes against [hugged_carbon]'s [blocked]!")) + if(worn_mask.anti_hug == 0) + worn_mask.on_hugger_damage() return FALSE if(!blocked) - M.visible_message(span_danger("[src] smashes against [M]'s [W.name] and rips it off!")) - M.dropItemToGround(W) + hugged_carbon.visible_message(span_danger("[src] smashes against [hugged_carbon]'s [worn_mask.name] and rips it off!")) + hugged_carbon.dropItemToGround(worn_mask) if(blocked) - M.visible_message(span_danger("[src] smashes against [M]'s [blocked]!")) + hugged_carbon.visible_message(span_danger("[src] smashes against [hugged_carbon]'s [blocked]!")) return FALSE - M.equip_to_slot(src, SLOT_WEAR_MASK) + hugged_carbon.equip_to_slot(src, SLOT_WEAR_MASK) return TRUE /obj/item/clothing/mask/facehugger/equipped(mob/living/user, slot) @@ -663,9 +664,6 @@ proj.ammo.on_hit_obj(src, proj) return TRUE -/obj/item/clothing/mask/facehugger/fire_act(burn_level, flame_color) - kill_hugger() - /obj/item/clothing/mask/facehugger/dropped(mob/user) . = ..() go_idle() 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 cc9af820119..55fc77ac05b 100644 --- a/code/modules/mob/living/carbon/xenomorph/update_icons.dm +++ b/code/modules/mob/living/carbon/xenomorph/update_icons.dm @@ -101,7 +101,7 @@ wound_overlay.layer = layer + 0.3 wound_overlay.icon = src.icon wound_overlay.vis_flags |= VIS_HIDE - if(HAS_TRAIT(src, TRAIT_MOB_ICON_UPDATE_BLOCKED)) + if(HAS_TRAIT(src, TRAIT_MOB_ICON_UPDATE_BLOCKED) || HAS_TRAIT(src, TRAIT_BURROWED)) wound_overlay.icon_state = "none" return if(health > health_threshold_crit) @@ -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 ee6ade74075..9b893c00b59 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm @@ -181,6 +181,7 @@ /// The maximum amount of Wrath that we can have stored at a time. var/wrath_max = 0 + ///the 'abilities' available to a caste. var/list/actions @@ -338,6 +339,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 = "
" dat += "
Active Upgrade Chambers:" @@ -682,17 +670,17 @@ var/spur_chambers_built = length(user?.hive?.spur_chambers) var/veil_chambers_built = length(user?.hive?.veil_chambers) dat += "
SURVIVAL
" - dat += "[shell_chambers_built ? "
Carapace " : "
Carapace "] | Cost: [upgrade_price] | Increase our armor." - dat += "[shell_chambers_built ? "
Regeneration " : "
Regeneration "] | Cost: [upgrade_price] | Increase our health regeneration." - dat += "[shell_chambers_built ? "
Vampirism " : "
Vampirism "] | Cost: [upgrade_price] | Leech from our attacks." + dat += "[shell_chambers_built ? "
Carapace " : "
Carapace "] | Cost: [XENO_UPGRADE_COST] | Increase our armor." + dat += "[shell_chambers_built ? "
Regeneration " : "
Regeneration "] | Cost: [XENO_UPGRADE_COST] | Increase our health regeneration." + dat += "[shell_chambers_built ? "
Vampirism " : "
Vampirism "] | Cost: [XENO_UPGRADE_COST] | Leech from our attacks." dat += "
ATTACK
" - dat += "[spur_chambers_built ? "
Celerity " : "
Celerity "] | Cost: [upgrade_price] | Increase our movement speed." - dat += "[spur_chambers_built ? "
Adrenalin " : "
Adrenalin "] | Cost: [upgrade_price] | Increase our plasma regeneration." - dat += "[spur_chambers_built ? "
Crush " : "
Crush "] | Cost: [upgrade_price] | Increase our damage to objects." + dat += "[spur_chambers_built ? "
Celerity " : "
Celerity "] | Cost: [XENO_UPGRADE_COST] | Increase our movement speed." + dat += "[spur_chambers_built ? "
Adrenalin " : "
Adrenalin "] | Cost: [XENO_UPGRADE_COST] | Increase our plasma regeneration." + dat += "[spur_chambers_built ? "
Crush " : "
Crush "] | Cost: [XENO_UPGRADE_COST] | Increase our damage to objects." dat += "
UTILITY
" - dat += "[veil_chambers_built ? "
Toxin " : "
Toxin "] | Cost: [upgrade_price] | Inject neurotoxin into the target." - dat += "[veil_chambers_built ? "
Pheromones " : "
Pheromones "] | Cost: [upgrade_price] | Ability to emit pheromones." - dat += "[veil_chambers_built ? "
Trail " : "
Trail "] | Cost: [upgrade_price] | Leave a trail behind." + dat += "[veil_chambers_built ? "
Toxin " : "
Toxin "] | Cost: [XENO_UPGRADE_COST] | Inject neurotoxin into the target." + dat += "[veil_chambers_built ? "
Pheromones " : "
Pheromones "] | Cost: [XENO_UPGRADE_COST] | Ability to emit pheromones." + dat += "[veil_chambers_built ? "
Trail " : "
Trail "] | Cost: [XENO_UPGRADE_COST] | Leave a trail behind." var/datum/browser/popup = new(user, "upgrademenu", "
Mutations Menu
", 600, 600) popup.set_content(dat) @@ -702,17 +690,7 @@ if(incapacitated(TRUE)) to_chat(usr, span_warning("Cant do that right now!")) return - 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 - if(biomass < upgrade_price) + if(biomass < XENO_UPGRADE_COST) to_chat(usr, span_warning("You dont have enough biomass!")) return var/upgrade = locate(upgrade_to_apply) in status_effects @@ -720,12 +698,14 @@ to_chat(usr, span_xenonotice("Existing mutation chosen. No biomass spent.")) DIRECT_OUTPUT(usr, browse(null, "window=["upgrademenu"]")) return - biomass -= upgrade_price + biomass -= XENO_UPGRADE_COST to_chat(usr, span_xenonotice("Mutation gained.")) for(var/datum/status_effect/S AS in upgrades_to_remove) remove_status_effect(S) + upgrades_holder.Remove(S.type) do_jitter_animation(500) apply_status_effect(upgrade_to_apply) + upgrades_holder.Add(upgrade_to_apply.type) DIRECT_OUTPUT(usr, browse(null, "window=["upgrademenu"]")) //Special override case. May not call the parent. diff --git a/code/modules/mob/living/carbon/xenomorph/xenoupgrade.dm b/code/modules/mob/living/carbon/xenomorph/xenoupgrade.dm index 4b6377daf42..4a52db295ba 100644 --- a/code/modules/mob/living/carbon/xenomorph/xenoupgrade.dm +++ b/code/modules/mob/living/carbon/xenomorph/xenoupgrade.dm @@ -354,6 +354,15 @@ //----BEHEMOTH END----// //============// +//----WIDOW START----// +/mob/living/carbon/xenomorph/widow + upgrade = XENO_UPGRADE_NORMAL + +/mob/living/carbon/xenomorph/widow/primordial + upgrade = XENO_UPGRADE_PRIMO + +//----WIDOW END----// + //----PANTHER START----// /mob/living/carbon/xenomorph/panther/primordial upgrade = XENO_UPGRADE_PRIMO diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index fe0aebcd4cf..7fd5a5060d6 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -323,6 +323,8 @@ return FALSE if(buckled || now_pushing) return + if(anchored) + return if(isliving(A)) var/mob/living/L = A diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 51db202422e..7510773844b 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -163,8 +163,8 @@ //TODO: Make firetypes, colour types are terrible if(flame_color == FLAME_COLOR_LIME) - var/datum/status_effect/stacking/melting/debuff = has_status_effect(STATUS_EFFECT_MELTING) - if(debuff) + if(has_status_effect(STATUS_EFFECT_MELTING)) + var/datum/status_effect/stacking/melting/debuff = has_status_effect(STATUS_EFFECT_MELTING) debuff.add_stacks(2) else apply_status_effect(STATUS_EFFECT_MELTING, 2) diff --git a/code/modules/mob/living/living_health_procs.dm b/code/modules/mob/living/living_health_procs.dm index b3812ccb5ec..38f7a321bec 100644 --- a/code/modules/mob/living/living_health_procs.dm +++ b/code/modules/mob/living/living_health_procs.dm @@ -300,7 +300,6 @@ // make the icons look correct regenerate_icons() - med_hud_set_status() med_pain_set_perceived_health() med_hud_set_health() handle_regular_hud_updates() @@ -361,11 +360,12 @@ return ..() /mob/living/carbon/xenomorph/revive(admin_revive = FALSE) + . = ..() set_plasma(xeno_caste.plasma_max) sunder = 0 + hud_update_primo() if(stat == DEAD) hive?.on_xeno_revive(src) - return ..() ///Revive the huamn up to X health points /mob/living/carbon/human/proc/revive_to_crit(should_offer_to_ghost = FALSE, should_zombify = FALSE) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 88130e2750f..9bffe969dd4 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -527,7 +527,7 @@ if(!can_use_action()) return owner.playsound_local(owner, "sound/effects/CIC_order.ogg", 10, 1) - TIMER_COOLDOWN_START(owner, COOLDOWN_HUD_ORDER, ORDER_COOLDOWN) + TIMER_COOLDOWN_START(owner, COOLDOWN_HUD_ORDER, CIC_ORDER_COOLDOWN) log_game("[key_name(owner)] has broadcasted the hud message [text] at [AREACOORD(owner)]") deadchat_broadcast(" has sent the command order \"[text]\"", owner, owner) for(var/mob/living/carbon/human/human AS in GLOB.alive_human_list) diff --git a/code/modules/mob/living/silicon/ai/ai_notifications.dm b/code/modules/mob/living/silicon/ai/ai_notifications.dm index 7c3b481b6c2..1ce070af5a7 100644 --- a/code/modules/mob/living/silicon/ai/ai_notifications.dm +++ b/code/modules/mob/living/silicon/ai/ai_notifications.dm @@ -23,7 +23,7 @@ alertnotification.add_overlay(alert_overlay) ///Receive notifications about OB laser dots that have been deployed -/mob/living/silicon/ai/proc/receive_laser_ob(datum/source, obj/effect/overlay/temp/laser_target/OB/incoming_laser) +/mob/living/silicon/ai/proc/receive_laser_ob(datum/source, obj/effect/overlay/temp/laser_target/ob/incoming_laser) SIGNAL_HANDLER to_chat(src, span_notice("Orbital Bombardment laser detected. Target: [AREACOORD_NO_Z(incoming_laser)]")) notify_ai(src, " An Orbital Bombardment laser has been detected at [AREACOORD_NO_Z(incoming_laser)]!", ai_sound = 'sound/effects/obalarm.ogg', source = incoming_laser, action = NOTIFY_AI_ALERT, notify_volume = 15) @@ -80,4 +80,4 @@ SIGNAL_HANDLER var/area/A = get_area(callingholopad) to_chat(src, span_notice("Your presence is requested at [A]!")) - notify_ai(src, " Your presence is requested at [A]! ", source = callingholopad, action = NOTIFY_AI_ALERT, notify_volume = 15) + notify_ai(src, " Your presence is requested at [A]! ", source = callingholopad, action = NOTIFY_AI_ALERT, notify_volume = 35) diff --git a/code/modules/mob/living/silicon/ai/ai_verbs.dm b/code/modules/mob/living/silicon/ai/ai_verbs.dm index b89f3a35fcd..46ecbbb9662 100644 --- a/code/modules/mob/living/silicon/ai/ai_verbs.dm +++ b/code/modules/mob/living/silicon/ai/ai_verbs.dm @@ -112,7 +112,7 @@ "floating face" = 'icons/mob/ai.dmi', "xeno_queen" = 'icons/mob/ai.dmi', "void_horror" = 'icons/mob/ai.dmi', - "holo4" = 'icons/mob/ai.dmi' + "carp" = 'icons/mob/ai.dmi' ) hologram = tgui_input_list(src, "Please select a hologram:", null, icon_list) @@ -153,7 +153,7 @@ return last_announcement = world.time - priority_announce(input, "[src] Announcement", sound = 'sound/AI/aireport.ogg') + priority_announce(input, "Оповещение от [src]", sound = 'sound/AI/aireport.ogg') /mob/living/silicon/ai/verb/ai_core_display() @@ -320,6 +320,6 @@ log_game("[key_name(src)] has ghosted at [AREACOORD(src)].") message_admins("[ADMIN_TPMONTY(src)] has ghosted.") - priority_announce("[src] has suffered an unexpected NTOS failure over its Logarithmic silicon backhaul functions and has been taken offline. An attempt to load a backup personality core will proceed shortly.", "AI NT-OS Critical Failure") + priority_announce("[src] был отключен. Ожидание загрузки новой личности...", "Сбой ИИ", sound = 'sound/AI/aileft.ogg') ghostize(FALSE) offer_mob() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index a8815a0061a..661d2e08339 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -45,9 +45,6 @@ /mob/living/silicon/put_in_r_hand(obj/item/I) return -/mob/living/silicon/stripPanelUnequip(obj/item/I, mob/M, slot) - return - /mob/living/silicon/med_hud_set_health() return diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index e11d50dbcb8..e4cc0a91146 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -79,25 +79,24 @@ to_chat(src, span_userdanger("You are tipped over by [user]!")) Paralyze(20 SECONDS) icon_state = icon_dead - spawn(rand(20, 50)) - if(!stat && user) - icon_state = icon_living - var/external - var/internal - switch(pick(1,2,3,4)) - if(1,2,3) - var/text = pick("imploringly.", "pleadingly.", - "with a resigned expression.") - external = "[src] looks at [user] [text]" - internal = "You look at [user] [text]" - if(4) - external = "[src] seems resigned to its fate." - internal = "You resign yourself to your fate." - visible_message(span_notice("[external]"), - span_revennotice("[internal]")) + addtimer(CALLBACK(src, PROC_REF(tip_message), user), rand(2 SECONDS, 5 SECONDS)) else return ..() +/mob/living/simple_animal/cow/proc/tip_message(mob/living/user) + if(stat || !user) + return + icon_state = icon_living + var/external + var/internal + if(prob(75)) + var/text = pick("imploringly.", "pleadingly.", "with a resigned expression.") + external = "[src] looks at [user] [text]" + internal = "You look at [user] [text]" + else + external = "[src] seems resigned to its fate." + internal = "You resign yourself to your fate." + visible_message(span_notice("[external]"), span_revennotice("[internal]")) /mob/living/simple_animal/chick name = "\improper chick" diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index e6086011dd9..1dc60661422 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -378,9 +378,9 @@ GLOBAL_LIST_INIT(organ_rel_size, list( A.target = source if(!alert_overlay) alert_overlay = new(source) - var/icon/I = icon(source.icon) - var/iheight = I.Height() - var/iwidth = I.Width() + var/list/icon_dimensions = get_icon_dimensions(source.icon) + var/iheight = icon_dimensions["width"] + var/iwidth = icon_dimensions["height"] var/higher_power = (iheight > iwidth) ? iheight : iwidth if(higher_power > 32) var/diff = 32 / higher_power diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index 58c7b6dd60c..f5be18d6bf1 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -63,3 +63,6 @@ /mob/proc/update_burst() return + +/mob/proc/hud_set_hunter() + return diff --git a/code/modules/orbits/spaceship.dm b/code/modules/orbits/spaceship.dm index d058fe16f2c..0852570b41c 100644 --- a/code/modules/orbits/spaceship.dm +++ b/code/modules/orbits/spaceship.dm @@ -160,8 +160,8 @@ GLOBAL_VAR_INIT(current_orbit,STANDARD_ORBIT) return message_admins("[ADMIN_TPMONTY(usr)] Has sent the ship [direction == "UP" ? "UPWARD" : "DOWNWARD"] in orbit") - var/message = "Prepare for orbital change in 10 seconds.\nMoving [direction] the gravity well.\nSecure all belongings and prepare for engine ignition." - minor_announce(message, title = "Orbit Change") + var/message = "Внимание. [direction == "UP" ? "Подъём" : "Снижение"] на другую орбиту через 10 секунд." + minor_announce(message, title = "Смена Орбиты") addtimer(CALLBACK(src, PROC_REF(do_change_orbit), current_orbit, direction), 10 SECONDS) /obj/machinery/computer/navigation/proc/can_change_orbit(current_orbit, direction, silent = FALSE) @@ -194,8 +194,8 @@ GLOBAL_VAR_INIT(current_orbit,STANDARD_ORBIT) changing_orbit = TRUE engine_shudder() - var/message = "Arriving at new orbital level. Prepare for engine ignition and stabilization." - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(minor_announce), message, "Orbit Change"), 290 SECONDS) + var/message = "Переход на новую орбиту. Приготовьтесь к запуску двигателей и стабилизации." + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(minor_announce), message, "Смена Орбиты"), 290 SECONDS) addtimer(CALLBACK(src, PROC_REF(orbit_gets_changed), current_orbit, direction), 3 MINUTES) /obj/machinery/computer/navigation/proc/orbit_gets_changed(current_orbit, direction) diff --git a/code/modules/organs/organs.dm b/code/modules/organs/organs.dm index f08ca8b3933..811e98d13d6 100644 --- a/code/modules/organs/organs.dm +++ b/code/modules/organs/organs.dm @@ -50,7 +50,7 @@ ///How many drugs we can take before they overwhelm us. Decreases with damage var/current_medicine_cap = 5 ///Additional medicine capacity given by the freyr module. - var/freyr_medicine_cap = 3 + var/freyr_medicine_cap = 5 ///Whether we were over cap the last time we checked. var/old_overflow = FALSE ///Total medicines added since last tick diff --git a/code/modules/paperwork/beginner_tutorials.dm b/code/modules/paperwork/beginner_tutorials.dm new file mode 100644 index 00000000000..d90de89dc53 --- /dev/null +++ b/code/modules/paperwork/beginner_tutorials.dm @@ -0,0 +1,360 @@ +//Each beginner loadout in quick_load_beginners.dm has a instruction pamphlet. + +/obj/item/paper/tutorial/beginner_rifleman + name = "Rifleman Tutorial" + info = {"As a rifleman, you are suited for virtually all theatres of combat. Your AR-12 assault rifle is accurate and effective at all ranges, and its powerful underbarrel grenade launcher poses even further danger to mid-range threats. Inside your backpack is a box of flares to refill your flare pouch, gauze and ointment for brute (slashes) and burn (acid) wounds respectively, and backup magazines for your AR 12. Your belt contains backup magazines for your AR-12, while your body armor contains additional grenades to reload your underbarrel grenade launcher with. Your left pocket contains a flare gun holster and several flares. Your right pocket contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your boots contain a MRE, in case you get hungry, and a standard issue combat knife for clearing weeds or breaking things.
+
+ Try to spend as much time as possible near other marines - being alone is very dangerous. Your versatility is an immense strength and makes you the ideal battle buddy for virtually any other marine. You can easily work with a shotgunner to clear close quarters areas, or perhaps with a machine gunner to hold a fortified position, or even take point in front of a marksman. When not in immediate danger, use your flare gun to keep your surroundings lit, as your and your fellow marines' lives may very well depend on it.
+
+ TIPS
+
+ BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+
+ While holding your AR-12, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil. In the top left of your screen are several weapon-specific buttons. (Note that your grenades will NOT go through marines!) The second option changes the firing mode, between Single Automatic, Burst, and Burst Automatic. Automatic modes will keep firing as long as you hold down the mouse button. The third option enables your underbarrel grenade launcher. Once enabled, you can use right click to launch a grenade out!
+
+ On running out of ammo, the empty magazine will automatically eject from the rifle. To reload, simply grab a new magazine with an empty hand and click your gun with it. Alternatively, you can perform a tactical reload by click-dragging the magazine from its storage directly onto the rifle, which can be done without an empty hand and with a different magazine still in the gun. You can reload the underbarrel launcher by right clicking on the gun while holding a valid grenade (like the HEDP grenades in your webbing.)
+
+ Your flare gun can be rapidly reloaded by just right clicking the flare pouch with it in hand. Your flare pouch can be refilled by left clicking on it while holding a flare box. Flare any dark area you can see to reduce the risk of a xenomorph ambushing you from the dark. On a similar note, your suit's light can be toggled in the top left - you should almost always keep this on to help your visibility.
+
+ Your P23 has a pistol lace attached. By toggling it in the top left while wielding it, it becomes impossible for you to drop - or for it to be knocked out of your hand by a xenomorph. Similarly, your AR-12 has a magnetic harness, which means if you drop it or otherwise lose it, it'll automatically snap back to your armor.
+
+ Because your AR-12 can effectively engage at all ranges, your optimal range is whatever your opponent's optimal range isn't. Try keeping the distance from ferocious melee enemies, while getting too close for comfort with squishier ranged ones."} + +/obj/item/paper/tutorial/beginner_machinegunner + name = "Machinergunner Tutorial" + info = {"As a machinegunner, you are the backbone of a marine force. While you possess heavy armor reinforced with Tyr-pattern plating (strengthening its defense even further against melee attacks), your slow move speed and the unwieldy nature of your MG-60 machine gun means you should not be spearheading any pushes. Your backpack contains several additional box magazines, allowing you to carry almost two THOUSAND rounds on your person at any time. Your left pouch contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your right pocket contains a flare gun holster and several flares. Your suit storage contains two plasma pistols, which are low in damage but can start fires. Your webbing contains an MRE to eat and both gauze and ointment, Your boots contain a MRE for further eating, and a standard issue combat knife for clearing weeds or breaking things.
+
+ Your full strength is hard to utilize on your own or in the very front of battle. Your ideal positions are either safely behind a barricade guarding a front or flank from assault, or behind your fellow marines, shooting over them with aim mode to protect them from enemies. Keep in mind that your heavy armor and weapon means you move rather slowly - so if you get the order to leave a position, get moving early to avoid being left behind.
+
+ TIPS
+
+ BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+
+ While holding your MG-60, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil. In the top left of your screen are several weapon-specific buttons. The bipod button will deploy your bipod, increasing fire rate and accuracy significantly for as long as you remain stationary.
+
+ On running out of ammo, the empty magazine will automatically eject from the machine gun. To reload, simply grab a new magazine with an empty hand and click your gun with it. Alternatively, you can perform a tactical reload by click-dragging the magazine from its storage directly onto the machine gun, which can be done without an empty hand and with a different magazine still in the gun.
+
+ Your flare gun can be rapidly reloaded by just right clicking the flare pouch with it in hand. Your flare pouch can be refilled by left clicking on it while holding a flare box. Flare any dark area you can see to reduce the risk of a xenomorph ambushing you from the dark. On a similar note, your suit's light can be toggled in the top left - you should almost always keep this on to help your visibility.
+
+ On your belt is a belt harness. By left clicking on your belt harness with your machine gun, you can attach them. If you drop your machine gun, or have a xenomorph make you drop it, your machine gun will automatically return to your armor if it's attached.
+
+ If you are facehugged, quickly take out your plasma pistol and shoot the ground with it, then walk into the fire. While this will cause you to be set on fire, facehuggers will detach in the presence of fire, preventing you from becoming infected. You can press B (or click resist in the bottom right) once the facehugger has detached to stop, drop, and roll, extinguishing the fire.
+
+ Your impressive magazine size means you don't need to reload often. You can suppress one spot for an impressive amount of time, and you have the ammo and damage to clear out resin walls.
+
+ The more bullets you shoot, the better a marine you are. It's actually that simple."} + +/obj/item/paper/tutorial/beginner_marksman + name = "Marksman Tutorial" + info = {"As a marksman, you are a master of precision and range, and should utilize both of these advantages as much as possible. Your DMR-37 is incredibly accurate at long ranges and packs a devastating punch. Due to your ability to engage at long range - and conversely, your inability to engage properly at short range - you should be staying as far from conflict as possible while still remaining in your rifle's effective range. Your backpack and both of your pouches contain spare magazines for your DMR. Your backpack also contains an MRE to eat, and both gauze and ointment for treating injuries. Your armor contains Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and an inaprovaline injector for helping other marines in critical condition. Your webbing contains the MK88 Mod 4, a fully automatic handgun for self-defense, as well as spare magazines for it. Your boots contain a MRE to eat, and survival knife for clearing weeds and breaking things.
+
+ With your DMR, aim to support other marines from afar using your scope and aim mode. Your range means that many xenomorphs might not realize you're watching over an area until you're already shooting at them - use this to your advantage. Your rate of fire is relatively slow compared to automatic weapons, so make each of your shots count.
+
+ TIPS
+
+ BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+
+ On running out of ammo, the empty magazine will automatically eject from the DMR. To reload, simply grab a new magazine with an empty hand and click your gun with it. Alternatively, you can perform a tactical reload by click-dragging the magazine from its storage directly onto the DMR, which can be done without an empty hand and with a different magazine still in the gun.
+
+ While holding your DMR-37, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil. In the top left of your screen are several weapon-specific buttons. The scope button will zoom your screen out and towards the direction you're currently facing, allowing you to see (and shoot at) targets much farther away.
+
+ On your belt is a belt harness. By left clicking on your belt harness with your DMR, you can attach them. If you drop your DMR, or have a xenomorph make you drop it, your DMR will automatically return to your armor if it's attached.
+
+ Try holding your fire until your target is already engaging someone else. While this may seem counter-intuitive, it allows you to wait until they've already committed to a fight (that's likely to damage them) and may cause them to not notice your presence until it's too late, increasing the odds of securing a kill.
+
+ Do not attempt to use your DMR at too close of a range, as marksman weapons have a chance to miss against enemies that are near you. Instead, try switching to your 88 Mod 4, your fully automatic handgun that's much more effective at close range."} + +/obj/item/paper/tutorial/beginner_shotgunner + name = "Shotgunner Tutorial" + info = {"As a shotgunner, you are the spearhead of the marine force. Your semiautomatic SH-39 fires slugs that will devastate any target at short to medium range, dealing heavy damage as well as leaving them stunned and staggered. Your role is to be at the front of any marine push, side by side with your fellow marines as you charge into danger. Your shotgun shell rig on your belt, as well as your backpack, hold many additional slugs to reload your shotgun with. Your backpack also contains an MRE to eat, and both gauze and ointment for treating injuries, as well as inaprovaline. Your left pouch contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your right pocket contains a flare gun holster and several flares. Your webbing contains a plasma pistol, a low damage sidearm that starts fires wherever it hits. Your suit storage contains boxes of additional flares. Your boots contain a MRE to eat, and a combat knife for clearing weeds and breaking things.
+
+ You should be close to the enemy constantly to take full advantage of your shotgun. This does not mean you should run off alone, as this is a good way to get yourself killed; rather, be in front of other marines, clearing away enemies to allow them to safely advance and cover you.
+
+ TIPS
+
+ BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+
+ While holding your SH-39, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil.
+
+ Your flare gun can be rapidly reloaded by just right clicking the flare pouch with it in hand. Your flare pouch can be refilled by left clicking on it while holding a flare box. Flare any dark area you can see to reduce the risk of a xenomorph ambushing you from the dark. On a similar note, your suit's light can be toggled in the top left - you should almost always keep this on to help your visibility.
+
+ If you are facehugged, quickly take out your plasma pistol and shoot the ground with it, then walk into the fire. While this will cause you to be set on fire, facehuggers will detach in the presence of fire, preventing you from becoming infected. You can press B (or click resist in the bottom right) once the facehugger has detached to stop, drop, and roll, extinguishing the fire.
+
+ To reload your shotgun, take out a handful of shells with a free hand and click your gun with them while it's in your other hand.
+
+ Shotguns can take a variety of rounds, in case slugs aren't your style. Buckshot rounds have more stopping power but fall off at mid range, while flechette rounds are less generally effective in exchange for drastically improved performance against heavily armored targets. The requisitions-exclusive incendiary slugs aren't quite as powerful as standard slugs but set anything they hit on fire!
+
+ The green M50 signal flares in your body armor don't last as long as normal flares but deploying them signals to CAS (close air support) that you're requesting an airstrike in the region, also granting them the ability to see and shoot at xenomorphs in the area.
+
+ Using the powerful knockback of your shotgun to knock xenomorphs TOWARDS other marines is a good way to get kills - most xenomorphs can't deal with that many marines at once!
+
+ Shotguns don't have access to aimmode, so be careful near other marines so you don't risk shooting them.
+
+ You have incredibly high per-shot damage. Waiting a little bit to allow a xenomorph to get closer before opening fire can lure it into a false sense of safety, potentially scoring you a kill."} + +/obj/item/paper/tutorial/beginner_shocktrooper + name = "Shocktrooper Tutorial" + info = {"As a shock trooper, you are a versatile yet powerful frontliner, and aim to change up tactics often to gain the advantage. You use the multimodal laser rifle, an experimental battery-powered weapon with an underbarrel flamethrower. Your belt contains spare energy cells for your laser rifle. Your right pocket and body armor contain a powerpack each- effectively bulkier versions of energy cells. Your body armor also contains a box of flares. Your left pocket contains a flare gun holster and several flares. Your backpack contains a large amount of miniature fuel tanks for use with your underbarrel flamethrower, as well as an inaprovaline autoinjector. Your webbing contains Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and gauze and ointment, which also heal brute and burn damage respectively. Your boots contains a MRE, in case you get hungry.
+
+ Switching between the different modes of your laser rifle is key to mastery on the battlefield. Like other frontliners, you aim to lead the push into enemy territory, clearing the path forward and facing xenomorphs head-on.
+
+ TIPS
+
+ BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+
+ On running out of ammo, the empty battery will automatically eject from the rifle. To reload, simply grab a new battery with an empty hand and click your gun with it. Alternatively, you can perform a tactical reload by click-dragging the battery from its storage directly onto the rifle, which can be done without an empty hand and with a different battery still in the gun. The powerpacks are a bit different - they have to be click-dragged while in one of your pockets to attach to the gun, and once attached remain in your pocket. However, they have four times the energy of a normal magazine. To refuel your underbarrel flamethrower, right click the gun with an empty hand to remove the old tank, then right click the gun again with a fresh tank.
+
+ While holding your laser rifle, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil. In the top left of your screen are several weapon-specific buttons. By pressing toggle mini flamethrower, you enable your underbarrel flamethrower, which you can now shoot with right click.
+
+ Your flare gun can be rapidly reloaded by just right clicking the flare pouch with it in hand. Your flare pouch can be refilled by left clicking on it while holding a flare box. Flare any dark area you can see to reduce the risk of a xenomorph ambushing you from the dark. On a similar note, your suit's light can be toggled in the top left - you should almost always keep this on to help your visibility.
+
+ By pressing unique action (default: space bar), you can cycle between the different modes of your laser gun. Standard mode rapidly fires laser beams, Overcharge mode fires more powerful beams at a lower rate of fire, weakening mode slows the target mildly as well as draining their plasma, and microwave applies a stacking debuff (up to five times) that deals armor-piercing damage over time. Note that different modes consume battery charge at different rates.
+
+ Laser weapons, unlike traditional ballistics, can fire through windows unimpeded. Use this with stronger windows, such as ballistic glass, to attack the enemy without them being able to attack you back."} + +/obj/item/paper/tutorial/beginner_hazmat + name = "Hazmat Tutorial" + info = {"As a HAZMAT, you excel in situations too dangerous for other marines. Your Mimir type armor grants you complete immunity to toxic gas, from acid to neurotoxin. It also provides an increased resistance against acid in general, for dealing with ranged xenomorphs. Your AR-11 is somewhat unwieldy and inaccurate, but packs both potent bursts and an impressive 70-round magazine. Your backpack, left pouch, and suit storage are all filled with spare magazines for your AR-11. Your right pouch contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your webbing contains flares for lighting areas, gauze and ointment for treating wounds, and a miniature fire extinguisher. Your boots contain a MRE, for when you get hungry.
+
+ Unlike other marines, you have no reason to fear toxic gas - and thanks to your tactical sensor, you pose quite a threat to xenomorphs while in it. Hide in smoke and use your sensor to fire at xenomorphs that can't see you back. In the absence of smoke, your AR-11 is still quite powerful, and can be used in many situations, though its inaccuracy makes it somewhat less potent at longer ranges.
+
+ TIPS
+
+ BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+
+ While holding your Type 71, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil. In the top left of your screen are several weapon-specific buttons. The button changes the firing mode, between Burst and Burst Automatic. Automatic burst will keep firing as long as you hold down the mouse button. The tactical sensor option toggles your tactical sensor - you should keep this on always.
+
+ Your tactical sensor will periodically blip, detecting moving targets in an area a little bigger than your screen. Green circles are friendly targets (or anyone wearing a marine ID), while red circles accompanied with an audible blip are unknown (almost always hostile) targets. This sensor works even without vision, such as through any form of smoke and through walls.
+
+ On running out of ammo, the empty magazine will automatically eject from the rifle. To reload, simply grab a new magazine with an empty hand and click your gun with it. Alternatively, you can perform a tactical reload by click-dragging the magazine from its storage directly onto the rifle, which can be done without an empty hand and with a different magazine still in the gun.
+
+ Your suit's light can be toggled in the top left - you should almost always keep this on to help your visibility. However, note that xenomorphs will often determine a marine's position in a smoke cloud by their light, so you should turn OFF your light if hiding in smoke!
+
+ On your belt is a belt harness. By left clicking on your belt harness with your AR-11, you can attach them. If you drop your AR, or have a xenomorph make you drop it, your AR will automatically return to your armor if it's attached.
+
+ While you're no machinegunner, you have over 700 rounds on you. Don't be afraid to shoot at anything that blips on your tactical sensor (as long as there aren't friendlies in the way!)"} + +/obj/item/paper/tutorial/beginner_cqc + name = "CQC Tutorial" + info = {"As a CQC marine, you are incredibly mobile, and should be using and abusing your speed to dart in and out of danger. You are effective both spearheading the assault and pushing into flanks. Your AR-18 carbine isn't the most dangerous rifle, nor does it have a particularly high magazine size, but it's incredibly lightweight compared to almost any other weapon, and its relative accuracy and stability even while moving and high fire rate allow it to pose a surprise threat to almost any xenomorphs. Your belt, body armor, and backpack all contain spare magazines for your AR-18. Your backpack also contains an MRE (in case you get hungry) as well as gauze and ointment to treat injuries with. Your left pocket contains a flare gun and several flares. Your right pouch contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your webbing contains gauze and ointment for healing, an MRE for eating, and two boxes of flares. Your boots contain a MRE for eating, and a combat knife for clearing weeds and breaking things.
+
+ Your speed is your greatest strength. You should be using it to rush into combat and chase after already injured enemies, only to rapidly retreat before things turn south. You're ideal at scouting locations, quickly reinforcing threatened positions, and overall being everywhere at once.
+
+ TIPS
+
+ BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+
+ While holding your AR-18, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil. In the top left of your screen are several weapon-specific buttons. The button changes the firing mode, between Single Automatic, Burst, and Burst Automatic. Automatic modes will keep firing as long as you hold down the mouse button. The tactical sensor option toggles your tactical sensor - you should keep this on always.
+
+ On running out of ammo, the empty magazine will automatically eject from the rifle. To reload, simply grab a new magazine with an empty hand and click your gun with it. Alternatively, you can perform a tactical reload by click-dragging the magazine from its storage directly onto the rifle, which can be done without an empty hand and with a different magazine still in the gun.
+
+ Your flare gun can be rapidly reloaded by just right clicking the flare pouch with it in hand. Your flare pouch can be refilled by left clicking on it while holding a flare box. Flare any dark area you can see to reduce the risk of a xenomorph ambushing you from the dark. On a similar note, your suit's light can be toggled in the top left - you should almost always keep this on to help your visibility.
+
+ Don't be afraid to charge headfirst into danger if you think you can save a teammate or get a kill - you have the speed to get back out, after all. The ALT key by default allows humans or clones to sprint at the cost of stamina, to go even faster!
+
+ While your rifle runs out of ammo quickly, its rapid fire four round bursts deal impressive damage. Combined with your speed, you are the master of ambushing."} + +/obj/item/paper/tutorial/builder + name = "Builder Tutorial" + info = {"The builder loadout is designed around you establishing defenses, barricades made from metal, plasteel or sandbags. You are the frontline, without you marines will be exposed to attacks from any and all directions. Use your quicker build speed and tools to aid and repair barricades, and fix APCs for generating the nuclear disks to win the round! Your loadout contains materials, a MG42 Light machine gun for self defense and suppression, and a radiopack for ordering more material to entrench and establish a fortified defensive position.
+
+ TIPS
+
+ In your webbing you will find a spare powercell and a handheld cell crank charger to charge them, when fixing apcs swap the empty battery for your full one and insert the empty one into your crank and charge it for the next disk!
+
+ When building defensive barricades it is best to not make them "flush" with nearby doors or walls. Instead pull back 1 tile and build it there, this prevents xenos from hiding around the corner behind the walls and smacking your cades freely without repercussion.
+
+ All metal barricades can be upgraded, the basic upgrade is of course barbed wire. This damages xenos when they attack the barricade and prevents them (and marines!) from climbing over the barricade.
+
+ BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage."} + +/obj/item/paper/tutorial/flamer + name = "Flamer Tutorial" + info = {"As a flamethrower specialist your job is to burn, burn some more and BURN again. You are equipped with a flamethrower bag that refills your flamethrower everytime you insert it back into the bag, and also have a lascarbine for more practical and pragmatic self defense. Also comes with a large box of claymore anti-personnel mines, and some general materials for helping fortify positions.
+
+ TIPS
+
+ Your flamethrower is best used to clear resin walls, it is a poor weapon for self defense and is best used to help carve a path through enemy mazes and to deny areas of movement without punishing xenos for trekking through the flames.
+
+ In your webbing you will find a spare powercell and a handheld cell crank charger to charge them, when fixing apcs swap the empty battery for your full one and insert the empty one into your crank and charge it for the next disk!
+
+ Your claymore mines are useful for denying an area from being easily flanked and can cause serious disruption (or even kill!) backlining xenomorphs from causing you a bad day.
+
+ BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage."} + +/obj/item/paper/tutorial/plasmacutter + name = "PlasmaCutter Tutorial" + info = {"Tired of watching marines endlessly pour into a maze or terribly held choke point? This is the class for you then! With your plasma cutter you will be able to easily delete resin walls from existence, and carve through metal, reinforced or even solid rock walls! With this kit you'll be able to widen choke points and eradicate mazes with ease. This loadout also comes with a few materials for defenses and a R44 Revolver for self defense in your welderpack.
+
+ TIPS
+
+ Your Plasma Cutter (often abbreviated to PC) is a very versatile tool but it contains a limited charge of 7500, for resin walls the charge is rather miniscule at 100 Charge but a much heavier or thicker metallic or rock wall will cost you 1000 charge so make sure to keep track of how much charge your battery contains! Do remember to keep your welding module or goggles on when using it however, as the plasma cutter will damage your eyes until they're blind!
+
+ In your webbing you will find a spare powercell and a handheld cell crank charger to charge them, when fixing apcs swap the empty battery for your full one and insert the empty one into your crank and charge it for the next disk!
+
+ Your plasma cutter can be used as a melee weapon in emergency situations, while not the best by any means it can work in a pinch and if you manage to smack a xeno you'll get rewarded with draining them of a small amount of plasma and a bit of charge for your plasma cutter. Use this to destroy mazes and punish xenos for trying to attack you by refilling your battery. A recommended combo when frontlining us combining it with a defensive shield!
+
+ BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage."} + +/obj/item/paper/tutorial/lifesaver + name = "Lifesaver Tutorial" + info = {"As the lifesaver, you are a MEDIC first and foremost. You should be prioritizing healing marines over trying to fight xenomorphs yourself. Your belt contains many pill bottles - examine them to find out what they do with shift click, and draw from them with right click. Your belt also contains splints, which are used on fractured bones, and a medical analyzer, which will tell you exactly what's wrong with a person. Avoid giving someone more than one pill of a given medicine at a time; many pills overdose at three, and some at two, and some marines might go and take a pill themselves, so one is safest. In your armor storage are an assortment of autoinjectors. Combat injectors should be used on marines in active danger, quick clot plus helps deal with internal bleeding, peridaxon plus heals organs, and dexalin plus helps with deoxygenation. Your right pouch contains three stacks of trauma and burn kits, which will cause a body part they're applied to to heal brute or burn damage over time respectively. It also contains a hypospray full of meraderm, a medicine mixture that heals both brute and burn damage quickly. Your webbing contains oxycodone, a painkiller, nanoblood, a blood replacement, a stasis bag to hold patients you aren't actively treating in to prevent their condition from worsening, tweezers to remove shrapnel, a roller bed to roll around patients with, and a medivac to evacuate patients. Your boots and helmet contain food.
+
+ Stay away from the frontlines - let patients come to (or be dragged to) you instead of putting yourself in danger. Try to remain in a safe location, as xenomorphs do not obey the Geneva convention and will in fact deliberately target you and your patients as often as possible.
+
+ TIPS
+
+ Your gloves are defibrillators. By clicking on any dead target with their exosuit removed (drag their sprite onto your sprite to remove it) you will attempt to bring them back to life, healing them somewhat and then resuscitating them if they're healed enough. Drag your gloves to your backpack to recharge them. This even works on robots! Make sure your intent is help while doing this or you might just punch them right after they revive, taking them out again.
+
+ While holding your repeater, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil. In the top left of your screen are several weapon-specific buttons.
+
+ As your rifle is bolt-action, it needs to be racked after every shot. Do this by pressing your Unique Action key, which defaults to the spacebar.
+
+ Your backpack contains ammo packets. You can click on your shotgun shell pouch to quickly transfer ammo into the pouch. You can then reload your repeater by clicking it while it's in your hand with the handful of bullets.
+
+ Before you do ANYTHING to a patient, use your medical analyzer on them. Not analyzing is the number one cause of overdoses. Right clicking with the analyzer instead shows them their own health scan, useful for getting their attention or informing them that they're fully healed.
+
+ When you dispense your equipment, a medivac beacon will appear on the floor. Pick this up, take your medivac and click it on the beacon so it says linked! Once done, you should go to your ship's medical bay and place the beacon by pressing Z with it in hand. Once groundside, you can now medivac people for treatment shipside. Shipside can fix bone fractures, clone damage, facehugging, and anything else you can't. To evac someone, deploy your medivac by pressing Z with it in hand, drag them onto it to buckle them to it, then right click to send them up. Drag the medivac to you to pick it back up once you're done.
+
+ Marines will "go cold" after five minutes of being dead, rendering them permanently unrevivable. This timer can be extended via your stasis bag or with CPR, which other marines can perform while you work by left clicking the corpse on help intent while neither of them are wearing a mask.
+
+ Accidentally overdose a marine? They're full of deadly neurotoxin? Don't panic - use hypervene. While uncomfortable for the marine, this medication (located in your medical belt) will rapidly purge their system.
+
+ You can use meralyne and dermaline at the same time as bicardine and kelotane, for an accelerated healing rate."} + +/obj/item/paper/tutorial/hypobelt + name = "Hypobelt Tutorial" + info = {"As the hypobelt medic, you are the master of rapid healing. Your belt is full of hyposprays which instantly apply a dose of medicine when you click a marine with them. Examine them with shift click to read their labels to find out what they do. Avoid injecting someone more than once or twice with the same medicine to prevent an overdose! Your pouch contains three stacks of trauma and burn kits, which will cause a body part they're applied to to heal brute or burn damage over time respectively. It also contains a hypospray full of meraderm, a medicine mixture that heals both brute and burn damage quickly. These hyposprays can be refilled by the bottles in the syringe cases of your belt. Your webbing is filled with splints for treating fractures. Your body armor contains oxycodone, a painkiller, a stasis bag to hold patients you aren't actively treating in to prevent their condition from worsening, tweezers to remove shrapnel, a roller bed to roll around patients with, and a medivac to evacuate patients. Your boots and helmet contain food.
+
+ Your light armor and quick injectors make you adept at rapidly getting marines back into the action. However, take care to avoid danger; xenomorphs WILL target you, and you will go down fast without proper protection.
+
+ TIPS
+
+ Your gloves are medical analyzers, which you can use on a patient by left clicking them. Before you do ANYTHING to a patient, use your medical analyzer on them. Not analyzing is the number one cause of overdoses. Right click with the analyzer instead shows them their own health scan, useful for getting their attention or informing them that they're fully healed.
+
+ In your backpack is a defibrillator. By clicking on any dead target with their exosuit removed (drag their sprite onto your sprite to remove it) you will attempt to bring them back to life, healing them somewhat and then resuscitating them if they're healed enough. Drag your defib to your backpack to recharge them. This even works on robots!
+
+ When you dispense your equipment, a medivac beacon will appear on the floor. Pick this up, take your medivac and click it on the beacon so it says linked! Once done, you should go to your ship's medical bay and place the beacon by pressing Z with it in hand. Once groundside, you can now medivac people for treatment shipside. Shipside can fix bone fractures, clone damage, facehugging, and anything else you can't. To evac someone, deploy your medivac by pressing Z with it in hand, drag them onto it to buckle them to it, then right click to send them up. Drag the medivac to you to pick it back up once you're done.
+
+ Marines will "go cold" after five minutes of being dead, rendering them permanently unrevivable. This timer can be extended via your stasis bag or with CPR, which other marines can perform while you work by left clicking the corpse on help intent while neither of them are wearing a mask.
+
+ Accidentally overdose a marine? They're full of deadly neurotoxin? Don't panic - use hypervene. While uncomfortable for the marine, this medication (located in your medical belt) will rapidly purge their system.
+
+ You can use meralyne and dermaline at the same time as bicardine and kelotane, for an accelerated healing rate.
+
+ As your shotgun is pump-action, you'll need to pump it after every shot by pressing Unique Action (default space.)
+
+ You can reload your shotgun by grabbing a handful of slugs from your backpack and clicking your shotgun with them."} + +/obj/item/paper/tutorial/smartmachinegunner + name = "Smartmachinegunner Tutorial" + info = {"As the smartmachinegunner, you are the very backbone of your squad, and should be behind another marine or three at all times. Your SG-29 is capable of firing directly through your teammates without risk of harm, so staying safe and behind your allies is essential to gaining full value out of it. Your backpack and body armor contain both fire extinguishers and spare ammo, with your backpack also containing a plasma pistol to start fires with. Your left pouch contains a flare gun holster and several flares. Your right pouch contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your webbing contains flares for creating lights and gauze and ointment for treating injuries. Your helmet and boots contain food, in case you get hungry.
+
+ You should NEVER be at the front of a group of marines. Aim to provide covering fire for those who are in front, and let them protect you in turn by, well, being in front of you. Remember that your SG-29 fires through marines, so you don't need to worry about friendly fire.
+
+ TIPS
+
+ BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+
+ Your flare gun can be rapidly reloaded by just right clicking the flare pouch with it in hand. Your flare pouch can be refilled by left clicking on it while holding a flare box. Flare any dark area you can see to reduce the risk of a xenomorph ambushing you from the dark. On a similar note, your suit's light can be toggled in the top left - you should almost always keep this on to help your visibility.
+
+ On your belt is a belt harness. By left clicking on your belt harness with your machine gun, you can attach them. If you drop your machine gun, or have a xenomorph make you drop it, your machine gun will automatically return to your armor if it's attached.
+
+ If you are facehugged, quickly take out your plasma pistol and shoot the ground with it, then walk into the fire. While this will cause you to be set on fire, facehuggers will detach in the presence of fire, preventing you from becoming infected. You can press B (or click resist in the bottom right) once the facehugger has detached to stop, drop, and roll, extinguishing the fire.
+
+ Your impressive magazine size means you don't need to reload often. You can suppress one spot for an impressive amount of time, and you have the ammo and damage to clear out resin walls.
+
+ While holding your SG-29, use Z to wield your weapon with both hands, increasing accuracy and stability and reducing recoil. In the top left of your screen are several weapon-specific buttons. The tactical sensor option toggles your tactical sensor - you should keep this on always.
+
+ Your tactical sensor will periodically blip, detecting moving targets in an area a little bigger than your screen. Green circles are friendly targets (or anyone wearing a marine ID), while red circles accompanied with an audible blip are unknown (almost always hostile) targets. This sensor works even without vision, such as through any form of smoke and through walls.
+
+ On running out of ammo, the empty magazine will automatically eject from the smartgun. To reload, simply grab a new magazine with an empty hand and click your gun with it. Alternatively, you can perform a tactical reload by click-dragging the magazine from its storage directly onto the rifle, which can be done without an empty hand and with a different magazine still in the gun.
+
+ STAY BEHIND OTHER MARINES. I cannot stress this enough. You are a priority target for xenomorphs due to your ability to provide covering fire from behind other marines.
+
+ Your massive drum size of 250 rounds means you don't need to reload often. Because of this, you should avoid reloading in dangerous areas if you can help it, instead waiting until you're back behind fortifications or other marines.
+
+ You possess an antenna module on your helmet, which allows you to receive shipments from requisitions (on the ship) while in the field. To request something, say :u followed by a clear and polite request as to what you would like to receive. For example, if you ran out of ammo, you might say ":u RO, requesting SG-29 drums to my antenna." After some amount of time, you will likely get a response in the requisitions channel (pay attention!) along the lines of "Yourname, your order is ready. Raise your antenna." To do this, click the antenna icon in the top left - you should get a notification in the bottom right informing you it's successfully raised. You should then HOLD STILL until you receive your order. (Once you've raised your antenna, it's polite to inform the RO, or requisitions officer, that it's raised.) After some time, you should hear a WOOSH noise, and a box will teleport to where you're standing with what you requested. Note that requisitions is the ONLY place you can get more smartgun ammo!
+
+ You are the most mobile among smartgunners - use this to your advantage. You are the best at providing cover fire for a mobile squad."} + +/obj/item/paper/tutorial/smartminigunner + name = "Smartminigunner Tutorial" + info = {"As the smartminigunner, you are the very embodiment of BRRT. With your huge SG-85 smart minigun, you can fire ten rounds per second for one hundred straight seconds, providing powerful covering fire for other marines. No enemy wants to get stuck in your line of fire. Instead of a backpack you carry a back mounted powerpack that feeds and powers your SG-85. In your body armor are two bins to refill your powerpack with. Your left pouch contains a flare gun holster and several flares. Your right pouch contains a first aid kit, complete with Bicardine (which heals brute damage), Kelotane (which heals burn damage), Tramadol (which is a painkiller), Tricordrazine (which heals all damage, but slowly), and Dylovene (which heals toxin, or poison damage), as well as splints and inaprovaline. Your webbing contains flares for creating lights and gauze and ointment for treating injuries. Your helmet and boots contain food, in case you get hungry.
+
+ Your minigun boasts both high levels of armor piercing and the ability to shoot through allies - use both to your advantage. Note that the heavy nature of your minigun and your brief windup before you can fire means you're best positioned defensively, firing at the toughest targets within range.
+
+ TIPS
+ BKTT is an acronym that is used to describe the combination of Bicardine, Kelotane, Tricordizine, and Tramadol used as an all-rounder combat medicine mix for any situation that heals all different types of damage. Make sure not to take more than two of each pill at a time - medicine takes a while to process through your system, and too many at once risks a dangerous overdose. Your gauze and ointment are body-part specific, unlike medication, but once you start applying one, you will keep applying it to all body parts that require treatment as long as you hold still. Your splints are used to alleviate the effects of bone fractures, by applying them to a fractured limb. Your inaprovaline autoinjector is not to be applied to yourself - rather, it should be applied to an alive marine that is so heavily injured they are unconscious on the ground (referred to as "critical condition") to rescue them from that state. You can remove pills from their packets directly by right clicking on the packet, even while it's in storage.
+
+ Your flare gun can be rapidly reloaded by just right clicking the flare pouch with it in hand. Your flare pouch can be refilled by left clicking on it while holding a flare box. Flare any dark area you can see to reduce the risk of a xenomorph ambushing you from the dark. On a similar note, your suit's light can be toggled in the top left - you should almost always keep this on to help your visibility.
+
+ On your belt is a belt harness. By left clicking on your belt harness with your minigun, you can attach them. If you drop your minigun, or have a xenomorph make you drop it, your machine gun will automatically return to your armor if it's attached. On the same note, by left clicking your powerpack, you hook up your minigun, allowing it to draw from it for ammo. If you drop your minigun, even if it's saved by the belt harness, you will have to re-attach it to the powerpack.
+
+ To reload your power back, take it into your hand, then grab an ammo bin with your other hand and click the power pack with it.
+
+ While holding your SG-85, use Z to wield your weapon with both hands, which is required to fire it. In the top left of your screen are several weapon-specific buttons. The tactical sensor option toggles your tactical sensor - you should keep this on always.
+
+ Your tactical sensor will periodically blip, detecting moving targets in an area a little bigger than your screen. Green circles are friendly targets (or anyone wearing a marine ID), while red circles accompanied with an audible blip are unknown (almost always hostile) targets. This sensor works even without vision, such as through any form of smoke and through walls.
+
+ You possess an antenna module on your helmet, which allows you to receive shipments from requisitions (on the ship) while in the field. To request something, say :u followed by a clear and polite request as to what you would like to receive. For example, if you ran out of ammo, you might say ":u RO, requesting SG-85 bins to my antenna." After some amount of time, you will likely get a response in the requisitions channel (pay attention!) along the lines of "Yourname, your order is ready. Raise your antenna." To do this, click the antenna icon in the top left - you should get a notification in the bottom right informing you it's successfully raised. You should then HOLD STILL until you receive your order. (Once you've raised your antenna, it's polite to inform the RO, or requisitions officer, that it's raised.) After some time, you should hear a WOOSH noise, and a box will teleport to where you're standing with what you requested. Note that requisitions is the ONLY place you can get more smartgun ammo!
+
+ STAY BEHIND OTHER MARINES. I cannot stress this enough. You are a priority target for xenomorphs due to your ability to provide covering fire from behind other marines.
+
+ You almost never need to reload - you have enough rounds to fire for almost two straight minutes. Because of this, you should exclusively reload when it is completely safe to do so, as other marines are counting on you to protect them.
+
+ Your minigun boasts an incredibly high amount of armor piercing. Aim for particularly durable targets, like Crushers and Kings, as you'll likely do a lot more damage."} + +/obj/item/paper/tutorial/robot_laser_rifleman + name = "Robot Laser Rifleman" + info = {"As a robot, you are immune to most traumas and toxins, but unable to run, which decreases your potential speed. Use either the instruments in your webbing, on the uniform, to repair yourself or autorepair ability. Welders are used to repair brute damage, cable coils for the burn damage, but the soldering tool is universal, so don't loose it!
+
+ Your weapon is called Laser Rifle, it uses laser batteries from your belt to shoot. Red batteries are self-recharging, at the cost of decreased charge amount. Use laser powerpack cell, from your suit storage, to quickly recharge spent laser batteries.
+
+ Don't forget to activate your armor integrated flashlight and helmet proximity detector module, by clicking buttons on the upper-left. +
+ You also have a mini-flamethrower attached to your gun. Enable it by clicking on the flamethrower button in upper-left. Shoot it by RMB-ing on the turfs. Reload it by clicking RMB with mini-flamethrower tanks from your backpack.
+
+ You have a charged powerfist in your backpack storage, use it when xenomorphs get too close to you, to send them flying away from you. X2 performance points if you send them in the place, where all the marines are standing.
+
+ In your helmet you have inaprovaline autoinjectors, use them on your human comrades, that seem sleeping on the battlefield, or just in critical state of health. It will recover 30% of their health instantly, which most probably will put them on their foot.
+
+ Your flare gun can be rapidly reloaded by just right clicking the flare pouch with it in hand. Your flare pouch can be refilled by left clicking on it while holding a flare box. Flare any dark area you can see to reduce the risk of a xenomorph ambushing you from the dark. On a similar note, your suit's light can be toggled in the top left - you should almost always keep this on to help your visibility. +
+ Your tools pouch can be used for the sake of helping your fellow engineers with repairing barricades, generators or something similar."} + +/obj/item/paper/tutorial/robot_laser_machinegunner + name = "Robot Laser Machinegunner" + info = {"As a robot, you are immune to most traumas and toxins, but unable to run, which decreases your potential speed. Use either the instruments in your webbing, on the uniform, to repair yourself or autorepair ability. Welders are used to repair brute damage, cable coils for the burn damage, but the soldering tool is universal, so don't loose it!
+
+ Your weapon is called Laser Machine Gun, it uses charge from laser batteries or powerpacks. Attack it your back powerpack for nearly infinite power-source for your weapon, as it recharges by the time by itself.
+
+ You have a magnetic harness on your belt slot, click it with your weapon, so you don't loose it when someone attacks you. +
+ Don't forget to activate your armor integrated flashlight, by clicking buttons on the upper-left. +
+ You have a charged powerfist in your suit storage, use it when xenomorphs get too close to you, to send them flying away from you. X2 performance points if you send them in the place, where all the marines are standing.
+
+ In your helmet you have inaprovaline autoinjectors, use them on your human comrades, that seem sleeping on the battlefield, or just in critical state of health. It will recover 30% of their health instantly, which most probably will put them on their foot.
+
+ Your flare gun can be rapidly reloaded by just right clicking the flare pouch with it in hand. Your flare pouch can be refilled by left clicking on it while holding a flare box. Flare any dark area you can see to reduce the risk of a xenomorph ambushing you from the dark. On a similar note, your suit's light can be toggled in the top left - you should almost always keep this on to help your visibility. +
+ Your tools pouch can be used for the sake of helping your fellow engineers with repairing barricades, generators or something similar."} + +/obj/item/paper/tutorial/robot_laser_sniper + name = "Robot Laser Sniper" + info = {"As a robot, you are immune to most traumas and toxins, but unable to run, which decreases your potential speed. Use either the instruments in your webbing, on the uniform, to repair yourself or autorepair ability. Welders are used to repair brute damage, cable coils for the burn damage, but the soldering tool is universal, so don't loose it!
+
+ Your weapon is called Laser Sniper Rifle, it uses charge from laser batteries or powerpacks. Attack it your back powerpack for nearly infinite power-source for your weapon, as it recharges by the time by itself.
+
+ You have a magnetic harness on your belt slot, click it with your weapon, so you don't loose it when someone attacks you. +
+ Don't forget to activate your armor integrated flashlight, by clicking buttons on the upper-left. +
+ You have a charged powerfist in your suit storage, use it when xenomorphs get too close to you, to send them flying away from you. X2 performance points if you send them in the place, where all the marines are standing.
+
+ In your helmet you have inaprovaline autoinjectors, use them on your human comrades, that seem sleeping on the battlefield, or just in critical state of health. It will recover 30% of their health instantly, which most probably will put them on their foot.
+
+ Your flare gun can be rapidly reloaded by just right clicking the flare pouch with it in hand. Your flare pouch can be refilled by left clicking on it while holding a flare box. Flare any dark area you can see to reduce the risk of a xenomorph ambushing you from the dark. On a similar note, your suit's light can be toggled in the top left - you should almost always keep this on to help your visibility. +
+ Your tools pouch can be used for the sake of helping your fellow engineers with repairing barricades, generators or something similar."} diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index aa8693dd92a..8d410fbd1ec 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -219,27 +219,28 @@ /obj/item/paper/proc/burnpaper(obj/item/P, mob/user) var/class = "" - if(P.heat >= 400 && !user.restrained()) - if(istype(P, /obj/item/tool/lighter/zippo)) - class = "" - - user.visible_message("[class][user] holds \the [P] up to \the [src], it looks like [user.p_theyre()] trying to burn it!", \ - "[class]You hold \the [P] up to \the [src], burning it slowly.") + if(P.heat < 400 || user.restrained()) + return + if(istype(P, /obj/item/tool/lighter/zippo)) + class = "" - spawn(20) - if(get_dist(src, user) < 2 && user.get_active_held_item() == P && P.heat) - user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ - "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") + user.visible_message("[class][user] holds \the [P] up to \the [src], it looks like [user.p_theyre()] trying to burn it!", \ + "[class]You hold \the [P] up to \the [src], burning it slowly.") - if(user.get_inactive_held_item() == src) - user.dropItemToGround(src) + if(!do_after(user, 2 SECONDS, NONE, src)) + to_chat(user, span_warning("You must hold \the [P] steady to burn \the [src].")) + return - new /obj/effect/decal/cleanable/ash(src.loc) - qdel(src) + if(!P.heat) + return + user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ + "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") - else - to_chat(user, span_warning("You must hold \the [P] steady to burn \the [src].")) + if(user.get_inactive_held_item() == src) + user.dropItemToGround(src) + new /obj/effect/decal/cleanable/ash(src.loc) + qdel(src) /obj/item/paper/Topic(href, href_list) . = ..() @@ -389,7 +390,7 @@ then, for every time you included a field, increment fields. */ /obj/item/paper/jobs name = "Job Information" - info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document.
\nThe data will be in the following form.
\nGenerally lower ranking positions come first in this list.
\n
\nJob Name general access>lab access-engine access-systems access (atmosphere control)
\n\tJob Description
\nJob Duties (in no particular order)
\nTips (where applicable)
\n
\nResearch Assistant 1>1-0-0
\n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance.
\n1. Assist the researchers.
\n2. Clean up the labs.
\n3. Prepare materials.
\n
\nStaff Assistant 2>0-0-0
\n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel)
\n1. Patrol ship/Guard key areas
\n2. Assist security officer
\n3. Perform other security duties.
\n
\nTechnical Assistant 1>0-0-1
\n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that.
\n1. Assist Station technician and Engineers.
\n2. Perform general maintenance of station.
\n3. Prepare materials.
\n
\nMedical Assistant 1>1-0-0
\n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals)
\n1. Assist the medical personnel.
\n2. Update medical files.
\n3. Prepare materials for medical operations.
\n
\nResearch Technician 2>3-0-0
\n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally.
\n1. Inform superiors of research.
\n2. Perform research alongside of official researchers.
\n
\nDetective 3>2-0-0
\n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly.
\n1. Perform crime-scene investigations/draw conclusions.
\n2. Store and catalogue evidence properly.
\n3. Testify to superiors/inquieries on findings.
\n
\nStation Technician 2>0-2-3
\n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician.
\n1. Maintain SS13 systems.
\n2. Repair equipment.
\n
\nAtmospheric Technician 3>0-0-4
\n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13.
\n1. Maintain atmosphere on SS13
\n2. Research atmospheres on the space station. (safely please!)
\n
\nEngineer 2>1-3-0
\n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area.
\n1. Upkeep the engine.
\n2. Prevent fires in the engine.
\n3. Maintain a safe orbit.
\n
\nMedical Researcher 2>5-0-0
\n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed.
\n1. Make sure the station is kept safe.
\n2. Research medical properties of materials studied of Space Station 13.
\n
\nScientist 2>5-0-0
\n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Phoron Technicians as phoron is the material they routinly handle.
\n1. Research phoron
\n2. Make sure all phoron is properly handled.
\n
\nMedical Doctor (Officer) 2>0-0-0
\n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder.
\n1. Heal wounded people.
\n2. Perform examinations of all personnel.
\n3. Moniter usage of medical equipment.
\n
\nSecurity Officer 3>0-0-0
\n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources.
\n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel)
\n1. Maintain order.
\n2. Assist others.
\n3. Repair structural problems.
\n
\nHead of Security 4>5-2-2
\n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person.
\n1. Oversee security.
\n2. Assign patrol duties.
\n3. Protect the station and staff.
\n
\nHead of Personnel 4>4-2-2
\n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels.
\n1. Assign duties.
\n2. Moderate personnel.
\n3. Moderate research.
\n
\nCaptain 5>5-5-5 (unrestricted station wide access)
\n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power.
\n1. Assign all positions on SS13
\n2. Inspect the station for any problems.
\n3. Perform administrative duties.
\n" + info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document.
\nThe data will be in the following form.
\nGenerally lower ranking positions come first in this list.
\n
\nJob Name general access>lab access-engine access-systems access (atmosphere control)
\n\tJob Description
\nJob Duties (in no particular order)
\nTips (where applicable)
\n
\nResearch Assistant 1>1-0-0
\n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance.
\n1. Assist the researchers.
\n2. Clean up the labs.
\n3. Prepare materials.
\n
\nStaff Assistant 2>0-0-0
\n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel)
\n1. Patrol ship/Guard key areas
\n2. Assist security officer
\n3. Perform other security duties.
\n
\nTechnical Assistant 1>0-0-1
\n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that.
\n1. Assist Station technician and Engineers.
\n2. Perform general maintenance of station.
\n3. Prepare materials.
\n
\nMedical Assistant 1>1-0-0
\n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals)
\n1. Assist the medical personnel.
\n2. Update medical files.
\n3. Prepare materials for medical operations.
\n
\nResearch Technician 2>3-0-0
\n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally.
\n1. Inform superiors of research.
\n2. Perform research alongside of official researchers.
\n
\nDetective 3>2-0-0
\n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly.
\n1. Perform crime-scene investigations/draw conclusions.
\n2. Store and catalogue evidence properly.
\n3. Testify to superiors/inquieries on findings.
\n
\nStation Technician 2>0-2-3
\n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician.
\n1. Maintain SS13 systems.
\n2. Repair equipment.
\n
\nAtmospheric Technician 3>0-0-4
\n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13.
\n1. Maintain atmosphere on SS13
\n2. Research atmospheres on the space station. (safely please!)
\n
\nEngineer 2>1-3-0
\n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area.
\n1. Upkeep the engine.
\n2. Prevent fires in the engine.
\n3. Maintain a safe orbit.
\n
\nField Researcher 2>5-0-0
\n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed.
\n1. Make sure the station is kept safe.
\n2. Research medical properties of materials studied of Space Station 13.
\n
\nScientist 2>5-0-0
\n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Phoron Technicians as phoron is the material they routinly handle.
\n1. Research phoron
\n2. Make sure all phoron is properly handled.
\n
\nMedical Doctor (Officer) 2>0-0-0
\n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder.
\n1. Heal wounded people.
\n2. Perform examinations of all personnel.
\n3. Moniter usage of medical equipment.
\n
\nSecurity Officer 3>0-0-0
\n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources.
\n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel)
\n1. Maintain order.
\n2. Assist others.
\n3. Repair structural problems.
\n
\nHead of Security 4>5-2-2
\n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person.
\n1. Oversee security.
\n2. Assign patrol duties.
\n3. Protect the station and staff.
\n
\nHead of Personnel 4>4-2-2
\n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels.
\n1. Assign duties.
\n2. Moderate personnel.
\n3. Moderate research.
\n
\nCaptain 5>5-5-5 (unrestricted station wide access)
\n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power.
\n1. Assign all positions on SS13
\n2. Inspect the station for any problems.
\n3. Perform administrative duties.
\n" /obj/item/paper/photograph name = "photo" diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 7197a28b951..58ed494b9fb 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -62,30 +62,31 @@ update_icon() attack_self(user) //Update the browsed page. - /obj/item/paper_bundle/proc/burnpaper(obj/item/P, mob/user) var/class = "" - if(P.heat >= 400 && !user.restrained()) - if(istype(P, /obj/item/tool/lighter/zippo)) - class = "" + if(P.heat < 400 || user.restrained()) + return + if(istype(P, /obj/item/tool/lighter/zippo)) + class = "" - user.visible_message("[class][user] holds \the [P] up to \the [src], it looks like [user.p_theyre()] trying to burn it!", \ + user.visible_message("[class][user] holds \the [P] up to \the [src], it looks like [user.p_theyre()] trying to burn it!", \ "[class]You hold \the [P] up to \the [src], burning it slowly.") - spawn(20) - if(get_dist(src, user) < 2 && user.get_active_held_item() == P && P.heat) - user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ - "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") + if(!do_after(user, 2 SECONDS, NONE, src)) + to_chat(user, span_warning("You must hold \the [P] steady to burn \the [src].")) + return - if(user.get_inactive_held_item() == src) - user.dropItemToGround(src) + if(!P.heat) + return + user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ + "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") - new /obj/effect/decal/cleanable/ash(src.loc) - qdel(src) + if(user.get_inactive_held_item() == src) + user.dropItemToGround(src) - else - to_chat(user, span_warning("You must hold \the [P] steady to burn \the [src].")) + new /obj/effect/decal/cleanable/ash(src.loc) + qdel(src) /obj/item/paper_bundle/examine(mob/user) . = ..() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index b3c011ddc13..78b15cfe79d 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -350,15 +350,17 @@ if(flickering) return flickering = TRUE - spawn(0) - if(light_on && status == LIGHT_OK) - for(var/i = 0; i < amount; i++) - if(status != LIGHT_OK) - break - update(FALSE) - sleep(rand(5, 15)) - update(FALSE) - flickering = FALSE + INVOKE_ASYNC(src, PROC_REF(flicker_stage_2), amount) + +/obj/machinery/light/proc/flicker_stage_2(amount) + if(light_on && status == LIGHT_OK) + for(var/i = 0; i < amount; i++) + if(status != LIGHT_OK) + break + update(FALSE, FALSE) + sleep(rand(5, 15)) + update(FALSE) + flickering = FALSE // ai attack - make lights flicker, because why not diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 5bc55e70d38..dcfec555aa3 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -328,7 +328,7 @@ playsound_z(3, 'sound/effects/powerloss.ogg') if(announce) - priority_announce("Abnormal activity detected in the ship power system. As a precaution, power must be shut down for an indefinite duration.", "Critical Power Failure", sound = 'sound/AI/poweroff.ogg') + priority_announce("В системе питания судна обнаружена аномальная активность. В качестве меры предосторожности питание будет отключено на неопределенный срок.", "Критический Сбой Питания", sound = 'sound/AI/poweroff.ogg') /proc/power_restore(announce = TRUE) @@ -351,7 +351,7 @@ if(announce) - priority_announce("Power has been restored. Reason: Unknown.", "Power Systems Nominal", sound = 'sound/AI/poweron.ogg') + priority_announce("Питание восстановлено. Причина: Неизвестно.", "Восстановление Питания", sound = 'sound/AI/poweron.ogg') /proc/power_restore_quick(announce = TRUE) @@ -365,7 +365,7 @@ S.power_change() if(announce) - priority_announce("Power has been restored. Reason: Unknown.", "Power Systems Nominal", sound = 'sound/AI/poweron.ogg') + priority_announce("Питание восстановлено. Причина: Неизвестно.", "Восстановление Питания", sound = 'sound/AI/poweron.ogg') /proc/power_restore_everything(announce = TRUE) @@ -382,4 +382,4 @@ C.cell.charge = C.cell.maxcharge if(announce) - priority_announce("Power has been restored. Reason: Unknown.", "Power Systems Nominal", sound = 'sound/AI/poweron.ogg') + priority_announce("Питание восстановлено. Причина: Неизвестно.", "Восстановление Питания", sound = 'sound/AI/poweron.ogg') diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 4441018438b..f78389b8b20 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -141,29 +141,31 @@ if (prob(50)) visible_message("DANGER! Magnetic containment field unstable! Containment field failure imminent!") failing = 1 - // 30 - 60 seconds and then BAM! - spawn(rand(300,600)) - if(!failing) // Admin can manually set this var back to 0 to stop overload, for use when griffed. - update_icon() - visible_message("Magnetic containment stabilised.") - return - visible_message("DANGER! Magnetic containment field failure in 3 ... 2 ... 1 ...") - cell_explosion(loc, 250, 50) - // Not sure if this is necessary, but just in case the SMES *somehow* survived.. - qdel(src) - - // Gets powernet APCs and overloads lights or breaks the APC completely, depending on percentages. + addtimer(CALLBACK(src, PROC_REF(smes_overload)), rand(30 SECONDS, 60 SECONDS)) + +/obj/machinery/power/smes/buildable/proc/smes_overload() + if(!failing) // Admin can manually set this var back to 0 to stop overload, for use when griffed. + update_icon() + visible_message("Magnetic containment stabilised.") + return + visible_message("DANGER! Magnetic containment field failure in 3 ... 2 ... 1 ...") + cell_explosion(loc, 250, 50) + // Not sure if this is necessary, but just in case the SMES *somehow* survived.. + qdel(src) + +/// Gets powernet APCs and overloads lights or breaks the APC completely, depending on percentages. /obj/machinery/power/smes/buildable/proc/apcs_overload(failure_chance, overload_chance) - if (!src.powernet) + if(!src.powernet) return for(var/obj/machinery/power/terminal/T in src.powernet.nodes) - if(istype(T.master, /obj/machinery/power/apc)) - var/obj/machinery/power/apc/A = T.master - if (prob(overload_chance)) - A.overload_lighting() - if (prob(failure_chance)) - A.set_broken() + if(!istype(T.master, /obj/machinery/power/apc)) + continue + var/obj/machinery/power/apc/A = T.master + if(prob(overload_chance)) + A.overload_lighting() + if(prob(failure_chance)) + A.set_broken() // Failing SMES has special icon overlay. /obj/machinery/power/smes/buildable/update_overlays() diff --git a/code/modules/predator/smartdisc.dm b/code/modules/predator/smartdisc.dm index d99b83b2e8f..f5c3aaaff57 100644 --- a/code/modules/predator/smartdisc.dm +++ b/code/modules/predator/smartdisc.dm @@ -120,9 +120,7 @@ active = TRUE playsound(loc, 'sound/items/countdown.ogg', 25, 1) update_icon() - spawn(det_time) - prime() - return + addtimer(CALLBACK(src, PROC_REF(prime)), det_time) /obj/item/explosive/grenade/spawnergrenade/smartdisc/prime() if(spawner_type && deliveryamt) @@ -212,10 +210,8 @@ /mob/living/simple_animal/hostile/smartdisc/death() visible_message("\The [src] stops whirring and spins out onto the floor.") drop_real_disc() - ..() - spawn(1) - if(src) - qdel(src) + . = ..() + QDEL_IN(src, 0.1 SECONDS) /mob/living/simple_animal/hostile/smartdisc/proc/drop_real_disc() spawner_item.forceMove(loc) @@ -230,9 +226,7 @@ /mob/living/simple_animal/hostile/smartdisc/gib() visible_message("\The [src] explodes!") . = ..() - spawn(1) - if(src) - qdel(src) + QDEL_IN(src, 0.1 SECONDS) /mob/living/simple_animal/hostile/smartdisc/FindTarget() var/atom/T = null diff --git a/code/modules/predator/yautja/bracers.dm b/code/modules/predator/yautja/bracers.dm index a6055b235e6..376e9b344c0 100644 --- a/code/modules/predator/yautja/bracers.dm +++ b/code/modules/predator/yautja/bracers.dm @@ -92,7 +92,7 @@ action.remove_action(user) if(!user.hunter_data?.claimed_equipment) claim_equipment.remove_action(user) - ..() + return ..() /obj/item/clothing/gloves/yautja/equipped(mob/living/carbon/human/user, slot) if(slot == SLOT_GLOVES) @@ -530,8 +530,7 @@ sparks.set_up(5, 4, src) sparks.start() - spawn() - decloak(wearer, TRUE) + INVOKE_ASYNC(src, PROC_REF(decloak), wearer, TRUE) /obj/item/clothing/gloves/yautja/proc/track_gear_internal(mob/caller, forced = FALSE) . = check_random_function(caller, forced) diff --git a/code/modules/predator/yautja/weapons/ranged.dm b/code/modules/predator/yautja/weapons/ranged.dm index afed63d1489..741409c6ec2 100644 --- a/code/modules/predator/yautja/weapons/ranged.dm +++ b/code/modules/predator/yautja/weapons/ranged.dm @@ -462,13 +462,16 @@ /mob/living/carbon/apply_pred_laser() overlays_standing[PRED_LASER_LAYER] = image("icon" = 'icons/mob/hunter/pred_gear.dmi', "icon_state" = "locking-y", "layer" = -PRED_LASER_LAYER) apply_overlay(PRED_LASER_LAYER) - spawn(2 SECONDS) - if(overlays_standing[PRED_LASER_LAYER]) - remove_overlay(PRED_LASER_LAYER) - overlays_standing[PRED_LASER_LAYER] = image("icon" = 'icons/mob/hunter/pred_gear.dmi', "icon_state" = "locked-y", "layer" = -PRED_LASER_LAYER) - apply_overlay(PRED_LASER_LAYER) + addtimer(CALLBACK(src, PROC_REF(delayed_apply_pred_laser)), 2 SECONDS) return TRUE +/mob/living/carbon/proc/delayed_apply_pred_laser() + if(!overlays_standing[PRED_LASER_LAYER]) + return + remove_overlay(PRED_LASER_LAYER) + overlays_standing[PRED_LASER_LAYER] = image("icon" = 'icons/mob/hunter/pred_gear.dmi', "icon_state" = "locked-y", "layer" = -PRED_LASER_LAYER) + apply_overlay(PRED_LASER_LAYER) + /atom/proc/remove_pred_laser() return FALSE diff --git a/code/modules/projectiles/ammo_casing.dm b/code/modules/projectiles/ammo_casing.dm new file mode 100644 index 00000000000..2a28b5acd67 --- /dev/null +++ b/code/modules/projectiles/ammo_casing.dm @@ -0,0 +1,86 @@ +/* +Doesn't do anything or hold anything anymore. +Generated per the various mags, and then changed based on the number of +casings. .dir is the main thing that controls the icon. It modifies +the icon_state to look like more casings are hitting the ground. +There are 8 directions, 8 bullets are possible so after that it tries to grab the next +icon_state while reseting the direction. After 16 casings, it just ignores new +ones. At that point there are too many anyway. Shells and bullets leave different +items, so they do not intersect. This is far more efficient than using Blend() or +Turn() or Shift() as there is virtually no overhead. ~N +*/ +/obj/item/ammo_casing + name = "spent casing" + desc = "Empty and useless now." + icon = 'icons/obj/items/casings.dmi' + icon_state = "casing_" + throwforce = 1 + w_class = WEIGHT_CLASS_TINY + layer = LOWER_ITEM_LAYER //Below other objects + dir = 1 //Always north when it spawns. + flags_atom = CONDUCT|DIRLOCK + ///This is manipulated in the procs that use these. + var/current_casings = 1 + ///Maximum amount of casings 1 stack can have + var/max_casings = 16 + ///Current icon of the casings stack, increases by 1 with each casing in the stack + var/current_icon = 0 + ///How many variations of this item there are. + var/number_of_states = 10 + ///holder for icon_state so we can do random variations without effecting mapper visibility + var/initial_icon_state = "cartridge_" + +/obj/item/ammo_casing/Initialize(mapload) + . = ..() + pixel_x = rand(-2, 2) //Want to move them just a tad. + pixel_y = rand(-2, 2) + icon_state = initial_icon_state += "[rand(1, number_of_states)]" //Set the icon to it. + +//This does most of the heavy lifting. It updates the icon and name if needed + +/obj/item/ammo_casing/update_name(updates) + . = ..() + if(max_casings >= current_casings && current_casings == 2) + name += "s" //In case there is more than one. + +/obj/item/ammo_casing/update_icon_state() + . = ..() + if(max_casings < current_casings) + return + if(round((current_casings - 1) / 8) > current_icon) + current_icon++ + icon_state += "_[current_icon]" + + var/base_direction = current_casings - (current_icon * 8) + setDir(base_direction + round(base_direction) / 3) + switch(current_casings) + if(3 to 5) + w_class = WEIGHT_CLASS_SMALL //Slightly heavier. + if(9 to 10) + w_class = WEIGHT_CLASS_NORMAL //Can't put it in your pockets and stuff. + +///changes .dir to simulate new casings, also sets the new w_class +/obj/item/ammo_casing/proc/update_dir() + var/base_direction = current_casings - (current_icon * 8) + setDir(base_direction + round(base_direction) / 3) + switch(current_casings) + if(3 to 5) + w_class = WEIGHT_CLASS_SMALL //Slightly heavier. + if(9 to 10) + w_class = WEIGHT_CLASS_NORMAL //Can't put it in your pockets and stuff. + +/obj/item/ammo_casing/update_icon() + update_dir() + return ..() + +//Making child objects so that locate() and istype() doesn't screw up. +/obj/item/ammo_casing/bullet + +/obj/item/ammo_casing/cartridge + name = "spent cartridge" + icon_state = "cartridge" + +/obj/item/ammo_casing/shell + name = "spent shell" + initial_icon_state = "shell_" + icon_state = "shell" diff --git a/code/modules/projectiles/ammo_datums/bullet/machinegun.dm b/code/modules/projectiles/ammo_datums/bullet/machinegun.dm index c32d6fe7e68..63092ccbef9 100644 --- a/code/modules/projectiles/ammo_datums/bullet/machinegun.dm +++ b/code/modules/projectiles/ammo_datums/bullet/machinegun.dm @@ -90,17 +90,6 @@ penetration = 10 sundering = 1 -/datum/ammo/bullet/sg29 - name = "smartmachinegun bullet" - bullet_color = COLOR_SOFT_RED //Red bullets to indicate friendly fire restriction - hud_state = "smartgun" - hud_state_empty = "smartgun_empty" - flags_ammo_behavior = AMMO_BALLISTIC - accurate_range = 8 - damage = 20 - penetration = 5 - additional_xeno_penetration = 20 - /datum/ammo/bullet/smart_minigun name = "smartminigun bullet" bullet_color = COLOR_SOFT_RED //Red bullets to indicate friendly fire restriction @@ -108,6 +97,14 @@ hud_state_empty = "smartgun_empty" flags_ammo_behavior = AMMO_BALLISTIC accurate_range = 12 - damage = 25 - penetration = -15 + damage = 12 + penetration = 20 damage_falloff = 0.1 + var/shatter_duration = 3 SECONDS + +/datum/ammo/bullet/smart_minigun/on_hit_mob(mob/M, obj/projectile/proj) + if(!isliving(M)) + return + + var/mob/living/living_victim = M + living_victim.apply_status_effect(STATUS_EFFECT_SHATTER, shatter_duration) diff --git a/code/modules/projectiles/ammo_datums/bullet/pistol.dm b/code/modules/projectiles/ammo_datums/bullet/pistol.dm index 428b085f021..f599320d889 100644 --- a/code/modules/projectiles/ammo_datums/bullet/pistol.dm +++ b/code/modules/projectiles/ammo_datums/bullet/pistol.dm @@ -93,6 +93,8 @@ shrapnel_chance = 0 flags_ammo_behavior = AMMO_BALLISTIC|AMMO_INCENDIARY damage = 20 + penetration = 0 + additional_xeno_penetration = 0 /datum/ammo/bullet/pistol/squash name = "squash-head pistol bullet" diff --git a/code/modules/projectiles/ammo_datums/bullet/rifle.dm b/code/modules/projectiles/ammo_datums/bullet/rifle.dm index 72f4323e9c8..084e43752e8 100644 --- a/code/modules/projectiles/ammo_datums/bullet/rifle.dm +++ b/code/modules/projectiles/ammo_datums/bullet/rifle.dm @@ -52,6 +52,7 @@ name = "heavy rifle bullet" hud_state = "rifle_heavy" damage = 30 + damage_falloff = 2 penetration = 10 additional_xeno_penetration = 15 @@ -149,6 +150,7 @@ hud_state = "rifle_crude" flags_ammo_behavior = AMMO_BALLISTIC damage = 30 + damage_falloff = 3 penetration = 15 additional_xeno_penetration = 12.5 @@ -164,7 +166,7 @@ name = "crude heavy rifle bullet" hud_state = "rifle_crude" flags_ammo_behavior = AMMO_BALLISTIC - damage = 50 + damage = 60 penetration = 0 additional_xeno_penetration = -10 diff --git a/code/modules/projectiles/ammo_datums/bullet/sniper.dm b/code/modules/projectiles/ammo_datums/bullet/sniper.dm index a70e99e73a8..880ed363270 100644 --- a/code/modules/projectiles/ammo_datums/bullet/sniper.dm +++ b/code/modules/projectiles/ammo_datums/bullet/sniper.dm @@ -95,10 +95,10 @@ name = "high caliber rifle bullet" hud_state = "sniper_heavy" flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER - damage = 75 + damage = 80 penetration = 30 sundering = 0 - additional_xeno_penetration = 15 + additional_xeno_penetration = 0 damage_falloff = 0.25 /datum/ammo/bullet/sniper/pfc/on_hit_mob(mob/M, obj/projectile/P) diff --git a/code/modules/projectiles/ammo_datums/bullet/submachinegun.dm b/code/modules/projectiles/ammo_datums/bullet/submachinegun.dm index 2784415903a..009aa5b5029 100644 --- a/code/modules/projectiles/ammo_datums/bullet/submachinegun.dm +++ b/code/modules/projectiles/ammo_datums/bullet/submachinegun.dm @@ -27,7 +27,7 @@ accuracy_var_high = 7 damage = 20 accurate_range = 4 - damage_falloff = 1 + damage_falloff = 1.75 penetration = 0 additional_xeno_penetration = 10 shrapnel_chance = 25 @@ -40,8 +40,8 @@ /datum/ammo/bullet/smg/acp/ap name = "armor-piercing submachinegun ACP bullet" - damage = 15 - penetration = 20 + damage = 20 + penetration = 15 additional_xeno_penetration = 20 /datum/ammo/bullet/smg/acp/incendiary diff --git a/code/modules/projectiles/ammo_datums/xeno.dm b/code/modules/projectiles/ammo_datums/xeno.dm index 57698eea793..99e73c285ff 100644 --- a/code/modules/projectiles/ammo_datums/xeno.dm +++ b/code/modules/projectiles/ammo_datums/xeno.dm @@ -124,6 +124,7 @@ GLOBAL_LIST_INIT(no_sticky_resin, typecacheof(list(/obj/item/clothing/mask/faceh /datum/ammo/xeno/tox_loss name = "toxin spit" + icon_state = "transvitox" flags_ammo_behavior = AMMO_XENO|AMMO_SKIPS_ALIENS spit_cost = 50 added_spit_delay = 0 @@ -573,15 +574,15 @@ GLOBAL_LIST_INIT(no_sticky_resin, typecacheof(list(/obj/item/clothing/mask/faceh /datum/ammo/xeno/hugger/on_hit_mob(mob/M, obj/projectile/proj) var/obj/item/clothing/mask/facehugger/hugger = new hugger_type(get_turf(M), hivenumber) - hugger.go_idle() + hugger.Attach(M) /datum/ammo/xeno/hugger/on_hit_obj(obj/O, obj/projectile/proj) var/obj/item/clothing/mask/facehugger/hugger = new hugger_type(get_turf(O), hivenumber) - hugger.go_idle() + hugger.go_active() /datum/ammo/xeno/hugger/on_hit_turf(turf/T, obj/projectile/P) var/obj/item/clothing/mask/facehugger/hugger = new hugger_type(T.density ? P.loc : T, hivenumber) - hugger.go_idle() + hugger.go_active() /datum/ammo/xeno/hugger/do_at_max_range(turf/T, obj/projectile/P) var/obj/item/clothing/mask/facehugger/hugger = new hugger_type(T.density ? P.loc : T, hivenumber) @@ -598,3 +599,65 @@ GLOBAL_LIST_INIT(no_sticky_resin, typecacheof(list(/obj/item/clothing/mask/faceh /datum/ammo/xeno/hugger/acid hugger_type = /obj/item/clothing/mask/facehugger/combat/acid + +/* +//================================================ + Widow Ammo Types +//================================================ +*/ + +/datum/ammo/xeno/leash_ball + icon_state = "widow_snareball" + ping = "ping_x" + damage_type = STAMINA + flags_ammo_behavior = AMMO_SKIPS_ALIENS | AMMO_TARGET_TURF + bullet_color = COLOR_PURPLE + ping = null + damage = 0 + armor_type = BIO + shell_speed = 1.5 + accurate_range = 8 + max_range = 8 + +/datum/ammo/xeno/leash_ball/on_hit_turf(turf/target_turf, obj/projectile/proj) + drop_leashball(target_turf.density ? proj.loc : target_turf) + +/datum/ammo/xeno/leash_ball/on_hit_mob(mob/target_mob, obj/projectile/proj) + var/turf/target_turf = get_turf(target_mob) + drop_leashball(target_turf.density ? proj.loc : target_turf, proj.firer) + +/datum/ammo/xeno/leash_ball/on_hit_obj(obj/target_obj, obj/projectile/proj) + var/turf/target_turf = get_turf(target_obj) + if(target_turf.density || (target_obj.density && !(target_obj.allow_pass_flags & PASS_PROJECTILE))) + target_turf = get_turf(proj) + drop_leashball(target_turf.density ? proj.loc : target_turf, proj.firer) + +/datum/ammo/xeno/leash_ball/do_at_max_range(turf/target_turf, obj/projectile/proj) + drop_leashball(target_turf.density ? proj.loc : target_turf) + +/// This spawns a leash ball and checks if the turf is dense before doing so +/datum/ammo/xeno/leash_ball/proc/drop_leashball(turf/target_turf) + new /obj/structure/xeno/aoe_leash(get_turf(target_turf), hivenumber) + +/datum/ammo/xeno/web_projectile + icon_state = "web_spit" + sound_hit = "snap" + sound_bounce = "alien_resin_build3" + damage_type = STAMINA + bullet_color = COLOR_PURPLE + flags_ammo_behavior = AMMO_SKIPS_ALIENS + ping = null + armor_type = BIO + accurate_range = 8 + max_range = 8 + ///How long the victim will be KO'd + var/hit_weaken = 2 SECONDS + +/datum/ammo/xeno/web_projectile/on_hit_mob(mob/target_mob, obj/projectile/proj) + . = ..() + if(!ishuman(target_mob)) + return + playsound(get_turf(target_mob), sound(get_sfx("snap")), 30, falloff = 5) + var/mob/living/carbon/human/human_victim = target_mob + human_victim.apply_effect(hit_weaken, WEAKEN) + diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index fa73492a4bb..06291ece24d 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -1,20 +1,19 @@ /obj/item/ammo_magazine name = "generic ammo" desc = "A box of ammo." - icon = 'icons/obj/items/ammo.dmi' - icon_state = null + icon = 'icons/obj/items/ammo/magazine.dmi' item_state = "ammo_mag" //PLACEHOLDER. This ensures the mag doesn't use the icon state instead. item_icons = list( slot_l_hand_str = 'icons/mob/inhands/weapons/ammo_left.dmi', slot_r_hand_str = 'icons/mob/inhands/weapons/ammo_right.dmi', - ) + ) flags_atom = CONDUCT flags_equip_slot = ITEM_SLOT_BELT throwforce = 2 w_class = WEIGHT_CLASS_TINY throw_speed = 2 throw_range = 6 - ///Icon state in ammo.dmi to an overlay to add to the gun, for extended mags, box mags, and so on + ///Icon state to an overlay to add to the gun, for extended mags, box mags, and so on var/bonus_overlay = null ///This is a typepath for the type of bullet the magazine holds, it is cast so that it can draw the variable handful_amount from default_ammo in create_handful() var/datum/ammo/bullet/default_ammo = /datum/ammo/bullet @@ -80,7 +79,6 @@ . = ..() . += "[src] has [current_rounds] rounds out of [max_rounds]." - /obj/item/ammo_magazine/attack_hand(mob/living/user) if(user.get_inactive_held_item() != src || !CHECK_BITFIELD(flags_magazine, MAGAZINE_REFILLABLE)) return ..() @@ -119,7 +117,6 @@ transfer_ammo(mag, user, amount_to_transfer) - /obj/item/ammo_magazine/attackby_alternate(obj/item/I, mob/user, params) . = ..() if(!isgun(I)) @@ -135,32 +132,41 @@ master_gun.aim_slowdown += aim_speed_mod master_gun.wield_delay += wield_delay_mod - /obj/item/ammo_magazine/proc/on_removed(obj/item/weapon/gun/master_gun) master_gun.scatter -= scatter_mod master_gun.scatter_unwielded -= scatter_unwielded_mod master_gun.aim_slowdown -= aim_speed_mod master_gun.wield_delay -= wield_delay_mod -//Generic proc to transfer ammo between ammo mags. Can work for anything, mags, handfuls, etc. -/obj/item/ammo_magazine/proc/transfer_ammo(obj/item/ammo_magazine/source, mob/user, transfer_amount = 1, is_new_ammo_type = FALSE) +///Сan the magazine be refilled, mainly used in transfer_ammo proc +/obj/item/ammo_magazine/proc/can_transfer_ammo(obj/item/ammo_magazine/source, mob/user, transfer_amount = 1, silent = FALSE) if(current_rounds >= max_rounds) //Does the mag actually need reloading? - to_chat(user, span_notice("[src] is already full.")) - return + if(!silent) + to_chat(user, span_notice("[src] is already full.")) + return FALSE if(source.caliber != caliber) //Are they the same caliber? - to_chat(user, span_notice("The rounds don't match up. Better not mix them up.")) - return + if(!silent) + to_chat(user, span_notice("The rounds don't match up. Better not mix them up.")) + return FALSE if(!source.current_rounds) - to_chat(user, span_warning("\The [source] is empty.")) - return + if(!silent) + to_chat(user, span_warning("\The [source] is empty.")) + return FALSE //using handfuls; and filling internal mags has no delay. if(fill_delay) - to_chat(user, span_notice("You start refilling [src] with [source].")) + if(!silent) + to_chat(user, span_notice("You start refilling [src] with [source].")) if(!do_after(user, fill_delay, NONE, src, BUSY_ICON_GENERIC)) - return + return FALSE + return TRUE + +///Generic proc to transfer ammo between ammo mags. Can work for anything, mags, handfuls, etc. +/obj/item/ammo_magazine/proc/transfer_ammo(obj/item/ammo_magazine/source, mob/user, transfer_amount = 1, is_new_ammo_type = FALSE) + if(!can_transfer_ammo(source, user, transfer_amount)) + return to_chat(user, span_notice("You refill [src] with [source].")) @@ -181,29 +187,6 @@ update_icon() -///This will attempt to place the ammo in the user's hand if possible. -/obj/item/ammo_magazine/proc/create_handful(mob/user, transfer_amount) - if(current_rounds <= 0) - return - var/obj/item/ammo_magazine/handful/new_handful = new /obj/item/ammo_magazine/handful() - var/rounds = transfer_amount ? min(current_rounds, transfer_amount) : min(current_rounds, initial(default_ammo.handful_amount)) - new_handful.generate_handful(default_ammo, caliber, rounds) - current_rounds -= rounds - - if(user) - user.put_in_hands(new_handful) - to_chat(user, span_notice("You grab [rounds] round\s from [src].")) - update_icon() //Update the other one. - if(current_rounds <= 0 && CHECK_BITFIELD(flags_magazine, MAGAZINE_HANDFUL)) - user.temporarilyRemoveItemFromInventory(src) - qdel(src) - return rounds //Give the number created. - else - update_icon() - if(current_rounds <= 0 && CHECK_BITFIELD(flags_magazine, MAGAZINE_HANDFUL)) - qdel(src) - return new_handful - ///Called on a /ammo_magazine that wishes to be a handful. It generates all the data required for the handful. /obj/item/ammo_magazine/proc/generate_handful(new_ammo, new_caliber, new_rounds, maximum_rounds) var/datum/ammo/ammo = ispath(new_ammo) ? GLOB.ammo_list[new_ammo] : new_ammo @@ -226,6 +209,28 @@ current_rounds = new_rounds update_icon() +///This will attempt to place the ammo in the user's hand if possible. +/obj/item/ammo_magazine/proc/create_handful(mob/user, transfer_amount) + if(current_rounds <= 0) + return + var/obj/item/ammo_magazine/handful/new_handful = new /obj/item/ammo_magazine/handful() + var/rounds = transfer_amount ? min(current_rounds, transfer_amount) : min(current_rounds, initial(default_ammo.handful_amount)) + new_handful.generate_handful(default_ammo, caliber, rounds) + current_rounds -= rounds + + if(user) + user.put_in_hands(new_handful) + to_chat(user, span_notice("You grab [rounds] round\s from [src].")) + update_icon() //Update the other one. + if(current_rounds <= 0 && CHECK_BITFIELD(flags_magazine, MAGAZINE_HANDFUL)) + user.temporarilyRemoveItemFromInventory(src) + qdel(src) + return rounds //Give the number created. + else + update_icon() + if(current_rounds <= 0 && CHECK_BITFIELD(flags_magazine, MAGAZINE_HANDFUL)) + qdel(src) + return new_handful //our magazine inherits ammo info from a source magazine /obj/item/ammo_magazine/proc/match_ammo(obj/item/ammo_magazine/source) @@ -248,402 +253,4 @@ //Helper proc, to allow us to see a percentage of how full the magazine is. /obj/item/ammo_magazine/proc/get_ammo_percent() // return % charge of cell - return 100.0*current_rounds/max_rounds - -/obj/item/ammo_magazine/handful - name = "generic handful of bullets or shells" - desc = "A handful of rounds to reload on the go." - flags_equip_slot = null // It only fits into pockets and such. - w_class = WEIGHT_CLASS_SMALL - current_rounds = 1 // So it doesn't get autofilled for no reason. - max_rounds = 5 // For shotguns, though this will be determined by the handful type when generated. - flags_atom = CONDUCT|DIRLOCK - flags_magazine = MAGAZINE_HANDFUL|MAGAZINE_REFILLABLE - attack_speed = 3 // should make reloading less painful - icon_state_mini = "bullets" - -/obj/item/ammo_magazine/handful/buckshot - name = "handful of shotgun buckshot shells (12g)" - icon_state = "shotgun buckshot shell" - current_rounds = 5 - default_ammo = /datum/ammo/bullet/shotgun/buckshot - caliber = CALIBER_12G - -/obj/item/ammo_magazine/handful/flechette - name = "handful of shotgun flechette shells (12g)" - icon_state = "shotgun flechette shell" - current_rounds = 5 - default_ammo = /datum/ammo/bullet/shotgun/flechette - caliber = CALIBER_12G - -/obj/item/ammo_magazine/handful/incendiary - name = "handful of shotgun incendiary shells (12g)" - icon_state = "incendiary slug" - current_rounds = 5 - default_ammo = /datum/ammo/bullet/shotgun/incendiary - caliber = CALIBER_12G - -/obj/item/ammo_magazine/handful/micro_grenade - name = "handful of airburst micro grenades (10g)" - icon_state = "micro_grenade_airburst" - icon_state_mini = "40mm_cyan" - current_rounds = 3 - max_rounds = 3 - default_ammo = /datum/ammo/bullet/micro_rail/airburst - caliber = CALIBER_10G_RAIL - -/obj/item/ammo_magazine/handful/micro_grenade/dragonbreath - name = "handful of dragon's breath micro grenades (10g)" - icon_state = "micro_grenade_incendiary" - icon_state_mini = "40mm_orange" - default_ammo = /datum/ammo/bullet/micro_rail/dragonbreath - -/obj/item/ammo_magazine/handful/micro_grenade/cluster - name = "handful of clustermunition micro grenades (10g)" - icon_state = "micro_grenade_cluster" - icon_state_mini = "40mm_red" - default_ammo = /datum/ammo/bullet/micro_rail/cluster - -/obj/item/ammo_magazine/handful/micro_grenade/smoke_burst - name = "handful of smoke burst micro grenades (10g)" - icon_state = "micro_grenade_smoke" - icon_state_mini = "40mm_blue" - default_ammo = /datum/ammo/bullet/micro_rail/smoke_burst - -//----------------------------------------------------------------// - -/* -Doesn't do anything or hold anything anymore. -Generated per the various mags, and then changed based on the number of -casings. .dir is the main thing that controls the icon. It modifies -the icon_state to look like more casings are hitting the ground. -There are 8 directions, 8 bullets are possible so after that it tries to grab the next -icon_state while reseting the direction. After 16 casings, it just ignores new -ones. At that point there are too many anyway. Shells and bullets leave different -items, so they do not intersect. This is far more efficient than using Blend() or -Turn() or Shift() as there is virtually no overhead. ~N -*/ -/obj/item/ammo_casing - name = "spent casing" - desc = "Empty and useless now." - icon = 'icons/obj/items/casings.dmi' - icon_state = "casing_" - throwforce = 1 - w_class = WEIGHT_CLASS_TINY - layer = LOWER_ITEM_LAYER //Below other objects - dir = 1 //Always north when it spawns. - flags_atom = CONDUCT|DIRLOCK - var/current_casings = 1 //This is manipulated in the procs that use these. - var/max_casings = 16 - var/current_icon = 0 - var/number_of_states = 10 //How many variations of this item there are. - var/initial_icon_state = "cartridge_" //holder for icon_state so we can do random variations without effecting mapper visibility - -/obj/item/ammo_casing/Initialize(mapload) - . = ..() - pixel_x = rand(-2, 2) //Want to move them just a tad. - pixel_y = rand(-2, 2) - icon_state = initial_icon_state += "[rand(1, number_of_states)]" //Set the icon to it. - -//This does most of the heavy lifting. It updates the icon and name if needed - -/obj/item/ammo_casing/update_name(updates) - . = ..() - if(max_casings >= current_casings && current_casings == 2) - name += "s" //In case there is more than one. - -/obj/item/ammo_casing/update_icon_state() - . = ..() - if(max_casings >= current_casings) - if(round((current_casings-1)/8) > current_icon) - current_icon++ - icon_state += "_[current_icon]" - - var/base_direction = current_casings - (current_icon * 8) - setDir(base_direction + round(base_direction)/3) - switch(current_casings) - if(3 to 5) - w_class = WEIGHT_CLASS_SMALL //Slightly heavier. - if(9 to 10) - w_class = WEIGHT_CLASS_NORMAL //Can't put it in your pockets and stuff. - -///changes .dir to simulate new casings, also sets the new w_class -/obj/item/ammo_casing/proc/update_dir() - var/base_direction = current_casings - (current_icon * 8) - setDir(base_direction + round(base_direction)/3) - switch(current_casings) - if(3 to 5) - w_class = WEIGHT_CLASS_SMALL //Slightly heavier. - if(9 to 10) - w_class = WEIGHT_CLASS_NORMAL //Can't put it in your pockets and stuff. - -/obj/item/ammo_casing/update_icon() - update_dir() - return ..() - -//Making child objects so that locate() and istype() doesn't screw up. -/obj/item/ammo_casing/bullet - -/obj/item/ammo_casing/cartridge - name = "spent cartridge" - icon_state = "cartridge" - -/obj/item/ammo_casing/shell - name = "spent shell" - initial_icon_state = "shell_" - icon_state = "shell" - - - - -//Big ammo boxes - -/obj/item/big_ammo_box - name = "big ammo box (10x24mm)" - desc = "A large ammo box. It comes with a leather strap." - w_class = WEIGHT_CLASS_HUGE - icon = 'icons/obj/items/ammo.dmi' - icon_state = "big_ammo_box" - item_state = "big_ammo_box" - flags_equip_slot = ITEM_SLOT_BACK - base_icon_state = "big_ammo_box" - var/default_ammo = /datum/ammo/bullet/rifle - var/bullet_amount = 2400 - var/max_bullet_amount = 2400 - var/caliber = CALIBER_10X24_CASELESS - -/obj/item/big_ammo_box/update_icon_state() - . = ..() - if(bullet_amount) - icon_state = base_icon_state - return - icon_state = "[base_icon_state]_e" - -/obj/item/big_ammo_box/examine(mob/user) - . = ..() - if(bullet_amount) - . += "It contains [bullet_amount] round\s." - else - . += "It's empty." - -/obj/item/big_ammo_box/attackby(obj/item/I, mob/user, params) - . = ..() - - if(istype(I, /obj/item/ammo_magazine)) - var/obj/item/ammo_magazine/AM = I - if(!isturf(loc)) - to_chat(user, span_warning("[src] must be on the ground to be used.")) - return - if(AM.flags_magazine & MAGAZINE_REFILLABLE) - if(default_ammo != AM.default_ammo) - to_chat(user, span_warning("Those aren't the same rounds. Better not mix them up.")) - return - if(caliber != AM.caliber) - to_chat(user, span_warning("The rounds don't match up. Better not mix them up.")) - return - if(AM.current_rounds == AM.max_rounds) - to_chat(user, span_warning("[AM] is already full.")) - return - - if(!do_after(user, 15, NONE, src, BUSY_ICON_GENERIC)) - return - - playsound(loc, 'sound/weapons/guns/interact/revolver_load.ogg', 25, 1) - var/S = min(bullet_amount, AM.max_rounds - AM.current_rounds) - AM.current_rounds += S - bullet_amount -= S - AM.update_icon() - update_icon() - if(AM.current_rounds == AM.max_rounds) - to_chat(user, span_notice("You refill [AM].")) - else - to_chat(user, span_notice("You put [S] rounds in [AM].")) - else if(AM.flags_magazine & MAGAZINE_HANDFUL) - if(caliber != AM.caliber) - to_chat(user, span_warning("The rounds don't match up. Better not mix them up.")) - return - if(bullet_amount == max_bullet_amount) - to_chat(user, span_warning("[src] is full!")) - return - playsound(loc, 'sound/weapons/guns/interact/revolver_load.ogg', 25, 1) - var/S = min(AM.current_rounds, max_bullet_amount - bullet_amount) - AM.current_rounds -= S - bullet_amount += S - AM.update_icon() - to_chat(user, span_notice("You put [S] rounds in [src].")) - if(AM.current_rounds <= 0) - user.temporarilyRemoveItemFromInventory(AM) - qdel(AM) - -//explosion when using flamer procs. -/obj/item/big_ammo_box/fire_act(burn_level, flame_color) - if(QDELETED(src)) - return - if(!bullet_amount) - return - var/turf/explosion_loc = loc // we keep it so we don't runtime on src deletion - var/power = 5 - for(var/obj/item/big_ammo_box/box in explosion_loc) - if(!box.bullet_amount) - continue - power++ - qdel(box) - cell_explosion(explosion_loc, power, power) - -//Deployable shotgun ammo box -/obj/item/shotgunbox - name = "Slug Ammo Box" - desc = "A large, deployable ammo box." - icon = 'icons/obj/items/ammo.dmi' - icon_state = "ammoboxslug" - item_state = "ammoboxslug" - base_icon_state = "ammoboxslug" - w_class = WEIGHT_CLASS_HUGE - flags_equip_slot = ITEM_SLOT_BACK - ///Current stored rounds - var/current_rounds = 200 - ///Maximum stored rounds - var/max_rounds = 200 - ///Ammunition type - var/datum/ammo/ammo_type = /datum/ammo/bullet/shotgun/slug - ///Whether the box is deployed or not. - var/deployed = FALSE - ///Caliber of the rounds stored. - var/caliber = CALIBER_12G - - -/obj/item/shotgunbox/update_icon_state() - . = ..() - if(!deployed) - icon_state = "[initial(icon_state)]" - else if(current_rounds > 0) - icon_state = "[initial(icon_state)]_deployed" - else - icon_state = "[initial(icon_state)]_empty" - - -/obj/item/shotgunbox/attack_self(mob/user) - deployed = TRUE - update_icon() - user.dropItemToGround(src) - - -/obj/item/shotgunbox/MouseDrop(atom/over_object) - if(!deployed) - return - - if(!ishuman(over_object)) - return - - var/mob/living/carbon/human/H = over_object - if(H == usr && !H.incapacitated() && Adjacent(H) && H.put_in_hands(src)) - deployed = FALSE - update_icon() - - -/obj/item/shotgunbox/examine(mob/user) - . = ..() - . += "It contains [current_rounds] out of [max_rounds] shotgun shells." - - -/obj/item/shotgunbox/attack_hand(mob/living/user) - if(loc == user) - return ..() - - if(!deployed) - user.put_in_hands(src) - return - - if(current_rounds < 1) - to_chat(user, ("The [src] is empty.")) - return - - var/obj/item/ammo_magazine/handful/H = new - var/rounds = min(current_rounds, 5) - - H.generate_handful(ammo_type, caliber, rounds, initial(ammo_type.handful_amount)) - current_rounds -= rounds - - user.put_in_hands(H) - to_chat(user, span_notice("You grab [rounds] round\s from [src].")) - update_icon() - - -/obj/item/shotgunbox/attackby(obj/item/I, mob/user, params) - . = ..() - - if(!istype(I, /obj/item/ammo_magazine/handful)) - return - - var/obj/item/ammo_magazine/handful/H = I - - if(!deployed) - to_chat(user, span_warning("[src] must be deployed on the ground to be refilled.")) - return - - if(H.default_ammo != ammo_type) - to_chat(user, span_warning("That's not the right kind of ammo.")) - return - - if(current_rounds == max_rounds) - to_chat(user, span_warning("The [src] is already full.")) - return - - current_rounds = min(current_rounds + H.current_rounds, max_rounds) - qdel(H) - update_icon() - - -/obj/item/big_ammo_box/ap - name = "big ammo box (10x24mm AP)" - icon_state = "big_ammo_box_ap" - base_icon_state = "big_ammo_box_ap" - default_ammo = /datum/ammo/bullet/rifle/ap - bullet_amount = 400 //AP is OP - max_bullet_amount = 400 - -/obj/item/big_ammo_box/smg - name = "big ammo box (10x20mm)" - caliber = CALIBER_10X20 - icon_state = "big_ammo_box_m25" - base_icon_state = "big_ammo_box_m25" - default_ammo = /datum/ammo/bullet/smg - bullet_amount = 4500 - max_bullet_amount = 4500 - caliber = CALIBER_10X20_CASELESS - -/obj/item/shotgunbox/buckshot - name = "Buckshot Ammo Box" - icon_state = "ammoboxbuckshot" - item_state = "ammoboxbuckshot" - base_icon_state = "ammoboxbuckshot" - ammo_type = /datum/ammo/bullet/shotgun/buckshot - -/obj/item/shotgunbox/flechette - name = "Flechette Ammo Box" - icon_state = "ammoboxflechette" - item_state = "ammoboxflechette" - base_icon_state = "ammoboxflechette" - ammo_type = /datum/ammo/bullet/shotgun/flechette - -/obj/item/shotgunbox/clf_heavyrifle - name = "big ammo box (14.5mm API)" - caliber = CALIBER_14X5 - icon_state = "ammobox_145" - item_state = "ammobox_145" - base_icon_state = "ammobox_145" - ammo_type = /datum/ammo/bullet/sniper/clf_heavyrifle - -/obj/item/shotgunbox/tracker - name = "Tracking Ammo Box" - icon_state = "ammoboxtracking" - item_state = "ammoboxtracking" - base_icon_state = "ammoboxtracking" - ammo_type = /datum/ammo/bullet/shotgun/tracker - -/obj/item/big_ammo_box/mg - name = "big ammo box (10x26mm)" - default_ammo = /datum/ammo/bullet/rifle/machinegun - caliber = CALIBER_10x26_CASELESS - bullet_amount = 3200 //a backpack holds 8 MG-60 box mags, which is 1600 rounds - max_bullet_amount = 3200 + return 100.0 * current_rounds / max_rounds diff --git a/code/modules/projectiles/attachables/_attachable.dm b/code/modules/projectiles/attachables/_attachable.dm index 19902ff68eb..09965c6f055 100644 --- a/code/modules/projectiles/attachables/_attachable.dm +++ b/code/modules/projectiles/attachables/_attachable.dm @@ -344,7 +344,6 @@ inaccurate. Don't worry if force is ever negative, it won't runtime. attached_to:gunattachment = src activate(user) new_action.set_toggle(TRUE) - new_action.update_button_icon() update_icon() RegisterSignal(master_gun, COMSIG_ITEM_REMOVED_INVENTORY, TYPE_PROC_REF(/obj/item/weapon/gun, drop_connected_mag)) @@ -380,11 +379,6 @@ inaccurate. Don't worry if force is ever negative, it won't runtime. set_gun_user(null) set_gun_user(master_gun.gun_user) to_chat(user, span_notice("You start using [src].")) - for(var/datum/action/item_action/toggle/action AS in master_gun.actions) - if(action.target != src ) - continue - action.set_toggle(master_gun.active_attachable == src) - action.update_button_icon() return TRUE ///Called when the attachment is trying to be attached. If the attachment is allowed to go through, return TRUE. diff --git a/code/modules/projectiles/attachables/flamer.dm b/code/modules/projectiles/attachables/flamer.dm index af458858e4c..a44add5b00f 100644 --- a/code/modules/projectiles/attachables/flamer.dm +++ b/code/modules/projectiles/attachables/flamer.dm @@ -49,6 +49,7 @@ pixel_shift_y = 17 stream_type = FLAMER_STREAM_CONE burn_time_mod = 0.3 + range_modifier = -2 ///Funny red wide nozzle that can fill entire screens with flames. Admeme only. /obj/item/attachable/flamer_nozzle/wide/red diff --git a/code/modules/projectiles/attachables/foldable.dm b/code/modules/projectiles/attachables/foldable.dm index 75da6193e06..8e76cc5cb07 100644 --- a/code/modules/projectiles/attachables/foldable.dm +++ b/code/modules/projectiles/attachables/foldable.dm @@ -61,9 +61,6 @@ if(master_gun) apply_modifiers(master_gun, user, !folded) - for(var/X in master_gun.actions) - var/datum/action/A = X - A.update_button_icon() return TRUE @@ -155,6 +152,7 @@ scatter_mod = -10 burst_scatter_mod = -3 aim_mode_delay_mod = -0.5 + var/user_old_move_resist /obj/item/attachable/foldable/bipod/activate(mob/living/user, turn_off) if(folded && !(master_gun.flags_item & WIELDED)) //no one handed bipod use @@ -168,12 +166,16 @@ UnregisterSignal(master_gun, list(COMSIG_ITEM_DROPPED, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_UNWIELD)) UnregisterSignal(user, COMSIG_MOVABLE_MOVED) to_chat(user, span_notice("You retract [src].")) + user.move_resist = user_old_move_resist return if(user) RegisterSignals(master_gun, list(COMSIG_ITEM_DROPPED, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_UNWIELD), PROC_REF(retract_bipod)) RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(retract_bipod)) to_chat(user, span_notice("You deploy [src].")) + user_old_move_resist = user.move_resist + user.move_resist = MOVE_FORCE_STRONG + ///Signal handler for forced undeployment /obj/item/attachable/foldable/bipod/proc/retract_bipod(datum/source, mob/living/user) diff --git a/code/modules/projectiles/attachables/muzzle.dm b/code/modules/projectiles/attachables/muzzle.dm index 1b4eda6ae8b..132c5d0f664 100644 --- a/code/modules/projectiles/attachables/muzzle.dm +++ b/code/modules/projectiles/attachables/muzzle.dm @@ -5,7 +5,7 @@ slot = ATTACHMENT_SLOT_MUZZLE silence_mod = TRUE pixel_shift_y = 16 - attach_shell_speed_mod = -1 + attach_shell_speed_mod = -0.5 accuracy_mod = 0.1 recoil_mod = -2 scatter_mod = -2 diff --git a/code/modules/projectiles/attachables/rail.dm b/code/modules/projectiles/attachables/rail.dm index aebff5a0a07..98507e5e8f8 100644 --- a/code/modules/projectiles/attachables/rail.dm +++ b/code/modules/projectiles/attachables/rail.dm @@ -13,7 +13,17 @@ desc = "A B7 smart scope. Does not have a zoom feature, but allows you to take aim and fire through allies. \nNo drawbacks." icon_state = "b7" slot = ATTACHMENT_SLOT_RAIL - add_aim_mode = TRUE + damage_mod = -0.15 + +/obj/item/attachable/b7_scope/on_attach(attaching_item, mob/user) + . = ..() + var/obj/item/weapon/gun/attaching_gun = attaching_item + ENABLE_BITFIELD(attaching_gun.flags_gun_features, GUN_IFF) + +/obj/item/attachable/b7_scope/on_detach(detaching_item, mob/user) + . = ..() + var/obj/item/weapon/gun/detaching_gun = detaching_item + DISABLE_BITFIELD(detaching_gun.flags_gun_features, GUN_IFF) /obj/item/attachable/m16sight name = "M16 iron sights" @@ -66,10 +76,6 @@ else return - for(var/X in master_gun.actions) - var/datum/action/A = X - A.update_button_icon() - update_icon() /obj/item/attachable/flashlight/attackby(obj/item/I, mob/user, params) @@ -211,7 +217,6 @@ . = TRUE for(var/datum/action/item_action/toggle/action_to_update AS in actions) action_to_update.set_toggle(.) - action_to_update.update_button_icon() ///Handles the gun attaching to the armor. /obj/item/attachable/shoulder_mount/proc/handle_armor_attach(datum/source, attaching_item, mob/user) diff --git a/code/modules/projectiles/attachables/scope.dm b/code/modules/projectiles/attachables/scope.dm index 017edd8809c..b0f46efe416 100644 --- a/code/modules/projectiles/attachables/scope.dm +++ b/code/modules/projectiles/attachables/scope.dm @@ -28,6 +28,7 @@ name = "T-47 rail scope" desc = "A marine standard mounted zoom sight scope. Allows zoom by activating the attachment." icon_state = "marinescope" + add_aim_mode = TRUE /obj/item/attachable/scope/nightvision name = "T-46 Night vision scope" @@ -207,6 +208,7 @@ scope_zoom_mod = TRUE has_nightvision = FALSE zoom_allow_movement = TRUE + add_aim_mode = TRUE zoom_slowdown = 0.3 zoom_tile_offset = 5 zoom_viewsize = 0 diff --git a/code/modules/projectiles/attachables/underbarrel.dm b/code/modules/projectiles/attachables/underbarrel.dm index 04558ec4879..c4879773cbf 100644 --- a/code/modules/projectiles/attachables/underbarrel.dm +++ b/code/modules/projectiles/attachables/underbarrel.dm @@ -59,13 +59,6 @@ flags_attach_features = ATTACH_REMOVABLE|ATTACH_ACTIVATION attachment_action_type = /datum/action/item_action/toggle -/obj/item/attachable/lace/t500 - name = "R-500 lace" - icon = 'icons/Marine/attachments_64.dmi' - slot = ATTACHMENT_SLOT_STOCK - pixel_shift_x = 0 - pixel_shift_y = 0 - /obj/item/attachable/lace/activate(mob/living/user, turn_off) if(lace_deployed) REMOVE_TRAIT(master_gun, TRAIT_NODROP, PISTOL_LACE_TRAIT) @@ -87,18 +80,19 @@ lace_deployed = !lace_deployed - for(var/i in master_gun.actions) - var/datum/action/action_to_update = i - action_to_update.update_button_icon() - update_icon() return TRUE +/obj/item/attachable/lace/t500 + name = "R-500 lace" + icon = 'icons/Marine/attachments_64.dmi' + slot = ATTACHMENT_SLOT_STOCK + pixel_shift_x = 0 + pixel_shift_y = 0 + /obj/item/attachable/burstfire_assembly name = "burst fire assembly" - desc = "A mechanism re-assembly kit that allows for automatic fire, or more shots per burst if the weapon already has the ability. \nIncreases scatter and decreases accuracy." + desc = "A mechanism re-assembly kit that allows for automatic fire, or more shots per burst if the weapon already has the ability." icon_state = "rapidfire" slot = ATTACHMENT_SLOT_UNDER burst_mod = 2 - burst_scatter_mod = 1 - burst_accuracy_mod = -0.1 diff --git a/code/modules/projectiles/big_ammo_box.dm b/code/modules/projectiles/big_ammo_box.dm new file mode 100644 index 00000000000..898b2609859 --- /dev/null +++ b/code/modules/projectiles/big_ammo_box.dm @@ -0,0 +1,246 @@ +/obj/item/big_ammo_box + name = "big ammo box (10x24mm)" + desc = "A large ammo box. It comes with a leather strap." + w_class = WEIGHT_CLASS_HUGE + icon = 'icons/obj/items/ammo/box.dmi' + icon_state = "big_ammo_box" + item_state = "big_ammo_box" + flags_equip_slot = ITEM_SLOT_BACK + base_icon_state = "big_ammo_box" + ///Ammunition type + var/default_ammo = /datum/ammo/bullet/rifle + ///Current stored rounds + var/bullet_amount = 2400 + ///Maximum stored rounds + var/max_bullet_amount = 2400 + ///Caliber of the rounds stored. + var/caliber = CALIBER_10X24_CASELESS + +/obj/item/big_ammo_box/update_icon_state() + . = ..() + if(bullet_amount) + icon_state = base_icon_state + return + icon_state = "[base_icon_state]_e" + +/obj/item/big_ammo_box/examine(mob/user) + . = ..() + if(bullet_amount) + . += "It contains [bullet_amount] round\s." + else + . += "It's empty." + +/obj/item/big_ammo_box/attackby(obj/item/I, mob/user, params) + . = ..() + + if(istype(I, /obj/item/ammo_magazine)) + var/obj/item/ammo_magazine/AM = I + if(!isturf(loc)) + to_chat(user, span_warning("[src] must be on the ground to be used.")) + return + if(AM.flags_magazine & MAGAZINE_REFILLABLE) + if(default_ammo != AM.default_ammo) + to_chat(user, span_warning("Those aren't the same rounds. Better not mix them up.")) + return + if(caliber != AM.caliber) + to_chat(user, span_warning("The rounds don't match up. Better not mix them up.")) + return + if(AM.current_rounds == AM.max_rounds) + to_chat(user, span_warning("[AM] is already full.")) + return + + if(!do_after(user, 15, NONE, src, BUSY_ICON_GENERIC)) + return + + playsound(loc, 'sound/weapons/guns/interact/revolver_load.ogg', 25, 1) + var/S = min(bullet_amount, AM.max_rounds - AM.current_rounds) + AM.current_rounds += S + bullet_amount -= S + AM.update_icon() + update_icon() + if(AM.current_rounds == AM.max_rounds) + to_chat(user, span_notice("You refill [AM].")) + else + to_chat(user, span_notice("You put [S] rounds in [AM].")) + else if(AM.flags_magazine & MAGAZINE_HANDFUL) + if(caliber != AM.caliber) + to_chat(user, span_warning("The rounds don't match up. Better not mix them up.")) + return + if(bullet_amount == max_bullet_amount) + to_chat(user, span_warning("[src] is full!")) + return + playsound(loc, 'sound/weapons/guns/interact/revolver_load.ogg', 25, 1) + var/S = min(AM.current_rounds, max_bullet_amount - bullet_amount) + AM.current_rounds -= S + bullet_amount += S + AM.update_icon() + to_chat(user, span_notice("You put [S] rounds in [src].")) + if(AM.current_rounds <= 0) + user.temporarilyRemoveItemFromInventory(AM) + qdel(AM) + +//explosion when using flamer procs. +/obj/item/big_ammo_box/fire_act(burn_level, flame_color) + if(QDELETED(src)) + return + if(!bullet_amount) + return + var/turf/explosion_loc = loc // we keep it so we don't runtime on src deletion + var/power = 5 + for(var/obj/item/big_ammo_box/box in explosion_loc) + if(!box.bullet_amount) + continue + power++ + qdel(box) + cell_explosion(explosion_loc, power, power) + +/obj/item/big_ammo_box/ap + name = "big ammo box (10x24mm AP)" + icon_state = "big_ammo_box_ap" + base_icon_state = "big_ammo_box_ap" + default_ammo = /datum/ammo/bullet/rifle/ap + bullet_amount = 400 //AP is OP + max_bullet_amount = 400 + +/obj/item/big_ammo_box/smg + name = "big ammo box (10x20mm)" + caliber = CALIBER_10X20 + icon_state = "big_ammo_box_m25" + base_icon_state = "big_ammo_box_m25" + default_ammo = /datum/ammo/bullet/smg + bullet_amount = 4500 + max_bullet_amount = 4500 + caliber = CALIBER_10X20_CASELESS + +/obj/item/big_ammo_box/mg + name = "big ammo box (10x26mm)" + default_ammo = /datum/ammo/bullet/rifle/machinegun + caliber = CALIBER_10X26_CASELESS + bullet_amount = 3200 //a backpack holds 8 MG-60 box mags, which is 1600 rounds + max_bullet_amount = 3200 + +//Deployable shotgun ammo box +/obj/item/shotgunbox + name = "Slug Ammo Box" + desc = "A large, deployable ammo box." + icon = 'icons/obj/items/ammo/box.dmi' + icon_state = "ammoboxslug" + item_state = "ammoboxslug" + base_icon_state = "ammoboxslug" + w_class = WEIGHT_CLASS_HUGE + flags_equip_slot = ITEM_SLOT_BACK + ///Current stored rounds + var/current_rounds = 200 + ///Maximum stored rounds + var/max_rounds = 200 + ///Ammunition type + var/datum/ammo/ammo_type = /datum/ammo/bullet/shotgun/slug + ///Whether the box is deployed or not. + var/deployed = FALSE + ///Caliber of the rounds stored. + var/caliber = CALIBER_12G + +/obj/item/shotgunbox/update_icon_state() + . = ..() + if(!deployed) + icon_state = "[initial(icon_state)]" + else if(current_rounds > 0) + icon_state = "[initial(icon_state)]_deployed" + else + icon_state = "[initial(icon_state)]_empty" + +/obj/item/shotgunbox/attack_self(mob/user) + deployed = TRUE + update_icon() + user.dropItemToGround(src) + +/obj/item/shotgunbox/MouseDrop(atom/over_object) + if(!deployed) + return + + if(!ishuman(over_object)) + return + + var/mob/living/carbon/human/H = over_object + if(H == usr && !H.incapacitated() && Adjacent(H) && H.put_in_hands(src)) + deployed = FALSE + update_icon() + +/obj/item/shotgunbox/examine(mob/user) + . = ..() + . += "It contains [current_rounds] out of [max_rounds] shotgun shells." + +/obj/item/shotgunbox/attack_hand(mob/living/user) + if(loc == user) + return ..() + + if(!deployed) + user.put_in_hands(src) + return + + if(current_rounds < 1) + to_chat(user, ("The [src] is empty.")) + return + + var/obj/item/ammo_magazine/handful/H = new + var/rounds = min(current_rounds, 5) + + H.generate_handful(ammo_type, caliber, rounds, initial(ammo_type.handful_amount)) + current_rounds -= rounds + + user.put_in_hands(H) + to_chat(user, span_notice("You grab [rounds] round\s from [src].")) + update_icon() + +/obj/item/shotgunbox/attackby(obj/item/I, mob/user, params) + . = ..() + + if(!istype(I, /obj/item/ammo_magazine/handful)) + return + + var/obj/item/ammo_magazine/handful/H = I + + if(!deployed) + to_chat(user, span_warning("[src] must be deployed on the ground to be refilled.")) + return + + if(H.default_ammo != ammo_type) + to_chat(user, span_warning("That's not the right kind of ammo.")) + return + + if(current_rounds == max_rounds) + to_chat(user, span_warning("The [src] is already full.")) + return + + current_rounds = min(current_rounds + H.current_rounds, max_rounds) + qdel(H) + update_icon() + +/obj/item/shotgunbox/buckshot + name = "Buckshot Ammo Box" + icon_state = "ammoboxbuckshot" + item_state = "ammoboxbuckshot" + base_icon_state = "ammoboxbuckshot" + ammo_type = /datum/ammo/bullet/shotgun/buckshot + +/obj/item/shotgunbox/flechette + name = "Flechette Ammo Box" + icon_state = "ammoboxflechette" + item_state = "ammoboxflechette" + base_icon_state = "ammoboxflechette" + ammo_type = /datum/ammo/bullet/shotgun/flechette + +/obj/item/shotgunbox/clf_heavyrifle + name = "big ammo box (14.5mm API)" + caliber = CALIBER_14X5 + icon_state = "ammobox_145" + item_state = "ammobox_145" + base_icon_state = "ammobox_145" + ammo_type = /datum/ammo/bullet/sniper/clf_heavyrifle + +/obj/item/shotgunbox/tracker + name = "Tracking Ammo Box" + icon_state = "ammoboxtracking" + item_state = "ammoboxtracking" + base_icon_state = "ammoboxtracking" + ammo_type = /datum/ammo/bullet/shotgun/tracker diff --git a/code/modules/projectiles/gun_system.dm b/code/modules/projectiles/gun_system.dm index 30438dd3199..722749767d0 100644 --- a/code/modules/projectiles/gun_system.dm +++ b/code/modules/projectiles/gun_system.dm @@ -504,16 +504,8 @@ SIGNAL_HANDLER set_gun_user(null) -/obj/item/weapon/gun/update_icon() +/obj/item/weapon/gun/update_icon(updates=ALL) . = ..() - - for(var/datum/action/action AS in actions) - action.update_button_icon() - - if(master_gun) - for(var/datum/action/action AS in master_gun.actions) - action.update_button_icon() - update_item_state() /obj/item/weapon/gun/update_icon_state() @@ -1416,6 +1408,7 @@ user.put_in_hands(mag) else mag.forceMove(get_turf(src)) + SEND_SIGNAL(gun_user, COMSIG_MAGAZINE_DROP, mag) if(CHECK_BITFIELD(reciever_flags, AMMO_RECIEVER_ROTATES_CHAMBER)) chamber_items[chamber_items.Find(mag)] = null else diff --git a/code/modules/projectiles/guns/_shared_ammo_objects.dm b/code/modules/projectiles/guns/_shared_ammo_objects.dm index 7297bdbc771..b8d2e059fc1 100644 --- a/code/modules/projectiles/guns/_shared_ammo_objects.dm +++ b/code/modules/projectiles/guns/_shared_ammo_objects.dm @@ -139,7 +139,7 @@ burn_ticks = 12 /obj/fire/flamer/affect_atom(atom/affected) - affected.fire_act(burn_level) + affected.fire_act(burn_level, flame_color) /obj/fire/flamer/process() . = ..() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index d0fba59781f..eb6760cd326 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -160,8 +160,6 @@ /obj/item/attachable/flashlight, /obj/item/attachable/foldable/bipod, /obj/item/attachable/magnetic_harness, - /obj/item/attachable/scope, - /obj/item/attachable/scope/mini, /obj/item/attachable/focuslens, /obj/item/attachable/widelens, /obj/item/attachable/heatlens, @@ -264,9 +262,6 @@ /obj/item/attachable/flashlight, /obj/item/attachable/foldable/bipod, /obj/item/attachable/magnetic_harness, - /obj/item/attachable/scope, - /obj/item/attachable/scope/marine, - /obj/item/attachable/scope/mini, ) flags_gun_features = GUN_CAN_POINTBLANK|GUN_AMMO_COUNTER|GUN_ENERGY|GUN_AMMO_COUNT_BY_SHOTS_REMAINING|GUN_NO_PITCH_SHIFT_NEAR_EMPTY attachable_offset = list("muzzle_x" = 34, "muzzle_y" = 14,"rail_x" = 18, "rail_y" = 18, "under_x" = 23, "under_y" = 10, "stock_x" = 22, "stock_y" = 12) @@ -447,8 +442,6 @@ /obj/item/attachable/lasersight, /obj/item/attachable/flashlight, /obj/item/attachable/magnetic_harness, - /obj/item/attachable/scope/marine, - /obj/item/attachable/scope/mini, /obj/item/weapon/gun/flamer/mini_flamer, /obj/item/attachable/motiondetector, /obj/item/attachable/buildasentry, @@ -534,6 +527,7 @@ /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_pistol name = "\improper Terra Experimental laser pistol" desc = "A TerraGov standard issue laser pistol abbreviated as TE-P. It has an integrated charge selector for normal, heat and taser 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." + w_class = WEIGHT_CLASS_NORMAL reload_sound = 'sound/weapons/guns/interact/standard_laser_pistol_reload.ogg' fire_sound = 'sound/weapons/guns/fire/Laser Pistol Standard.ogg' icon_state = "tep" @@ -555,7 +549,6 @@ /obj/item/attachable/reddot, /obj/item/attachable/lasersight, /obj/item/attachable/flashlight, - /obj/item/attachable/scope/mini, /obj/item/attachable/lace, /obj/item/attachable/gyro, /obj/item/attachable/flashlight/under, @@ -588,7 +581,7 @@ fire_delay = 0.15 SECONDS fire_sound = 'sound/weapons/guns/fire/Laser Pistol Standard.ogg' message_to_user = "You set the laser pistol's charge mode to standard fire." - fire_mode = GUN_FIREMODE_SEMIAUTO + fire_mode = GUN_FIREMODE_AUTOMATIC icon_state = "tep" description = "Fires a standard laser pulse. Moderate damage." @@ -694,6 +687,13 @@ /obj/item/attachable/gyro, ) +/obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine/beginner + starting_attachment_types = list( + /obj/item/attachable/magnetic_harness, + /obj/item/attachable/verticalgrip, + /obj/item/attachable/bayonet, + ) + /datum/lasrifle/energy_carbine_mode/auto_burst rounds_per_shot = 12 ammo_datum_type = /datum/ammo/energy/lasgun/marine/carbine @@ -820,6 +820,9 @@ modify_fire_delay(aim_fire_delay) modify_auto_burst_delay(aim_fire_delay) +/obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_sniper/beginner + starting_attachment_types = list(/obj/item/attachable/scope/unremovable/laser_sniper_scope, /obj/item/attachable/foldable/bipod) + /datum/lasrifle/energy_sniper_mode/standard rounds_per_shot = 30 fire_delay = 0.8 SECONDS @@ -900,8 +903,6 @@ /obj/item/attachable/bayonetknife/som, /obj/item/attachable/flashlight, /obj/item/attachable/magnetic_harness, - /obj/item/attachable/scope/marine, - /obj/item/attachable/scope/mini, /obj/item/weapon/gun/grenade_launcher/underslung, /obj/item/weapon/gun/flamer/mini_flamer, /obj/item/attachable/motiondetector, @@ -944,6 +945,9 @@ /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_mlaser/patrol starting_attachment_types = list(/obj/item/attachable/magnetic_harness, /obj/item/weapon/gun/grenade_launcher/underslung, /obj/item/attachable/bayonet) +/obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_mlaser/beginner + starting_attachment_types = list(/obj/item/attachable/bayonet, /obj/item/attachable/motiondetector, /obj/item/attachable/gyro) + /datum/lasrifle/energy_mg_mode/standard rounds_per_shot = 4 ammo_datum_type = /datum/ammo/energy/lasgun/marine/autolaser @@ -1007,7 +1011,6 @@ /obj/item/attachable/lasersight, /obj/item/attachable/flashlight, /obj/item/attachable/magnetic_harness, - /obj/item/attachable/scope/mini, /obj/item/weapon/gun/flamer/mini_flamer, /obj/item/attachable/motiondetector, /obj/item/attachable/buildasentry, diff --git a/code/modules/projectiles/guns/flamer.dm b/code/modules/projectiles/guns/flamer.dm index 86d2f9717fc..9c243f824dd 100644 --- a/code/modules/projectiles/guns/flamer.dm +++ b/code/modules/projectiles/guns/flamer.dm @@ -349,6 +349,13 @@ ) starting_attachment_types = list(/obj/item/attachable/flamer_nozzle, /obj/item/attachable/stock/t84stock) +/obj/item/weapon/gun/flamer/big_flamer/marinestandard/engineer/beginner + starting_attachment_types = list( + /obj/item/attachable/motiondetector, + /obj/item/attachable/flamer_nozzle, + /obj/item/attachable/stock/t84stock, + ) + /obj/item/weapon/gun/flamer/mini_flamer name = "mini flamethrower" desc = "A weapon-mounted refillable flamethrower attachment.\nIt is designed for short bursts." diff --git a/code/modules/projectiles/guns/grenade_launchers.dm b/code/modules/projectiles/guns/grenade_launchers.dm index d0083e317d1..5b558ae81e0 100644 --- a/code/modules/projectiles/guns/grenade_launchers.dm +++ b/code/modules/projectiles/guns/grenade_launchers.dm @@ -131,6 +131,9 @@ The Grenade Launchers fire_delay = 1.3 SECONDS max_chamber_items = 5 +/obj/item/weapon/gun/grenade_launcher/multinade_launcher/beginner + starting_attachment_types = list(/obj/item/attachable/magnetic_harness) + /obj/item/weapon/gun/grenade_launcher/multinade_launcher/unloaded default_ammo_type = null @@ -139,8 +142,8 @@ The Grenade Launchers desc = "A weapon-mounted, reloadable, two-shot grenade launcher." icon = 'icons/Marine/marine-weapons.dmi' icon_state = "grenade" - max_shells = 1 //codex - max_chamber_items = 0 + max_shells = 2 //codex + max_chamber_items = 1 fire_delay = 1 SECONDS fire_sound = 'sound/weapons/guns/fire/underbarrel_grenadelauncher.ogg' attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 18,"rail_x" = 14, "rail_y" = 22, "under_x" = 19, "under_y" = 14, "stock_x" = 19, "stock_y" = 14) @@ -176,6 +179,11 @@ The Grenade Launchers /obj/item/explosive/grenade/impact, /obj/item/explosive/grenade/sticky, /obj/item/explosive/grenade/flashbang/stun, + /obj/item/explosive/grenade/m15, + /obj/item/explosive/grenade/sticky/trailblazer, + /obj/item/explosive/grenade/sticky/trailblazer/phosphorus, + /obj/item/explosive/grenade/sticky/cloaker, + /obj/item/explosive/grenade/mirage, ) wield_delay_mod = 0.2 SECONDS diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/mounted.dm index 47f2855b267..1b13d0d5659 100644 --- a/code/modules/projectiles/guns/mounted.dm +++ b/code/modules/projectiles/guns/mounted.dm @@ -402,7 +402,7 @@ icon = 'icons/Marine/marine-mmg.dmi' icon_state = "t27" item_state = "t27" - caliber = CALIBER_10x27_CASELESS // codex + caliber = CALIBER_10X27_CASELESS // codex max_shells = 150 //codex force = 40 aim_slowdown = 1.2 diff --git a/code/modules/projectiles/guns/pistols.dm b/code/modules/projectiles/guns/pistols.dm index a753d345c7f..72e2382e309 100644 --- a/code/modules/projectiles/guns/pistols.dm +++ b/code/modules/projectiles/guns/pistols.dm @@ -124,6 +124,9 @@ placed_overlay_iconstate = "tx7" +/obj/item/weapon/gun/pistol/plasma_pistol/beginner + starting_attachment_types = list(/obj/item/weapon/gun/shotgun/combat/masterkey, /obj/item/attachable/reddot, /obj/item/attachable/lasersight) + /obj/item/weapon/gun/pistol/plasma_pistol/can_attach(obj/item/attaching_to, mob/attacher) if(!attachments_by_slot[ATTACHMENT_SLOT_RAIL]) return TRUE @@ -219,6 +222,10 @@ /obj/item/weapon/gun/pistol/p23/tactical starting_attachment_types = list(/obj/item/attachable/reddot) + +/obj/item/weapon/gun/pistol/p23/beginner + starting_attachment_types = list(/obj/item/attachable/lace, /obj/item/attachable/reddot) + //------------------------------------------------------- //P-1911 @@ -236,7 +243,7 @@ default_ammo_type = /obj/item/ammo_magazine/pistol/m1911 allowed_ammo_types = list(/obj/item/ammo_magazine/pistol/m1911) attachable_offset = list("muzzle_x" = 30, "muzzle_y" = 21,"rail_x" = 17, "rail_y" = 22, "under_x" = 21, "under_y" = 15, "stock_x" = 21, "stock_y" = 17) - reciever_flags = AMMO_RECIEVER_MAGAZINES|AMMO_RECIEVER_AUTO_EJECT_LOCKED + reciever_flags = AMMO_RECIEVER_MAGAZINES fire_delay = 0.2 SECONDS accuracy_mult = 1.05 accuracy_mult_unwielded = 0.85 @@ -451,6 +458,7 @@ /obj/item/attachable/flashlight, /obj/item/attachable/heavy_barrel, /obj/item/attachable/lace, + /obj/item/attachable/flashlight/under, ) flags_gun_features = GUN_CAN_POINTBLANK|GUN_AMMO_COUNTER|GUN_SMOKE_PARTICLES @@ -524,7 +532,6 @@ /obj/item/attachable/extended_barrel, /obj/item/attachable/heavy_barrel, /obj/item/attachable/flashlight/under, - /obj/item/attachable/burstfire_assembly, /obj/item/attachable/lace, ) @@ -546,6 +553,9 @@ /obj/item/weapon/gun/pistol/vp70/tactical starting_attachment_types = list(/obj/item/attachable/reddot, /obj/item/attachable/lasersight, /obj/item/attachable/compensator) +/obj/item/weapon/gun/pistol/vp70/beginner + starting_attachment_types = list(/obj/item/attachable/reddot, /obj/item/attachable/lasersight, /obj/item/attachable/lace) + //------------------------------------------------------- //VP78 diff --git a/code/modules/projectiles/guns/revolvers.dm b/code/modules/projectiles/guns/revolvers.dm index 715b5f705b9..8fdc32db8d4 100644 --- a/code/modules/projectiles/guns/revolvers.dm +++ b/code/modules/projectiles/guns/revolvers.dm @@ -148,6 +148,9 @@ base_gun_icon = "tp44cool" update_icon() +/obj/item/weapon/gun/revolver/r44/beginner + starting_attachment_types = list(/obj/item/attachable/reddot, /obj/item/attachable/compensator, /obj/item/attachable/lasersight) + //------------------------------------------------------- //RUSSIAN REVOLVER //Based on the 7.62mm Russian revolvers. @@ -331,7 +334,7 @@ icon_state = "t76" item_state = "t76" fire_animation = "t76_fire" - caliber = CALIBER_12x7 //codex + caliber = CALIBER_12X7 //codex max_chamber_items = 5 //codex default_ammo_type = /obj/item/ammo_magazine/revolver/standard_magnum allowed_ammo_types = list(/obj/item/ammo_magazine/revolver/standard_magnum) diff --git a/code/modules/projectiles/guns/rifles.dm b/code/modules/projectiles/guns/rifles.dm index 66d07cf84c9..1c4567109c0 100644 --- a/code/modules/projectiles/guns/rifles.dm +++ b/code/modules/projectiles/guns/rifles.dm @@ -42,7 +42,6 @@ max_shells = 36 //codex force = 20 default_ammo_type = /obj/item/ammo_magazine/rifle/ar18 - allowed_ammo_types = list(/obj/item/ammo_magazine/rifle/ar18) item_icons = list( slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', @@ -119,6 +118,9 @@ /obj/item/weapon/gun/rifle/ar18/plasma_pistol starting_attachment_types = list(/obj/item/attachable/stock/ar18stock, /obj/item/weapon/gun/pistol/plasma_pistol, /obj/item/attachable/motiondetector, /obj/item/attachable/compensator) +/obj/item/weapon/gun/rifle/ar18/beginner + starting_attachment_types = list(/obj/item/attachable/stock/ar18stock, /obj/item/attachable/magnetic_harness, /obj/item/attachable/angledgrip, /obj/item/attachable/compensator) + //------------------------------------------------------- //AR-12 Assault Rifle @@ -136,7 +138,6 @@ max_shells = 50 //codex force = 20 default_ammo_type = /obj/item/ammo_magazine/rifle/ar12 - allowed_ammo_types = list(/obj/item/ammo_magazine/rifle/ar12) item_icons = list( slot_l_hand_str = 'icons/mob/items_lefthand_1.dmi', slot_r_hand_str = 'icons/mob/items_righthand_1.dmi', @@ -235,7 +236,7 @@ cocked_sound = 'sound/weapons/guns/dmr/DMR-37/DMR37_boltpull.ogg' silenced_sound = 'sound/weapons/guns/dmr/DMR-37/DMR37_SIL.ogg' wield_sound = 'sound/weapons/guns/dmr/Deploy_Wave_DMR.ogg' - caliber = CALIBER_10x27_CASELESS //codex + caliber = CALIBER_10X27_CASELESS //codex aim_slowdown = 0.75 wield_delay = 0.8 SECONDS force = 20 @@ -289,6 +290,8 @@ /obj/item/weapon/gun/rifle/dmr37/marksman starting_attachment_types = list(/obj/item/attachable/scope, /obj/item/attachable/angledgrip, /obj/item/attachable/extended_barrel) +/obj/item/weapon/gun/rifle/dmr37/beginner + starting_attachment_types = list(/obj/item/attachable/scope, /obj/item/attachable/verticalgrip, /obj/item/attachable/extended_barrel) //------------------------------------------------------- @@ -316,7 +319,7 @@ cocked_sound = 'sound/weapons/guns/dmr/BR-64/BR64_boltpull.ogg' silenced_sound = 'sound/weapons/guns/dmr/BR-64/BR64_SIL.ogg' wield_sound = 'sound/weapons/guns/dmr/Deploy_Wave_DMR.ogg' - caliber = CALIBER_10x265_CASELESS //codex + caliber = CALIBER_10X265_CASELESS //codex aim_slowdown = 0.55 wield_delay = 0.7 SECONDS force = 20 @@ -676,7 +679,6 @@ cocked_sound = 'sound/weapons/guns/interact/ak47_cocked.ogg' default_ammo_type = /obj/item/ammo_magazine/rifle/lmg_d allowed_ammo_types = list(/obj/item/ammo_magazine/rifle/lmg_d) - attachable_allowed = list( /obj/item/attachable/bayonet, /obj/item/attachable/bayonetknife, @@ -965,6 +967,12 @@ scatter_unwielded = 80 movement_acc_penalty_mult = 6 +/obj/item/weapon/gun/rifle/mg42/autorifleman + starting_attachment_types = list(/obj/item/attachable/verticalgrip, /obj/item/attachable/reddot) + +/obj/item/weapon/gun/rifle/mg42/autorifleman + starting_attachment_types = list(/obj/item/attachable/verticalgrip, /obj/item/attachable/reddot) + //------------------------------------------------------- //MG-60 General Purpose Machine Gun @@ -982,7 +990,7 @@ inhand_x_dimension = 64 inhand_y_dimension = 32 - caliber = CALIBER_10x26_CASELESS //codex + caliber = CALIBER_10X26_CASELESS //codex max_shells = 200 //codex force = 35 aim_slowdown = 1.2 @@ -1021,6 +1029,7 @@ starting_attachment_types = list(/obj/item/attachable/stock/t60stock) gun_skill_category = SKILL_HEAVY_WEAPONS attachable_offset = list("muzzle_x" = 42, "muzzle_y" = 21,"rail_x" = 6, "rail_y" = 23, "under_x" = 26, "under_y" = 15, "stock_x" = 8, "stock_y" = 13) + actions_types = list(/datum/action/item_action/aim_mode) aim_fire_delay = 0.15 SECONDS aim_speed_modifier = 5.3 @@ -1035,12 +1044,12 @@ placed_overlay_iconstate = "lmg" -/obj/item/weapon/gun/rifle/mg42/autorifleman - starting_attachment_types = list(/obj/item/attachable/verticalgrip, /obj/item/attachable/reddot) - /obj/item/weapon/gun/rifle/mg60/machinegunner starting_attachment_types = list(/obj/item/attachable/stock/t60stock, /obj/item/attachable/foldable/bipod, /obj/item/attachable/magnetic_harness, /obj/item/attachable/extended_barrel) +/obj/item/weapon/gun/rifle/mg60/beginner + starting_attachment_types = list(/obj/item/attachable/stock/t60stock, /obj/item/attachable/foldable/bipod, /obj/item/attachable/magnetic_harness, /obj/item/attachable/heavy_barrel) + //------------------------------------------------------- //M41AE2 Heavy Pulse Rifle @@ -1143,7 +1152,6 @@ /obj/item/attachable/gyro, /obj/item/attachable/flashlight, /obj/item/attachable/foldable/bipod, - /obj/item/attachable/burstfire_assembly, /obj/item/attachable/magnetic_harness, /obj/item/attachable/extended_barrel, /obj/item/attachable/heavy_barrel, @@ -1153,6 +1161,7 @@ /obj/item/attachable/bayonetknife/som, /obj/item/attachable/compensator, /obj/item/attachable/scope, + /obj/item/attachable/flashlight/under, /obj/item/attachable/scope/mini, /obj/item/attachable/scope/marine, /obj/item/attachable/angledgrip, @@ -1160,8 +1169,10 @@ /obj/item/weapon/gun/shotgun/combat/masterkey, /obj/item/weapon/gun/flamer/mini_flamer, /obj/item/weapon/gun/grenade_launcher/underslung, + /obj/item/attachable/motiondetector, /obj/item/weapon/gun/rifle/pepperball/pepperball_mini, /obj/item/weapon/gun/flamer/mini_flamer/unremovable, + /obj/item/weapon/gun/energy/lasgun/lasrifle/pocket_beam, /obj/item/attachable/suppressor/unremovable/invisible, /obj/item/attachable/scope/unremovable, ) @@ -1178,6 +1189,8 @@ accuracy_mult_unwielded = 0.8 scatter = -1 +/obj/item/weapon/gun/rifle/type71/beginner + starting_attachment_types = list(/obj/item/attachable/magnetic_harness, /obj/item/attachable/bayonet, /obj/item/attachable/gyro) /obj/item/weapon/gun/rifle/type71/flamer name = "\improper Type 71 pulse rifle" @@ -1303,7 +1316,7 @@ desc = "The Raummetall-KT SG-29 is the TGMC's current standard IFF-capable medium machine gun. It's known for its ability to lay down heavy fire support very well. It is generally used when someone wants to hold a position or provide fire support. Requires special training and it cannot turn off IFF. It uses 10x26mm ammunition." icon_state = "sg29" item_state = "sg29" - caliber = CALIBER_10x26_CASELESS //codex + caliber = CALIBER_10X26_CASELESS //codex max_shells = 300 //codex force = 30 aim_slowdown = 0.95 @@ -1339,7 +1352,8 @@ starting_attachment_types = list(/obj/item/attachable/stock/sgstock, /obj/item/attachable/sgbarrel) gun_skill_category = SKILL_SMARTGUN //Uses SG skill for the penalties. attachable_offset = list("muzzle_x" = 42, "muzzle_y" = 17,"rail_x" = 15, "rail_y" = 21, "under_x" = 24, "under_y" = 14, "stock_x" = 12, "stock_y" = 13) - fire_delay = 0.2 SECONDS + + fire_delay = 0.15 SECONDS burst_amount = 0 accuracy_mult_unwielded = 0.5 accuracy_mult = 1.1 @@ -1367,7 +1381,7 @@ icon = 'icons/Marine/gun64.dmi' icon_state = "sg62" item_state = "sg62" - caliber = CALIBER_10x27_CASELESS //codex + caliber = CALIBER_10X27_CASELESS //codex max_shells = 40 //codex aim_slowdown = 0.55 wield_delay = 0.65 SECONDS @@ -1415,7 +1429,7 @@ icon_state = "sg153" icon = 'icons/Marine/gun64.dmi' fire_sound = 'sound/weapons/guns/fire/spottingrifle.ogg' - caliber = CALIBER_12x7 + caliber = CALIBER_12X7 slot = ATTACHMENT_SLOT_UNDER max_shells = 5 default_ammo_type =/obj/item/ammo_magazine/rifle/sg153 @@ -1493,7 +1507,7 @@ //SR-127 bolt action sniper rifle -/obj/item/weapon/gun/rifle/sniper/antimaterial/sr127 //its a subtype of antimaterial. A little complicated, but I don't want to copypast +/obj/item/weapon/gun/rifle/sr127 name = "\improper SR-127 Bauer bolt action rifle" desc = "The Bauer SR-127 is the standard issue bolt action rifle used by the TGMC. Known for its long range accuracy and use by marksmen despite its age and lack of IFF, though careful aim allows fire support from behind. It has an irremoveable scope. Uses 8.6×70mm box magazines." icon = 'icons/Marine/gun64.dmi' @@ -1513,6 +1527,7 @@ reload_sound = 'sound/weapons/guns/sniper/SR-127/SR127_clipin.ogg' silenced_sound = 'sound/weapons/guns/sniper/SR-127/SR127_SIL.ogg' wield_sound = 'sound/weapons/guns/dmr/Deploy_Wave_DMR.ogg' + cocked_sound = 'sound/weapons/guns/sniper/SR-127/SR127_boltpull.ogg' caliber = CALIBER_86X70 //codex max_shells = 10 //codex default_ammo_type = /obj/item/ammo_magazine/rifle/sr127 @@ -1534,6 +1549,7 @@ ) flags_gun_features = GUN_WIELDED_FIRING_ONLY|GUN_AMMO_COUNTER|GUN_SMOKE_PARTICLES + reciever_flags = AMMO_RECIEVER_REQUIRES_UNIQUE_ACTION|AMMO_RECIEVER_MAGAZINES|AMMO_RECIEVER_UNIQUE_ACTION_LOCKS|AMMO_RECIEVER_AUTO_EJECT cock_animation = "tl127_cock" cocked_message = "You rack the bolt!" @@ -1562,7 +1578,7 @@ movement_acc_penalty_mult = 6 -/obj/item/weapon/gun/rifle/sniper/antimaterial/sr127/unscoped +/obj/item/weapon/gun/rifle/sr127/unscoped starting_attachment_types = list(/obj/item/attachable/stock/sr127stock) //------------------------------------------------------- @@ -1742,7 +1758,7 @@ /obj/item/weapon/gun/grenade_launcher/underslung, /obj/item/attachable/motiondetector, /obj/item/weapon/gun/rifle/pepperball/pepperball_mini, - /obj/item/weapon/gun/energy/lasgun/lasrifle/pocket_beam, //RUTGMC EDIT + /obj/item/weapon/gun/energy/lasgun/lasrifle/pocket_beam, ) flags_gun_features = GUN_CAN_POINTBLANK|GUN_AMMO_COUNTER|GUN_SMOKE_PARTICLES @@ -1961,8 +1977,6 @@ /obj/item/ammo_magazine/rifle/ar12/incendiary, ) attachable_allowed = list( - /obj/item/attachable/scope/optical, - /obj/item/weapon/gun/rifle/tx54/mini, /obj/item/attachable/reddot, /obj/item/attachable/b7_scope, /obj/item/attachable/verticalgrip, @@ -1970,7 +1984,6 @@ /obj/item/attachable/gyro, /obj/item/attachable/flashlight, /obj/item/attachable/foldable/bipod, - /obj/item/attachable/flashlight/under, /obj/item/attachable/magnetic_harness, /obj/item/attachable/extended_barrel, /obj/item/attachable/heavy_barrel, @@ -1980,9 +1993,13 @@ /obj/item/attachable/bayonetknife/som, /obj/item/attachable/compensator, /obj/item/attachable/scope, - /obj/item/attachable/scope/marine, + /obj/item/attachable/flashlight/under, /obj/item/attachable/scope/mini, + /obj/item/attachable/scope/marine, + /obj/item/attachable/angledgrip, /obj/item/attachable/motiondetector, + /obj/item/weapon/gun/rifle/tx54/mini, + /obj/item/attachable/scope/optical, ) flags_gun_features = GUN_AMMO_COUNTER|GUN_SMOKE_PARTICLES @@ -2272,7 +2289,7 @@ inhand_x_dimension = 64 inhand_y_dimension = 32 - caliber = CALIBER_10x26_CASELESS + caliber = CALIBER_10X26_CASELESS max_shells = 200 force = 35 wield_delay = 1.5 SECONDS @@ -2344,7 +2361,7 @@ dry_fire_sound = 'sound/weapons/guns/fire/m41a_empty.ogg' unload_sound = 'sound/weapons/guns/interact/fal_unload.ogg' reload_sound = 'sound/weapons/guns/interact/fal_reload.ogg' - caliber = CALIBER_10x27_CASELESS //codex + caliber = CALIBER_10X27_CASELESS //codex aim_slowdown = 0.8 wield_delay = 0.85 SECONDS force = 20 @@ -2656,7 +2673,7 @@ slot_s_store_str = 'icons/mob/suit_slot.dmi', slot_back_str = 'icons/mob/clothing/back.dmi', ) - caliber = CALIBER_10x26_CASELESS //codex + caliber = CALIBER_10X26_CASELESS //codex max_shells = 80 //codex force = 20 aim_slowdown = 0.5 diff --git a/code/modules/projectiles/guns/shotguns.dm b/code/modules/projectiles/guns/shotguns.dm index 5403d623ea4..1750e204f03 100644 --- a/code/modules/projectiles/guns/shotguns.dm +++ b/code/modules/projectiles/guns/shotguns.dm @@ -117,6 +117,10 @@ wield_delay = 0.8 SECONDS akimbo_additional_delay = 0.9 +/obj/item/weapon/gun/shotgun/combat/standardmarine/beginner + default_ammo_type = /datum/ammo/bullet/shotgun/slug + starting_attachment_types = list(/obj/item/attachable/magnetic_harness, /obj/item/attachable/heavy_barrel, /obj/item/attachable/verticalgrip, /obj/item/attachable/stock/t39stock) + /obj/item/weapon/gun/shotgun/combat/masterkey name = "masterkey shotgun" desc = "A weapon-mounted, three-shot shotgun. Reloadable with any normal 12 gauge shell. The short barrel reduces the ammo's effectiveness drastically in exchange for fitting as a attachment.." @@ -213,9 +217,6 @@ /obj/item/attachable/flashlight, /obj/item/attachable/flashlight/under, /obj/item/attachable/magnetic_harness, - /obj/item/attachable/scope, - /obj/item/attachable/scope/marine, - /obj/item/attachable/scope/mini, ) flags_gun_features = GUN_CAN_POINTBLANK|GUN_AMMO_COUNTER|GUN_WIELDED_FIRING_ONLY|GUN_SMOKE_PARTICLES @@ -629,6 +630,9 @@ RU TGMC EDIT */ aim_slowdown = 0.6 movement_acc_penalty_mult = 5 +/obj/item/weapon/gun/shotgun/pump/lever/repeater/beginner + starting_attachment_types = list(/obj/item/attachable/magnetic_harness, /obj/item/attachable/bayonet) + //------------------------------------------------------ //MBX900 Lever Action Shotgun /obj/item/weapon/gun/shotgun/pump/lever/mbx900 @@ -742,6 +746,10 @@ RU TGMC EDIT */ default_ammo_type = /datum/ammo/bullet/shotgun/buckshot starting_attachment_types = list(/obj/item/attachable/foldable/t35stock, /obj/item/attachable/angledgrip, /obj/item/attachable/magnetic_harness) +/obj/item/weapon/gun/shotgun/pump/t35/beginner + default_ammo_type = /datum/ammo/bullet/shotgun/slug + starting_attachment_types = list(/obj/item/attachable/foldable/t35stock, /obj/item/attachable/gyro, /obj/item/attachable/magnetic_harness, /obj/item/attachable/bayonet) + //------------------------------------------------------- //THE MYTH, THE GUN, THE LEGEND, THE DEATH, THE ZX diff --git a/code/modules/projectiles/guns/smgs.dm b/code/modules/projectiles/guns/smgs.dm index 3370b484b02..9760f395c55 100644 --- a/code/modules/projectiles/guns/smgs.dm +++ b/code/modules/projectiles/guns/smgs.dm @@ -49,7 +49,6 @@ type_of_casings = null default_ammo_type = /obj/item/ammo_magazine/smg/mp19 allowed_ammo_types = list(/obj/item/ammo_magazine/smg/mp19) - w_class = WEIGHT_CLASS_NORMAL attachable_allowed = list( /obj/item/attachable/suppressor, @@ -422,7 +421,6 @@ default_ammo_type = /obj/item/ammo_magazine/smg/uzi allowed_ammo_types = list(/obj/item/ammo_magazine/smg/uzi, /obj/item/ammo_magazine/smg/uzi/extended) attachable_offset = list("muzzle_x" = 30, "muzzle_y" = 20,"rail_x" = 11, "rail_y" = 27, "under_x" = 22, "under_y" = 16, "stock_x" = 22, "stock_y" = 16) - fire_delay = 0.15 SECONDS burst_amount = 4 accuracy_mult_unwielded = 0.9 @@ -745,3 +743,6 @@ movement_acc_penalty_mult = 0.1 upper_akimbo_accuracy = 5 lower_akimbo_accuracy = 5 + +/obj/item/weapon/gun/smg/vector/beginner + starting_attachment_types = list(/obj/item/attachable/compensator, /obj/item/attachable/magnetic_harness, /obj/item/attachable/lasersight) diff --git a/code/modules/projectiles/guns/specialist.dm b/code/modules/projectiles/guns/specialist.dm index 18131866893..49bbbc24c07 100644 --- a/code/modules/projectiles/guns/specialist.dm +++ b/code/modules/projectiles/guns/specialist.dm @@ -427,7 +427,7 @@ Note that this means that snipers will have a slowdown of 3, due to the scope item_state = "minigun_sg" fire_animation = "minigun_sg_fire" max_shells = 2000 //codex - caliber = CALIBER_10x26_CASELESS //codex + caliber = CALIBER_10X26_CASELESS //codex allowed_ammo_types = list(/obj/item/ammo_magazine/minigun_powerpack/smartgun) wield_delay = 1.5 SECONDS flags_gun_features = GUN_AMMO_COUNTER|GUN_WIELDED_FIRING_ONLY|GUN_IFF|GUN_SMOKE_PARTICLES @@ -959,7 +959,6 @@ Note that this means that snipers will have a slowdown of 3, due to the scope attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 18,"rail_x" = 31, "rail_y" = 23, "under_x" = 19, "under_y" = 14, "stock_x" = 19, "stock_y" = 14) attachable_allowed = list( /obj/item/attachable/magnetic_harness, - /obj/item/attachable/scope/marine, ) flags_gun_features = GUN_WIELDED_FIRING_ONLY|GUN_WIELDED_STABLE_FIRING_ONLY|GUN_AMMO_COUNTER diff --git a/code/modules/projectiles/handful.dm b/code/modules/projectiles/handful.dm new file mode 100644 index 00000000000..0698a2be023 --- /dev/null +++ b/code/modules/projectiles/handful.dm @@ -0,0 +1,75 @@ +/obj/item/ammo_magazine/handful + name = "generic handful of bullets or shells" + desc = "A handful of rounds to reload on the go." + flags_equip_slot = null // It only fits into pockets and such. + w_class = WEIGHT_CLASS_SMALL + current_rounds = 1 // So it doesn't get autofilled for no reason. + max_rounds = 5 // For shotguns, though this will be determined by the handful type when generated. + flags_atom = CONDUCT|DIRLOCK + flags_magazine = MAGAZINE_HANDFUL|MAGAZINE_REFILLABLE + attack_speed = 3 // should make reloading less painful + icon = 'icons/obj/items/ammo/handful.dmi' + icon_state_mini = "bullets" + +/obj/item/ammo_magazine/handful/repeater + name = "handful of heavy impact rifle bullet (.45-70 Government)" + icon_state = "bullet" + current_rounds = 8 + max_rounds = 8 + default_ammo = /datum/ammo/bullet/rifle/repeater + caliber = CALIBER_4570 + +/obj/item/ammo_magazine/handful/slug + name = "handful of shotgun slug (12 gauge)" + icon_state = "shotgun slug" + current_rounds = 5 + default_ammo = /datum/ammo/bullet/shotgun/slug + caliber = CALIBER_12G + +/obj/item/ammo_magazine/handful/buckshot + name = "handful of shotgun buckshot shells (12g)" + icon_state = "shotgun buckshot shell" + current_rounds = 5 + default_ammo = /datum/ammo/bullet/shotgun/buckshot + caliber = CALIBER_12G + +/obj/item/ammo_magazine/handful/flechette + name = "handful of shotgun flechette shells (12g)" + icon_state = "shotgun flechette shell" + current_rounds = 5 + default_ammo = /datum/ammo/bullet/shotgun/flechette + caliber = CALIBER_12G + +/obj/item/ammo_magazine/handful/incendiary + name = "handful of shotgun incendiary shells (12g)" + icon_state = "incendiary slug" + current_rounds = 5 + default_ammo = /datum/ammo/bullet/shotgun/incendiary + caliber = CALIBER_12G + +/obj/item/ammo_magazine/handful/micro_grenade + name = "handful of airburst micro grenades (10g)" + icon_state = "micro_grenade_airburst" + icon_state_mini = "40mm_cyan" + current_rounds = 3 + max_rounds = 3 + default_ammo = /datum/ammo/bullet/micro_rail/airburst + caliber = CALIBER_10G_RAIL + +/obj/item/ammo_magazine/handful/micro_grenade/dragonbreath + name = "handful of dragon's breath micro grenades (10g)" + icon_state = "micro_grenade_incendiary" + icon_state_mini = "40mm_orange" + default_ammo = /datum/ammo/bullet/micro_rail/dragonbreath + +/obj/item/ammo_magazine/handful/micro_grenade/cluster + name = "handful of clustermunition micro grenades (10g)" + icon_state = "micro_grenade_cluster" + icon_state_mini = "40mm_red" + default_ammo = /datum/ammo/bullet/micro_rail/cluster + +/obj/item/ammo_magazine/handful/micro_grenade/smoke_burst + name = "handful of smoke burst micro grenades (10g)" + icon_state = "micro_grenade_smoke" + icon_state_mini = "40mm_blue" + default_ammo = /datum/ammo/bullet/micro_rail/smoke_burst diff --git a/code/modules/projectiles/magazines/energy.dm b/code/modules/projectiles/magazines/energy.dm index cd558200f2e..260e4d93642 100644 --- a/code/modules/projectiles/magazines/energy.dm +++ b/code/modules/projectiles/magazines/energy.dm @@ -3,7 +3,7 @@ /obj/item/cell/lasgun name = "\improper lasgun Battery" desc = "A specialized high density battery used to power lasguns." - icon = 'icons/obj/items/ammo.dmi' + icon = 'icons/obj/items/ammo/energy.dmi' item_icons = list( slot_l_hand_str = 'icons/mob/inhands/weapons/ammo_left.dmi', slot_r_hand_str = 'icons/mob/inhands/weapons/ammo_right.dmi', @@ -57,6 +57,7 @@ icon_state = "te" icon_state_mini = "mag_cell_te" maxcharge = 600 + /obj/item/cell/lasgun/lasrifle/recharger name = "\improper Terra Experimental recharger battery" desc = "A prototype high density battery reverse-engineered from captured Volkite equipment. Due to developmental constraints and less than stellar jury-rigging, as well as space taken up by the recharger component, it boasts sub-par capacity." @@ -65,6 +66,7 @@ self_recharge = TRUE charge_amount = 12 //balanced around recharging 1 standard laser rifle shot per second charge_delay = 1 SECONDS + /obj/item/cell/lasgun/fob_sentry/cell maxcharge = INFINITY @@ -73,7 +75,6 @@ /obj/item/cell/lasgun/volkite name = "\improper volkite energy cell" desc = "A specialized high density battery used to power volkite weaponry." - icon = 'icons/obj/items/ammo.dmi' icon_state = "volkite" maxcharge = 1440 w_class = WEIGHT_CLASS_NORMAL @@ -84,7 +85,6 @@ /obj/item/cell/lasgun/volkite/small name = "\improper compact volkite energy cell" desc = "A specialized compact battery used to power the smallest volkite weaponry." - icon = 'icons/obj/items/ammo.dmi' icon_state = "volkite_small" maxcharge = 540 w_class = WEIGHT_CLASS_SMALL @@ -93,7 +93,6 @@ /obj/item/cell/lasgun/volkite/turret name = "\improper volkite nuclear energy cell" desc = "A nuclear powered battery designed for certain heavy SOM machinery like sentries. Slowly charges over time." - icon = 'icons/obj/items/ammo.dmi' icon_state = "volkite_turret" maxcharge = 1800 w_class = WEIGHT_CLASS_NORMAL diff --git a/code/modules/projectiles/magazines/flamer.dm b/code/modules/projectiles/magazines/flamer.dm index 83d2334e811..88871609779 100644 --- a/code/modules/projectiles/magazines/flamer.dm +++ b/code/modules/projectiles/magazines/flamer.dm @@ -1,11 +1,9 @@ - - //Flame thrower. - /obj/item/ammo_magazine/flamer_tank name = "incinerator tank" desc = "A fuel tank of usually ultra thick napthal, a sticky combustable liquid chemical, for use in the FL-240 incinerator unit. Handle with care." icon_state = "flametank" + icon = 'icons/obj/items/ammo/flamer.dmi' max_rounds = 50 //Per turf. current_rounds = 50 reload_delay = 2 SECONDS diff --git a/code/modules/projectiles/magazines/misc.dm b/code/modules/projectiles/magazines/misc.dm index 680443c5fdf..401f2426094 100644 --- a/code/modules/projectiles/magazines/misc.dm +++ b/code/modules/projectiles/magazines/misc.dm @@ -3,6 +3,7 @@ /obj/item/ammo_magazine/packet name = "box of some kind of ammo" desc = "A packet containing some kind of ammo." + icon = 'icons/obj/items/ammo/packet.dmi' icon_state_mini = "ammo_packet" w_class = WEIGHT_CLASS_NORMAL @@ -62,7 +63,7 @@ /obj/item/ammo_magazine/packet/p10x265mm name = "box of 10x26.5mm" desc = "A box containing 100 rounds of 10x26.5mm caseless." - caliber = CALIBER_10x265_CASELESS + caliber = CALIBER_10X265_CASELESS icon_state = "box_10x265mm" default_ammo = /datum/ammo/bullet/rifle/br64 current_rounds = 100 @@ -71,7 +72,7 @@ /obj/item/ammo_magazine/packet/p10x27mm name = "box of 10x27mm" desc = "A box containing 100 rounds of 10x27mm caseless." - caliber = CALIBER_10x27_CASELESS + caliber = CALIBER_10X27_CASELESS icon_state = "box_10x27mm" default_ammo = /datum/ammo/bullet/rifle/dmr37 current_rounds = 100 @@ -110,7 +111,7 @@ desc = "A hefty container stuffed to the absolute brim with 500 rounds for the SG-85 powerpack." icon_state = "box_smartminigun" default_ammo = /datum/ammo/bullet/smart_minigun - caliber = CALIBER_10x26_CASELESS + caliber = CALIBER_10X26_CASELESS current_rounds = 500 max_rounds = 500 w_class = WEIGHT_CLASS_NORMAL @@ -124,6 +125,18 @@ current_rounds = 150 max_rounds = 150 +/obj/item/ammo_magazine/packet/scout_rifle/impact + name = "Box of A19 high velocity impact bullets" + desc = "A box containing 150 rounds of A19 impact high velocity." + icon_state = "box_tx8_impact" + default_ammo = /datum/ammo/bullet/rifle/tx8/impact + +/obj/item/ammo_magazine/packet/scout_rifle/incendiary + name = "Box of A19 high velocity incendiary bullets" + desc = "A box containing 150 rounds of A19 incendiary high velocity." + icon_state = "box_tx8_incendiary" + default_ammo = /datum/ammo/bullet/rifle/tx8/incendiary + /obj/item/ammo_magazine/packet/sr81 name = "box of low-pressure 8.6x70mm" desc = "A box containing 120 rounds of 8.6x70mm low velocity." @@ -237,7 +250,7 @@ name = "packet of 10x26mm" desc = "A packet containing 100 rounds of 10x26mm caseless." icon_state = "box_10x26mm" - caliber = CALIBER_10x26_CASELESS + caliber = CALIBER_10X26_CASELESS default_ammo = /datum/ammo/bullet/rifle/machinegun w_class = WEIGHT_CLASS_SMALL current_rounds = 100 @@ -277,7 +290,6 @@ /obj/item/ammo_magazine/packet/long_special name = "box of .44 Long Special" desc = "A packet containing 40 rounds of .44 Long Special." - icon = 'icons/obj/items/ammo.dmi' icon_state = "44LSbox" default_ammo = /datum/ammo/bullet/revolver/rifle caliber = CALIBER_44LS @@ -288,10 +300,9 @@ /obj/item/ammo_magazine/packet/t25 name = "box of 10x26mm high-pressure" desc = "A box containing 300 rounds of 10x26mm 'HP' caseless tuned for a smartgun." - icon = 'icons/obj/items/ammo.dmi' icon_state = "box_t25" default_ammo = /datum/ammo/bullet/rifle/t25 - caliber = CALIBER_10x26_CASELESS + caliber = CALIBER_10X26_CASELESS current_rounds = 300 max_rounds = 300 @@ -307,7 +318,6 @@ /obj/item/ammo_magazine/packet/t500 name = "packet of .500 Nigro Express" - icon = 'icons/obj/items/ammo.dmi' icon_state = "boxt500" default_ammo = /datum/ammo/bullet/revolver/t500 caliber = CALIBER_500 @@ -328,10 +338,9 @@ /obj/item/ammo_magazine/packet/standard_magnum name = "packet of .12x7mm" - icon = 'icons/obj/items/ammo.dmi' icon_state = "box_t76" default_ammo = /datum/ammo/bullet/revolver/t76 - caliber = CALIBER_12x7 + caliber = CALIBER_12X7 w_class = WEIGHT_CLASS_SMALL current_rounds = 50 max_rounds = 50 @@ -375,22 +384,19 @@ /obj/item/ammo_magazine/packet/p10x265mm/ap desc = "A box containing 100 armor piercing rounds of 10x26.5mm caseless." - icon = 'icons/obj/items/ammo.dmi' icon_state = "box_10x265mm_ap" default_ammo = /datum/ammo/bullet/rifle/br64/ap /obj/item/ammo_magazine/packet/p10x20mm/ap desc = "A packet containing 125 rounds of 10x20mm caseless." - icon = 'icons/obj/items/ammo.dmi' icon_state = "box_10x20mm_ap" default_ammo = /datum/ammo/bullet/smg/ap /obj/item/ammo_magazine/packet/sg62 name = "box of 10x27mm" desc = "A box containing 200 rounds of 10x27mm caseless." - icon = 'icons/obj/items/ammo.dmi' icon_state = "box_sg62" default_ammo = /datum/ammo/bullet/sg62 - caliber = CALIBER_10x27_CASELESS + caliber = CALIBER_10X27_CASELESS current_rounds = 200 max_rounds = 200 diff --git a/code/modules/projectiles/magazines/mounted.dm b/code/modules/projectiles/magazines/mounted.dm index 8b169740b72..c01517bb952 100644 --- a/code/modules/projectiles/magazines/mounted.dm +++ b/code/modules/projectiles/magazines/mounted.dm @@ -48,7 +48,7 @@ icon_state = "mag" icon_state_mini = "mag_drum_big_armygreen" flags_magazine = NONE - caliber = CALIBER_10x27_CASELESS + caliber = CALIBER_10X27_CASELESS max_rounds = 150 default_ammo = /datum/ammo/bullet/rifle/heavy reload_delay = 1 SECONDS @@ -95,7 +95,6 @@ icon_state = "ags_mag_pgas" default_ammo = /datum/ammo/grenade_container/agls37/tanglefoot - /obj/item/ammo_magazine/at36 name = "AT-36 AP-HE shell (37mm Shell)" desc = "A 37mm shell for light anti tank guns. Will penetrate walls and fortifications, before hitting a target and exploding, has less payload and punch than usual rounds." @@ -141,7 +140,7 @@ name = "MG-2005 box magazine (7.62x51mm)" desc = "A box of 1000 rounds for the MG-2005 mounted minigun." w_class = WEIGHT_CLASS_BULKY - icon = 'icons/obj/items/ammo.dmi' + icon = 'icons/obj/items/ammo/stationary.dmi' icon_state = "minigun" flags_magazine = NONE caliber = CALIBER_762X51 diff --git a/code/modules/projectiles/magazines/pistols.dm b/code/modules/projectiles/magazines/pistols.dm index a12a25591ad..416e6545abf 100644 --- a/code/modules/projectiles/magazines/pistols.dm +++ b/code/modules/projectiles/magazines/pistols.dm @@ -32,35 +32,37 @@ name = "\improper RT-3 magazine (9mm)" desc = "A pistol magazine." caliber = CALIBER_9X19 + icon = 'icons/obj/items/ammo/pistol.dmi' icon_state = "m4a3" max_rounds = 14 w_class = WEIGHT_CLASS_SMALL default_ammo = /datum/ammo/bullet/pistol icon_state_mini = "mag_pistol_orange" + ammo_band_icon = "m4a3_band" /obj/item/ammo_magazine/pistol/hp name = "\improper M4A3 hollowpoint magazine (9mm)" - icon_state = "m4a3_hp" default_ammo = /datum/ammo/bullet/pistol/hollow icon_state_mini = "mag_pistol_blue" + ammo_band_color = AMMO_BAND_COLOR_HOLLOWPOINT /obj/item/ammo_magazine/pistol/ap name = "\improper M4A3 AP magazine (9mm)" - icon_state = "m4a3_ap" default_ammo = /datum/ammo/bullet/pistol/ap icon_state_mini = "mag_pistol_green" + ammo_band_color = AMMO_BAND_COLOR_AP /obj/item/ammo_magazine/pistol/incendiary name = "\improper M4A3 incendiary magazine (9mm)" - icon_state = "m4a3_incendiary" default_ammo = /datum/ammo/bullet/pistol/incendiary icon_state_mini = "mag_pistol_red" + ammo_band_color = AMMO_BAND_COLOR_INCENDIARY /obj/item/ammo_magazine/pistol/extended name = "\improper M4A3 extended magazine (9mm)" max_rounds = 24 - icon_state = "m4a3_ext" icon_state_mini = "mag_pistol_yellow" + ammo_band_color = AMMO_BAND_COLOR_EXTENDED //------------------------------------------------------- //P-1911 @@ -218,18 +220,20 @@ icon_state = "v11" icon_state_mini = "mag_pistol_normal" max_rounds = 18 + ammo_band_icon = "v11_band" /obj/item/ammo_magazine/pistol/som/incendiary name = "\improper V-11 incendiary magazine (9mm)" - icon_state = "v11_incend" default_ammo = /datum/ammo/bullet/pistol/incendiary icon_state_mini = "mag_pistol_red" + ammo_band_color = AMMO_BAND_COLOR_INCENDIARY /obj/item/ammo_magazine/pistol/som/extended name = "\improper V-11 extended magazine (9mm)" max_rounds = 30 icon_state = "v11_extended" icon_state_mini = "mag_pistol_yellow" + ammo_band_color = AMMO_BAND_COLOR_EXTENDED //------------------------------------------------------- //PL-5 diff --git a/code/modules/projectiles/magazines/revolvers.dm b/code/modules/projectiles/magazines/revolvers.dm index 75de1d988cd..b790b4617c3 100644 --- a/code/modules/projectiles/magazines/revolvers.dm +++ b/code/modules/projectiles/magazines/revolvers.dm @@ -4,6 +4,7 @@ default_ammo = /datum/ammo/bullet/revolver flags_equip_slot = NONE caliber = CALIBER_44 + icon = 'icons/obj/items/ammo/revolver.dmi' icon_state = "m44" icon_state_mini = "mag_revolver_bronze" w_class = WEIGHT_CLASS_SMALL @@ -12,7 +13,6 @@ /obj/item/ammo_magazine/revolver/rifle name = "\improper M1855 speed loader (.44LS)" desc = "A speed loader for the M1855, with special design to make it possible to speedload a rifle. Longer version of .44 Magnum, with uranium-neodimium core." - icon = 'icons/obj/items/ammo.dmi' icon_state = "44LS" default_ammo = /datum/ammo/bullet/revolver/rifle caliber = CALIBER_44LS @@ -20,13 +20,10 @@ /obj/item/ammo_magazine/revolver/t500 name = "\improper R-500 speed loader (.500)" - icon = 'icons/obj/items/ammo.dmi' icon_state = "t500" desc = "A R-500 BF revolver speed loader." default_ammo = /datum/ammo/bullet/revolver/t500 - flags_equip_slot = NONE caliber = CALIBER_500 - w_class = WEIGHT_CLASS_SMALL max_rounds = 5 /obj/item/ammo_magazine/revolver/t500/slavs @@ -114,6 +111,6 @@ desc = "A revolver speed loader for the R-76 Magnum, mind your shoulder, will stun most moderately sized targets on impact." default_ammo = /datum/ammo/bullet/revolver/t76 max_rounds = 5 - caliber = CALIBER_12x7 + caliber = CALIBER_12X7 icon_state = "t76" icon_state_mini = "mag_revolver_red" diff --git a/code/modules/projectiles/magazines/rifles.dm b/code/modules/projectiles/magazines/rifles.dm index 08defd211f7..6bbc909a885 100644 --- a/code/modules/projectiles/magazines/rifles.dm +++ b/code/modules/projectiles/magazines/rifles.dm @@ -1,10 +1,7 @@ - - - //------------------------------------------------------- //M41A PULSE RIFLE AMMUNITION -/obj/item/ammo_magazine/rifle/ +/obj/item/ammo_magazine/rifle name = "\improper PR-412 magazine (10x24mm)" desc = "A 10mm assault rifle magazine." caliber = CALIBER_10X24_CASELESS @@ -13,30 +10,31 @@ w_class = WEIGHT_CLASS_NORMAL default_ammo = /datum/ammo/bullet/rifle max_rounds = 40 + ammo_band_icon = "m412_band" /obj/item/ammo_magazine/rifle/extended name = "\improper PR-412 extended magazine (10x24mm)" desc = "A 10mm assault extended rifle magazine." - icon_state = "m412_ext" icon_state_mini = "mag_rifle_big_yellow" max_rounds = 60 bonus_overlay = "m412_ex" + ammo_band_color = AMMO_BAND_COLOR_EXTENDED /obj/item/ammo_magazine/rifle/incendiary name = "\improper PR-412 incendiary magazine (10x24mm)" desc = "A 10mm assault rifle magazine." - icon_state = "m412_incendiary" icon_state_mini = "mag_rifle_big_red" default_ammo = /datum/ammo/bullet/rifle/incendiary bonus_overlay = "m412_incend" + ammo_band_color = AMMO_BAND_COLOR_INCENDIARY /obj/item/ammo_magazine/rifle/ap name = "\improper PR-412 AP magazine (10x24mm)" desc = "A 10mm armor piercing magazine." - icon_state = "m412_ap" icon_state_mini = "mag_rifle_big_green" default_ammo = /datum/ammo/bullet/rifle/ap bonus_overlay = "m412_ap" + ammo_band_color = AMMO_BAND_COLOR_AP //------------------------------------------------------- //ar18 Carbine @@ -52,6 +50,24 @@ default_ammo = /datum/ammo/bullet/rifle max_rounds = 36 +/obj/item/ammo_magazine/rifle/ar18/ap + name = "\improper AR-18 AP magazine (10x24mm)" + desc = "A 10mm armor piercing carbine magazine." + ammo_band_color = AMMO_BAND_COLOR_AP + default_ammo = /datum/ammo/bullet/rifle/ap + +/obj/item/ammo_magazine/rifle/ar18/incendiary + name = "\improper AR-18 incendiary magazine (10x24mm)" + desc = "A 10mm incendiary carbine magazine." + ammo_band_color = AMMO_BAND_COLOR_INCENDIARY + default_ammo = /datum/ammo/bullet/rifle/incendiary + +/obj/item/ammo_magazine/rifle/ar18/hp + name = "\improper AR-18 HP magazine (10x24mm)" + desc = "A 10mm hollow-point carbine magazine." + ammo_band_color = AMMO_BAND_COLOR_HOLLOWPOINT + default_ammo = /datum/ammo/bullet/rifle/hp + //------------------------------------------------------- //AR12 Assault Rifle @@ -66,13 +82,31 @@ default_ammo = /datum/ammo/bullet/rifle max_rounds = 50 +/obj/item/ammo_magazine/rifle/ar12/ap + name = "\improper AR-12 AP magazine (10x24mm)" + desc = "A 10mm armor piercing assault rifle magazine." + ammo_band_color = AMMO_BAND_COLOR_AP + default_ammo = /datum/ammo/bullet/rifle/ap + +/obj/item/ammo_magazine/rifle/ar12/incendiary + name = "\improper AR-12 incendiary magazine (10x24mm)" + desc = "A 10mm incendiary assault rifle magazine." + ammo_band_color = AMMO_BAND_COLOR_INCENDIARY + default_ammo = /datum/ammo/bullet/rifle/incendiary + +/obj/item/ammo_magazine/rifle/ar12/hp + name = "\improper AR-12 HP magazine (10x24mm)" + desc = "A 10mm hollow-point assault rifle magazine." + ammo_band_color = AMMO_BAND_COLOR_HOLLOWPOINT + default_ammo = /datum/ammo/bullet/rifle/hp + //------------------------------------------------------- //DMR37 /obj/item/ammo_magazine/rifle/dmr37 name = "\improper DMR-37 magazine (10x27mm)" desc = "A 10mm DMR magazine." - caliber = CALIBER_10x27_CASELESS + caliber = CALIBER_10X27_CASELESS icon_state = "t37" icon_state_mini = "mag_rifle_big" w_class = WEIGHT_CLASS_NORMAL @@ -85,12 +119,19 @@ /obj/item/ammo_magazine/rifle/br64 name = "\improper BR-64 magazine (10x26.5mm)" desc = "A 10mm battle rifle magazine." - caliber = CALIBER_10x265_CASELESS + caliber = CALIBER_10X265_CASELESS icon_state = "t64" icon_state_mini = "mag_rifle_big" w_class = WEIGHT_CLASS_NORMAL default_ammo = /datum/ammo/bullet/rifle/br64 max_rounds = 36 + ammo_band_icon = "t64_band" + +/obj/item/ammo_magazine/rifle/br64/ap + name = "\improper BR-64 AP magazine (10x26.5mm)" + desc = "A 10mm armor piercing battle rifle magazine." + default_ammo = /datum/ammo/bullet/rifle/br64/ap + ammo_band_color = AMMO_BAND_COLOR_AP //------------------------------------------------------- //M41A TRUE AND ORIGINAL @@ -233,7 +274,7 @@ desc = "A belt box for the MG-60 general purpose machinegun." icon_state = "t60" icon_state_mini = "mag_gpmg" - caliber = CALIBER_10x26_CASELESS + caliber = CALIBER_10X26_CASELESS default_ammo = /datum/ammo/bullet/rifle/machinegun w_class = WEIGHT_CLASS_NORMAL max_rounds = 200 @@ -305,11 +346,11 @@ /obj/item/ammo_magazine/sg29 name = "\improper SG-29 drum magazine" desc = "A wide drum magazine carefully filled to capacity with 10x26mm specialized smart rounds." - caliber = CALIBER_10x26_CASELESS + caliber = CALIBER_10X26_CASELESS icon_state = "sg29" icon_state_mini = "mag_sg29" w_class = WEIGHT_CLASS_NORMAL - default_ammo = /datum/ammo/bullet/sg29 + default_ammo = /datum/ammo/bullet/rifle/t25 max_rounds = 250 reload_delay = 1.3 SECONDS @@ -319,7 +360,7 @@ /obj/item/ammo_magazine/rifle/sg62 name = "\improper SG-62 magazine (10x27mm HV)" desc = "A magazine filled with 10x27mm specialized smart rounds." - caliber = CALIBER_10x27_CASELESS + caliber = CALIBER_10X27_CASELESS icon_state = "sg62" w_class = WEIGHT_CLASS_NORMAL default_ammo = /datum/ammo/bullet/sg62 @@ -332,7 +373,7 @@ /obj/item/ammo_magazine/rifle/sg153 name = "\improper SG-153 magazine (12x7mm)" desc = "A magazine filled with 12x7mm lethal smart rounds, these will do nothing other than pack a big punch." - caliber = CALIBER_12x7 + caliber = CALIBER_12X7 icon_state = "sg153" w_class = WEIGHT_CLASS_SMALL default_ammo = /datum/ammo/bullet/sg153 @@ -399,14 +440,15 @@ default_ammo = /datum/ammo/bullet/sniper/pfc max_rounds = 10 bonus_overlay = "tl127_mag" + ammo_band_icon = "tl127_band" /obj/item/ammo_magazine/rifle/sr127/flak name = "SR-127 bolt action rifle flak magazine" desc = "A box magazine filled with 8.6x70mm rifle flak rounds for the SR-127." - icon_state = "tl127_flak" icon_state_mini = "mag_sniper_blue" default_ammo = /datum/ammo/bullet/sniper/pfc/flak bonus_overlay = "tl127_flak" + ammo_band_color = AMMO_BAND_COLOR_IMPACT //------------------------------------------------------- //Marine magazine automatic sniper, or the SR-81. @@ -442,6 +484,33 @@ default_ammo = /datum/ammo/bullet/rifle/heavy max_rounds = 30 +/obj/item/ammo_magazine/rifle/ar21/extended + name = "\improper AR-21 extended skirmish rifle magazine" + desc = "A extended magazine filled with 10x25mm rifle rounds for the AR-21." + icon_state = "t21_ext" + max_rounds = 50 + icon_state_mini = "mag_rifle_big_yellow" + ammo_band_color = AMMO_BAND_COLOR_EXTENDED + bonus_overlay = "t21_ext" + +/obj/item/ammo_magazine/rifle/ar21/ap + name = "\improper AR-21 skirmish AP rifle magazine" + desc = "A magazine filled with 10x25mm armor piercing rifle rounds for the AR-21." + ammo_band_color = AMMO_BAND_COLOR_AP + default_ammo = /datum/ammo/bullet/rifle/heavy/ap + +/obj/item/ammo_magazine/rifle/ar21/incendiary + name = "\improper AR-21 skirmish incendiary rifle magazine" + desc = "A magazine filled with 10x25mm incendiary rifle rounds for the AR-21." + ammo_band_color = AMMO_BAND_COLOR_INCENDIARY + default_ammo = /datum/ammo/bullet/rifle/heavy/incendiary + +/obj/item/ammo_magazine/rifle/ar21/hp + name = "\improper AR-21 skirmish HP rifle magazine" + desc = "A magazine filled with 10x25mm armor-piercing rifle rounds for the AR-21." + ammo_band_color = AMMO_BAND_COLOR_HOLLOWPOINT + default_ammo = /datum/ammo/bullet/rifle/heavy/hp + //ALF-51B /obj/item/ammo_magazine/rifle/alf_machinecarbine @@ -473,6 +542,7 @@ name = "\improper 20mm airburst grenade magazine" desc = "A 20mm magazine loaded with airburst grenades. For use with the GL-54 or AR-55." caliber = CALIBER_20MM + icon = 'icons/obj/items/ammo/misc.dmi' icon_state = "tx54_airburst" icon_state_mini = "mag_sniper_blue" w_class = WEIGHT_CLASS_NORMAL @@ -485,7 +555,6 @@ name = "\improper 20mm incendiary grenade magazine" desc = "A 20mm magazine loaded with incendiary grenades. For use with the GL-54 or AR-55." default_ammo = /datum/ammo/tx54/incendiary - icon_state = "tx54_airburst" icon_state_mini = "mag_sniper_orange" greyscale_colors = COLOR_AMMO_INCENDIARY @@ -493,7 +562,6 @@ name = "\improper 20mm tactical smoke grenade magazine" desc = "A 20mm magazine loaded with tactical smoke grenades. For use with the GL-54 or AR-55." default_ammo = /datum/ammo/tx54/smoke - icon_state = "tx54_airburst" icon_state_mini = "mag_sniper_green" greyscale_colors = COLOR_AMMO_TACTICAL_SMOKE @@ -501,7 +569,6 @@ name = "\improper 20mm smoke grenade magazine" desc = "A 20mm magazine loaded with smoke grenades. For use with the GL-54 or AR-55." default_ammo = /datum/ammo/tx54/smoke/dense - icon_state = "tx54_airburst" icon_state_mini = "mag_sniper_cyan" greyscale_colors = COLOR_AMMO_SMOKE @@ -509,7 +576,6 @@ name = "\improper 20mm tanglefoot grenade magazine" desc = "A 20mm magazine loaded with tanglefoot grenades. For use with the GL-54 or AR-55." default_ammo = /datum/ammo/tx54/smoke/tangle - icon_state = "tx54_airburst" icon_state_mini = "mag_sniper_purple" greyscale_colors = COLOR_AMMO_TANGLEFOOT @@ -517,7 +583,6 @@ name = "\improper 20mm razorburn grenade magazine" desc = "A 20mm magazine loaded with razorburn grenades. For use with the GL-54 or AR-55." default_ammo = /datum/ammo/tx54/razor - icon_state = "tx54_airburst" icon_state_mini = "mag_sniper_yellow" greyscale_colors = COLOR_AMMO_RAZORBURN @@ -545,23 +610,21 @@ w_class = WEIGHT_CLASS_NORMAL default_ammo = /datum/ammo/bullet/rifle max_rounds = 50 + ammo_band_icon = "v31_band" /obj/item/ammo_magazine/rifle/som/ap name = "\improper V-31 AP magazine (10x24mm)" desc = "A 10mm rifle magazine designed for the V-31, loaded with armor piercing rounds." - caliber = CALIBER_10X24_CASELESS - icon_state = "v31_ap" icon_state_mini = "mag_thin_green" - w_class = WEIGHT_CLASS_NORMAL default_ammo = /datum/ammo/bullet/rifle/hv - max_rounds = 50 + ammo_band_color = AMMO_BAND_COLOR_AP /obj/item/ammo_magazine/rifle/som/incendiary name = "\improper V-31 incendiary magazine (10x24mm)" desc = "A 10mm rifle magazine designed for the V-31, loaded with incendiary rounds." - icon_state = "v31_incend" icon_state_mini = "mag_thin_red" default_ammo = /datum/ammo/bullet/rifle/incendiary + ammo_band_color = AMMO_BAND_COLOR_INCENDIARY //------------------------------------------------------- //V-41 Machine Gun @@ -571,7 +634,7 @@ desc = "A drum magazine for the V-41 machinegun." icon_state = "v41" icon_state_mini = "mag_drum_big_long" - caliber = CALIBER_10x26_CASELESS + caliber = CALIBER_10X26_CASELESS default_ammo = /datum/ammo/bullet/rifle/som_machinegun w_class = WEIGHT_CLASS_NORMAL max_rounds = 200 @@ -583,7 +646,7 @@ /obj/item/ammo_magazine/rifle/icc_sharpshooter name = "\improper L-11 sharpshooter rifle magazine (10x27mm)" desc = "A 10mm DMR magazine." - caliber = CALIBER_10x27_CASELESS + caliber = CALIBER_10X27_CASELESS icon_state = "l11" icon_state_mini = "mag_rifle" w_class = WEIGHT_CLASS_NORMAL @@ -652,23 +715,13 @@ /obj/item/ammo_magazine/rifle/t25 name = "\improper T-25 magazine (10x26mm)" desc = "A 10mm assault rifle magazine." - caliber = CALIBER_10x26_CASELESS - icon = 'icons/obj/items/ammo.dmi' + caliber = CALIBER_10X26_CASELESS icon_state = "t25" w_class = WEIGHT_CLASS_NORMAL default_ammo = /datum/ammo/bullet/rifle/t25 max_rounds = 80 icon_state_mini = "mag_rifle_big" -/obj/item/ammo_magazine/rifle/ar21/extended - name = "\improper AR-21 extended skirmish rifle magazine" - desc = "A extended magazine filled with 10x25mm rifle rounds for the AR-21." - icon = 'icons/obj/items/ammo.dmi' - icon_state = "t21_ext" - max_rounds = 50 - icon_state_mini = "mag_rifle_big_yellow" - bonus_overlay = "t21_ext" - /obj/item/ammo_magazine/rifle/t25/extended name = "\improper T-25 extended magazine (10x26mm)" desc = "A 10mm extended assault rifle magazine." @@ -676,76 +729,3 @@ max_rounds = 120 icon_state_mini = "mag_rifle_big_yellow" bonus_overlay = "t25_ext" - -/obj/item/ammo_magazine/rifle/ar18/ap - name = "\improper AR-18 AP magazine (10x24mm)" - desc = "A 10mm armor piercing carbine magazine." - ammo_band_color = AMMO_BAND_COLOR_AP - default_ammo = /datum/ammo/bullet/rifle/ap - -/obj/item/ammo_magazine/rifle/ar18/incendiary - name = "\improper AR-18 incendiary magazine (10x24mm)" - desc = "A 10mm incendiary carbine magazine." - ammo_band_color = AMMO_BAND_COLOR_INCENDIARY - default_ammo = /datum/ammo/bullet/rifle/incendiary - -/obj/item/ammo_magazine/rifle/ar18/hp - name = "\improper AR-18 HP magazine (10x24mm)" - desc = "A 10mm hollow-point carbine magazine." - ammo_band_color = AMMO_BAND_COLOR_HOLLOWPOINT - default_ammo = /datum/ammo/bullet/rifle/hp - -/obj/item/ammo_magazine/rifle/ar12/ap - name = "\improper AR-12 AP magazine (10x24mm)" - desc = "A 10mm armor piercing assault rifle magazine." - ammo_band_color = AMMO_BAND_COLOR_AP - default_ammo = /datum/ammo/bullet/rifle/ap - -/obj/item/ammo_magazine/rifle/ar12/incendiary - name = "\improper AR-12 incendiary magazine (10x24mm)" - desc = "A 10mm incendiary assault rifle magazine." - ammo_band_color = AMMO_BAND_COLOR_INCENDIARY - default_ammo = /datum/ammo/bullet/rifle/incendiary - -/obj/item/ammo_magazine/rifle/ar12/hp - name = "\improper AR-12 HP magazine (10x24mm)" - desc = "A 10mm hollow-point assault rifle magazine." - ammo_band_color = AMMO_BAND_COLOR_HOLLOWPOINT - default_ammo = /datum/ammo/bullet/rifle/hp - -/obj/item/ammo_magazine/rifle/br64/ap - name = "\improper BR-64 AP magazine (10x26.5mm)" - desc = "A 10mm armor piercing battle rifle magazine." - caliber = CALIBER_10x265_CASELESS - icon = 'icons/obj/items/ammo.dmi' - icon_state = "t64_ap" - default_ammo = /datum/ammo/bullet/rifle/br64/ap - icon_state_mini = "mag_rifle_big" - -/obj/item/ammo_magazine/rifle/ar21/ap - name = "\improper AR-21 skirmish AP rifle magazine" - desc = "A magazine filled with 10x25mm armor piercing rifle rounds for the AR-21." - ammo_band_color = AMMO_BAND_COLOR_AP - default_ammo = /datum/ammo/bullet/rifle/heavy/ap - -/obj/item/ammo_magazine/rifle/ar21/incendiary - name = "\improper AR-21 skirmish incendiary rifle magazine" - desc = "A magazine filled with 10x25mm incendiary rifle rounds for the AR-21." - ammo_band_color = AMMO_BAND_COLOR_INCENDIARY - default_ammo = /datum/ammo/bullet/rifle/heavy/incendiary - -/obj/item/ammo_magazine/rifle/ar21/hp - name = "\improper AR-21 skirmish HP rifle magazine" - desc = "A magazine filled with 10x25mm armor-piercing rifle rounds for the AR-21." - ammo_band_color = AMMO_BAND_COLOR_HOLLOWPOINT - default_ammo = /datum/ammo/bullet/rifle/heavy/hp - -/obj/item/ammo_magazine/rifle/som/ap - name = "\improper V-31 AP magazine (10x24mm)" - desc = "A 10mm rifle magazine designed for the V-31, loaded with armor piercing rounds." - caliber = CALIBER_10X24_CASELESS - icon_state = "v31_ap" - w_class = WEIGHT_CLASS_NORMAL - default_ammo = /datum/ammo/bullet/rifle/hv - max_rounds = 50 - icon_state_mini = "mag_rifle_big_green" diff --git a/code/modules/projectiles/magazines/sentries.dm b/code/modules/projectiles/magazines/sentries.dm index f27d0ae7c79..0dd6d5b033e 100644 --- a/code/modules/projectiles/magazines/sentries.dm +++ b/code/modules/projectiles/magazines/sentries.dm @@ -2,7 +2,8 @@ name = "\improper Магазин TUR-B (10x28мм)" desc = "Коробчатый магазин на 200 безгильзовых патронов 10х28 мм для турели \"Базис\". Вставьте в порт турели в случае отстутсвия боеприпасов." w_class = WEIGHT_CLASS_NORMAL - icon_state = "sentry_mag" + icon = 'icons/obj/items/ammo/stationary.dmi' + icon_state = "sentry" flags_magazine = NONE //can't be refilled or emptied by hand caliber = CALIBER_10X28 max_rounds = 200 @@ -12,7 +13,8 @@ name = "\improper Магазин TUR-M (10x20мм)" desc = "Коробчатый магазин на 300 безгильзовых патронов 10х20 мм для турели \"Гном\". Вставьте в порт турели в случае отстутсвия боеприпасов." w_class = WEIGHT_CLASS_NORMAL - icon_state = "minisentry_mag" + icon = 'icons/obj/items/ammo/stationary.dmi' + icon_state = "minisentry" flags_magazine = NONE //can't be refilled or emptied by hand caliber = CALIBER_10X20 max_rounds = 300 @@ -35,7 +37,7 @@ /obj/item/ammo_magazine/sentry/sniper name = "\improper Магазин TUR-SN (9x39мм)" desc = "Коробчатый магазин на 50 безгильзовых патронов 9х39 мм для турели \"Оса\". Вставьте в порт турели в случае отстутсвия боеприпасов." - icon_state = "sentry_sniper_mag" + icon_state = "sentry_sniper" max_rounds = 50 default_ammo = /datum/ammo/bullet/turret/sniper @@ -43,7 +45,7 @@ name = "\improper Магазин TUR-SH (12G)" desc = "Коробчатый магазин на 75 специализированных патронов 12 калибра для турели \"Бык\". Вставьте в порт турели в случае отстутсвия боеприпасов." caliber = CALIBER_12G - icon_state = "sentry_shotgun_mag" + icon_state = "sentry_shotgun" max_rounds = 75 default_ammo = /datum/ammo/bullet/turret/buckshot @@ -52,7 +54,7 @@ /obj/item/ammo_magazine/flamer_tank/large/sentry name = "\improper Малый бак TUR-F (Горючее)" desc = "Малый бак на 5 литров горючего для турели \"Феникс\". Вставьте в порт турели в случае отстутсвия горючего." - icon_state = "sentry_flamer_mag" + icon_state = "sentry_flamer" w_class = WEIGHT_CLASS_NORMAL max_rounds = 75 current_rounds = 75 diff --git a/code/modules/projectiles/magazines/shotguns.dm b/code/modules/projectiles/magazines/shotguns.dm index ca99c0ffb21..6eddfa28088 100644 --- a/code/modules/projectiles/magazines/shotguns.dm +++ b/code/modules/projectiles/magazines/shotguns.dm @@ -10,6 +10,7 @@ one type of shotgun ammo, but I think it helps in referencing it. ~N /obj/item/ammo_magazine/shotgun name = "box of 12 gauge shotgun slugs" desc = "A box filled with heavy shotgun shells. A timeless classic. 12 Gauge." + icon = 'icons/obj/items/ammo/packet.dmi' icon_state = "slugs" default_ammo = /datum/ammo/bullet/shotgun/slug caliber = CALIBER_12G //All shotgun rounds are 12g right now. @@ -55,6 +56,7 @@ one type of shotgun ammo, but I think it helps in referencing it. ~N /obj/item/ammo_magazine/rifle/bolt name = "box of 7.62x54mmR rifle rounds" desc = "A box filled with rifle bullets." + icon = 'icons/obj/items/ammo/packet.dmi' icon_state = "7.62" //Thank you Alterist default_ammo = /datum/ammo/bullet/sniper/svd caliber = CALIBER_762X54 //Cyka Blyat @@ -75,6 +77,7 @@ one type of shotgun ammo, but I think it helps in referencing it. ~N /obj/item/ammo_magazine/rifle/martini name = "box of .557/440 rifle rounds" desc = "A box filled with rifle bullets." + icon = 'icons/obj/items/ammo/packet.dmi' icon_state = ".557" default_ammo = /datum/ammo/bullet/sniper/martini caliber = CALIBER_557 @@ -90,6 +93,7 @@ one type of shotgun ammo, but I think it helps in referencing it. ~N /obj/item/ammo_magazine/pistol/derringer name = "box of .40 rimfire pistol rounds" desc = "A box filled with pistol bullets." + icon = 'icons/obj/items/ammo/packet.dmi' icon_state = "derringer_box" default_ammo = /datum/ammo/bullet/pistol/superheavy/derringer caliber = CALIBER_41RIM diff --git a/code/modules/projectiles/magazines/smgs.dm b/code/modules/projectiles/magazines/smgs.dm index 176bedb0d0f..0a2924cc21e 100644 --- a/code/modules/projectiles/magazines/smgs.dm +++ b/code/modules/projectiles/magazines/smgs.dm @@ -3,6 +3,7 @@ desc = "A submachinegun magazine." default_ammo = /datum/ammo/bullet/smg max_rounds = 30 + icon = 'icons/obj/items/ammo/smg.dmi' icon_state_mini = "mag_smg" //------------------------------------------------------- @@ -15,20 +16,21 @@ icon_state = "m25" max_rounds = 60 w_class = WEIGHT_CLASS_SMALL + ammo_band_icon = "m25_band" /obj/item/ammo_magazine/smg/m25/ap name = "\improper SMG-25 AP magazine (10x20mm)" - icon_state = "m25_ap" default_ammo = /datum/ammo/bullet/smg/ap icon_state_mini = "mag_smg_green" bonus_overlay = "m25_ap" + ammo_band_color = AMMO_BAND_COLOR_AP /obj/item/ammo_magazine/smg/m25/extended name = "\improper SMG-25 extended magazine (10x20mm)" - icon_state = "m25_ext" max_rounds = 90 icon_state_mini = "mag_smg_yellow" bonus_overlay = "m25_ex" + ammo_band_color = AMMO_BAND_COLOR_EXTENDED //------------------------------------------------------- //MP-19 Machinepistol ammo @@ -132,20 +134,21 @@ icon_state_mini = "mag_smg" max_rounds = 50 w_class = WEIGHT_CLASS_SMALL + ammo_band_icon = "v21_band" /obj/item/ammo_magazine/smg/som/ap name = "\improper V-21 AP submachinegun magazine (10x20mm)" desc = "A 10x20mm caseless submachinegun magazine, loaded in armor piercing rounds." - icon_state = "v21_ap" default_ammo = /datum/ammo/bullet/smg/ap icon_state_mini = "mag_smg_green" + ammo_band_color = AMMO_BAND_COLOR_AP /obj/item/ammo_magazine/smg/som/incendiary name = "\improper V-21 incendiary submachinegun magazine (10x20mm)" desc = "A 10x20mm caseless submachinegun magazine, loaded in incendiary rounds." - icon_state = "v21_incend" default_ammo = /datum/ammo/bullet/smg/incendiary icon_state_mini = "mag_smg_red" + ammo_band_color = AMMO_BAND_COLOR_INCENDIARY /obj/item/ammo_magazine/smg/som/extended name = "\improper V-21 extended submachinegun magazine (10x20mm)" @@ -155,6 +158,7 @@ icon_state_mini = "mag_smg_yellow" w_class = WEIGHT_CLASS_NORMAL aim_speed_mod = 0.1 + ammo_band_color = AMMO_BAND_COLOR_EXTENDED /obj/item/ammo_magazine/smg/som/rad name = "\improper V-21 radioactive submachinegun magazine (10x20mm)" @@ -175,16 +179,14 @@ default_ammo = /datum/ammo/bullet/smg/ap max_rounds = 32 w_class = WEIGHT_CLASS_SMALL + ammo_band_icon = "pl38_band" /obj/item/ammo_magazine/smg/icc_machinepistol/hp name = "\improper PL-38 HP machinepistol magazine (10x20mm)" desc = "A 10x20mm caseless hollow point machine pistol magazine." - caliber = CALIBER_10X20_CASELESS - icon_state = "pl38_hp" icon_state_mini = "mag_smg_dark_blue" default_ammo = /datum/ammo/bullet/smg/hollow - max_rounds = 32 - w_class = WEIGHT_CLASS_SMALL + ammo_band_color = AMMO_BAND_COLOR_HOLLOWPOINT //------------------------------------------------------- //L-40, ICC PDW diff --git a/code/modules/projectiles/magazines/specialist.dm b/code/modules/projectiles/magazines/specialist.dm index 042f81290cf..65ef0bfa7c4 100644 --- a/code/modules/projectiles/magazines/specialist.dm +++ b/code/modules/projectiles/magazines/specialist.dm @@ -12,21 +12,21 @@ default_ammo = /datum/ammo/bullet/sniper reload_delay = 3 icon_state_mini = "mag_sniper" - + ammo_band_icon = "t26_band" /obj/item/ammo_magazine/sniper/incendiary name = "\improper SR-26 incendiary magazine (10x28mm)" default_ammo = /datum/ammo/bullet/sniper/incendiary - icon_state = "t26_inc" icon_state_mini = "mag_sniper_red" bonus_overlay = "t26_incend" + ammo_band_color = AMMO_BAND_COLOR_INCENDIARY /obj/item/ammo_magazine/sniper/flak name = "\improper SR-26 flak magazine (10x28mm)" default_ammo = /datum/ammo/bullet/sniper/flak - icon_state = "t26_flak" icon_state_mini = "mag_sniper_blue" bonus_overlay = "t26_flak" + ammo_band_color = AMMO_BAND_COLOR_IMPACT //SR-42 magazine @@ -62,24 +62,24 @@ default_ammo = /datum/ammo/bullet/rifle/tx8 max_rounds = 25 icon_state_mini = "mag_rifle_big" + ammo_band_icon = "tx8_band" /obj/item/ammo_magazine/rifle/tx8/incendiary name = "\improper high velocity incendiary magazine (10x28mm)" desc = "A magazine of overpressuered high velocity incendiary rounds for use in the BR-8 battle rifle. The BR-8 battle rifle is the only gun that can chamber these rounds." caliber = CALIBER_10X28_CASELESS - icon_state = "tx8_incend" default_ammo = /datum/ammo/bullet/rifle/tx8/incendiary icon_state_mini = "mag_rifle_big_red" bonus_overlay = "tx8_incend" + ammo_band_color = AMMO_BAND_COLOR_INCENDIARY /obj/item/ammo_magazine/rifle/tx8/impact name = "\improper high velocity impact magazine (10x28mm)" desc = "A magazine of overpressuered high velocity impact rounds for use in the BR-8 battle rifle. The BR-8 battle rifle is the only gun that can chamber these rounds." - icon_state = "tx8_impact" default_ammo = /datum/ammo/bullet/rifle/tx8/impact icon_state_mini = "mag_rifle_big_blue" bonus_overlay = "tx8_impact" - + ammo_band_color = AMMO_BAND_COLOR_IMPACT //------------------------------------------------------- //M5 RPG @@ -88,6 +88,7 @@ name = "\improper generic high-explosive rocket" desc = "A precursor to all kinds of rocket ammo unfit for normal use. How did you get this anyway?" caliber = CALIBER_84MM + icon = 'icons/obj/items/ammo/rocket.dmi' icon_state = "rocket" w_class = WEIGHT_CLASS_NORMAL flags_magazine = MAGAZINE_REFUND_IN_CHAMBER @@ -174,7 +175,7 @@ desc = "A high explosive shell for the RL-160 recoilless rifle. Causes a heavy explosion over a small area. Requires specialized storage to carry." caliber = CALIBER_67MM icon_state = "shell" - w_class = WEIGHT_CLASS_BULKY + w_class = WEIGHT_CLASS_NORMAL max_rounds = 1 default_ammo = /datum/ammo/rocket/recoilless reload_delay = 30 @@ -358,6 +359,7 @@ name = "railgun canister (Armor Piercing Discarding Sabot)" desc = "A canister holding a tungsten projectile to be used inside a railgun. APDS is written across the canister, this round will penetrate through most armor, but will not leave much of a hole." caliber = CALIBER_RAILGUN + icon = 'icons/obj/items/ammo/misc.dmi' icon_state = "railgun" default_ammo = /datum/ammo/bullet/railgun max_rounds = 3 @@ -385,6 +387,7 @@ name = "pepperball canister (SAN balls)" desc = "A canister holding a projectile to be used inside a pepperball gun." caliber = CALIBER_PEPPERBALL + icon = 'icons/obj/items/ammo/misc.dmi' icon_state = "pepperball" default_ammo = /datum/ammo/bullet/pepperball max_rounds = 100 @@ -431,9 +434,9 @@ icon_state = "powerpacksg" flags_magazine = MAGAZINE_WORN|MAGAZINE_REFILLABLE default_ammo = /datum/ammo/bullet/smart_minigun - current_rounds = 2000 - max_rounds = 2000 - caliber = CALIBER_10x26_CASELESS + current_rounds = 1000 + max_rounds = 1000 + caliber = CALIBER_10X26_CASELESS flags_item_map_variant = null diff --git a/code/modules/projectiles/magazines/unmanned_vehicle.dm b/code/modules/projectiles/magazines/unmanned_vehicle.dm index aa1a14595a1..45ba0ef21c5 100644 --- a/code/modules/projectiles/magazines/unmanned_vehicle.dm +++ b/code/modules/projectiles/magazines/unmanned_vehicle.dm @@ -2,6 +2,7 @@ name = "box of 12x40mm" desc = "A box containing 200 rounds of 12x40mm caseless." caliber = CALIBER_12X40 + icon = 'icons/obj/items/ammo/misc.dmi' icon_state = "ltbcannon_4" w_class = WEIGHT_CLASS_NORMAL default_ammo = /datum/ammo/bullet/machinegun @@ -13,6 +14,7 @@ name = "box of 11x35mm" desc = "A box containing 200 rounds of 11x35mm caseless." caliber = CALIBER_11X35 + icon = 'icons/obj/items/ammo/misc.dmi' icon_state = "ltbcannon_4" w_class = WEIGHT_CLASS_NORMAL default_ammo = /datum/ammo/bullet/smg diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 0cb2ba8bd31..8de5fbecc69 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -826,15 +826,9 @@ So if we are on the 32th absolute pixel coordinate we are on tile 1, but if we a return ..() /mob/living/carbon/human/projectile_hit(obj/projectile/proj, cardinal_move, uncrossing) - if(wear_id?.iff_signal & proj.iff_signal) - proj.damage -= proj.damage*proj.damage_marine_falloff + if((wear_id?.iff_signal & proj.iff_signal) || (proj?.firer?.faction == faction && proj.original_target != src && Adjacent(proj.firer))) + proj.damage -= proj.damage * proj.damage_marine_falloff return FALSE - //shooting from behind the shoulder - if(ismob(proj.firer)) - var/mob/firer = proj.firer - if(firer.faction == faction && Adjacent(proj.firer)) - proj.damage -= proj.damage*proj.damage_marine_falloff //no guns with marine falloff by the way - return FALSE return ..() /mob/living/carbon/xenomorph/projectile_hit(obj/projectile/proj, cardinal_move, uncrossing) @@ -851,8 +845,10 @@ So if we are on the 32th absolute pixel coordinate we are on tile 1, but if we a return ..() /obj/projectile/proc/play_damage_effect(mob/M) - if(ammo.sound_hit) playsound(M, ammo.sound_hit, 50, 1) - if(M.stat != DEAD) animation_flash_color(M) + if(ammo.sound_hit) + playsound(M, ammo.sound_hit, 50, 1) + if(M.stat != DEAD) + animation_flash_color(M) //---------------------------------------------------------- // \\ @@ -916,7 +912,7 @@ So if we are on the 32th absolute pixel coordinate we are on tile 1, but if we a if(stat != DEAD && proj.firer) proj.firer.record_projectile_damage(damage, src) //Tally up whoever the shooter was - if(damage) + if(damage > 0) if(do_shrapnel_roll(proj, damage)) feedback_flags |= (BULLET_FEEDBACK_SHRAPNEL|BULLET_FEEDBACK_SCREAM) embed_projectile_shrapnel(proj) diff --git a/code/modules/reagents/machinery/chem_master.dm b/code/modules/reagents/machinery/chem_master.dm index b00ed1571bc..c14146efe2b 100644 --- a/code/modules/reagents/machinery/chem_master.dm +++ b/code/modules/reagents/machinery/chem_master.dm @@ -341,21 +341,8 @@ . = ..() if(.) return - // if(user.skills.getRating(SKILL_MEDICAL) < SKILL_MEDICAL_PRACTICED) //RUTGMC edit - marines can use chem machines once again - // balloon_alert(user, "skill issue") - // return - if(!(user.client in has_sprites)) - spawn() - has_sprites += user.client - for(var/i = 1 to MAX_PILL_BOTTLE_SPRITE) - user << browse_rsc(icon('icons/obj/items/chemistry.dmi', pill_bottle_names[i]), pill_bottle_names[i]+".png") - for(var/i = 1 to MAX_PILL_SPRITE) - user << browse_rsc(icon('icons/obj/items/chemistry.dmi', "pill" + num2text(i)), "pill[i].png") - for(var/i = 1 to MAX_BOTTLE_SPRITE) - user << browse_rsc(icon('icons/obj/items/chemistry.dmi', "bottle-" + num2text(i)), "bottle-[i].png") - for(var/i = 1 to MAX_AUTOINJECTOR_SPRITE) - user << browse_rsc(icon('icons/obj/items/syringe.dmi', "autoinjector-" + num2text(i)), "autoinjector-[i].png") + INVOKE_ASYNC(src, PROC_REF(show_container_choises), user) var/dat = "" if(!beaker) dat = "Please insert beaker.
" @@ -407,6 +394,17 @@ popup.set_content(dat) popup.open() +/obj/machinery/chem_master/proc/show_container_choises(mob/user) + has_sprites += user.client + for(var/i = 1 to MAX_PILL_BOTTLE_SPRITE) + user << browse_rsc(icon('icons/obj/items/chemistry.dmi', pill_bottle_names[i]), pill_bottle_names[i]+".png") + for(var/i = 1 to MAX_PILL_SPRITE) + user << browse_rsc(icon('icons/obj/items/chemistry.dmi', "pill" + num2text(i)), "pill[i].png") + for(var/i = 1 to MAX_BOTTLE_SPRITE) + user << browse_rsc(icon('icons/obj/items/chemistry.dmi', "bottle-" + num2text(i)), "bottle-[i].png") + for(var/i = 1 to MAX_AUTOINJECTOR_SPRITE) + user << browse_rsc(icon('icons/obj/items/syringe.dmi', "autoinjector-" + num2text(i)), "autoinjector-[i].png") + /obj/machinery/chem_master/update_icon() . = ..() if(machine_stat & (NOPOWER)) diff --git a/code/modules/reagents/reagents/medical.dm b/code/modules/reagents/reagents/medical.dm index 82b46c0f1a1..12fce353b35 100644 --- a/code/modules/reagents/reagents/medical.dm +++ b/code/modules/reagents/reagents/medical.dm @@ -149,7 +149,6 @@ name = "Oxycodone" description = "An effective and very addictive painkiller." color = COLOR_REAGENT_OXYCODONE - custom_metabolism = REAGENTS_METABOLISM * 1.25 overdose_threshold = REAGENTS_OVERDOSE * 0.5 overdose_crit_threshold = REAGENTS_OVERDOSE_CRITICAL * 0.5 scannable = TRUE diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 4172a70df4d..d1b8a971a11 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -400,8 +400,7 @@ target = get_offset_target_turf(loc, rand(5) - rand(5), rand(5) - rand(5)) AM.loc = loc AM.pipe_eject(0) - spawn(1) - AM?.throw_at(target, 5, 1) + addtimer(CALLBACK(AM, TYPE_PROC_REF(/atom/movable, throw_at), target, 3, 1), 0.5 SECONDS) qdel(H) @@ -664,9 +663,8 @@ for(var/atom/movable/AM in H) AM.loc = T AM.pipe_eject(direction) - spawn(1) - if(AM) - AM.throw_at(target, 100, 1) + if(AM) + addtimer(CALLBACK(AM, TYPE_PROC_REF(/atom/movable, throw_at), target, 100, 1), 0.1 SECONDS) qdel(H) else //No specified direction, so throw in random direction @@ -678,9 +676,8 @@ AM.loc = T AM.pipe_eject(0) - spawn(1) - if(AM) - AM.throw_at(target, 5, 1) + if(AM) + addtimer(CALLBACK(AM, TYPE_PROC_REF(/atom/movable, throw_at), target, 5, 1), 0.1 SECONDS) qdel(H) @@ -1289,8 +1286,7 @@ for(var/atom/movable/AM in H) AM.loc = src.loc AM.pipe_eject(dir) - spawn(5) - AM.throw_at(target, 3, 1) + addtimer(CALLBACK(AM, TYPE_PROC_REF(/atom/movable, throw_at), target, 3, 1), 0.5 SECONDS) qdel(H) /obj/structure/disposaloutlet/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/reqs/_supply.dm b/code/modules/reqs/_supply.dm index 6eeb1a5cbee..8fac9089dcd 100644 --- a/code/modules/reqs/_supply.dm +++ b/code/modules/reqs/_supply.dm @@ -1,10 +1,3 @@ -GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( - /mob/living, - /obj/item/disk/nuclear, - /obj/item/radio/beacon, - /obj/vehicle, - ))) - /datum/supply_order var/id var/orderer @@ -16,174 +9,6 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( ///What faction ordered this var/faction = FACTION_TERRAGOV -/obj/item/paper/manifest - name = "Supply Manifest" - -/obj/docking_port/stationary/supply - id = "supply_home" - roundstart_template = /datum/map_template/shuttle/supply - width = 5 - dwidth = 2 - dheight = 2 - height = 5 - -/obj/docking_port/mobile/supply - name = "supply shuttle" - id = SHUTTLE_SUPPLY - callTime = 15 SECONDS - - dir = WEST - port_direction = EAST - width = 5 - dwidth = 2 - dheight = 2 - height = 5 - movement_force = list("KNOCKDOWN" = 0, "THROW" = 0) - use_ripples = FALSE - var/list/gears = list() - var/list/obj/machinery/door/poddoor/railing/railings = list() - ///The faction of this docking port (aka, on which ship it is located) - var/faction = FACTION_TERRAGOV - /// Id of the home docking port - var/home_id = "supply_home" - ///prefix for railings and gear todo should probbaly be defines instead? - var/railing_gear_name = "supply" - -/obj/docking_port/mobile/supply/Destroy(force) - for(var/i in railings) - var/obj/machinery/door/poddoor/railing/railing = i - railing.linked_pad = null - railings.Cut() - return ..() - - -/obj/docking_port/mobile/supply/afterShuttleMove() - . = ..() - if(getDockedId() == home_id) - for(var/j in railings) - var/obj/machinery/door/poddoor/railing/R = j - R.open() - -/obj/docking_port/mobile/supply/on_ignition() - if(getDockedId() == home_id) - for(var/j in railings) - var/obj/machinery/door/poddoor/railing/R = j - R.close() - for(var/i in gears) - var/obj/machinery/gear/G = i - G.start_moving(NORTH) - else - for(var/i in gears) - var/obj/machinery/gear/G = i - G.start_moving(SOUTH) - -/obj/docking_port/mobile/supply/register() - . = ..() - for(var/obj/machinery/gear/G in GLOB.machines) - if(G.id == (railing_gear_name+"_elevator_gear")) - gears += G - RegisterSignal(G, COMSIG_QDELETING, PROC_REF(clean_gear)) - for(var/obj/machinery/door/poddoor/railing/R in GLOB.machines) - if(R.id == (railing_gear_name+"_elevator_railing")) - railings += R - RegisterSignal(R, COMSIG_QDELETING, PROC_REF(clean_railing)) - R.linked_pad = src - R.open() - -///Signal handler when a gear is destroyed -/obj/docking_port/mobile/supply/proc/clean_gear(datum/source) - SIGNAL_HANDLER - gears -= source - -///Signal handler when a railing is destroyed -/obj/docking_port/mobile/supply/proc/clean_railing(datum/source) - SIGNAL_HANDLER - railings -= source - -/obj/docking_port/mobile/supply/canMove() - if(is_station_level(z)) - return check_blacklist(shuttle_areas) - return ..() - -/obj/docking_port/mobile/supply/proc/check_blacklist(areaInstances) - if(!areaInstances) - areaInstances = shuttle_areas - for(var/place in areaInstances) - var/area/shuttle/shuttle_area = place - for(var/trf in shuttle_area) - var/turf/T = trf - for(var/a in T.GetAllContents()) - if(isxeno(a)) - var/mob/living/L = a - if(L.stat == DEAD) - continue - if(ishuman(a)) - var/mob/living/carbon/human/human_to_sell = a - if(human_to_sell.stat == DEAD && can_sell_human_body(human_to_sell, faction)) - continue - if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types)) - return FALSE - return TRUE - -/obj/docking_port/mobile/supply/request(obj/docking_port/stationary/S) - if(mode != SHUTTLE_IDLE) - return 2 - return ..() - -/obj/docking_port/mobile/supply/proc/buy(mob/user, datum/supply_ui/supply_ui) - if(!length(SSpoints.shoppinglist[faction])) - return - log_game("Supply pack orders have been purchased by [key_name(user)]") - - var/list/empty_turfs = list() - for(var/place in shuttle_areas) - var/area/shuttle/shuttle_area = place - for(var/turf/open/floor/T in shuttle_area) - if(is_blocked_turf(T)) - continue - empty_turfs += T - - for(var/i in SSpoints.shoppinglist[faction]) - if(!length(empty_turfs)) - break - var/datum/supply_order/SO = LAZYACCESSASSOC(SSpoints.shoppinglist, faction, i) - - var/datum/supply_packs/firstpack = SO.pack[1] - - var/obj/structure/crate_type = firstpack.containertype || firstpack.contains[1] - - var/obj/structure/A = new crate_type(pick_n_take(empty_turfs)) - if(firstpack.containertype) - A.name = "Order #[SO.id] for [SO.orderer]" - - - var/list/contains = list() - //spawn the stuff, finish generating the manifest while you're at it - for(var/P in SO.pack) - var/datum/supply_packs/SP = P - // yes i know - if(SP.access) - A.req_access = list() - A.req_access += text2num(SP.access) - - if(SP.randomised_num_contained) - if(length(SP.contains)) - for(var/j in 1 to SP.randomised_num_contained) - contains += pick(SP.contains) - else - contains += SP.contains - - for(var/typepath in contains) - if(!typepath) - continue - if(!firstpack.containertype) - break - new typepath(A) - - SSpoints.shoppinglist[faction] -= "[SO.id]" - SSpoints.shopping_history += SO - - /datum/export_report /// How many points from that export var/points @@ -196,833 +21,3 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( points = _points export_name = _export_name faction = _faction - -/obj/docking_port/mobile/supply/proc/sell() - for(var/place in shuttle_areas) - var/area/shuttle/shuttle_area = place - for(var/atom/movable/AM in shuttle_area) - if(AM.anchored) - continue - var/datum/export_report = AM.supply_export(faction) - if(export_report) - SSpoints.export_history += export_report - qdel(AM) - -/obj/item/supplytablet - name = "ASRS tablet" - desc = "A tablet for an Automated Storage and Retrieval System" - icon = 'icons/Marine/marine-navigation.dmi' - icon_state = "req_tablet_off" - req_access = list(ACCESS_MARINE_CARGO) - flags_equip_slot = ITEM_SLOT_POCKET - w_class = WEIGHT_CLASS_NORMAL - var/datum/supply_ui/SU - ///Id of the shuttle controlled - var/shuttle_id = SHUTTLE_SUPPLY - /// Id of the home docking port - var/home_id = "supply_home" - /// Faction of the tablet - var/faction = FACTION_TERRAGOV - -/obj/item/supplytablet/interact(mob/user) - . = ..() - if(.) - return - if(!allowed(user)) - return - if(!SU) - SU = new(src) - SU.shuttle_id = shuttle_id - SU.home_id = home_id - SU.faction = faction - return SU.interact(user) - -/obj/machinery/computer/supplycomp - name = "ASRS console" - desc = "A console for an Automated Storage and Retrieval System" - icon = 'icons/obj/machines/computer.dmi' - icon_state = "computer" - screen_overlay = "supply" - req_access = list(ACCESS_MARINE_CARGO) - circuit = /obj/item/circuitboard/computer/supplycomp - var/datum/supply_ui/SU - ///Id of the shuttle controlled - var/shuttle_id = SHUTTLE_SUPPLY - /// Id of the home docking port - var/home_id = "supply_home" - /// Faction of the computer - var/faction = FACTION_TERRAGOV - -/obj/machinery/computer/supplycomp/interact(mob/user) - . = ..() - if(.) - return - if(isliving(user) && !allowed(user)) - return - if(!SU) - SU = new(src) - SU.shuttle_id = shuttle_id - SU.home_id = home_id - SU.faction = faction - return SU.interact(user) - -/datum/supply_ui - interaction_flags = INTERACT_MACHINE_TGUI - var/atom/source_object - var/tgui_name = "Cargo" - ///Id of the shuttle controlled - var/shuttle_id = "" - ///Reference to the supply shuttle - var/obj/docking_port/mobile/supply/supply_shuttle - ///Faction of the supply console linked - var/faction = FACTION_TERRAGOV - ///Id of the home port - var/home_id = "" - -/datum/supply_ui/New(atom/source_object) - . = ..() - src.source_object = source_object - RegisterSignal(source_object, COMSIG_QDELETING, PROC_REF(clean_ui)) - -///Signal handler to delete the ui when the source object is deleting -/datum/supply_ui/proc/clean_ui() - SIGNAL_HANDLER - qdel(src) - -/datum/supply_ui/Destroy(force) - source_object = null - return ..() - -/datum/supply_ui/ui_host() - return source_object - -/datum/supply_ui/can_interact(mob/user) - . = ..() - if(!.) - return FALSE - if(!user.CanReach(source_object)) - return FALSE - return TRUE - -/datum/supply_ui/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - - if(!ui) - if(shuttle_id) - supply_shuttle = SSshuttle.getShuttle(shuttle_id) - supply_shuttle.home_id = home_id - supply_shuttle.faction = faction - ui = new(user, src, tgui_name, source_object.name) - ui.open() - -/datum/supply_ui/ui_static_data(mob/user) - . = list() - .["categories"] = GLOB.all_supply_groups - .["supplypacks"] = SSpoints.supply_packs_ui - .["supplypackscontents"] = SSpoints.supply_packs_contents - .["elevator_size"] = supply_shuttle?.return_number_of_turfs() - -/datum/supply_ui/ui_data(mob/living/user) - . = list() - .["currentpoints"] = round(SSpoints.supply_points[user.faction]) - .["personalpoints"] = round(SSpoints.personal_supply_points[user.ckey]) - .["requests"] = list() - for(var/key in SSpoints.requestlist) - var/datum/supply_order/SO = SSpoints.requestlist[key] - if(SO.faction != user.faction) - continue - var/list/packs = list() - var/cost = 0 - for(var/P in SO.pack) - var/datum/supply_packs/SP = P - if(packs[SP.type]) - packs[SP.type] += 1 - else - packs[SP.type] = 1 - cost += SP.cost - .["requests"] += list(list("id" = SO.id, "orderer" = SO.orderer, "orderer_rank" = SO.orderer_rank, "reason" = SO.reason, "cost" = cost, "packs" = packs, "authed_by" = SO.authorised_by)) - .["deniedrequests"] = list() - for(var/i in length(SSpoints.deniedrequests) to 1 step -1) - var/datum/supply_order/SO = SSpoints.deniedrequests[SSpoints.deniedrequests[i]] - if(SO.faction != user.faction) - continue - var/list/packs = list() - var/cost = 0 - for(var/P in SO.pack) - var/datum/supply_packs/SP = P - if(packs[SP.type]) - packs[SP.type] += 1 - else - packs[SP.type] = 1 - cost += SP.cost - .["deniedrequests"] += list(list("id" = SO.id, "orderer" = SO.orderer, "orderer_rank" = SO.orderer_rank, "reason" = SO.reason, "cost" = cost, "packs" = packs, "authed_by" = SO.authorised_by)) - .["approvedrequests"] = list() - for(var/i in length(SSpoints.approvedrequests) to 1 step -1) - var/datum/supply_order/SO = SSpoints.approvedrequests[SSpoints.approvedrequests[i]] - if(SO.faction != user.faction) - continue - var/list/packs = list() - var/cost = 0 - for(var/P in SO.pack) - var/datum/supply_packs/SP = P - if(packs[SP.type]) - packs[SP.type] += 1 - else - packs[SP.type] = 1 - cost += SP.cost - .["approvedrequests"] += list(list("id" = SO.id, "orderer" = SO.orderer, "orderer_rank" = SO.orderer_rank, "reason" = SO.reason, "cost" = cost, "packs" = packs, "authed_by" = SO.authorised_by)) - .["awaiting_delivery"] = list() - .["awaiting_delivery_orders"] = 0 - for(var/key in SSpoints.shoppinglist[faction]) - var/datum/supply_order/SO = LAZYACCESSASSOC(SSpoints.shoppinglist, faction, key) - .["awaiting_delivery_orders"]++ - var/list/packs = list() - var/cost = 0 - for(var/P in SO.pack) - var/datum/supply_packs/SP = P - if(packs[SP.type]) - packs[SP.type] += 1 - else - packs[SP.type] = 1 - cost += SP.cost - .["awaiting_delivery"] += list(list("id" = SO.id, "orderer" = SO.orderer, "orderer_rank" = SO.orderer_rank, "reason" = SO.reason, "cost" = cost, "packs" = packs, "authed_by" = SO.authorised_by)) - .["export_history"] = list() - var/id = 0 - var/lastexport = "" - for(var/datum/export_report/report AS in SSpoints.export_history) - if(report.faction != user.faction) - continue - if(report.points == 0) - continue - if(report.export_name == lastexport) - .["export_history"][id]["amount"] += 1 - .["export_history"][id]["total"] += report.points - else - .["export_history"] += list(list("id" = id, "name" = report.export_name, "points" = report.points, "amount" = 1, total = report.points)) - id++ - lastexport = report.export_name - .["shopping_history"] = list() - for(var/datum/supply_order/SO AS in SSpoints.shopping_history) - if(SO.faction != user.faction) - continue - var/list/packs = list() - var/cost = 0 - for(var/P in SO.pack) - var/datum/supply_packs/SP = P - if(packs[SP.type]) - packs[SP.type] += 1 - else - packs[SP.type] = 1 - cost += SP.cost - .["shopping_history"] += list(list("id" = SO.id, "orderer" = SO.orderer, "orderer_rank" = SO.orderer_rank, "reason" = SO.reason, "cost" = cost, "packs" = packs, "authed_by" = SO.authorised_by)) - .["shopping_list_cost"] = 0 - .["shopping_list_items"] = 0 - .["shopping_list"] = list() - for(var/i in SSpoints.shopping_cart) - var/datum/supply_packs/SP = SSpoints.supply_packs[i] - .["shopping_list_items"] += SSpoints.shopping_cart[i] - .["shopping_list_cost"] += SP.cost * SSpoints.shopping_cart[SP.type] - .["shopping_list"][SP.type] = list("count" = SSpoints.shopping_cart[SP.type]) - if(supply_shuttle) - if(supply_shuttle?.mode == SHUTTLE_CALL) - if(is_mainship_level(supply_shuttle.destination.z)) - .["elevator"] = "Raising" - .["elevator_dir"] = "up" - else - .["elevator"] = "Lowering" - .["elevator_dir"] = "down" - else if(supply_shuttle?.mode == SHUTTLE_IDLE) - if(is_mainship_level(supply_shuttle.z)) - .["elevator"] = "Raised" - .["elevator_dir"] = "down" - else - .["elevator"] = "Lowered" - .["elevator_dir"] = "up" - else - if(is_mainship_level(supply_shuttle.z)) - .["elevator"] = "Lowering" - .["elevator_dir"] = "down" - else - .["elevator"] = "Raising" - .["elevator_dir"] = "up" - else - .["elevator"] = "MISSING!" - .["beacon"] = length(GLOB.supply_beacon) ? TRUE : FALSE - -/datum/supply_ui/proc/get_shopping_cart(mob/user) - return SSpoints.shopping_cart - -/datum/supply_ui/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - switch(action) - if("cart") - var/datum/supply_packs/P = SSpoints.supply_packs[text2path(params["id"])] - if(!P) - return - var/shopping_cart = get_shopping_cart(ui.user) - switch(params["mode"]) - if("removeall") - shopping_cart -= P.type - if("removeone") - if(shopping_cart[P.type] > 1) - shopping_cart[P.type]-- - else - shopping_cart -= P.type - if("addone") - if(shopping_cart[P.type]) - shopping_cart[P.type]++ - else - shopping_cart[P.type] = 1 - if("addall") - var/mob/living/ui_user = ui.user - var/cart_cost = 0 - for(var/i in shopping_cart) - var/datum/supply_packs/SP = SSpoints.supply_packs[i] - cart_cost += SP.cost * shopping_cart[SP.type] - var/excess_points = SSpoints.supply_points[ui_user.faction] - cart_cost - var/number_to_buy = min(round(excess_points / P.cost), 20) //hard cap at 20 - if(shopping_cart[P.type]) - shopping_cart[P.type] += number_to_buy - else - shopping_cart[P.type] = number_to_buy - . = TRUE - if("send") - if(supply_shuttle.mode != SHUTTLE_IDLE) - return - if(is_mainship_level(supply_shuttle.z)) - if (!supply_shuttle.check_blacklist()) - to_chat(usr, "For safety reasons, the Automated Storage and Retrieval System cannot store live, friendlies, classified nuclear weaponry or homing beacons.") - playsound(supply_shuttle.return_center_turf(), 'sound/machines/buzz-two.ogg', 50, 0) - else - playsound(supply_shuttle.return_center_turf(), 'sound/machines/elevator_move.ogg', 50, 0) - SSshuttle.moveShuttleToTransit(shuttle_id, TRUE) - addtimer(CALLBACK(supply_shuttle, TYPE_PROC_REF(/obj/docking_port/mobile/supply, sell)), 15 SECONDS) - else - var/obj/docking_port/D = SSshuttle.getDock(home_id) - supply_shuttle.buy(usr, src) - playsound(D.return_center_turf(), 'sound/machines/elevator_move.ogg', 50, 0) - SSshuttle.moveShuttle(shuttle_id, home_id, TRUE) - . = TRUE - if("approve") - var/datum/supply_order/O = SSpoints.requestlist["[params["id"]]"] - if(!O) - O = SSpoints.deniedrequests["[params["id"]]"] - if(!O) - return - SSpoints.approve_request(O, ui.user) - . = TRUE - if("deny") - var/datum/supply_order/O = SSpoints.requestlist["[params["id"]]"] - if(!O) - return - SSpoints.deny_request(O) - . = TRUE - if("approveall") - for(var/i in SSpoints.requestlist) - var/datum/supply_order/O = SSpoints.requestlist[i] - SSpoints.approve_request(O, ui.user) - . = TRUE - if("denyall") - for(var/i in SSpoints.requestlist) - var/datum/supply_order/O = SSpoints.requestlist[i] - SSpoints.deny_request(O) - . = TRUE - if("buycart") - SSpoints.buy_cart(ui.user) - . = TRUE - if("clearcart") - var/list/shopping_cart = get_shopping_cart(ui.user) - shopping_cart.Cut() - . = TRUE - if("buypersonal") - SSpoints.buy_using_psp(ui.user) - . = TRUE - if("delivery") - var/datum/supply_order/O = SSpoints.shoppinglist[faction]["[params["id"]]"] - if(!O) - return - SSpoints.fast_delivery(O, ui.user) - . = TRUE - -/datum/supply_ui/requests - tgui_name = "CargoRequest" - -// yes these are copy pasted from above because SPEEEEEEEEEEEEED -/datum/supply_ui/requests/ui_static_data(mob/user) - . = list() - .["categories"] = GLOB.all_supply_groups - .["supplypacks"] = SSpoints.supply_packs_ui - .["supplypackscontents"] = SSpoints.supply_packs_contents - -/datum/supply_ui/requests/ui_data(mob/living/user) - . = list() - .["currentpoints"] = round(SSpoints.supply_points[user.faction]) - .["personalpoints"] = round(SSpoints.personal_supply_points[user.ckey]) - .["requests"] = list() - for(var/i in SSpoints.requestlist) - var/datum/supply_order/SO = SSpoints.requestlist[i] - if(SO.faction != user.faction) - continue - var/list/packs = list() - var/cost = 0 - for(var/P in SO.pack) - var/datum/supply_packs/SP = P - if(packs[SP.type]) - packs[SP.type] += 1 - else - packs[SP.type] = 1 - cost += SP.cost - .["requests"] += list(list("id" = SO.id, "orderer" = SO.orderer, "orderer_rank" = SO.orderer_rank, "reason" = SO.reason, "cost" = cost, "packs" = packs, "authed_by" = SO.authorised_by)) - .["deniedrequests"] = list() - for(var/i in length(SSpoints.deniedrequests) to 1 step -1) - var/datum/supply_order/SO = SSpoints.deniedrequests[SSpoints.deniedrequests[i]] - if(SO.faction != user.faction) - continue - var/list/packs = list() - var/cost = 0 - for(var/P in SO.pack) - var/datum/supply_packs/SP = P - if(packs[SP.type]) - packs[SP.type] += 1 - else - packs[SP.type] = 1 - cost += SP.cost - .["deniedrequests"] += list(list("id" = SO.id, "orderer" = SO.orderer, "orderer_rank" = SO.orderer_rank, "reason" = SO.reason, "cost" = cost, "packs" = packs, "authed_by" = SO.authorised_by)) - .["approvedrequests"] = list() - for(var/i in length(SSpoints.approvedrequests) to 1 step -1) - var/datum/supply_order/SO = SSpoints.approvedrequests[SSpoints.approvedrequests[i]] - if(SO.faction != user.faction) - continue - var/list/packs = list() - var/cost = 0 - for(var/P in SO.pack) - var/datum/supply_packs/SP = P - if(packs[SP.type]) - packs[SP.type] += 1 - else - packs[SP.type] = 1 - cost += SP.cost - .["approvedrequests"] += list(list("id" = SO.id, "orderer" = SO.orderer, "orderer_rank" = SO.orderer_rank, "reason" = SO.reason, "cost" = cost, "packs" = packs, "authed_by" = SO.authorised_by)) - .["awaiting_delivery"] = list() - .["awaiting_delivery_orders"] = 0 - for(var/key in SSpoints.shoppinglist[faction]) - //only own orders - var/datum/supply_order/SO = LAZYACCESSASSOC(SSpoints.shoppinglist, faction, key) - if(user.real_name == SO.orderer) - .["awaiting_delivery_orders"]++ - var/list/packs = list() - var/cost = 0 - for(var/P in SO.pack) - var/datum/supply_packs/SP = P - if(packs[SP.type]) - packs[SP.type] += 1 - else - packs[SP.type] = 1 - cost += SP.cost - .["awaiting_delivery"] += list(list("id" = SO.id, "orderer" = SO.orderer, "orderer_rank" = SO.orderer_rank, "reason" = SO.reason, "cost" = cost, "packs" = packs, "authed_by" = SO.authorised_by)) - if(!SSpoints.request_shopping_cart[user.ckey]) - SSpoints.request_shopping_cart[user.ckey] = list() - .["shopping_list_cost"] = 0 - .["shopping_list_items"] = 0 - .["shopping_list"] = list() - for(var/i in SSpoints.request_shopping_cart[user.ckey]) - var/datum/supply_packs/SP = SSpoints.supply_packs[i] - .["shopping_list_items"] += SSpoints.request_shopping_cart[user.ckey][i] - .["shopping_list_cost"] += SP.cost * SSpoints.request_shopping_cart[user.ckey][SP.type] - .["shopping_list"][SP.type] = list("count" = SSpoints.request_shopping_cart[user.ckey][SP.type]) - .["beacon"] = length(GLOB.supply_beacon) ? TRUE : FALSE - -/datum/supply_ui/requests/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return TRUE - switch(action) - if("submitrequest") - SSpoints.submit_request(ui.user, params["reason"]) - . = TRUE - -/datum/supply_ui/requests/get_shopping_cart(mob/user) - return SSpoints.request_shopping_cart[user.ckey] - -/obj/machinery/computer/ordercomp - name = "Supply ordering console" - icon = 'icons/obj/machines/computer.dmi' - icon_state = "computer" - screen_overlay = "request" - broken_icon = "computer_orange_broken" - circuit = /obj/item/circuitboard/computer/ordercomp - var/datum/supply_ui/requests/SU - -/obj/machinery/computer/ordercomp/interact(mob/user) - . = ..() - if(.) - return - if(!allowed(user)) - return - if(!SU) - SU = new(src) - return SU.interact(user) - -/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 - -/obj/docking_port/mobile/supply/vehicle - railing_gear_name = "vehicle" - id = SHUTTLE_VEHICLE_SUPPLY - home_id = "vehicle_home" - -/obj/docking_port/mobile/supply/vehicle/buy(mob/user, datum/supply_ui/supply_ui) - var/datum/supply_ui/vehicles/veh_ui = supply_ui - if(!veh_ui || !veh_ui.current_veh_type) - return - var/obj/vehicle/sealed/armored/tanktype = veh_ui.current_veh_type - var/is_assault = initial(tanktype.flags_armored) & ARMORED_PURCHASABLE_ASSAULT - if(GLOB.purchased_tanks[user.faction]?["[is_assault]"]) - to_chat(usr, span_danger("A vehicle of this type has already been purchased!")) - return - if(!GLOB.purchased_tanks[user.faction]) - GLOB.purchased_tanks[user.faction] = list() - GLOB.purchased_tanks[user.faction]["[is_assault]"] += 1 - var/obj/vehicle/sealed/armored/tank = new tanktype(loc) - if(veh_ui.current_primary) - var/obj/item/armored_weapon/gun = new veh_ui.current_primary(loc) - gun.attach(tank, TRUE) - if(veh_ui.current_secondary) - var/obj/item/armored_weapon/gun = new veh_ui.current_secondary(loc) - gun.attach(tank, FALSE) - if(veh_ui.current_driver_mod) - var/obj/item/tank_module/mod = new veh_ui.current_driver_mod(loc) - mod.on_equip(tank) - if(veh_ui.current_gunner_mod) - var/obj/item/tank_module/mod = new veh_ui.current_gunner_mod(loc) - mod.on_equip(tank) - if(length(veh_ui.primary_ammo)) - var/turf/dumploc = get_step(get_step(loc, NORTH), NORTH) // todo should autoload depending on tank prolly - for(var/ammo in veh_ui.primary_ammo) - for(var/i=1 to veh_ui.primary_ammo[ammo]) - new ammo(dumploc) - if(length(veh_ui.secondary_ammo)) - var/turf/dumploc = get_step(get_step(loc, NORTH), NORTH) // todo should autoload depending on tank prolly - for(var/ammo in veh_ui.secondary_ammo) - for(var/i=1 to veh_ui.secondary_ammo[ammo]) - new ammo(dumploc) - -/obj/docking_port/stationary/supply/vehicle - id = "vehicle_home" - roundstart_template = /datum/map_template/shuttle/supply/vehicle - - - -GLOBAL_LIST_EMPTY(armored_gunammo) -GLOBAL_LIST_EMPTY(armored_modtypes) -GLOBAL_LIST_INIT(armored_guntypes, armored_init_guntypes()) -GLOBAL_LIST_EMPTY(purchased_tanks) -#define DEFAULT_MAX_ARMORED_AMMO 20 - -///im a lazy bum who cant use initial on lists, so we just load everything into a list -/proc/armored_init_guntypes() - . = list() - for(var/obj/vehicle/sealed/armored/vehtype AS in typesof(/obj/vehicle/sealed/armored)) - vehtype = new vehtype - GLOB.armored_modtypes[vehtype.type] = vehtype.permitted_mods - .[vehtype.type] = vehtype.permitted_weapons - qdel(vehtype) - for(var/obj/item/armored_weapon/gun AS in typesof(/obj/item/armored_weapon)) - gun = new gun - GLOB.armored_gunammo[gun.type] = gun.accepted_ammo - qdel(gun) - -/datum/supply_ui/vehicles - tgui_name = "VehicleSupply" - shuttle_id = SHUTTLE_VEHICLE_SUPPLY - home_id = "vehicle_home" - /// current selected vehicles typepath - var/current_veh_type - /// current selected primary weapons typepath - var/current_primary - /// current selected secondaryies typepath - var/current_secondary - /// current driver mod typepath - var/current_driver_mod - /// current gunner mod typepath - var/current_gunner_mod - /// current primary ammo list, type = count - var/list/primary_ammo = list() - /// current secondary ammo list, type = count - var/list/secondary_ammo = list() - -/datum/supply_ui/vehicles/ui_static_data(mob/user) - var/list/data = list() - for(var/obj/vehicle/sealed/armored/vehtype AS in typesof(/obj/vehicle/sealed/armored)) - var/flags = vehtype::flags_armored - - if(flags & ARMORED_PURCHASABLE_TRANSPORT) - if(user.skills.getRating(SKILL_LARGE_VEHICLE) < SKILL_LARGE_VEHICLE_EXPERIENCED) - continue - else if(flags & ARMORED_PURCHASABLE_ASSAULT) - if(user.skills.getRating(SKILL_LARGE_VEHICLE) < SKILL_LARGE_VEHICLE_VETERAN) - continue - else - continue - - data["vehicles"] += list(list("name" = initial(vehtype.name), "desc" = initial(vehtype.desc), "type" = "[vehtype]", "isselected" = (vehtype == current_veh_type))) - if(vehtype != current_veh_type) - continue - for(var/obj/item/armored_weapon/gun AS in GLOB.armored_guntypes[vehtype]) - var/primary_selected = (current_primary == gun) - var/secondary_selected = (current_secondary == gun) - if(initial(gun.weapon_slot) & MODULE_PRIMARY) - data["primaryWeapons"] += list(list( - "name" = initial(gun.name), - "desc" = initial(gun.desc), - "type" = gun, - "isselected" = primary_selected, - )) - if(primary_selected) - for(var/obj/item/ammo_magazine/mag AS in primary_ammo) - data["primaryammotypes"] += list(list( - "name" = initial(mag.name), - "type" = mag, - "current" = primary_ammo[mag], - "max" = DEFAULT_MAX_ARMORED_AMMO, //TODO make vehicle ammo dynamic instead of fixed number - )) - - if(initial(gun.weapon_slot) & MODULE_SECONDARY) - data["secondaryWeapons"] += list(list( - "name" = initial(gun.name), - "desc" = initial(gun.desc), - "type" = gun, - "isselected" = secondary_selected, - )) - if(secondary_selected) - for(var/obj/item/ammo_magazine/mag AS in secondary_ammo) - data["secondarymmotypes"] += list(list( - "name" = initial(mag.name), - "type" = mag, - "current" = secondary_ammo[mag], - "max" = DEFAULT_MAX_ARMORED_AMMO, //TODO make vehicle ammo dynamic instead of fixed number - )) - - for(var/obj/item/tank_module/mod AS in GLOB.armored_modtypes[vehtype]) - if(initial(mod.is_driver_module)) - data["driverModules"] += list(list( - "name" = initial(mod.name), - "desc" = initial(mod.desc), - "type" = mod, - "isselected" = (current_driver_mod == mod), - )) - else - data["gunnerModules"] += list(list( - "name" = initial(mod.name), - "desc" = initial(mod.desc), - "type" = mod, - "isselected" = (current_gunner_mod == mod), - )) - return data - -/datum/supply_ui/vehicles/ui_data(mob/living/user) - var/list/data = list() - if(supply_shuttle) - if(supply_shuttle?.mode == SHUTTLE_CALL) - if(is_mainship_level(supply_shuttle.destination.z)) - data["elevator"] = "Raising" - data["elevator_dir"] = "up" - else - data["elevator"] = "Lowering" - data["elevator_dir"] = "down" - else if(supply_shuttle?.mode == SHUTTLE_IDLE) - if(is_mainship_level(supply_shuttle.z)) - data["elevator"] = "Raised" - data["elevator_dir"] = "down" - else if(current_veh_type) - data["elevator"] = "Purchase" - data["elevator_dir"] = "store" - else - data["elevator"] = "Lowered" - data["elevator_dir"] = "up" - else - if(is_mainship_level(supply_shuttle.z)) - data["elevator"] = "Lowering" - data["elevator_dir"] = "down" - else - data["elevator"] = "Raising" - data["elevator_dir"] = "up" - else - data["elevator"] = "MISSING!" - return data - -/datum/supply_ui/vehicles/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - - switch(action) - if("setvehicle") - var/newtype = text2path(params["type"]) - if(!ispath(newtype, /obj/vehicle/sealed/armored)) - return - var/obj/vehicle/sealed/armored/tank_type = newtype - var/is_assault = initial(tank_type.flags_armored) & ARMORED_PURCHASABLE_ASSAULT - if(GLOB.purchased_tanks[usr.faction]?["[is_assault]"]) - to_chat(usr, span_danger("A vehicle of this type has already been purchased!")) - return - current_veh_type = newtype - current_primary = null // set everything to null, to avoid bugs - current_secondary = null - current_driver_mod = null - current_gunner_mod = null - primary_ammo = list() - secondary_ammo = list() - . = TRUE - - if("setprimary") - if(!current_veh_type) - return - var/newtype = text2path(params["type"]) - if(!(newtype in GLOB.armored_guntypes[current_veh_type])) - return - current_primary = newtype - var/list/assoc_cast = GLOB.armored_gunammo[newtype] - primary_ammo = assoc_cast.Copy() - for(var/ammo in primary_ammo) - primary_ammo[ammo] = 0 - . = TRUE - - if("setsecondary") - if(!current_veh_type) - return - var/newtype = text2path(params["type"]) - if(!(newtype in GLOB.armored_guntypes[current_veh_type])) - return - current_secondary = newtype - var/list/assoc_cast = GLOB.armored_gunammo[newtype] - secondary_ammo = assoc_cast.Copy() - for(var/ammo in secondary_ammo) - secondary_ammo[ammo] = 0 - . = TRUE - - if("set_ammo_primary") - if(!current_primary) - return - var/newtype = text2path(params["type"]) - if(!(newtype in primary_ammo)) - return - var/non_adjusted_total = 0 - for(var/ammo in primary_ammo) - if(ammo == newtype) - continue - non_adjusted_total += primary_ammo[ammo] - var/newvalue = clamp(params["new_value"], 0, DEFAULT_MAX_ARMORED_AMMO-non_adjusted_total) - primary_ammo[newtype] = newvalue - . = TRUE - - if("set_ammo_secondary") - if(!current_secondary) - return - var/newtype = text2path(params["type"]) - if(!(newtype in secondary_ammo)) - return - var/non_adjusted_total = 0 - for(var/ammo in secondary_ammo) - if(ammo == newtype) - continue - non_adjusted_total += secondary_ammo[ammo] - var/newvalue = clamp(params["new_value"], 0, DEFAULT_MAX_ARMORED_AMMO-non_adjusted_total) - secondary_ammo[newtype] = newvalue - . = TRUE - - if("set_driver_mod") - if(!current_veh_type) - return - var/newtype = text2path(params["type"]) - if(!ispath(newtype, /obj/item/tank_module)) - return - if(!(newtype in GLOB.armored_modtypes[current_veh_type])) - return - current_driver_mod = newtype - . = TRUE - - if("set_gunner_mod") - if(!current_veh_type) - return - var/newtype = text2path(params["type"]) - if(!ispath(newtype, /obj/item/tank_module)) - return - if(!(newtype in GLOB.armored_modtypes[current_veh_type])) - return - current_gunner_mod = newtype - . = TRUE - - if("deploy") - if(supply_shuttle.mode != SHUTTLE_IDLE) - to_chat(usr, span_danger("Elevator moving!")) - return - if(is_mainship_level(supply_shuttle.z)) - to_chat(usr, span_danger("Elevator raised. Lower to deploy vehicle.")) - return - supply_shuttle.buy(usr, src) - ui_act("send", params, ui, state) - SStgui.close_user_uis(usr, src) - current_veh_type = null - current_primary = null - current_secondary = null - current_driver_mod = null - current_gunner_mod = null - primary_ammo = list() - secondary_ammo = list() - update_static_data(usr) - - if(.) - update_static_data(usr) diff --git a/code/modules/reqs/computer.dm b/code/modules/reqs/computer.dm new file mode 100644 index 00000000000..d8a60503b07 --- /dev/null +++ b/code/modules/reqs/computer.dm @@ -0,0 +1,52 @@ +/obj/machinery/computer/supplycomp + name = "ASRS console" + desc = "A console for an Automated Storage and Retrieval System" + icon = 'icons/obj/machines/computer.dmi' + icon_state = "computer" + screen_overlay = "supply" + req_access = list(ACCESS_MARINE_CARGO) + circuit = /obj/item/circuitboard/computer/supplycomp + var/datum/supply_ui/supply_ui + ///Id of the shuttle controlled + var/shuttle_id = SHUTTLE_SUPPLY + /// Id of the home docking port + var/home_id = "supply_home" + /// Faction of the computer + var/faction = FACTION_TERRAGOV + +/obj/machinery/computer/supplycomp/crash + req_access = list() //So marines can access cargo stuff without relying on synth spawn + desc = "A console for an Automated Storage and Retrieval System. This version somehow does not require special access." + resistance_flags = RESIST_ALL + +/obj/machinery/computer/supplycomp/interact(mob/user) + . = ..() + if(.) + return + if(isliving(user) && !allowed(user)) + return + if(!supply_ui) + supply_ui = new(src) + supply_ui.shuttle_id = shuttle_id + supply_ui.home_id = home_id + supply_ui.faction = faction + return supply_ui.interact(user) + +/obj/machinery/computer/ordercomp + name = "Supply ordering console" + icon = 'icons/obj/machines/computer.dmi' + icon_state = "computer" + screen_overlay = "request" + broken_icon = "computer_orange_broken" + circuit = /obj/item/circuitboard/computer/ordercomp + var/datum/supply_ui/requests/supply_ui + +/obj/machinery/computer/ordercomp/interact(mob/user) + . = ..() + if(.) + return + if(!allowed(user)) + return + if(!supply_ui) + supply_ui = new(src) + return supply_ui.interact(user) diff --git a/code/modules/reqs/elevator.dm b/code/modules/reqs/elevator.dm new file mode 100644 index 00000000000..53362324d42 --- /dev/null +++ b/code/modules/reqs/elevator.dm @@ -0,0 +1,227 @@ +GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( + /mob/living, + /obj/item/disk/nuclear, + /obj/item/radio/beacon, + /obj/vehicle, +))) + +/obj/docking_port/stationary/supply + id = "supply_home" + roundstart_template = /datum/map_template/shuttle/supply + width = 5 + dwidth = 2 + dheight = 2 + height = 5 + +/obj/docking_port/mobile/supply + name = "supply shuttle" + id = SHUTTLE_SUPPLY + callTime = 15 SECONDS + + dir = WEST + port_direction = EAST + width = 5 + dwidth = 2 + dheight = 2 + height = 5 + movement_force = list("KNOCKDOWN" = 0, "THROW" = 0) + use_ripples = FALSE + var/list/gears = list() + var/list/obj/machinery/door/poddoor/railing/railings = list() + ///The faction of this docking port (aka, on which ship it is located) + var/faction = FACTION_TERRAGOV + /// Id of the home docking port + var/home_id = "supply_home" + ///prefix for railings and gear todo should probbaly be defines instead? + var/railing_gear_name = "supply" + +/obj/docking_port/mobile/supply/Destroy(force) + for(var/i in railings) + var/obj/machinery/door/poddoor/railing/railing = i + railing.linked_pad = null + railings.Cut() + return ..() + +/obj/docking_port/mobile/supply/afterShuttleMove() + . = ..() + if(getDockedId() != home_id) + return + for(var/j in railings) + var/obj/machinery/door/poddoor/railing/our_railing = j + our_railing.open() + +/obj/docking_port/mobile/supply/on_ignition() + if(getDockedId() == home_id) + for(var/j in railings) + var/obj/machinery/door/poddoor/railing/our_railing = j + our_railing.close() + for(var/i in gears) + var/obj/machinery/gear/our_gear = i + our_gear.start_moving(NORTH) + else + for(var/i in gears) + var/obj/machinery/gear/our_gear = i + our_gear.start_moving(SOUTH) + +/obj/docking_port/mobile/supply/register() + . = ..() + for(var/obj/machinery/gear/our_gear in GLOB.machines) + if(our_gear.id != (railing_gear_name + "_elevator_gear")) + continue + gears += our_gear + RegisterSignal(our_gear, COMSIG_QDELETING, PROC_REF(clean_gear)) + for(var/obj/machinery/door/poddoor/railing/our_railing in GLOB.machines) + if(our_railing.id != (railing_gear_name + "_elevator_railing")) + continue + railings += our_railing + RegisterSignal(our_railing, COMSIG_QDELETING, PROC_REF(clean_railing)) + our_railing.linked_pad = src + our_railing.open() + +///Signal handler when a gear is destroyed +/obj/docking_port/mobile/supply/proc/clean_gear(datum/source) + SIGNAL_HANDLER + gears -= source + +///Signal handler when a railing is destroyed +/obj/docking_port/mobile/supply/proc/clean_railing(datum/source) + SIGNAL_HANDLER + railings -= source + +/obj/docking_port/mobile/supply/canMove() + if(is_station_level(z)) + return check_blacklist(shuttle_areas) + return ..() + +/obj/docking_port/mobile/supply/proc/check_blacklist(areaInstances) + if(!areaInstances) + areaInstances = shuttle_areas + for(var/place in areaInstances) + var/area/shuttle/shuttle_area = place + for(var/trf in shuttle_area) + var/turf/T = trf + for(var/a in T.GetAllContents()) + if(isxeno(a)) + var/mob/living/L = a + if(L.stat == DEAD) + continue + if(ishuman(a)) + var/mob/living/carbon/human/human_to_sell = a + if(human_to_sell.stat == DEAD && can_sell_human_body(human_to_sell, faction)) + continue + if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types)) + return FALSE + return TRUE + +/obj/docking_port/mobile/supply/request(obj/docking_port/stationary/S) + if(mode != SHUTTLE_IDLE) + return 2 + return ..() + +/obj/docking_port/mobile/supply/proc/buy(mob/user, datum/supply_ui/supply_ui) + if(!length(SSpoints.shoppinglist[faction])) + return + log_game("Supply pack orders have been purchased by [key_name(user)]") + + var/list/empty_turfs = list() + for(var/place in shuttle_areas) + var/area/shuttle/shuttle_area = place + for(var/turf/open/floor/T in shuttle_area) + if(is_blocked_turf(T)) + continue + empty_turfs += T + + for(var/i in SSpoints.shoppinglist[faction]) + if(!length(empty_turfs)) + break + var/datum/supply_order/our_order = LAZYACCESSASSOC(SSpoints.shoppinglist, faction, i) + + var/datum/supply_packs/firstpack = our_order.pack[1] + + var/obj/structure/crate_type = firstpack.containertype || firstpack.contains[1] + + var/obj/structure/our_structure = new crate_type(pick_n_take(empty_turfs)) + if(firstpack.containertype) + our_structure.name = "Order #[our_order.id] for [our_order.orderer]" + + var/list/contains = list() + //spawn the stuff, finish generating the manifest while you're at it + for(var/P in our_order.pack) + var/datum/supply_packs/our_pack = P + // yes i know + if(our_pack.access) + our_structure.req_access = list() + our_structure.req_access += text2num(our_pack.access) + + if(our_pack.randomised_num_contained) + if(length(our_pack.contains)) + for(var/j in 1 to our_pack.randomised_num_contained) + contains += pick(our_pack.contains) + else + contains += our_pack.contains + + for(var/typepath in contains) + if(!typepath) + continue + if(!firstpack.containertype) + break + new typepath(our_structure) + + SSpoints.shoppinglist[faction] -= "[our_order.id]" + SSpoints.shopping_history += our_order + +/obj/docking_port/mobile/supply/proc/sell() + for(var/place in shuttle_areas) + var/area/shuttle/shuttle_area = place + for(var/atom/movable/AM in shuttle_area) + if(AM.anchored) + continue + var/datum/export_report = AM.supply_export(faction) + if(export_report) + SSpoints.export_history += export_report + qdel(AM) + +/obj/docking_port/mobile/supply/vehicle + railing_gear_name = "vehicle" + id = SHUTTLE_VEHICLE_SUPPLY + home_id = "vehicle_home" + +/obj/docking_port/mobile/supply/vehicle/buy(mob/user, datum/supply_ui/supply_ui) + var/datum/supply_ui/vehicles/veh_ui = supply_ui + if(!veh_ui || !veh_ui.current_veh_type) + return + var/obj/vehicle/sealed/armored/tanktype = veh_ui.current_veh_type + var/is_assault = initial(tanktype.flags_armored) & ARMORED_PURCHASABLE_ASSAULT + if(GLOB.purchased_tanks[user.faction]?["[is_assault]"]) + to_chat(usr, span_danger("A vehicle of this type has already been purchased!")) + return + if(!GLOB.purchased_tanks[user.faction]) + GLOB.purchased_tanks[user.faction] = list() + GLOB.purchased_tanks[user.faction]["[is_assault]"] += 1 + var/obj/vehicle/sealed/armored/tank = new tanktype(loc) + if(veh_ui.current_primary) + var/obj/item/armored_weapon/gun = new veh_ui.current_primary(loc) + gun.attach(tank, TRUE) + if(veh_ui.current_secondary) + var/obj/item/armored_weapon/gun = new veh_ui.current_secondary(loc) + gun.attach(tank, FALSE) + if(veh_ui.current_driver_mod) + var/obj/item/tank_module/mod = new veh_ui.current_driver_mod(loc) + mod.on_equip(tank) + if(veh_ui.current_gunner_mod) + var/obj/item/tank_module/mod = new veh_ui.current_gunner_mod(loc) + mod.on_equip(tank) + if(length(veh_ui.primary_ammo)) + var/turf/dumploc = get_step(get_step(loc, NORTH), NORTH) // todo should autoload depending on tank prolly + for(var/ammo in veh_ui.primary_ammo) + for(var/i=1 to veh_ui.primary_ammo[ammo]) + new ammo(dumploc) + if(length(veh_ui.secondary_ammo)) + var/turf/dumploc = get_step(get_step(loc, NORTH), NORTH) // todo should autoload depending on tank prolly + for(var/ammo in veh_ui.secondary_ammo) + for(var/i=1 to veh_ui.secondary_ammo[ammo]) + new ammo(dumploc) + +/obj/docking_port/stationary/supply/vehicle + id = "vehicle_home" + roundstart_template = /datum/map_template/shuttle/supply/vehicle diff --git a/code/modules/reqs/_supplypacks.dm b/code/modules/reqs/supplypacks/_supplypacks.dm similarity index 82% rename from code/modules/reqs/_supplypacks.dm rename to code/modules/reqs/supplypacks/_supplypacks.dm index acae4c0c975..10be13f685c 100644 --- a/code/modules/reqs/_supplypacks.dm +++ b/code/modules/reqs/supplypacks/_supplypacks.dm @@ -3,7 +3,7 @@ //NOTE: Don't add living things to crates, that's bad, it will break the shuttle. //NOTE: Do NOT set the price of any crates below 7 points. Doing so allows infinite points. -GLOBAL_LIST_INIT(all_supply_groups, list("Operations", "Weapons", "Explosives", "Armor", "Clothing", "Medical", "Engineering", "Supplies", "Imports", "Vehicles", "Factory")) +GLOBAL_LIST_INIT(all_supply_groups, list("Operations", "Weapons", "Smartguns", "Stationary", "Launchers", "Explosives", "Armor", "Clothing", "Medical", "Engineering", "Supplies", "Imports", "Vehicles", "Factory")) /datum/supply_packs var/name diff --git a/code/modules/reqs/armor.dm b/code/modules/reqs/supplypacks/armor.dm similarity index 99% rename from code/modules/reqs/armor.dm rename to code/modules/reqs/supplypacks/armor.dm index 0c44b1efb7f..6df2f7c5286 100644 --- a/code/modules/reqs/armor.dm +++ b/code/modules/reqs/supplypacks/armor.dm @@ -86,7 +86,7 @@ /obj/item/armor_module/module/mimir_environment_protection/mimir_helmet, /obj/item/armor_module/module/mimir_environment_protection, ) - cost = 120 + cost = 160 /datum/supply_packs/armor/modular/attachments/artemis_mark_two name = "Freyr Mark 2 helmet module" diff --git a/code/modules/reqs/clothing.dm b/code/modules/reqs/supplypacks/clothing.dm similarity index 94% rename from code/modules/reqs/clothing.dm rename to code/modules/reqs/supplypacks/clothing.dm index 951272cbfdf..6c52f46f66d 100644 --- a/code/modules/reqs/clothing.dm +++ b/code/modules/reqs/supplypacks/clothing.dm @@ -22,6 +22,11 @@ contains = list(/obj/item/storage/backpack/marine/radiopack) cost = 20 +/datum/supply_packs/clothing/auto_catch_belt + name = "M344 pattern ammo load rig" + contains = list(/obj/item/storage/belt/marine/auto_catch) + cost = 50 + /datum/supply_packs/clothing/technician_pack name = "Engineering Technician Pack" contains = list(/obj/item/storage/backpack/marine/tech) diff --git a/code/modules/reqs/engineering.dm b/code/modules/reqs/supplypacks/engineering.dm similarity index 96% rename from code/modules/reqs/engineering.dm rename to code/modules/reqs/supplypacks/engineering.dm index 0b4ed6d5aeb..c6c8d04631c 100644 --- a/code/modules/reqs/engineering.dm +++ b/code/modules/reqs/supplypacks/engineering.dm @@ -43,6 +43,11 @@ contains = list(/obj/item/stack/sheet/mineral/junk/large_stack) cost = 300 +/datum/supply_packs/engineering/handheld_charger + name = "handheld charger" + contains = list(/obj/item/tool/handheld_charger) + cost = 80 + /datum/supply_packs/engineering/plasmacutter name = "plasma cutter" contains = list(/obj/item/tool/pickaxe/plasmacutter/) diff --git a/code/modules/reqs/explosives.dm b/code/modules/reqs/supplypacks/explosives.dm similarity index 98% rename from code/modules/reqs/explosives.dm rename to code/modules/reqs/supplypacks/explosives.dm index 3e27266b57f..e97ac91d7a8 100644 --- a/code/modules/reqs/explosives.dm +++ b/code/modules/reqs/supplypacks/explosives.dm @@ -22,7 +22,7 @@ /datum/supply_packs/explosives/stickytanglenades name = "M45-T adhesive tanglefoot grenade" notes = "Contains 25 M45-T sticky grenade" - contains = list(/obj/item/storage/box/visual/grenade/drain) + contains = list(/obj/item/storage/box/visual/grenade/drain/sticky) cost = 300 /datum/supply_packs/explosives/explosives_sticky diff --git a/code/modules/reqs/factory.dm b/code/modules/reqs/supplypacks/factory.dm similarity index 100% rename from code/modules/reqs/factory.dm rename to code/modules/reqs/supplypacks/factory.dm diff --git a/code/modules/reqs/imports.dm b/code/modules/reqs/supplypacks/imports.dm similarity index 95% rename from code/modules/reqs/imports.dm rename to code/modules/reqs/supplypacks/imports.dm index 25821a53b5d..d83c4704a12 100644 --- a/code/modules/reqs/imports.dm +++ b/code/modules/reqs/supplypacks/imports.dm @@ -287,7 +287,18 @@ contains = list(/obj/item/clothing/head/strawhat) cost = 10 +/datum/supply_packs/imports/bricks + name = "Brick" + contains = list(/obj/item/weapon/brick) + cost = 10 + /datum/supply_packs/imports/loot_box name = "Loot box" contains = list(/obj/item/loot_box/marine) cost = 500 + +/datum/supply_packs/imports/loot_pack + name = "TGMC Loot Pack" + notes = "Contains a random, but curated set of items, these packs are valued around 150 to 200 points. Some items can only be acquired from these. Spend responsibly." + contains = list(/obj/item/loot_box/tgmclootbox) + cost = 1000 diff --git a/code/modules/reqs/supplypacks/launchers.dm b/code/modules/reqs/supplypacks/launchers.dm new file mode 100644 index 00000000000..58405e1f611 --- /dev/null +++ b/code/modules/reqs/supplypacks/launchers.dm @@ -0,0 +1,133 @@ +/datum/supply_packs/launchers + containertype = /obj/structure/closet/crate/ammo + group = "Launchers" + +/datum/supply_packs/launchers/rpgoneuse + name = "RL-72 Disposable RPG" + contains = list(/obj/item/weapon/gun/launcher/rocket/oneuse) + cost = 100 + +/datum/supply_packs/launchers/recoillesskit + name = "RL-160 Recoilless rifle kit" + contains = list(/obj/item/storage/holster/backholster/rpg/full) + cost = 400 + +/datum/supply_packs/launchers/shell_regular + name = "RL-160 RR HE shell" + contains = list(/obj/item/ammo_magazine/rocket/recoilless) + cost = 30 + +/datum/supply_packs/launchers/shell_le + name = "RL-160 RR LE shell" + contains = list(/obj/item/ammo_magazine/rocket/recoilless/light) + cost = 30 + +/datum/supply_packs/launchers/shell_heat + name = "RL-160 HEAT shell" + contains = list(/obj/item/ammo_magazine/rocket/recoilless/heat) + cost = 30 + +/datum/supply_packs/launchers/shell_smoke + name = "RL-160 RR Smoke shell" + contains = list(/obj/item/ammo_magazine/rocket/recoilless/smoke) + cost = 30 + +/datum/supply_packs/launchers/shell_cloak + name = "RL-160 RR Cloak shell" + contains = list(/obj/item/ammo_magazine/rocket/recoilless/cloak) + cost = 30 + +/datum/supply_packs/launchers/shell_tangle + name = "RL-160 RR Tanglefoot shell" + contains = list(/obj/item/ammo_magazine/rocket/recoilless/plasmaloss) + cost = 30 + +/datum/supply_packs/launchers/thermobaric + name = "RL-57 Thermobaric Launcher" + contains = list(/obj/item/weapon/gun/launcher/rocket/m57a4/t57) + cost = 500 + +/datum/supply_packs/launchers/thermobaric_wp + name = "RL-57 Thermobaric WP rocket array" + contains = list(/obj/item/ammo_magazine/rocket/m57a4) + cost = 50 + +/datum/supply_packs/launchers/thermobaric + name = "RL-57 Thermobaric Launcher Kit" + contains = list(/obj/item/storage/holster/backholster/rlquad/full) + cost = 550 //launcher + ammo price + +/datum/supply_packs/launchers/sadar + name = "RL-152 SADAR Rocket Launcher" + contains = list(/obj/item/weapon/gun/launcher/rocket/sadar) + cost = SADAR_PRICE + +/datum/supply_packs/launchers/rpg_regular + name = "RL-152 SADAR HE rocket" + contains = list(/obj/item/ammo_magazine/rocket/sadar) + cost = 50 + +/datum/supply_packs/launchers/rpg_regular_unguided + name = "RL-152 SADAR HE rocket (Unguided)" + contains = list(/obj/item/ammo_magazine/rocket/sadar/unguided) + cost = 50 + +/datum/supply_packs/launchers/rpg_ap + name = "RL-152 SADAR AP rocket" + contains = list(/obj/item/ammo_magazine/rocket/sadar/ap) + cost = 60 + +/datum/supply_packs/launchers/rpg_wp + name = "RL-152 SADAR WP rocket" + contains = list(/obj/item/ammo_magazine/rocket/sadar/wp) + cost = 40 + +/datum/supply_packs/launchers/rpg_wp_unguided + name = "RL-152 SADAR WP rocket (Unguided)" + contains = list(/obj/item/ammo_magazine/rocket/sadar/wp/unguided) + cost = 40 + +/datum/supply_packs/launchers/specdemo + name = "RL-152 SADAR Rocket Launcher kit" + contains = list(/obj/item/storage/holster/backholster/rlsadar/full) + cost = SADAR_PRICE + 150 //ammo price + +/datum/supply_packs/launchers/tx54 + name = "GL-54 airburst grenade launcher" + contains = list(/obj/item/weapon/gun/rifle/tx54) + cost = 300 + +/datum/supply_packs/launchers/tx54_airburst + name = "GL-54 airburst grenade magazine" + contains = list(/obj/item/ammo_magazine/rifle/tx54) + cost = 20 + +/datum/supply_packs/launchers/tx54_incendiary + name = "GL-54 incendiary grenade magazine" + contains = list(/obj/item/ammo_magazine/rifle/tx54/incendiary) + cost = 60 + +/datum/supply_packs/launchers/tx54_smoke + name = "GL-54 tactical smoke grenade magazine" + contains = list(/obj/item/ammo_magazine/rifle/tx54/smoke) + cost = 12 + +/datum/supply_packs/launchers/tx54_smoke/dense + name = "GL-54 dense smoke grenade magazine" + contains = list(/obj/item/ammo_magazine/rifle/tx54/smoke/dense) + cost = 8 + +/datum/supply_packs/launchers/tx54_smoke/tangle + name = "GL-54 tanglefoot grenade magazine" + contains = list(/obj/item/ammo_magazine/rifle/tx54/smoke/tangle) + cost = 48 + +/datum/supply_packs/launchers/singleshot_launcher + name = "GL-81 grenade launcher" + contains = list(/obj/item/weapon/gun/grenade_launcher/single_shot) + cost = 150 + +/datum/supply_packs/launchers/multinade_launcher + name = "GL-70 grenade launcher" + contains = list(/obj/item/weapon/gun/grenade_launcher/multinade_launcher/unloaded) + cost = 450 diff --git a/code/modules/reqs/medical.dm b/code/modules/reqs/supplypacks/medical.dm similarity index 100% rename from code/modules/reqs/medical.dm rename to code/modules/reqs/supplypacks/medical.dm diff --git a/code/modules/reqs/operations.dm b/code/modules/reqs/supplypacks/operations.dm similarity index 91% rename from code/modules/reqs/operations.dm rename to code/modules/reqs/supplypacks/operations.dm index 8ace18d33f7..9d08b1f61df 100644 --- a/code/modules/reqs/operations.dm +++ b/code/modules/reqs/supplypacks/operations.dm @@ -1,12 +1,13 @@ /datum/supply_packs/operations group = "Operations" - containertype = /obj/structure/closet/crate + containertype = /obj/structure/closet/crate/operations -/datum/supply_packs/imports/loot_pack - name = "TGMC Loot Pack" - notes = "Contains a random, but curated set of items, these packs are valued around 150 to 200 points. Some items can only be acquired from these. Spend responsibly." - contains = list(/obj/item/loot_box/tgmclootbox) - cost = 1000 +/datum/supply_packs/operations/standard_ammo + name = "Surplus Standard Ammo Crate" + notes = "Contains 22 ammo boxes of a wide variety which come prefilled. You lazy bum." + contains = list(/obj/structure/largecrate/supply/ammo/standard_ammo) + containertype = null + cost = 200 /datum/supply_packs/operations/beacons_supply name = "Supply beacon" diff --git a/code/modules/reqs/supplypacks/smartguns.dm b/code/modules/reqs/supplypacks/smartguns.dm new file mode 100644 index 00000000000..6a78f2b2242 --- /dev/null +++ b/code/modules/reqs/supplypacks/smartguns.dm @@ -0,0 +1,103 @@ +/datum/supply_packs/smartguns + group = "Smartguns" + containertype = /obj/structure/closet/crate/smart + +/datum/supply_packs/smartguns/sg29 + name = "SG-29 smart machine gun" + contains = list(/obj/item/weapon/gun/rifle/sg29) + cost = 400 + +/datum/supply_packs/smartguns/sg29_ammo + name = "SG-29 ammo drum" + contains = list(/obj/item/ammo_magazine/sg29) + cost = 50 + +/datum/supply_packs/smartguns/rifle/t25 + name = "T25 smartrifle" + contains = list(/obj/item/weapon/gun/rifle/t25) + cost = 400 + +/datum/supply_packs/smartguns/ammo_magazine/rifle/t25 + name = "T25 smartrifle magazine" + contains = list(/obj/item/ammo_magazine/rifle/t25) + cost = 20 + +/datum/supply_packs/smartguns/t25_extended_mag + name = "T25 extended magazine" + contains = list(/obj/item/ammo_magazine/rifle/t25/extended) + cost = 200 + containertype = /obj/structure/closet/crate/ammo + +/datum/supply_packs/smartguns/ammo_magazine/packet/t25 + name = "T25 smartrifle ammo box" + contains = list(/obj/item/ammo_magazine/packet/t25) + cost = 60 + +/datum/supply_packs/smartguns/smart_minigun + name = "SG-85 smart gatling gun" + contains = list(/obj/item/weapon/gun/minigun/smart_minigun) + cost = 400 + +/datum/supply_packs/smartguns/smart_minigun_ammo + name = "SG-85 ammo bin" + contains = list(/obj/item/ammo_magazine/packet/smart_minigun) + cost = 50 + +/datum/supply_packs/smartguns/minigun_powerpack + name = "SG-85 Minigun Powerpack" + contains = list(/obj/item/ammo_magazine/minigun_powerpack/smartgun) + cost = 150 + +/datum/supply_packs/smartguns/sg62 + name = "SG-62 Smart Target Rifle" + contains = list(/obj/item/weapon/gun/rifle/sg62) + cost = 400 + +/datum/supply_packs/smartguns/sg62_ammo + name = "SG-62 smart target rifle ammo" + contains = list(/obj/item/ammo_magazine/rifle/sg62) + cost = 35 + +/datum/supply_packs/smartguns/box_10x27mm + name = "SG-62 smart target rifle ammo box" + contains = list(/obj/item/ammo_magazine/packet/sg62) + cost = 50 + +/datum/supply_packs/smartguns/sg153_ammo + name = "SG-153 spotting rifle ammo" + contains = list(/obj/item/ammo_magazine/rifle/sg153) + cost = 15 + +/datum/supply_packs/smartguns/sg153_ammo/highimpact + name = "SG-153 high impact spotting rifle ammo" + contains = list(/obj/item/ammo_magazine/rifle/sg153/highimpact) + +/datum/supply_packs/smartguns/sg153_ammo/heavyrubber + name = "SG-153 heavy rubber spotting rifle ammo" + contains = list(/obj/item/ammo_magazine/rifle/sg153/heavyrubber) + +/datum/supply_packs/smartguns/sg153_ammo/plasmaloss + name = "SG-153 tanglefoot spotting rifle ammo" + contains = list(/obj/item/ammo_magazine/rifle/sg153/plasmaloss) + +/datum/supply_packs/smartguns/sg153_ammo/tungsten + name = "SG-153 tungsten spotting rifle ammo" + contains = list(/obj/item/ammo_magazine/rifle/sg153/tungsten) + +/datum/supply_packs/smartguns/sg153_ammo/flak + name = "SG-153 flak spotting rifle ammo" + contains = list(/obj/item/ammo_magazine/rifle/sg153/flak) + +/datum/supply_packs/smartguns/sg153_ammo/incendiary + name = "SG-153 incendiary spotting rifle ammo" + contains = list(/obj/item/ammo_magazine/rifle/sg153/incendiary) + +/datum/supply_packs/smartguns/smart_pistol + name = "TX13 smartpistol" + contains = list(/obj/item/weapon/gun/pistol/smart_pistol) + cost = 150 + +/datum/supply_packs/smartguns/smart_pistol_ammo + name = "TX13 smartpistol ammo" + contains = list(/obj/item/ammo_magazine/pistol/p14/smart_pistol) + cost = 10 diff --git a/code/modules/reqs/supplypacks/stationary.dm b/code/modules/reqs/supplypacks/stationary.dm new file mode 100644 index 00000000000..27042ca4bae --- /dev/null +++ b/code/modules/reqs/supplypacks/stationary.dm @@ -0,0 +1,220 @@ +/datum/supply_packs/stationary + group = "Stationary" + containertype = /obj/structure/closet/crate/mounted + +/datum/supply_packs/stationary/sentry + name = "Турель TUR-B \"Базис\"" + contains = list( + /obj/item/weapon/gun/sentry/basic, + ) + cost = 200 + +/datum/supply_packs/stationary/sentry_upgrade + name = "Набор для улучшения турели TUR-B" + contains = list( + /obj/item/sentry_upgrade_kit, + ) + cost = 150 + +/datum/supply_packs/stationary/sentry/ammo + name = "Магазин для турели TUR-B \"Базис\"" + contains = list( + /obj/item/ammo_magazine/sentry, + ) + cost = 50 + +/datum/supply_packs/stationary/sentry/ammo/mini + name = "Магазин для турели TUR-M \"Гном\"" + contains = list( + /obj/item/ammo_magazine/minisentry, + ) + +/datum/supply_packs/stationary/sentry/ammo/sniper + name = "Магазин для турели TUR-SN \"Оса\"" + contains = list( + /obj/item/ammo_magazine/sentry/sniper, + ) + +/datum/supply_packs/stationary/sentry/ammo/shotgun + name = "Магазин для турели TUR-SH \"Бык\"" + contains = list( + /obj/item/ammo_magazine/sentry/shotgun, + ) + +/datum/supply_packs/stationary/sentry/ammo/flamer + name = "Бак для турели TUR-F \"Феникс\"" + contains = list( + /obj/item/ammo_magazine/flamer_tank/large/sentry, + ) + +/datum/supply_packs/stationary/buildasentry + name = "Build-A-Sentry Attachment System" + contains = list( + /obj/item/attachable/buildasentry, + ) + cost = 250 + +/datum/supply_packs/stationary/m56d_emplacement + name = "HSG-102 Mounted Heavy Smartgun" + contains = list(/obj/item/storage/box/hsg102) + cost = 600 + +/datum/supply_packs/stationary/m56d + name = "HSG-102 mounted heavy smartgun ammo" + contains = list(/obj/item/ammo_magazine/hsg102) + cost = 30 + +/datum/supply_packs/stationary/minigun_emplacement + name = "Mounted Automatic Minigun" + contains = list(/obj/item/weapon/gun/standard_minigun) + cost = 600 + +/datum/supply_packs/stationary/minigun_ammo + name = "Mounted Minigun ammo" + contains = list(/obj/item/ammo_magazine/heavy_minigun) + cost = 30 + +/datum/supply_packs/stationary/autocannon_emplacement + name = "ATR-22 Mounted Flak Cannon" + contains = list(/obj/item/weapon/gun/atr22) + cost = 700 + +/datum/supply_packs/stationary/ac_hv + name = "ATR-22 High-Velocity ammo" + contains = list(/obj/item/ammo_magazine/atr22) + cost = 40 + +/datum/supply_packs/stationary/ac_flak + name = "ATR-22 Smart-Detonating ammo" + contains = list(/obj/item/ammo_magazine/atr22/flak) + cost = 40 + +/datum/supply_packs/stationary/ags_emplacement + name = "AGLS-37 Mounted Automated Grenade Launcher" + contains = list(/obj/item/weapon/gun/agls37) + cost = 300 + +/datum/supply_packs/stationary/ags_highexplo + name = "AGLS-37 AGL High Explosive Grenades" + contains = list(/obj/item/ammo_magazine/agls37) + cost = 65 + +/datum/supply_packs/stationary/ags_frag + name = "AGLS-37 AGL Fragmentation Grenades" + contains = list(/obj/item/ammo_magazine/agls37/fragmentation) + cost = 55 + +/datum/supply_packs/stationary/ags_incendiary + name = "AGLS-37 AGL White Phosphorous Grenades" + contains = list(/obj/item/ammo_magazine/agls37/incendiary) + cost = 55 + +/datum/supply_packs/stationary/ags_flare + name = "AGLS-37 AGL Flare Grenades" + contains = list(/obj/item/ammo_magazine/agls37/flare) + cost = 35 + +/datum/supply_packs/stationary/ags_cloak + name = "AGLS-37 AGL Cloak Grenades" + contains = list(/obj/item/ammo_magazine/agls37/cloak) + cost = 45 + +/datum/supply_packs/stationary/ags_tanglefoot + name = "AGLS-37 AGL Tanglefoot Grenades" + contains = list(/obj/item/ammo_magazine/agls37/tanglefoot) + cost = 85 + +/datum/supply_packs/stationary/antitankgun + name = "AT-36 Anti Tank Gun" + contains = list(/obj/item/weapon/gun/at36) + cost = 800 + +/datum/supply_packs/stationary/antitankgunammo + name = "AT-36 AP-HE Shell (x3)" + contains = list( + /obj/item/ammo_magazine/at36, + /obj/item/ammo_magazine/at36, + /obj/item/ammo_magazine/at36, + ) + cost = 20 + +/datum/supply_packs/stationary/antitankgunammo/apcr + name = "AT-36 APCR Shell (x3)" + contains = list( + /obj/item/ammo_magazine/at36/apcr, + /obj/item/ammo_magazine/at36/apcr, + /obj/item/ammo_magazine/at36/apcr, + ) + cost = 20 + +/datum/supply_packs/stationary/antitankgunammo/he + name = "AT-36 HE Shell (x3)" + contains = list( + /obj/item/ammo_magazine/at36/he, + /obj/item/ammo_magazine/at36/he, + /obj/item/ammo_magazine/at36/he, + ) + cost = 20 + +/datum/supply_packs/stationary/antitankgunammo/beehive + name = "AT-36 Beehive Shell (x3)" + contains = list( + /obj/item/ammo_magazine/at36/beehive, + /obj/item/ammo_magazine/at36/beehive, + /obj/item/ammo_magazine/at36/beehive, + ) + cost = 20 + +/datum/supply_packs/stationary/antitankgunammo/incendiary + name = "AT-36 Napalm Shell (x3)" + contains = list( + /obj/item/ammo_magazine/at36/incend, + /obj/item/ammo_magazine/at36/incend, + /obj/item/ammo_magazine/at36/incend, + ) + cost = 20 + +/datum/supply_packs/stationary/flak_gun + name = "FK-88 Flak Gun" + contains = list(/obj/item/weapon/gun/heavy_isg) + cost = 1200 + +/datum/supply_packs/stationary/flak_he + name = "FK-88 HE Shell" + contains = list(/obj/item/ammo_magazine/heavy_isg/he) + cost = 100 + +/datum/supply_packs/stationary/flak_sabot + name = "FK-88 APFDS Shell" + contains = list(/obj/item/ammo_magazine/heavy_isg/sabot) + cost = 120 + +/datum/supply_packs/stationary/heayvlaser_emplacement + name = "Mounted Heavy Laser" + contains = list(/obj/item/weapon/gun/energy/lasgun/lasrifle/heavy_laser/deployable) + cost = 800 + +/datum/supply_packs/stationary/heayvlaser_ammo + name = "Mounted Heavy Laser Ammo (x1)" + contains = list(/obj/item/cell/lasgun/heavy_laser) + cost = 15 + +/datum/supply_packs/stationary/mg27 + name = "MG-27 Medium Machinegun" + contains = list(/obj/item/weapon/gun/mg27) + cost = 100 + +/datum/supply_packs/stationary/hmg08 + name = "HMG-08 heavy machinegun" + contains = list(/obj/item/weapon/gun/hmg08) + cost = 400 + +/datum/supply_packs/stationary/hmg08_ammo + name = "HMG-08 heavy machinegun ammo (500 rounds)" + contains = list(/obj/item/ammo_magazine/hmg08) + cost = 70 + +/datum/supply_packs/stationary/hmg08_ammo_small + name = "HMG-08 heavy machinegun ammo (250 rounds)" + contains = list(/obj/item/ammo_magazine/hmg08/small) + cost = 40 diff --git a/code/modules/reqs/supplies.dm b/code/modules/reqs/supplypacks/supplies.dm similarity index 85% rename from code/modules/reqs/supplies.dm rename to code/modules/reqs/supplypacks/supplies.dm index 2b5897a8b06..7f3d3801ea5 100644 --- a/code/modules/reqs/supplies.dm +++ b/code/modules/reqs/supplypacks/supplies.dm @@ -5,8 +5,27 @@ /datum/supply_packs/supplies/crayons name = "PFC Jim Special Crayon Pack" contains = list(/obj/item/storage/fancy/crayons) + containertype = /obj/structure/closet/crate/operations cost = 40 +/datum/supply_packs/supplies/provision + name = "Emergency Provision Crate" + notes = "Contains 10 special TGMC MRE racions." + contains = list( + /obj/item/storage/box/MRE, + /obj/item/storage/box/MRE, + /obj/item/storage/box/MRE, + /obj/item/storage/box/MRE, + /obj/item/storage/box/MRE, + /obj/item/storage/box/MRE, + /obj/item/storage/box/MRE, + /obj/item/storage/box/MRE, + /obj/item/storage/box/MRE, + /obj/item/storage/box/MRE, + ) + containertype = /obj/structure/closet/crate/operations + cost = 65 + /datum/supply_packs/supplies/janitor name = "assorted janitorial supplies" contains = list( diff --git a/code/modules/reqs/vehicles.dm b/code/modules/reqs/supplypacks/vehicles.dm similarity index 77% rename from code/modules/reqs/vehicles.dm rename to code/modules/reqs/supplypacks/vehicles.dm index 93dd7d2d216..fdd194a6908 100644 --- a/code/modules/reqs/vehicles.dm +++ b/code/modules/reqs/supplypacks/vehicles.dm @@ -1,6 +1,36 @@ /datum/supply_packs/vehicles group = "Vehicles" +/datum/supply_packs/vehicles/ltb_shells + name = "LTB tank shell" + contains = list(/obj/item/ammo_magazine/tank/ltb_cannon) + cost = 10 + containertype = /obj/structure/closet/crate/ammo + +/datum/supply_packs/vehicles/ltb_shells_apfds + name = "LTB tank APFDS shell" + contains = list(/obj/item/ammo_magazine/tank/ltb_cannon/apfds) + cost = 10 + containertype = /obj/structure/closet/crate/ammo + +/datum/supply_packs/vehicles/ltaap_rounds + name = "LTAAP tank magazine" + contains = list(/obj/item/ammo_magazine/tank/ltaap_chaingun) + cost = 10 + containertype = /obj/structure/closet/crate/ammo + +/datum/supply_packs/vehicles/cupola_rounds + name = "Cupola tank magazine" + contains = list(/obj/item/ammo_magazine/tank/secondary_cupola) + cost = 10 + containertype = /obj/structure/closet/crate/ammo + +/datum/supply_packs/vehicles/secondary_flamer_tank + name = "Spray flamer tank" + contains = list(/obj/item/ammo_magazine/tank/secondary_flamer_tank) + cost = 10 + containertype = /obj/structure/closet/crate/ammo + /datum/supply_packs/vehicles/motorbike name = "All-Terrain Motorbike" cost = 400 diff --git a/code/modules/reqs/supplypacks/weapons.dm b/code/modules/reqs/supplypacks/weapons.dm new file mode 100644 index 00000000000..234a4b13e08 --- /dev/null +++ b/code/modules/reqs/supplypacks/weapons.dm @@ -0,0 +1,303 @@ +/datum/supply_packs/weapons + group = "Weapons" + containertype = /obj/structure/closet/crate/weapon + +/datum/supply_packs/weapons/tesla + name = "Tesla Shock Rifle" + contains = list(/obj/item/weapon/gun/energy/lasgun/lasrifle/tesla) + cost = 600 + +/datum/supply_packs/weapons/tx55 + name = "AR-55 OICW Rifle" + contains = list(/obj/item/weapon/gun/rifle/tx55) + cost = 525 + +/datum/supply_packs/weapons/pepperball + name = "PB-12 pepperball gun" + contains = list(/obj/item/weapon/gun/rifle/pepperball) + cost = 100 + +/datum/supply_packs/weapons/railgun + name = "SR-220 Railgun" + contains = list(/obj/item/weapon/gun/rifle/railgun) + cost = 400 + +/datum/supply_packs/weapons/railgun_ammo + name = "SR-220 Railgun armor piercing discarding sabot round" + contains = list(/obj/item/ammo_magazine/railgun) + cost = 50 + +/datum/supply_packs/weapons/railgun_ammo/hvap + name = "SR-220 Railgun high velocity armor piercing round" + contains = list(/obj/item/ammo_magazine/railgun/hvap) + cost = 50 + +/datum/supply_packs/weapons/railgun_ammo/smart + name = "SR-220 Railgun smart armor piercing round" + contains = list(/obj/item/ammo_magazine/railgun/smart) + cost = 50 + +/datum/supply_packs/weapons/tx8 + name = "BR-8 Scout Rifle" + contains = list(/obj/item/weapon/gun/rifle/tx8) + cost = 400 + +/datum/supply_packs/weapons/scout_regular + name = "BR-8 scout rifle magazine" + contains = list(/obj/item/ammo_magazine/rifle/tx8) + cost = 20 + +/datum/supply_packs/weapons/scout_regular_box + name = "BR-8 scout rifle ammo box" + contains = list(/obj/item/ammo_magazine/packet/scout_rifle) + cost = 50 + +/datum/supply_packs/weapons/scout_impact + name = "BR-8 scout rifle impact magazine" + contains = list(/obj/item/ammo_magazine/rifle/tx8/impact) + cost = 40 + +/datum/supply_packs/weapons/scout_impact_box + name = "BR-8 scout rifle impact ammo box" + contains = list(/obj/item/ammo_magazine/packet/scout_rifle/impact) + cost = 100 + +/datum/supply_packs/weapons/scout_incendiary + name = "Br-8 scout rifle incendiary magazine" + contains = list(/obj/item/ammo_magazine/rifle/tx8/incendiary) + cost = 40 + +/datum/supply_packs/weapons/scout_incendiary_box + name = "BR-8 scout rifle incendiary ammo box" + contains = list(/obj/item/ammo_magazine/packet/scout_rifle/incendiary) + cost = 100 + +/datum/supply_packs/weapons/zx76 + name = "ZX-76 Twin-Barrled Burst Shotgun" + contains = list(/obj/item/weapon/gun/shotgun/zx76) + cost = 1000 + +/datum/supply_packs/weapons/shotguntracker + name = "12 Gauge Tracker Shells" + contains = list(/obj/item/ammo_magazine/shotgun/tracker) + cost = 50 + +/datum/supply_packs/weapons/incendiaryslugs + name = "Box of Incendiary Slugs" + contains = list(/obj/item/ammo_magazine/shotgun/incendiary) + cost = 100 + +/datum/supply_packs/weapons/sr81 + name = "SR-81 IFF Auto Sniper kit" + contains = list(/obj/item/weapon/gun/rifle/sr81) + cost = 500 + +/datum/supply_packs/weapons/sr81_ammo + name = "SR-81 IFF sniper magazine" + contains = list(/obj/item/ammo_magazine/rifle/sr81) + cost = 30 + +/datum/supply_packs/weapons/sr81_packet + name = "SR-81 IFF sniper ammo box" + contains = list(/obj/item/ammo_magazine/packet/sr81) + cost = 50 + +/datum/supply_packs/weapons/antimaterial + name = "SR-26 Antimaterial rifle (AMR) kit" + contains = list(/obj/item/weapon/gun/rifle/sniper/antimaterial) + cost = 775 + +/datum/supply_packs/weapons/antimaterial_ammo + name = "SR-26 AMR magazine" + contains = list(/obj/item/ammo_magazine/sniper) + cost = 30 + +/datum/supply_packs/weapons/antimaterial_incend_ammo + name = "SR-26 AMR incendiary magazine" + contains = list(/obj/item/ammo_magazine/sniper/incendiary) + cost = 50 + +/datum/supply_packs/weapons/antimaterial_flak_ammo + name = "SR-26 AMR flak magazine" + contains = list(/obj/item/ammo_magazine/sniper/flak) + cost = 40 + +/datum/supply_packs/weapons/specminigun + name = "MG-100 Vindicator Minigun" + contains = list(/obj/item/weapon/gun/minigun) + cost = MINIGUN_PRICE + +/datum/supply_packs/weapons/minigun + name = "MG-100 Vindicator Minigun Powerpack" + contains = list(/obj/item/ammo_magazine/minigun_powerpack) + cost = 50 + +/datum/supply_packs/weapons/flamethrower + name = "FL-84 Flamethrower" + contains = list(/obj/item/weapon/gun/flamer/big_flamer/marinestandard) + cost = 150 + +/datum/supply_packs/weapons/napalm + name = "FL-84 normal fuel tank" + contains = list(/obj/item/ammo_magazine/flamer_tank/large) + cost = 60 + +/datum/supply_packs/weapons/napalm_G + name = "FL-84 G fuel tank" + contains = list(/obj/item/ammo_magazine/flamer_tank/large/G) + cost = 75 + +/datum/supply_packs/weapons/napalm_X + name = "FL-84 X fuel tank" + contains = list(/obj/item/ammo_magazine/flamer_tank/large/X) + cost = 300 + +/datum/supply_packs/weapons/back_fuel_tank + name = "Standard back fuel tank" + contains = list(/obj/item/ammo_magazine/flamer_tank/backtank) + cost = 200 + +/datum/supply_packs/weapons/back_fuel_tank_g + name = "Type G fuel tank" + contains = list(/obj/item/ammo_magazine/flamer_tank/backtank/G) + cost = 150 + +/datum/supply_packs/weapons/back_fuel_tank_x + name = "Type X back fuel tank" + contains = list(/obj/item/ammo_magazine/flamer_tank/backtank/X) + cost = 600 + +/datum/supply_packs/weapons/mini_fuel_tank_g + name = "Type G mini fuel tank" + contains = list(/obj/item/ammo_magazine/flamer_tank/mini/G) + cost = 5 + +/datum/supply_packs/weapons/mini_fuel_tank_x + name = "Type X back mini fuel tank" + contains = list(/obj/item/ammo_magazine/flamer_tank/mini/X) + cost = 20 + +/datum/supply_packs/weapons/fueltank_g + name = "G-fuel tank" + contains = list(/obj/structure/reagent_dispensers/fueltank/gfuel) + cost = 150 + containertype = null + +/datum/supply_packs/weapons/fueltank + name = "X-fuel tank" + contains = list(/obj/structure/reagent_dispensers/fueltank/xfuel) + cost = 600 + containertype = null + +/datum/supply_packs/weapons/mateba + name = "Mateba Autorevolver belt" + contains = list(/obj/item/storage/holster/belt/revolver/mateba/full) + notes = "Contains 6 speedloaders" + cost = 150 + +/datum/supply_packs/weapons/mateba_ammo + name = "Mateba magazine" + contains = list(/obj/item/ammo_magazine/revolver/mateba) + cost = 30 + +/datum/supply_packs/weapons/mateba_packet + name = "Mateba packet" + contains = list(/obj/item/ammo_magazine/packet/mateba) + cost = 120 + +/datum/supply_packs/weapons/sr127_flak + name = "SR-127 Flak Magazine" + contains = list(/obj/item/ammo_magazine/rifle/sr127/flak) + cost = 50 + +/datum/supply_packs/weapons/rechargemag + name = "Terra Experimental recharger battery" + contains = list(/obj/item/cell/lasgun/lasrifle/recharger) + cost = 60 + +/datum/supply_packs/weapons/xray_gun + name = "TE-X Laser Rifle" + contains = list(/obj/item/weapon/gun/energy/lasgun/lasrifle/xray) + cost = 400 + +/datum/supply_packs/weapons/rocketsledge + name = "Rocket Sledge" + contains = list(/obj/item/weapon/twohanded/rocketsledge) + cost = 600 + +/datum/supply_packs/weapons/vector_incendiary + name = "vector incendiary magazine" + contains = list(/obj/item/ammo_magazine/smg/vector/incendiary) + cost = 20 //40 rounds + containertype = /obj/structure/closet/crate/ammo + +/datum/supply_packs/weapons/valihalberd + name = "VAL-HAL-A" + contains = list(/obj/item/weapon/twohanded/glaive/halberd/harvester) + cost = 600 + +/datum/supply_packs/weapons/t500case + name = "R-500 bundle" + contains = list(/obj/item/storage/box/t500case) + cost = 50 + +/datum/supply_packs/weapons/r76case + name = "R76 bundle" + contains = list(/obj/item/storage/briefcase/standard_magnum) + cost = 120 + +/datum/supply_packs/weapons/r76_speedloader + name = "R76 speedloader (x4)" + contains = list( + /obj/item/ammo_magazine/revolver/standard_magnum, + /obj/item/ammo_magazine/revolver/standard_magnum, + /obj/item/ammo_magazine/revolver/standard_magnum, + /obj/item/ammo_magazine/revolver/standard_magnum, + ) + cost = 40 + +/datum/supply_packs/weapons/ar12_incendiary + name = "AR-12 incendiary magazine" + contains = list(/obj/item/ammo_magazine/rifle/ar12/incendiary) + cost = 30 //50 rounds + containertype = /obj/structure/closet/crate/ammo + +/datum/supply_packs/weapons/smg25_ap + name = "SMG-25 armor piercing magazine" + contains = list(/obj/item/ammo_magazine/smg/m25/ap) + cost = 30 //60 rounds + containertype = /obj/structure/closet/crate/ammo + +/datum/supply_packs/weapons/box_10x24mm_incendiary + name = "10x24mm incendiary ammo box" + contains = list(/obj/item/ammo_magazine/packet/p10x24mm/incendiary) + cost = 45 //150 rounds + containertype = /obj/structure/closet/crate/ammo + +/datum/supply_packs/weapons/box_10x25mm_incendiary + name = "10x25mm incendiary ammo box" + contains = list(/obj/item/ammo_magazine/packet/p10x25mm/incendiary) + cost = 50 //125 rounds + containertype = /obj/structure/closet/crate/ammo + +/datum/supply_packs/weapons/p9mm_incendiary + name = "9mm incendiary packet" + contains = list(/obj/item/ammo_magazine/packet/p9mm/incendiary) + cost = 30 //70 rounds + containertype = /obj/structure/closet/crate/ammo + +/datum/supply_packs/weapons/box_10x265mm_ap + name = "10x26.5mm armor piercing ammo box" + contains = list(/obj/item/ammo_magazine/packet/p10x265mm/ap) + cost = 60 //100 rounds + containertype = /obj/structure/closet/crate/ammo + +/datum/supply_packs/weapons/box_10x20mm_ap + name = "10x20mm armor piercing ammo box" + contains = list(/obj/item/ammo_magazine/packet/p10x20mm/ap) + cost = 50 //150 rounds + containertype = /obj/structure/closet/crate/ammo + +/datum/supply_packs/weapons/xray_gun + contains = list(/obj/item/weapon/gun/energy/lasgun/lasrifle/xray) + cost = 500 diff --git a/code/modules/reqs/tablet.dm b/code/modules/reqs/tablet.dm new file mode 100644 index 00000000000..373413c7edc --- /dev/null +++ b/code/modules/reqs/tablet.dm @@ -0,0 +1,28 @@ +/obj/item/supplytablet + name = "ASRS tablet" + desc = "A tablet for an Automated Storage and Retrieval System" + icon = 'icons/Marine/marine-navigation.dmi' + icon_state = "req_tablet_off" + req_access = list(ACCESS_MARINE_CARGO) + flags_equip_slot = ITEM_SLOT_POCKET + w_class = WEIGHT_CLASS_NORMAL + var/datum/supply_ui/supply_ui + ///Id of the shuttle controlled + var/shuttle_id = SHUTTLE_SUPPLY + /// Id of the home docking port + var/home_id = "supply_home" + /// Faction of the tablet + var/faction = FACTION_TERRAGOV + +/obj/item/supplytablet/interact(mob/user) + . = ..() + if(.) + return + if(!allowed(user)) + return + if(!supply_ui) + supply_ui = new(src) + supply_ui.shuttle_id = shuttle_id + supply_ui.home_id = home_id + supply_ui.faction = faction + return supply_ui.interact(user) diff --git a/code/modules/reqs/ui/_ui.dm b/code/modules/reqs/ui/_ui.dm new file mode 100644 index 00000000000..495ddbdf9f3 --- /dev/null +++ b/code/modules/reqs/ui/_ui.dm @@ -0,0 +1,316 @@ +/datum/supply_ui + interaction_flags = INTERACT_MACHINE_TGUI + var/atom/source_object + var/tgui_name = "Cargo" + ///Id of the shuttle controlled + var/shuttle_id = "" + ///Reference to the supply shuttle + var/obj/docking_port/mobile/supply/supply_shuttle + ///Faction of the supply console linked + var/faction = FACTION_TERRAGOV + ///Id of the home port + var/home_id = "" + +/datum/supply_ui/New(atom/source_object) + . = ..() + src.source_object = source_object + RegisterSignal(source_object, COMSIG_QDELETING, PROC_REF(clean_ui)) + +///Signal handler to delete the ui when the source object is deleting +/datum/supply_ui/proc/clean_ui() + SIGNAL_HANDLER + qdel(src) + +/datum/supply_ui/Destroy(force) + source_object = null + return ..() + +/datum/supply_ui/ui_host() + return source_object + +/datum/supply_ui/can_interact(mob/user) + . = ..() + if(!.) + return FALSE + if(!user.CanReach(source_object)) + return FALSE + return TRUE + +/datum/supply_ui/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + + if(ui) + return + if(shuttle_id) + supply_shuttle = SSshuttle.getShuttle(shuttle_id) + supply_shuttle.home_id = home_id + supply_shuttle.faction = faction + ui = new(user, src, tgui_name, source_object.name) + ui.open() + +/datum/supply_ui/ui_static_data(mob/user) + . = list() + .["categories"] = GLOB.all_supply_groups + .["supplypacks"] = SSpoints.supply_packs_ui + .["supplypackscontents"] = SSpoints.supply_packs_contents + .["elevator_size"] = supply_shuttle?.return_number_of_turfs() + +/datum/supply_ui/ui_data(mob/living/user) + . = list() + .["currentpoints"] = round(SSpoints.supply_points[user.faction]) + .["personalpoints"] = round(SSpoints.personal_supply_points[user.ckey]) + .["requests"] = list() + for(var/key in SSpoints.requestlist) + var/datum/supply_order/our_order = SSpoints.requestlist[key] + if(our_order.faction != user.faction) + continue + var/list/packs = list() + var/cost = 0 + for(var/P in our_order.pack) + var/datum/supply_packs/our_pack = P + if(packs[our_pack.type]) + packs[our_pack.type] += 1 + else + packs[our_pack.type] = 1 + cost += our_pack.cost + .["requests"] += list(list("id" = our_order.id, "orderer" = our_order.orderer, "orderer_rank" = our_order.orderer_rank, "reason" = our_order.reason, "cost" = cost, "packs" = packs, "authed_by" = our_order.authorised_by)) + .["deniedrequests"] = list() + for(var/i in length(SSpoints.deniedrequests) to 1 step -1) + var/datum/supply_order/our_order = SSpoints.deniedrequests[SSpoints.deniedrequests[i]] + if(our_order.faction != user.faction) + continue + var/list/packs = list() + var/cost = 0 + for(var/P in our_order.pack) + var/datum/supply_packs/our_pack = P + if(packs[our_pack.type]) + packs[our_pack.type] += 1 + else + packs[our_pack.type] = 1 + cost += our_pack.cost + .["deniedrequests"] += list(list( + "id" = our_order.id, + "orderer" = our_order.orderer, + "orderer_rank" = our_order.orderer_rank, + "reason" = our_order.reason, + "cost" = cost, "packs" = packs, + "authed_by" = our_order.authorised_by + )) + .["approvedrequests"] = list() + for(var/i in length(SSpoints.approvedrequests) to 1 step -1) + var/datum/supply_order/our_order = SSpoints.approvedrequests[SSpoints.approvedrequests[i]] + if(our_order.faction != user.faction) + continue + var/list/packs = list() + var/cost = 0 + for(var/P in our_order.pack) + var/datum/supply_packs/our_pack = P + if(packs[our_pack.type]) + packs[our_pack.type] += 1 + else + packs[our_pack.type] = 1 + cost += our_pack.cost + .["approvedrequests"] += list(list( + "id" = our_order.id, + "orderer" = our_order.orderer, + "orderer_rank" = our_order.orderer_rank, + "reason" = our_order.reason, + "cost" = cost, "packs" = packs, + "authed_by" = our_order.authorised_by + )) + .["awaiting_delivery"] = list() + .["awaiting_delivery_orders"] = 0 + for(var/key in SSpoints.shoppinglist[faction]) + var/datum/supply_order/our_order = LAZYACCESSASSOC(SSpoints.shoppinglist, faction, key) + .["awaiting_delivery_orders"]++ + var/list/packs = list() + var/cost = 0 + for(var/P in our_order.pack) + var/datum/supply_packs/our_pack = P + if(packs[our_pack.type]) + packs[our_pack.type] += 1 + else + packs[our_pack.type] = 1 + cost += our_pack.cost + .["awaiting_delivery"] += list(list( + "id" = our_order.id, + "orderer" = our_order.orderer, + "orderer_rank" = our_order.orderer_rank, + "reason" = our_order.reason, + "cost" = cost, + "packs" = packs, + "authed_by" = our_order.authorised_by + )) + .["export_history"] = list() + var/id = 0 + var/lastexport = "" + for(var/datum/export_report/report AS in SSpoints.export_history) + if(report.faction != user.faction) + continue + if(report.points == 0) + continue + if(report.export_name == lastexport) + .["export_history"][id]["amount"] += 1 + .["export_history"][id]["total"] += report.points + else + .["export_history"] += list(list( + "id" = id, + "name" = report.export_name, + "points" = report.points, + "amount" = 1, + total = report.points + )) + id++ + lastexport = report.export_name + .["shopping_history"] = list() + for(var/datum/supply_order/our_order AS in SSpoints.shopping_history) + if(our_order.faction != user.faction) + continue + var/list/packs = list() + var/cost = 0 + for(var/P in our_order.pack) + var/datum/supply_packs/our_pack = P + if(packs[our_pack.type]) + packs[our_pack.type] += 1 + else + packs[our_pack.type] = 1 + cost += our_pack.cost + .["shopping_history"] += list(list( + "id" = our_order.id, + "orderer" = our_order.orderer, + "orderer_rank" = our_order.orderer_rank, + "reason" = our_order.reason, + "cost" = cost, + "packs" = packs, + "authed_by" = our_order.authorised_by + )) + .["shopping_list_cost"] = 0 + .["shopping_list_items"] = 0 + .["shopping_list"] = list() + for(var/i in SSpoints.shopping_cart) + var/datum/supply_packs/our_pack = SSpoints.supply_packs[i] + .["shopping_list_items"] += SSpoints.shopping_cart[i] + .["shopping_list_cost"] += our_pack.cost * SSpoints.shopping_cart[our_pack.type] + .["shopping_list"][our_pack.type] = list("count" = SSpoints.shopping_cart[our_pack.type]) + if(supply_shuttle) + if(supply_shuttle?.mode == SHUTTLE_CALL) + if(is_mainship_level(supply_shuttle.destination.z)) + .["elevator"] = "Raising" + .["elevator_dir"] = "up" + else + .["elevator"] = "Lowering" + .["elevator_dir"] = "down" + else if(supply_shuttle?.mode == SHUTTLE_IDLE) + if(is_mainship_level(supply_shuttle.z)) + .["elevator"] = "Raised" + .["elevator_dir"] = "down" + else + .["elevator"] = "Lowered" + .["elevator_dir"] = "up" + else + if(is_mainship_level(supply_shuttle.z)) + .["elevator"] = "Lowering" + .["elevator_dir"] = "down" + else + .["elevator"] = "Raising" + .["elevator_dir"] = "up" + else + .["elevator"] = "MISSING!" + .["beacon"] = length(GLOB.supply_beacon) ? TRUE : FALSE + +/datum/supply_ui/proc/get_shopping_cart(mob/user) + return SSpoints.shopping_cart + +/datum/supply_ui/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + switch(action) + if("cart") + var/datum/supply_packs/P = SSpoints.supply_packs[text2path(params["id"])] + if(!P) + return + var/shopping_cart = get_shopping_cart(ui.user) + switch(params["mode"]) + if("removeall") + shopping_cart -= P.type + if("removeone") + if(shopping_cart[P.type] > 1) + shopping_cart[P.type]-- + else + shopping_cart -= P.type + if("addone") + if(shopping_cart[P.type]) + shopping_cart[P.type]++ + else + shopping_cart[P.type] = 1 + if("addall") + var/mob/living/ui_user = ui.user + var/cart_cost = 0 + for(var/i in shopping_cart) + var/datum/supply_packs/SP = SSpoints.supply_packs[i] + cart_cost += SP.cost * shopping_cart[SP.type] + var/excess_points = SSpoints.supply_points[ui_user.faction] - cart_cost + var/number_to_buy = min(round(excess_points / P.cost), 20) //hard cap at 20 + if(shopping_cart[P.type]) + shopping_cart[P.type] += number_to_buy + else + shopping_cart[P.type] = number_to_buy + . = TRUE + if("send") + if(supply_shuttle.mode != SHUTTLE_IDLE) + return + if(is_mainship_level(supply_shuttle.z)) + if (!supply_shuttle.check_blacklist()) + to_chat(usr, "For safety reasons, the Automated Storage and Retrieval System cannot store live, friendlies, classified nuclear weaponry or homing beacons.") + playsound(supply_shuttle.return_center_turf(), 'sound/machines/buzz-two.ogg', 50, 0) + else + playsound(supply_shuttle.return_center_turf(), 'sound/machines/elevator_move.ogg', 50, 0) + SSshuttle.moveShuttleToTransit(shuttle_id, TRUE) + addtimer(CALLBACK(supply_shuttle, TYPE_PROC_REF(/obj/docking_port/mobile/supply, sell)), 15 SECONDS) + else + var/obj/docking_port/D = SSshuttle.getDock(home_id) + supply_shuttle.buy(usr, src) + playsound(D.return_center_turf(), 'sound/machines/elevator_move.ogg', 50, 0) + SSshuttle.moveShuttle(shuttle_id, home_id, TRUE) + . = TRUE + if("approve") + var/datum/supply_order/O = SSpoints.requestlist["[params["id"]]"] + if(!O) + O = SSpoints.deniedrequests["[params["id"]]"] + if(!O) + return + SSpoints.approve_request(O, ui.user) + . = TRUE + if("deny") + var/datum/supply_order/O = SSpoints.requestlist["[params["id"]]"] + if(!O) + return + SSpoints.deny_request(O) + . = TRUE + if("approveall") + for(var/i in SSpoints.requestlist) + var/datum/supply_order/O = SSpoints.requestlist[i] + SSpoints.approve_request(O, ui.user) + . = TRUE + if("denyall") + for(var/i in SSpoints.requestlist) + var/datum/supply_order/O = SSpoints.requestlist[i] + SSpoints.deny_request(O) + . = TRUE + if("buycart") + SSpoints.buy_cart(ui.user) + . = TRUE + if("clearcart") + var/list/shopping_cart = get_shopping_cart(ui.user) + shopping_cart.Cut() + . = TRUE + if("buypersonal") + SSpoints.buy_using_psp(ui.user) + . = TRUE + if("delivery") + var/datum/supply_order/O = SSpoints.shoppinglist[faction]["[params["id"]]"] + if(!O) + return + SSpoints.fast_delivery(O, ui.user) + . = TRUE diff --git a/code/modules/reqs/ui/request.dm b/code/modules/reqs/ui/request.dm new file mode 100644 index 00000000000..f9b92be3cca --- /dev/null +++ b/code/modules/reqs/ui/request.dm @@ -0,0 +1,133 @@ + +/datum/supply_ui/requests + tgui_name = "CargoRequest" + +// yes these are copy pasted from above because SPEEEEEEEEEEEEED +/datum/supply_ui/requests/ui_static_data(mob/user) + . = list() + .["categories"] = GLOB.all_supply_groups + .["supplypacks"] = SSpoints.supply_packs_ui + .["supplypackscontents"] = SSpoints.supply_packs_contents + +/datum/supply_ui/requests/ui_data(mob/living/user) + . = list() + .["currentpoints"] = round(SSpoints.supply_points[user.faction]) + .["personalpoints"] = round(SSpoints.personal_supply_points[user.ckey]) + .["requests"] = list() + for(var/i in SSpoints.requestlist) + var/datum/supply_order/our_order = SSpoints.requestlist[i] + if(our_order.faction != user.faction) + continue + var/list/packs = list() + var/cost = 0 + for(var/P in our_order.pack) + var/datum/supply_packs/our_pack = P + if(packs[our_pack.type]) + packs[our_pack.type] += 1 + else + packs[our_pack.type] = 1 + cost += our_pack.cost + .["requests"] += list(list( + "id" = our_order.id, + "orderer" = our_order.orderer, + "orderer_rank" = our_order.orderer_rank, + "reason" = our_order.reason, + "cost" = cost, + "packs" = packs, + "authed_by" = our_order.authorised_by + )) + .["deniedrequests"] = list() + for(var/i in length(SSpoints.deniedrequests) to 1 step -1) + var/datum/supply_order/our_order = SSpoints.deniedrequests[SSpoints.deniedrequests[i]] + if(our_order.faction != user.faction) + continue + var/list/packs = list() + var/cost = 0 + for(var/P in our_order.pack) + var/datum/supply_packs/our_pack = P + if(packs[our_pack.type]) + packs[our_pack.type] += 1 + else + packs[our_pack.type] = 1 + cost += our_pack.cost + .["deniedrequests"] += list(list( + "id" = our_order.id, + "orderer" = our_order.orderer, + "orderer_rank" = our_order.orderer_rank, + "reason" = our_order.reason, + "cost" = cost, + "packs" = packs, + "authed_by" = our_order.authorised_by + )) + .["approvedrequests"] = list() + for(var/i in length(SSpoints.approvedrequests) to 1 step -1) + var/datum/supply_order/our_order = SSpoints.approvedrequests[SSpoints.approvedrequests[i]] + if(our_order.faction != user.faction) + continue + var/list/packs = list() + var/cost = 0 + for(var/P in our_order.pack) + var/datum/supply_packs/our_pack = P + if(packs[our_pack.type]) + packs[our_pack.type] += 1 + else + packs[our_pack.type] = 1 + cost += our_pack.cost + .["approvedrequests"] += list(list( + "id" = our_order.id, + "orderer" = our_order.orderer, + "orderer_rank" = our_order.orderer_rank, + "reason" = our_order.reason, + "cost" = cost, + "packs" = packs, + "authed_by" = our_order.authorised_by + )) + .["awaiting_delivery"] = list() + .["awaiting_delivery_orders"] = 0 + for(var/key in SSpoints.shoppinglist[faction]) + //only own orders + var/datum/supply_order/our_order = LAZYACCESSASSOC(SSpoints.shoppinglist, faction, key) + if(user.real_name != our_order.orderer) + continue + .["awaiting_delivery_orders"]++ + var/list/packs = list() + var/cost = 0 + for(var/P in our_order.pack) + var/datum/supply_packs/our_pack = P + if(packs[our_pack.type]) + packs[our_pack.type] += 1 + else + packs[our_pack.type] = 1 + cost += our_pack.cost + .["awaiting_delivery"] += list(list( + "id" = our_order.id, + "orderer" = our_order.orderer, + "orderer_rank" = our_order.orderer_rank, + "reason" = our_order.reason, + "cost" = cost, + "packs" = packs, + "authed_by" = our_order.authorised_by + )) + if(!SSpoints.request_shopping_cart[user.ckey]) + SSpoints.request_shopping_cart[user.ckey] = list() + .["shopping_list_cost"] = 0 + .["shopping_list_items"] = 0 + .["shopping_list"] = list() + for(var/i in SSpoints.request_shopping_cart[user.ckey]) + var/datum/supply_packs/our_pack = SSpoints.supply_packs[i] + .["shopping_list_items"] += SSpoints.request_shopping_cart[user.ckey][i] + .["shopping_list_cost"] += our_pack.cost * SSpoints.request_shopping_cart[user.ckey][our_pack.type] + .["shopping_list"][our_pack.type] = list("count" = SSpoints.request_shopping_cart[user.ckey][our_pack.type]) + .["beacon"] = length(GLOB.supply_beacon) ? TRUE : FALSE + +/datum/supply_ui/requests/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return TRUE + switch(action) + if("submitrequest") + SSpoints.submit_request(ui.user, params["reason"]) + . = TRUE + +/datum/supply_ui/requests/get_shopping_cart(mob/user) + return SSpoints.request_shopping_cart[user.ckey] diff --git a/code/modules/reqs/ui/vehicle.dm b/code/modules/reqs/ui/vehicle.dm new file mode 100644 index 00000000000..8b08be0395f --- /dev/null +++ b/code/modules/reqs/ui/vehicle.dm @@ -0,0 +1,264 @@ +#define DEFAULT_MAX_ARMORED_AMMO 20 + +GLOBAL_LIST_EMPTY(armored_gunammo) +GLOBAL_LIST_EMPTY(armored_modtypes) +GLOBAL_LIST_INIT(armored_guntypes, armored_init_guntypes()) +GLOBAL_LIST_EMPTY(purchased_tanks) + +///im a lazy bum who cant use initial on lists, so we just load everything into a list +/proc/armored_init_guntypes() + . = list() + for(var/obj/vehicle/sealed/armored/vehtype AS in typesof(/obj/vehicle/sealed/armored)) + vehtype = new vehtype + GLOB.armored_modtypes[vehtype.type] = vehtype.permitted_mods + .[vehtype.type] = vehtype.permitted_weapons + qdel(vehtype) + for(var/obj/item/armored_weapon/gun AS in typesof(/obj/item/armored_weapon)) + gun = new gun + GLOB.armored_gunammo[gun.type] = gun.accepted_ammo + qdel(gun) + +/datum/supply_ui/vehicles + tgui_name = "VehicleSupply" + shuttle_id = SHUTTLE_VEHICLE_SUPPLY + home_id = "vehicle_home" + /// current selected vehicles typepath + var/current_veh_type + /// current selected primary weapons typepath + var/current_primary + /// current selected secondaryies typepath + var/current_secondary + /// current driver mod typepath + var/current_driver_mod + /// current gunner mod typepath + var/current_gunner_mod + /// current primary ammo list, type = count + var/list/primary_ammo = list() + /// current secondary ammo list, type = count + var/list/secondary_ammo = list() + +/datum/supply_ui/vehicles/ui_static_data(mob/user) + var/list/data = list() + for(var/obj/vehicle/sealed/armored/vehtype AS in typesof(/obj/vehicle/sealed/armored)) + var/flags = vehtype::flags_armored + + if(flags & ARMORED_PURCHASABLE_TRANSPORT) + if(user.skills.getRating(SKILL_LARGE_VEHICLE) < SKILL_LARGE_VEHICLE_EXPERIENCED) + continue + else if(flags & ARMORED_PURCHASABLE_ASSAULT) + if(user.skills.getRating(SKILL_LARGE_VEHICLE) < SKILL_LARGE_VEHICLE_VETERAN) + continue + else + continue + + data["vehicles"] += list(list("name" = initial(vehtype.name), "desc" = initial(vehtype.desc), "type" = "[vehtype]", "isselected" = (vehtype == current_veh_type))) + if(vehtype != current_veh_type) + continue + for(var/obj/item/armored_weapon/gun AS in GLOB.armored_guntypes[vehtype]) + var/primary_selected = (current_primary == gun) + var/secondary_selected = (current_secondary == gun) + if(initial(gun.weapon_slot) & MODULE_PRIMARY) + data["primaryWeapons"] += list(list( + "name" = initial(gun.name), + "desc" = initial(gun.desc), + "type" = gun, + "isselected" = primary_selected, + )) + if(primary_selected) + for(var/obj/item/ammo_magazine/mag AS in primary_ammo) + data["primaryammotypes"] += list(list( + "name" = initial(mag.name), + "type" = mag, + "current" = primary_ammo[mag], + "max" = DEFAULT_MAX_ARMORED_AMMO, //TODO make vehicle ammo dynamic instead of fixed number + )) + + if(initial(gun.weapon_slot) & MODULE_SECONDARY) + data["secondaryWeapons"] += list(list( + "name" = initial(gun.name), + "desc" = initial(gun.desc), + "type" = gun, + "isselected" = secondary_selected, + )) + if(secondary_selected) + for(var/obj/item/ammo_magazine/mag AS in secondary_ammo) + data["secondarymmotypes"] += list(list( + "name" = initial(mag.name), + "type" = mag, + "current" = secondary_ammo[mag], + "max" = DEFAULT_MAX_ARMORED_AMMO, //TODO make vehicle ammo dynamic instead of fixed number + )) + + for(var/obj/item/tank_module/mod AS in GLOB.armored_modtypes[vehtype]) + if(initial(mod.is_driver_module)) + data["driverModules"] += list(list( + "name" = initial(mod.name), + "desc" = initial(mod.desc), + "type" = mod, + "isselected" = (current_driver_mod == mod), + )) + else + data["gunnerModules"] += list(list( + "name" = initial(mod.name), + "desc" = initial(mod.desc), + "type" = mod, + "isselected" = (current_gunner_mod == mod), + )) + return data + +/datum/supply_ui/vehicles/ui_data(mob/living/user) + var/list/data = list() + if(supply_shuttle) + if(supply_shuttle?.mode == SHUTTLE_CALL) + if(is_mainship_level(supply_shuttle.destination.z)) + data["elevator"] = "Raising" + data["elevator_dir"] = "up" + else + data["elevator"] = "Lowering" + data["elevator_dir"] = "down" + else if(supply_shuttle?.mode == SHUTTLE_IDLE) + if(is_mainship_level(supply_shuttle.z)) + data["elevator"] = "Raised" + data["elevator_dir"] = "down" + else if(current_veh_type) + data["elevator"] = "Purchase" + data["elevator_dir"] = "store" + else + data["elevator"] = "Lowered" + data["elevator_dir"] = "up" + else + if(is_mainship_level(supply_shuttle.z)) + data["elevator"] = "Lowering" + data["elevator_dir"] = "down" + else + data["elevator"] = "Raising" + data["elevator_dir"] = "up" + else + data["elevator"] = "MISSING!" + return data + +/datum/supply_ui/vehicles/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("setvehicle") + var/newtype = text2path(params["type"]) + if(!ispath(newtype, /obj/vehicle/sealed/armored)) + return + var/obj/vehicle/sealed/armored/tank_type = newtype + var/is_assault = initial(tank_type.flags_armored) & ARMORED_PURCHASABLE_ASSAULT + if(GLOB.purchased_tanks[usr.faction]?["[is_assault]"]) + to_chat(usr, span_danger("A vehicle of this type has already been purchased!")) + return + current_veh_type = newtype + current_primary = null // set everything to null, to avoid bugs + current_secondary = null + current_driver_mod = null + current_gunner_mod = null + primary_ammo = list() + secondary_ammo = list() + . = TRUE + + if("setprimary") + if(!current_veh_type) + return + var/newtype = text2path(params["type"]) + if(!(newtype in GLOB.armored_guntypes[current_veh_type])) + return + current_primary = newtype + var/list/assoc_cast = GLOB.armored_gunammo[newtype] + primary_ammo = assoc_cast.Copy() + for(var/ammo in primary_ammo) + primary_ammo[ammo] = 0 + . = TRUE + + if("setsecondary") + if(!current_veh_type) + return + var/newtype = text2path(params["type"]) + if(!(newtype in GLOB.armored_guntypes[current_veh_type])) + return + current_secondary = newtype + var/list/assoc_cast = GLOB.armored_gunammo[newtype] + secondary_ammo = assoc_cast.Copy() + for(var/ammo in secondary_ammo) + secondary_ammo[ammo] = 0 + . = TRUE + + if("set_ammo_primary") + if(!current_primary) + return + var/newtype = text2path(params["type"]) + if(!(newtype in primary_ammo)) + return + var/non_adjusted_total = 0 + for(var/ammo in primary_ammo) + if(ammo == newtype) + continue + non_adjusted_total += primary_ammo[ammo] + var/newvalue = clamp(params["new_value"], 0, DEFAULT_MAX_ARMORED_AMMO-non_adjusted_total) + primary_ammo[newtype] = newvalue + . = TRUE + + if("set_ammo_secondary") + if(!current_secondary) + return + var/newtype = text2path(params["type"]) + if(!(newtype in secondary_ammo)) + return + var/non_adjusted_total = 0 + for(var/ammo in secondary_ammo) + if(ammo == newtype) + continue + non_adjusted_total += secondary_ammo[ammo] + var/newvalue = clamp(params["new_value"], 0, DEFAULT_MAX_ARMORED_AMMO-non_adjusted_total) + secondary_ammo[newtype] = newvalue + . = TRUE + + if("set_driver_mod") + if(!current_veh_type) + return + var/newtype = text2path(params["type"]) + if(!ispath(newtype, /obj/item/tank_module)) + return + if(!(newtype in GLOB.armored_modtypes[current_veh_type])) + return + current_driver_mod = newtype + . = TRUE + + if("set_gunner_mod") + if(!current_veh_type) + return + var/newtype = text2path(params["type"]) + if(!ispath(newtype, /obj/item/tank_module)) + return + if(!(newtype in GLOB.armored_modtypes[current_veh_type])) + return + current_gunner_mod = newtype + . = TRUE + + if("deploy") + if(supply_shuttle.mode != SHUTTLE_IDLE) + to_chat(usr, span_danger("Elevator moving!")) + return + if(is_mainship_level(supply_shuttle.z)) + to_chat(usr, span_danger("Elevator raised. Lower to deploy vehicle.")) + return + supply_shuttle.buy(usr, src) + ui_act("send", params, ui, state) + SStgui.close_user_uis(usr, src) + current_veh_type = null + current_primary = null + current_secondary = null + current_driver_mod = null + current_gunner_mod = null + primary_ammo = list() + secondary_ammo = list() + update_static_data(usr) + + if(.) + update_static_data(usr) + +#undef DEFAULT_MAX_ARMORED_AMMO diff --git a/code/modules/reqs/weapons.dm b/code/modules/reqs/weapons.dm deleted file mode 100644 index 2984951433b..00000000000 --- a/code/modules/reqs/weapons.dm +++ /dev/null @@ -1,779 +0,0 @@ -/datum/supply_packs/weapons - group = "Weapons" - containertype = /obj/structure/closet/crate/weapon - -/datum/supply_packs/weapons/sentry - name = "Турель TUR-B \"Базис\"" - contains = list( - /obj/item/weapon/gun/sentry/basic, - ) - cost = 200 - -/datum/supply_packs/weapons/sentry_upgrade - name = "Набор для улучшения турели TUR-B" - contains = list( - /obj/item/sentry_upgrade_kit, - ) - cost = 150 - -/datum/supply_packs/weapons/sentry/ammo - name = "Магазин для турели TUR-B \"Базис\"" - contains = list( - /obj/item/ammo_magazine/sentry, - ) - cost = 50 - -/datum/supply_packs/weapons/sentry/ammo/mini - name = "Магазин для турели TUR-M \"Гном\"" - contains = list( - /obj/item/ammo_magazine/minisentry, - ) - -/datum/supply_packs/weapons/sentry/ammo/sniper - name = "Магазин для турели TUR-SN \"Оса\"" - contains = list( - /obj/item/ammo_magazine/sentry/sniper, - ) - -/datum/supply_packs/weapons/sentry/ammo/shotgun - name = "Магазин для турели TUR-SH \"Бык\"" - contains = list( - /obj/item/ammo_magazine/sentry/shotgun, - ) - -/datum/supply_packs/weapons/sentry/ammo/flamer - name = "Бак для турели TUR-F \"Феникс\"" - contains = list( - /obj/item/ammo_magazine/flamer_tank/large/sentry, - ) - -/datum/supply_packs/weapons/buildasentry - name = "Build-A-Sentry Attachment System" - contains = list( - /obj/item/attachable/buildasentry, - ) - cost = 250 - - -/datum/supply_packs/weapons/m56d_emplacement - name = "HSG-102 Mounted Heavy Smartgun" - contains = list(/obj/item/storage/box/hsg102) - cost = 600 - -/datum/supply_packs/weapons/m56d - name = "HSG-102 mounted heavy smartgun ammo" - contains = list(/obj/item/ammo_magazine/hsg102) - cost = 30 - -/datum/supply_packs/weapons/minigun_emplacement - name = "Mounted Automatic Minigun" - contains = list(/obj/item/weapon/gun/standard_minigun) - cost = 600 - -/datum/supply_packs/weapons/minigun_ammo - name = "Mounted Minigun ammo" - contains = list(/obj/item/ammo_magazine/heavy_minigun) - cost = 30 - -/datum/supply_packs/weapons/autocannon_emplacement - name = "ATR-22 Mounted Flak Cannon" - contains = list(/obj/item/weapon/gun/atr22) - cost = 700 - -/datum/supply_packs/weapons/ac_hv - name = "ATR-22 High-Velocity ammo" - contains = list(/obj/item/ammo_magazine/atr22) - cost = 40 - -/datum/supply_packs/weapons/ac_flak - name = "ATR-22 Smart-Detonating ammo" - contains = list(/obj/item/ammo_magazine/atr22/flak) - cost = 40 - -/datum/supply_packs/weapons/ags_emplacement - name = "AGLS-37 Mounted Automated Grenade Launcher" - contains = list(/obj/item/weapon/gun/agls37) - cost = 300 - -/datum/supply_packs/weapons/ags_highexplo - name = "AGLS-37 AGL High Explosive Grenades" - contains = list(/obj/item/ammo_magazine/agls37) - cost = 65 - -/datum/supply_packs/weapons/ags_frag - name = "AGLS-37 AGL Fragmentation Grenades" - contains = list(/obj/item/ammo_magazine/agls37/fragmentation) - cost = 55 - -/datum/supply_packs/weapons/ags_incendiary - name = "AGLS-37 AGL White Phosphorous Grenades" - contains = list(/obj/item/ammo_magazine/agls37/incendiary) - cost = 55 - -/datum/supply_packs/weapons/ags_flare - name = "AGLS-37 AGL Flare Grenades" - contains = list(/obj/item/ammo_magazine/agls37/flare) - cost = 35 - -/datum/supply_packs/weapons/ags_cloak - name = "AGLS-37 AGL Cloak Grenades" - contains = list(/obj/item/ammo_magazine/agls37/cloak) - cost = 45 - -/datum/supply_packs/weapons/ags_tanglefoot - name = "AGLS-37 AGL Tanglefoot Grenades" - contains = list(/obj/item/ammo_magazine/agls37/tanglefoot) - cost = 85 - -/datum/supply_packs/weapons/antitankgun - name = "AT-36 Anti Tank Gun" - contains = list(/obj/item/weapon/gun/at36) - cost = 800 - -/datum/supply_packs/weapons/antitankgunammo - name = "AT-36 AP-HE Shell (x3)" - contains = list( - /obj/item/ammo_magazine/at36, - /obj/item/ammo_magazine/at36, - /obj/item/ammo_magazine/at36, - ) - cost = 20 - -/datum/supply_packs/weapons/antitankgunammo/apcr - name = "AT-36 APCR Shell (x3)" - contains = list( - /obj/item/ammo_magazine/at36/apcr, - /obj/item/ammo_magazine/at36/apcr, - /obj/item/ammo_magazine/at36/apcr, - ) - cost = 20 - -/datum/supply_packs/weapons/antitankgunammo/he - name = "AT-36 HE Shell (x3)" - contains = list( - /obj/item/ammo_magazine/at36/he, - /obj/item/ammo_magazine/at36/he, - /obj/item/ammo_magazine/at36/he, - ) - cost = 20 - -/datum/supply_packs/weapons/antitankgunammo/beehive - name = "AT-36 Beehive Shell (x3)" - contains = list( - /obj/item/ammo_magazine/at36/beehive, - /obj/item/ammo_magazine/at36/beehive, - /obj/item/ammo_magazine/at36/beehive, - ) - cost = 20 - -/datum/supply_packs/weapons/antitankgunammo/incendiary - name = "AT-36 Napalm Shell (x3)" - contains = list( - /obj/item/ammo_magazine/at36/incend, - /obj/item/ammo_magazine/at36/incend, - /obj/item/ammo_magazine/at36/incend, - ) - cost = 20 - -/datum/supply_packs/weapons/flak_gun - name = "FK-88 Flak Gun" - contains = list(/obj/item/weapon/gun/heavy_isg) - cost = 1200 - -/datum/supply_packs/weapons/flak_he - name = "FK-88 HE Shell" - contains = list(/obj/item/ammo_magazine/heavy_isg/he) - cost = 100 - -/datum/supply_packs/weapons/flak_sabot - name = "FK-88 APFDS Shell" - contains = list(/obj/item/ammo_magazine/heavy_isg/sabot) - cost = 120 - -/datum/supply_packs/weapons/heayvlaser_emplacement - name = "Mounted Heavy Laser" - contains = list(/obj/item/weapon/gun/energy/lasgun/lasrifle/heavy_laser/deployable) - cost = 800 - - -/datum/supply_packs/weapons/heayvlaser_ammo - name = "Mounted Heavy Laser Ammo (x1)" - contains = list(/obj/item/cell/lasgun/heavy_laser) - cost = 15 - -/datum/supply_packs/weapons/tesla - name = "Tesla Shock Rifle" - contains = list(/obj/item/weapon/gun/energy/lasgun/lasrifle/tesla) - cost = 600 - -/datum/supply_packs/weapons/tx54 - name = "GL-54 airburst grenade launcher" - contains = list(/obj/item/weapon/gun/rifle/tx54) - cost = 300 - -/datum/supply_packs/weapons/tx54_airburst - name = "GL-54 airburst grenade magazine" - contains = list(/obj/item/ammo_magazine/rifle/tx54) - cost = 20 - -/datum/supply_packs/weapons/tx54_incendiary - name = "GL-54 incendiary grenade magazine" - contains = list(/obj/item/ammo_magazine/rifle/tx54/incendiary) - cost = 60 - -/datum/supply_packs/weapons/tx54_smoke - name = "GL-54 tactical smoke grenade magazine" - contains = list(/obj/item/ammo_magazine/rifle/tx54/smoke) - cost = 12 - -/datum/supply_packs/weapons/tx54_smoke/dense - name = "GL-54 dense smoke grenade magazine" - contains = list(/obj/item/ammo_magazine/rifle/tx54/smoke/dense) - cost = 8 - -/datum/supply_packs/weapons/tx54_smoke/tangle - name = "GL-54 tanglefoot grenade magazine" - contains = list(/obj/item/ammo_magazine/rifle/tx54/smoke/tangle) - cost = 48 - -/datum/supply_packs/weapons/tx55 - name = "AR-55 OICW Rifle" - contains = list(/obj/item/weapon/gun/rifle/tx55) - cost = 525 - -/datum/supply_packs/weapons/recoillesskit - name = "RL-160 Recoilless rifle kit" - contains = list(/obj/item/storage/holster/backholster/rpg/full) - cost = 400 - -/datum/supply_packs/weapons/shell_regular - name = "RL-160 RR HE shell" - contains = list(/obj/item/ammo_magazine/rocket/recoilless) - cost = 30 - -/datum/supply_packs/weapons/shell_le - name = "RL-160 RR LE shell" - contains = list(/obj/item/ammo_magazine/rocket/recoilless/light) - cost = 30 - -/datum/supply_packs/weapons/shell_heat - name = "RL-160 HEAT shell" - contains = list(/obj/item/ammo_magazine/rocket/recoilless/heat) - cost = 30 - -/datum/supply_packs/weapons/shell_smoke - name = "RL-160 RR Smoke shell" - contains = list(/obj/item/ammo_magazine/rocket/recoilless/smoke) - cost = 30 - -/datum/supply_packs/weapons/shell_smoke - name = "RL-160 RR Cloak shell" - contains = list(/obj/item/ammo_magazine/rocket/recoilless/cloak) - cost = 30 - -/datum/supply_packs/weapons/shell_smoke - name = "RL-160 RR Tanglefoot shell" - contains = list(/obj/item/ammo_magazine/rocket/recoilless/plasmaloss) - cost = 30 - -/datum/supply_packs/weapons/pepperball - name = "PB-12 pepperball gun" - contains = list(/obj/item/weapon/gun/rifle/pepperball) - cost = 100 - -/datum/supply_packs/weapons/bricks - name = "Brick" - contains = list(/obj/item/weapon/brick) - cost = 10 - -/datum/supply_packs/weapons/railgun - name = "SR-220 Railgun" - contains = list(/obj/item/weapon/gun/rifle/railgun) - cost = 400 - -/datum/supply_packs/weapons/railgun_ammo - name = "SR-220 Railgun armor piercing discarding sabot round" - contains = list(/obj/item/ammo_magazine/railgun) - cost = 50 - -/datum/supply_packs/weapons/railgun_ammo/hvap - name = "SR-220 Railgun high velocity armor piercing round" - contains = list(/obj/item/ammo_magazine/railgun/hvap) - cost = 50 - -/datum/supply_packs/weapons/railgun_ammo/smart - name = "SR-220 Railgun smart armor piercing round" - contains = list(/obj/item/ammo_magazine/railgun/smart) - cost = 50 - -/datum/supply_packs/weapons/tx8 - name = "BR-8 Scout Rifle" - contains = list(/obj/item/weapon/gun/rifle/tx8) - cost = 400 - -/datum/supply_packs/weapons/scout_regular - name = "BR-8 scout rifle magazine" - contains = list(/obj/item/ammo_magazine/rifle/tx8) - cost = 20 - -/datum/supply_packs/weapons/scout_regular_box - name = "BR-8 scout rifle ammo box" - contains = list(/obj/item/ammo_magazine/packet/scout_rifle) - cost = 50 - -/datum/supply_packs/weapons/scout_impact - name = "BR-8 scout rifle impact magazine" - contains = list(/obj/item/ammo_magazine/rifle/tx8/impact) - cost = 40 - -/datum/supply_packs/weapons/scout_incendiary - name = "Br-8 scout rifle incendiary magazine" - contains = list(/obj/item/ammo_magazine/rifle/tx8/incendiary) - cost = 40 - -/datum/supply_packs/weapons/thermobaric - name = "RL-57 Thermobaric Launcher" - contains = list(/obj/item/weapon/gun/launcher/rocket/m57a4/t57) - cost = 500 - -/datum/supply_packs/weapons/thermobaric_wp - name = "RL-57 Thermobaric WP rocket array" - contains = list(/obj/item/ammo_magazine/rocket/m57a4) - cost = 50 - -/datum/supply_packs/weapons/specdemo - name = "RL-152 SADAR Rocket Launcher" - contains = list(/obj/item/weapon/gun/launcher/rocket/sadar) - cost = SADAR_PRICE - -/datum/supply_packs/weapons/rpg_regular - name = "RL-152 SADAR HE rocket" - contains = list(/obj/item/ammo_magazine/rocket/sadar) - cost = 50 - -/datum/supply_packs/weapons/rpg_regular_unguided - name = "RL-152 SADAR HE rocket (Unguided)" - contains = list(/obj/item/ammo_magazine/rocket/sadar/unguided) - cost = 50 - -/datum/supply_packs/weapons/rpg_ap - name = "RL-152 SADAR AP rocket" - contains = list(/obj/item/ammo_magazine/rocket/sadar/ap) - cost = 60 - -/datum/supply_packs/weapons/rpg_wp - name = "RL-152 SADAR WP rocket" - contains = list(/obj/item/ammo_magazine/rocket/sadar/wp) - cost = 40 - -/datum/supply_packs/weapons/rpg_wp_unguided - name = "RL-152 SADAR WP rocket (Unguided)" - contains = list(/obj/item/ammo_magazine/rocket/sadar/wp/unguided) - cost = 40 - -/datum/supply_packs/weapons/zx76 - name = "ZX-76 Twin-Barrled Burst Shotgun" - contains = list(/obj/item/weapon/gun/shotgun/zx76) - cost = 1000 - -/datum/supply_packs/weapons/shotguntracker - name = "12 Gauge Tracker Shells" - contains = list(/obj/item/ammo_magazine/shotgun/tracker) - cost = 50 - -/datum/supply_packs/weapons/incendiaryslugs - name = "Box of Incendiary Slugs" - contains = list(/obj/item/ammo_magazine/shotgun/incendiary) - cost = 100 - -/datum/supply_packs/weapons/sr81 - name = "SR-81 IFF Auto Sniper kit" - contains = list(/obj/item/weapon/gun/rifle/sr81) - cost = 500 - -/datum/supply_packs/weapons/sr81_ammo - name = "SR-81 IFF sniper magazine" - contains = list(/obj/item/ammo_magazine/rifle/sr81) - cost = 30 - -/datum/supply_packs/weapons/sr81_packet - name = "SR-81 IFF sniper ammo box" - contains = list(/obj/item/ammo_magazine/packet/sr81) - cost = 50 - -/datum/supply_packs/weapons/antimaterial - name = "SR-26 Antimaterial rifle (AMR) kit" - contains = list(/obj/item/weapon/gun/rifle/sniper/antimaterial) - cost = 775 - -/datum/supply_packs/weapons/antimaterial_ammo - name = "SR-26 AMR magazine" - contains = list(/obj/item/ammo_magazine/sniper) - cost = 30 - -/datum/supply_packs/weapons/antimaterial_incend_ammo - name = "SR-26 AMR incendiary magazine" - contains = list(/obj/item/ammo_magazine/sniper/incendiary) - cost = 50 - -/datum/supply_packs/weapons/antimaterial_flak_ammo - name = "SR-26 AMR flak magazine" - contains = list(/obj/item/ammo_magazine/sniper/flak) - cost = 40 - -/datum/supply_packs/weapons/specminigun - name = "MG-100 Vindicator Minigun" - contains = list(/obj/item/weapon/gun/minigun) - cost = MINIGUN_PRICE - -/datum/supply_packs/weapons/minigun - name = "MG-100 Vindicator Minigun Powerpack" - contains = list(/obj/item/ammo_magazine/minigun_powerpack) - cost = 50 - -/datum/supply_packs/weapons/mg27 - name = "MG-27 Medium Machinegun" - contains = list(/obj/item/weapon/gun/mg27) - cost = 100 - -/datum/supply_packs/weapons/hmg08 - name = "HMG-08 heavy machinegun" - contains = list(/obj/item/weapon/gun/hmg08) - cost = 400 - -/datum/supply_packs/weapons/hmg08_ammo - name = "HMG-08 heavy machinegun ammo (500 rounds)" - contains = list(/obj/item/ammo_magazine/hmg08) - cost = 70 - -/datum/supply_packs/weapons/hmg08_ammo_small - name = "HMG-08 heavy machinegun ammo (250 rounds)" - contains = list(/obj/item/ammo_magazine/hmg08/small) - cost = 40 - -/datum/supply_packs/weapons/sg29 - name = "SG-29 smart machine gun" - contains = list(/obj/item/weapon/gun/rifle/sg29) - cost = 400 - -/datum/supply_packs/weapons/sg29_ammo - name = "SG-29 ammo drum" - contains = list(/obj/item/ammo_magazine/sg29) - cost = 50 - -/datum/supply_packs/weapons/smart_minigun - name = "SG-85 smart gatling gun" - contains = list(/obj/item/weapon/gun/minigun/smart_minigun) - cost = 400 - -/datum/supply_packs/weapons/smart_minigun_ammo - name = "SG-85 ammo bin" - contains = list(/obj/item/ammo_magazine/packet/smart_minigun) - cost = 50 - -/datum/supply_packs/weapons/sg62 - name = "SG-62 Smart Target Rifle" - contains = list(/obj/item/weapon/gun/rifle/sg62) - cost = 400 - -/datum/supply_packs/weapons/sg62_ammo - name = "SG-62 smart target rifle ammo" - contains = list(/obj/item/ammo_magazine/rifle/sg62) - cost = 35 - -/datum/supply_packs/weapons/sg153_ammo - name = "SG-153 spotting rifle ammo" - contains = list(/obj/item/ammo_magazine/rifle/sg153) - cost = 15 - -/datum/supply_packs/weapons/sg153_ammo/highimpact - name = "SG-153 high impact spotting rifle ammo" - contains = list(/obj/item/ammo_magazine/rifle/sg153/highimpact) - -/datum/supply_packs/weapons/sg153_ammo/heavyrubber - name = "SG-153 heavy rubber spotting rifle ammo" - contains = list(/obj/item/ammo_magazine/rifle/sg153/heavyrubber) - -/datum/supply_packs/weapons/sg153_ammo/plasmaloss - name = "SG-153 tanglefoot spotting rifle ammo" - contains = list(/obj/item/ammo_magazine/rifle/sg153/plasmaloss) - -/datum/supply_packs/weapons/sg153_ammo/tungsten - name = "SG-153 tungsten spotting rifle ammo" - contains = list(/obj/item/ammo_magazine/rifle/sg153/tungsten) - -/datum/supply_packs/weapons/sg153_ammo/flak - name = "SG-153 flak spotting rifle ammo" - contains = list(/obj/item/ammo_magazine/rifle/sg153/flak) - -/datum/supply_packs/weapons/sg153_ammo/incendiary - name = "SG-153 incendiary spotting rifle ammo" - contains = list(/obj/item/ammo_magazine/rifle/sg153/incendiary) - -/datum/supply_packs/weapons/flamethrower - name = "FL-84 Flamethrower" - contains = list(/obj/item/weapon/gun/flamer/big_flamer/marinestandard) - cost = 150 - -/datum/supply_packs/weapons/napalm - name = "FL-84 normal fuel tank" - contains = list(/obj/item/ammo_magazine/flamer_tank/large) - cost = 60 - -/datum/supply_packs/weapons/napalm_G - name = "FL-84 G fuel tank" - contains = list(/obj/item/ammo_magazine/flamer_tank/large/G) - cost = 75 - -/datum/supply_packs/weapons/napalm_X - name = "FL-84 X fuel tank" - contains = list(/obj/item/ammo_magazine/flamer_tank/large/X) - cost = 300 - -/datum/supply_packs/weapons/back_fuel_tank - name = "Standard back fuel tank" - contains = list(/obj/item/ammo_magazine/flamer_tank/backtank) - cost = 200 - -/datum/supply_packs/weapons/back_fuel_tank_g - name = "Type G fuel tank" - contains = list(/obj/item/ammo_magazine/flamer_tank/backtank/G) - cost = 150 - -/datum/supply_packs/weapons/back_fuel_tank_x - name = "Type X back fuel tank" - contains = list(/obj/item/ammo_magazine/flamer_tank/backtank/X) - cost = 600 - -/datum/supply_packs/weapons/mini_fuel_tank_g - name = "Type G mini fuel tank" - contains = list(/obj/item/ammo_magazine/flamer_tank/mini/G) - cost = 5 - -/datum/supply_packs/weapons/mini_fuel_tank_x - name = "Type X back mini fuel tank" - contains = list(/obj/item/ammo_magazine/flamer_tank/mini/X) - cost = 20 - -/datum/supply_packs/weapons/fueltank_g - name = "G-fuel tank" - contains = list(/obj/structure/reagent_dispensers/fueltank/gfuel) - cost = 150 - containertype = null - -/datum/supply_packs/weapons/fueltank - name = "X-fuel tank" - contains = list(/obj/structure/reagent_dispensers/fueltank/xfuel) - cost = 600 - containertype = null - -/datum/supply_packs/weapons/rpgoneuse - name = "RL-72 Disposable RPG" - contains = list(/obj/item/weapon/gun/launcher/rocket/oneuse) - cost = 100 - -/datum/supply_packs/weapons/mateba - name = "Mateba Autorevolver belt" - contains = list(/obj/item/storage/holster/belt/revolver/mateba/full) - notes = "Contains 6 speedloaders" - cost = 150 - -/datum/supply_packs/weapons/mateba_ammo - name = "Mateba magazine" - contains = list(/obj/item/ammo_magazine/revolver/mateba) - cost = 30 - -/datum/supply_packs/weapons/mateba_packet - name = "Mateba packet" - contains = list(/obj/item/ammo_magazine/packet/mateba) - cost = 120 - -/datum/supply_packs/weapons/standard_ammo - name = "Surplus Standard Ammo Crate" - notes = "Contains 22 ammo boxes of a wide variety which come prefilled. You lazy bum." - contains = list(/obj/structure/largecrate/supply/ammo/standard_ammo) - containertype = null - cost = 200 - -/datum/supply_packs/weapons/sr127_flak - name = "SR-127 Flak Magazine" - contains = list(/obj/item/ammo_magazine/rifle/sr127/flak) - cost = 50 - -/datum/supply_packs/weapons/rechargemag - name = "Terra Experimental recharger battery" - contains = list(/obj/item/cell/lasgun/lasrifle/recharger) - cost = 60 - -/datum/supply_packs/weapons/xray_gun - name = "TE-X Laser Rifle" - contains = list(/obj/item/weapon/gun/energy/lasgun/lasrifle/xray) - cost = 400 - -/datum/supply_packs/weapons/rocketsledge - name = "Rocket Sledge" - contains = list(/obj/item/weapon/twohanded/rocketsledge) - cost = 600 - -/datum/supply_packs/weapons/smart_pistol - name = "TX13 smartpistol" - contains = list(/obj/item/weapon/gun/pistol/smart_pistol) - cost = 150 - -/datum/supply_packs/weapons/smart_pistol_ammo - name = "TX13 smartpistol ammo" - contains = list(/obj/item/ammo_magazine/pistol/p14/smart_pistol) - cost = 10 - -/datum/supply_packs/weapons/vector_incendiary - name = "vector incendiary magazine" - contains = list(/obj/item/ammo_magazine/smg/vector/incendiary) - cost = 20 //40 rounds - containertype = /obj/structure/closet/crate/ammo - -/datum/supply_packs/weapons/valihalberd - name = "VAL-HAL-A" - contains = list(/obj/item/weapon/twohanded/glaive/halberd/harvester) - cost = 600 - -/datum/supply_packs/weapons/t500case - name = "R-500 bundle" - contains = list(/obj/item/storage/box/t500case) - cost = 50 - -/datum/supply_packs/weapons/r76case - name = "R76 bundle" - contains = list(/obj/item/storage/briefcase/standard_magnum) - cost = 120 - -/datum/supply_packs/weapons/r76_speedloader - name = "R76 speedloader (x4)" - contains = list( - /obj/item/ammo_magazine/revolver/standard_magnum, - /obj/item/ammo_magazine/revolver/standard_magnum, - /obj/item/ammo_magazine/revolver/standard_magnum, - /obj/item/ammo_magazine/revolver/standard_magnum, - ) - cost = 40 - -/datum/supply_packs/weapons/ar12_incendiary - name = "AR-12 incendiary magazine" - contains = list(/obj/item/ammo_magazine/rifle/ar12/incendiary) - cost = 30 //50 rounds - containertype = /obj/structure/closet/crate/ammo - -/datum/supply_packs/weapons/smg25_ap - name = "SMG-25 armor piercing magazine" - contains = list(/obj/item/ammo_magazine/smg/m25/ap) - cost = 30 //60 rounds - containertype = /obj/structure/closet/crate/ammo - -/datum/supply_packs/weapons/box_10x24mm_incendiary - name = "10x24mm incendiary ammo box" - contains = list(/obj/item/ammo_magazine/packet/p10x24mm/incendiary) - cost = 45 //150 rounds - containertype = /obj/structure/closet/crate/ammo - -/datum/supply_packs/weapons/rifle/t25 - name = "T25 smartrifle" - contains = list(/obj/item/weapon/gun/rifle/t25) - cost = 400 - -/datum/supply_packs/weapons/ammo_magazine/rifle/t25 - name = "T25 smartrifle magazine" - contains = list(/obj/item/ammo_magazine/rifle/t25) - cost = 20 - -/datum/supply_packs/weapons/t25_extended_mag - name = "T25 extended magazine" - contains = list(/obj/item/ammo_magazine/rifle/t25/extended) - cost = 200 - containertype = /obj/structure/closet/crate/ammo - -/datum/supply_packs/weapons/ammo_magazine/packet/t25 - name = "T25 smartrifle ammo box" - contains = list(/obj/item/ammo_magazine/packet/t25) - cost = 60 - -/datum/supply_packs/weapons/box_10x25mm_incendiary - name = "10x25mm incendiary ammo box" - contains = list(/obj/item/ammo_magazine/packet/p10x25mm/incendiary) - cost = 50 //125 rounds - containertype = /obj/structure/closet/crate/ammo - -/datum/supply_packs/weapons/p9mm_incendiary - name = "9mm incendiary packet" - contains = list(/obj/item/ammo_magazine/packet/p9mm/incendiary) - cost = 30 //70 rounds - containertype = /obj/structure/closet/crate/ammo - -/datum/supply_packs/weapons/box_10x265mm_ap - name = "10x26.5mm armor piercing ammo box" - contains = list(/obj/item/ammo_magazine/packet/p10x265mm/ap) - cost = 60 //100 rounds - containertype = /obj/structure/closet/crate/ammo - -/datum/supply_packs/weapons/box_10x20mm_ap - name = "10x20mm armor piercing ammo box" - contains = list(/obj/item/ammo_magazine/packet/p10x20mm/ap) - cost = 50 //150 rounds - containertype = /obj/structure/closet/crate/ammo - -/datum/supply_packs/weapons/thermobaric - name = "RL-57 Thermobaric Launcher Kit" - contains = list(/obj/item/storage/holster/backholster/rlquad/full) - cost = 500 + 50 //ammo price - -/datum/supply_packs/weapons/specdemo - name = "RL-152 SADAR Rocket Launcher kit" - contains = list(/obj/item/storage/holster/backholster/rlsadar/full) - cost = SADAR_PRICE + 150 //ammo price - -/datum/supply_packs/weapons/minigun_powerpack - name = "SG-85 Minigun Powerpack" - contains = list(/obj/item/ammo_magazine/minigun_powerpack/smartgun) - cost = 150 - -/datum/supply_packs/weapons/box_10x27mm - name = "SG-62 smart target rifle ammo box" - contains = list(/obj/item/ammo_magazine/packet/sg62) - cost = 50 - -/datum/supply_packs/weapons/xray_gun - contains = list(/obj/item/weapon/gun/energy/lasgun/lasrifle/xray) - cost = 500 - -/datum/supply_packs/weapons/singleshot_launcher - name = "GL-81 grenade launcher" - contains = list(/obj/item/weapon/gun/grenade_launcher/single_shot) - cost = 150 - -/datum/supply_packs/weapons/multinade_launcher - name = "GL-70 grenade launcher" - contains = list(/obj/item/weapon/gun/grenade_launcher/multinade_launcher/unloaded) - cost = 450 - -/datum/supply_packs/weapons/ltb_shells - name = "LTB tank shell" - contains = list(/obj/item/ammo_magazine/tank/ltb_cannon) - cost = 10 - -/datum/supply_packs/weapons/ltb_shells_apfds - name = "LTB tank APFDS shell" - contains = list(/obj/item/ammo_magazine/tank/ltb_cannon/apfds) - cost = 10 - -/datum/supply_packs/weapons/ltaap_rounds - name = "LTAAP tank magazine" - contains = list(/obj/item/ammo_magazine/tank/ltaap_chaingun) - cost = 10 - -/datum/supply_packs/weapons/cupola_rounds - name = "Cupola tank magazine" - contains = list(/obj/item/ammo_magazine/tank/secondary_cupola) - cost = 10 - -/datum/supply_packs/weapons/secondary_flamer_tank - name = "Spray flamer tank" - contains = list(/obj/item/ammo_magazine/tank/secondary_flamer_tank) - cost = 10 diff --git a/code/modules/reqtorio/assembly_crafts.dm b/code/modules/reqtorio/assembly_crafts.dm index 8591ceca2ed..3ce29de44dc 100644 --- a/code/modules/reqtorio/assembly_crafts.dm +++ b/code/modules/reqtorio/assembly_crafts.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_INIT(all_assembly_craft_groups, list("Operations", "Weapons", "Explo name = "Clearing junk in phoron and glass? Explosion transformation power!" craft_time = 15 SECONDS input = list(/obj/item/stack/sheet/mineral/junk = 4) // 20 points - output = list(/obj/item/stack/sheet/glass = 3, /obj/item/stack/sheet/mineral/phoron = 1) //that expensive! but automized! + output = list(/obj/item/stack/sheet/glass/glass = 3, /obj/item/stack/sheet/mineral/phoron = 1) //that expensive! but automized! //one in one craft cuz junk is multi use resource /datum/assembly_craft/engineering/junk_phoron_iron @@ -87,7 +87,7 @@ GLOBAL_LIST_INIT(all_assembly_craft_groups, list("Operations", "Weapons", "Explo /datum/assembly_craft/engineering/drop_pod name = "Zeus orbital drop pod" craft_time = 20 SECONDS - input = list(/obj/item/stack/sheet/plasteel = 5, /obj/item/stack/sheet/glass = 3) // 40 + 6 + input = list(/obj/item/stack/sheet/plasteel = 5, /obj/item/stack/sheet/glass/glass = 3) // 40 + 6 output = list(/obj/structure/droppod = 1) //40 points /******************************************************************************* @@ -98,7 +98,7 @@ CLOTHING /datum/assembly_craft/clothing/swat_mask name = "SWAT mask" - input = list(/obj/item/stack/sheet/plasteel = 3, /obj/item/stack/sheet/glass = 3) // 24 + 6 points + input = list(/obj/item/stack/sheet/plasteel = 3, /obj/item/stack/sheet/glass/glass = 3) // 24 + 6 points output = list(/obj/item/clothing/mask/gas/swat = 1) // 25 points from old factory @@ -305,3 +305,28 @@ WEAPONS name = "MLRS High Explosive rocket" input = list(/obj/item/stack/sheet/plasteel = 3, /obj/item/stack/gun_powder = 3) // 24 + 24 points output = list(/obj/item/storage/box/mlrs_rockets = 1) // 33 points from old factory + +/datum/assembly_craft/weapons/ltb_shells + name = "LTB tank shell" + input = list(/obj/item/stack/sheet/jeweler_steel = 1, /obj/item/stack/gun_powder = 5) + output = list(/obj/item/ammo_magazine/tank/ltb_cannon = 1) + +/datum/assembly_craft/weapons/ltb_cannon_apfds + name = "LTB tank APFDS shell" + input = list(/obj/item/stack/sheet/jeweler_steel = 2, /obj/item/stack/gun_powder = 3) + output = list(/obj/item/ammo_magazine/tank/ltb_cannon/apfds = 1) + +/datum/assembly_craft/weapons/ltb_cannon_TOW + name = "TOW Launcher Magazine" + input = list(/obj/item/stack/sheet/jeweler_steel = 3, /obj/item/stack/gun_powder = 6) + output = list(/obj/item/ammo_magazine/tank/towlauncher = 1) + +/datum/assembly_craft/weapons/heavy_isg_he + name = "A 15cm HE shell for the FK-88 mounted flak gun." + input = list(/obj/item/stack/sheet/jeweler_steel = 25, /obj/item/stack/gun_powder = 30) + output = list(/obj/item/ammo_magazine/heavy_isg/he = 1) + +/datum/assembly_craft/weapons/heavy_isg_sabot + name = "A 15cm APFDS shell for the FK-88 mounted flak gun" + input = list(/obj/item/stack/sheet/jeweler_steel = 30, /obj/item/stack/gun_powder = 25) + output = list(/obj/item/ammo_magazine/heavy_isg/sabot = 1) diff --git a/code/modules/requisitions/supply_export.dm b/code/modules/requisitions/supply_export.dm index dfcd0c4d500..750d96a83b0 100644 --- a/code/modules/requisitions/supply_export.dm +++ b/code/modules/requisitions/supply_export.dm @@ -18,46 +18,46 @@ if(!.) return FALSE - var/list/points = get_export_value() - GLOB.round_statistics.points_from_xenos += points[1] + var/points = get_export_value() + GLOB.round_statistics.points_from_xenos += points -/atom/movable/proc/get_export_value() - return 0 +/atom/movable/proc/get_export_value(export_value = 0) + return export_value -/mob/living/carbon/human/get_export_value() +/mob/living/carbon/human/get_export_value(export_value) if(!job) - return 0 + return export_value switch(job.job_category) if(JOB_CAT_CIVILIAN) - . = 10 + export_value = 10 if(JOB_CAT_ENGINEERING, JOB_CAT_MEDICAL, JOB_CAT_REQUISITIONS) - . = 150 + export_value = 150 if(JOB_CAT_MARINE) - . = 100 + export_value = 100 if(JOB_CAT_SILICON) - . = 800 + export_value = 800 if(JOB_CAT_COMMAND) - . = 1000 - return 0 + export_value = 1000 + return export_value /mob/living/carbon/human/species/yautja/get_export_value() return 3000 -/mob/living/carbon/xenomorph/get_export_value() +/mob/living/carbon/xenomorph/get_export_value(export_value) switch(tier) if(XENO_TIER_MINION) - . = 50 + export_value = 50 if(XENO_TIER_ZERO) - . = 70 + export_value = 70 if(XENO_TIER_ONE) - . = 150 + export_value = 150 if(XENO_TIER_TWO) - . = 300 + export_value = 300 if(XENO_TIER_THREE) - . = 500 + export_value = 500 if(XENO_TIER_FOUR) - . = 1000 - return + export_value = 1000 + return export_value //I hate it but it's how it was so I'm not touching it further than this /mob/living/carbon/xenomorph/shrike/get_export_value() diff --git a/code/modules/screen_alert/command_alert.dm b/code/modules/screen_alert/command_alert.dm index b489b9fb9bc..4f4afd9f118 100644 --- a/code/modules/screen_alert/command_alert.dm +++ b/code/modules/screen_alert/command_alert.dm @@ -24,6 +24,9 @@ var/skill_min = SKILL_LEAD_EXPERT /datum/action/innate/message_squad/should_show() + . = ..() + if(!.) + return return owner.skills.getRating(skill_name) >= skill_min /datum/action/innate/message_squad/can_use_action() @@ -39,7 +42,7 @@ if(!can_use_action()) return var/mob/living/carbon/human/human_owner = owner - var/text = tgui_input_text(human_owner, "Maximum message length [MAX_COMMAND_MESSAGE_LEN]", "Send message to squad", max_length = MAX_COMMAND_MESSAGE_LEN, multiline = TRUE) + var/text = tgui_input_text(human_owner, "Максимальная длина [MAX_COMMAND_MESSAGE_LEN]", "Отправить сообщение отряду", max_length = MAX_COMMAND_MESSAGE_LEN, multiline = TRUE) if(!text) return var/filter_result = CAN_BYPASS_FILTER(human_owner) ? null : is_ic_filtered(text) @@ -53,7 +56,9 @@ return var/sound/S = sound('sound/misc/notice2.ogg') S.channel = CHANNEL_ANNOUNCEMENTS - TIMER_COOLDOWN_START(owner, COOLDOWN_HUD_ORDER, ORDER_COOLDOWN) + TIMER_COOLDOWN_START(owner, COOLDOWN_HUD_ORDER, CIC_ORDER_COOLDOWN) + addtimer(CALLBACK(src, PROC_REF(update_button_icon)), CIC_ORDER_COOLDOWN + 1) + update_button_icon() log_game("[key_name(human_owner)] has broadcasted the hud message [text] at [AREACOORD(human_owner)]") var/override_color // for squad colors var/list/alert_receivers = (GLOB.alive_human_list + GLOB.ai_list + GLOB.observer_list) // for full faction alerts, do this so that faction's AI and ghosts can hear aswell @@ -70,21 +75,21 @@ else override_color = "grey" for(var/mob/living/carbon/human/marine AS in human_owner.assigned_squad.marines_list | GLOB.observer_list) - marine.play_screen_text("SQUAD ANNOUNCEMENT:
" + text, /atom/movable/screen/text/screen_text/command_order) + marine.play_screen_text("ПРИКАЗ ОТРЯДУ:
" + text, /atom/movable/screen/text/screen_text/command_order) to_chat(marine, assemble_alert( - title = "Squad [human_owner.assigned_squad.name] Announcement", - subtitle = "Sent by [human_owner.real_name]", + title = "Приказ отряду [human_owner.assigned_squad.name]", + subtitle = "Отправлен [human_owner.real_name]", message = text, color_override = override_color )) return for(var/mob/faction_receiver in alert_receivers) if(faction_receiver.faction == human_owner.faction || isdead(faction_receiver)) - var/faction_title = GLOB.faction_to_acronym[human_owner.faction] ? GLOB.faction_to_acronym[human_owner.faction] + " Command" : "Unknown Faction" + " Command" - faction_receiver.play_screen_text("[uppertext(faction_title)] ANNOUNCEMENT:
" + text, /atom/movable/screen/text/screen_text/command_order) + var/faction_title = GLOB.faction_to_acronym[human_owner.faction] ? "Командования " + GLOB.faction_to_acronym[human_owner.faction] : "Командования" + " Неизвестной Фракции" + faction_receiver.play_screen_text(" ПРИКАЗ [uppertext(faction_title)]:
" + text, /atom/movable/screen/text/screen_text/command_order) to_chat(faction_receiver, assemble_alert( - title = "[faction_title] Announcement", - subtitle = "Sent by [human_owner.job.title] [human_owner.real_name]", + title = "Сообщение от [faction_title]", + subtitle = "Отправлен [human_owner.job.title] [human_owner.real_name]", message = text )) SEND_SOUND(faction_receiver, S) diff --git a/code/modules/shuttle/marine_dropship.dm b/code/modules/shuttle/marine_dropship.dm index b4213f0f7ee..e47e4026de6 100644 --- a/code/modules/shuttle/marine_dropship.dm +++ b/code/modules/shuttle/marine_dropship.dm @@ -261,7 +261,7 @@ if(hijack_state != HIJACK_STATE_NORMAL) return cycle_timer = addtimer(CALLBACK(src, PROC_REF(go_to_previous_destination)), 20 SECONDS, TIMER_STOPPABLE) - priority_announce("The Alamo will depart towards [previous.name] in 20 seconds.", "Dropship Automatic Departure", color_override = "grey", playing_sound = FALSE) + priority_announce("Десантный шаттл взлетает через 20 секунд по направлению к [previous.name]", "Автопилот Нормандии", color_override = "grey", playing_sound = FALSE) ///Send the dropship to its previous dock /obj/docking_port/mobile/marine_dropship/proc/go_to_previous_destination() @@ -324,7 +324,7 @@ /obj/docking_port/mobile/marine_dropship/on_prearrival() . = ..() if(hijack_state == HIJACK_STATE_CRASHING) - priority_announce("DROPSHIP ON COLLISION COURSE. CRASH IMMINENT.", "EMERGENCY", sound = 'sound/AI/dropship_emergency.ogg', color_override = "red") + priority_announce("ДЕСАНТНЫЙ ШАТТЛ НА КУРСЕ СТОЛКНОВЕНИЯ. АВАРИЯ НЕИЗБЕЖНА.", "ТРЕВОГА", sound = 'sound/AI/dropship_emergency.ogg', color_override = "red") for(var/obj/machinery/landinglight/light AS in GLOB.landing_lights) if(light.linked_port == destination) light.turn_on() @@ -376,7 +376,7 @@ message_admins("[ADMIN_TPMONTY(src)] has summoned the dropship") log_admin("[key_name(src)] has summoned the dropship") hive?.xeno_message("[src] has summoned down the metal bird to [port], gather to her now!") - priority_announce("Unknown external interference with dropship control. Shutting down autopilot.", "Critical Dropship Alert", type = ANNOUNCEMENT_PRIORITY, color_override = "red") + priority_announce("Неизвестное вмешательство в управление десантным шаттлом. Выключение автопилота...", "Неисправность Шаттла", type = ANNOUNCEMENT_PRIORITY, color_override = "red", sound = 'sound/AI/dropship_wrong.ogg') #define ALIVE_HUMANS_FOR_CALLDOWN 0.1 @@ -414,37 +414,37 @@ locked_sides++ break if(!locked_sides) - to_chat(user, span_warning("The bird is already on the ground, open and vulnerable.")) + to_chat(user, span_warning("Птица уже на земле, открыта и уязвимая.")) return FALSE if(locked_sides < 3 && !isdropshiparea(get_area(user))) - to_chat(user, span_warning("At least one side is still unlocked!")) + to_chat(user, span_warning("По крайней мере одна сторона все еще разблокирована!")) return FALSE - to_chat(user, span_xenodanger("We crack open the metal bird's shell.")) + to_chat(user, span_xenodanger("Мы вскрываем металлическую оболочку птицы.")) if(D.hijack_state != HIJACK_STATE_NORMAL) return FALSE - to_chat(user, span_warning("We begin overriding the shuttle lockdown. This will take a while...")) + to_chat(user, span_warning("Мы начинаем отменять блокировку шаттла. Это займет некоторое время...")) if(!do_after(user, 30 SECONDS, FALSE, null, BUSY_ICON_DANGER, BUSY_ICON_DANGER)) - to_chat(user, span_warning("We cease overriding the shuttle lockdown.")) + to_chat(user, span_warning("Мы прекращаем отмену блокировки шаттла.")) return FALSE if(!is_ground_level(D.z)) - to_chat(user, span_warning("The bird has left meanwhile, try again.")) + to_chat(user, span_warning("Птица улетела, попробуйте еще раз.")) return FALSE D.unlock_all() if(D.mode != SHUTTLE_IGNITING) D.set_hijack_state(HIJACK_STATE_UNLOCKED) D.do_start_hijack_timer(GROUND_LOCKDOWN_TIME) - to_chat(user, span_warning("We were unable to prevent the bird from flying as it is already taking off.")) + to_chat(user, span_warning("Мы не можем помешать птице улететь, так как она уже взлетает.")) D.silicon_lock_airlocks(TRUE) - to_chat(user, span_warning("We have overriden the shuttle lockdown!")) + to_chat(user, span_warning("Мы отменили блокировку шаттла!")) playsound(user, "alien_roar", 50) - priority_announce("Normandy lockdown protocol compromised. Interference preventing remote control.", "Dropship Lock Alert", type = ANNOUNCEMENT_PRIORITY, color_override = "red") + priority_announce("Протокол блокировки Нормандии скомпрометирован. Постороннее вмешательство блокирует попытки удалённого управления.", "Шаттл Заблокирован", type = ANNOUNCEMENT_PRIORITY, color_override = "red", sound = 'sound/AI/dropship_block.ogg') return FALSE if(D.mode != SHUTTLE_IDLE && D.mode != SHUTTLE_RECHARGING) - to_chat(user, span_warning("The bird's mind is currently active. We need to wait until it's more vulnerable...")) + to_chat(user, span_warning("Сознание птицы активно. Нужно подождать, пока она станет более уязвимым...")) return FALSE var/list/living_player_list = count_humans_and_xenos(SSmapping.levels_by_any_trait(list(ZTRAIT_GROUND)), COUNT_IGNORE_ALIVE_SSD) if(length_char(GLOB.alive_human_list) && ((living_player_list[1] / length_char(GLOB.alive_human_list)) > ALIVE_HUMANS_FOR_CALLDOWN)) - to_chat(user, span_warning("There's too many tallhosts still on the ground. They interfere with our psychic field. We must dispatch them before we are able to do this.")) + to_chat(user, span_warning("Ещё много живой добычи на земле. Они мешают нашему психическому полю. Мы должны уничтожить их, прежде чем сможем это сделать.")) return FALSE return TRUE @@ -695,23 +695,23 @@ if(href_list["hijack"]) if(!(X.hive.hive_flags & HIVE_CAN_HIJACK)) - to_chat(X, span_warning("Our hive lacks the psychic prowess to hijack the bird.")) + to_chat(X, span_warning("Нашему улью не хватает экстрасенсорных способностей, чтобы украсть птицу.")) return var/list/living_player_list = SSticker.mode.count_humans_and_xenos(list(X.z), COUNT_IGNORE_ALIVE_SSD) - if(living_player_list[1] > 5) - to_chat(X, span_xenowarning("There is still prey left to hunt!")) + if(living_player_list[1] > living_player_list[2]) // if there are more marines than xenos, we are unable to hijack + to_chat(X, span_xenowarning("Еще осталась добыча, на которую можно поохотиться!")) return switch(M.mode) if(SHUTTLE_RECHARGING) - to_chat(X, span_xenowarning("The bird is still cooling down.")) + to_chat(X, span_xenowarning("Птица все еще остывает...")) return if(SHUTTLE_IDLE) //Continue. EMPTY_BLOCK_GUARD else - to_chat(X, span_xenowarning("We can't do that right now.")) + to_chat(X, span_xenowarning("Мы не можем сделать это сейчас.")) return - var/confirm = tgui_alert(usr, "Would you like to hijack the metal bird?", "Hijack the bird?", list("Yes", "No")) - if(confirm != "Yes") + var/confirm = tgui_alert(usr, "Хотите угнать металлическую птицу?", "Угнать птицу?", list("Да", "Нет")) + if(confirm != "Да") return var/obj/docking_port/stationary/marine_dropship/crash_target/CT = pick(SSshuttle.crash_targets) if(!CT) @@ -721,13 +721,13 @@ if(href_list["abduct"]) var/list/living_player_list = SSticker.mode.count_humans_and_xenos(list(X.z), COUNT_IGNORE_ALIVE_SSD) if(living_player_list[1] > 5) - to_chat(X, span_xenowarning("There is still prey left to hunt!")) + to_chat(X, span_xenowarning("Еще осталась добыча, на которую можно поохотиться!")) return - var/confirm = tgui_alert(usr, "Would you like to capture the metal bird?\n THIS WILL END THE ROUND", "Capture the ship?", list( "Yes", "No")) - if(confirm != "Yes") + var/confirm = tgui_alert(usr, "Хотите захватить металлическую птицу?\n ЭТО ЗАВЕРШИТ РАУНД", "Захватить птицу?", list( "Да", "Нет")) + if(confirm != "Да") return - priority_announce("The Normandy has been captured! Losing their main mean of accessing the ground, the marines have no choice but to retreat.", title = "Normandy Captured", color_override = "orange") + priority_announce("Нормандия захвачена! Потеряв главный путь к земле, морпехи вынуждены отступить.", title = "Нормандия Захвачена", color_override = "orange") var/datum/game_mode/infestation/infestation_mode = SSticker.mode infestation_mode.round_stage = INFESTATION_DROPSHIP_CAPTURED_XENOS return @@ -741,7 +741,7 @@ crashing_dropship.crashing = TRUE crashing_dropship.unlock_all() SEND_GLOBAL_SIGNAL(COMSIG_GLOB_DROPSHIP_HIJACKED) - priority_announce("Unscheduled dropship departure detected from operational area. Hijack likely.", title = "Critical Dropship Alert", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/hijack.ogg', color_override = "red") + priority_announce("Зафиксирован незапланированный вылет Нормандии из зоны боевых действий. Вероятен угон.", title = "Неисправность Нормандии", type = ANNOUNCEMENT_PRIORITY, sound = 'sound/AI/hijack.ogg', color_override = "red") to_chat(user, span_danger("A loud alarm erupts from [src]! The fleshy hosts must know that you can access it!")) user.hive.on_shuttle_hijack(crashing_dropship) playsound(src, 'sound/misc/queen_alarm.ogg') @@ -749,12 +749,12 @@ SSevacuation.flags_scuttle &= ~FLAGS_SDEVAC_TIMELOCK switch(SSshuttle.moveShuttleToDock(shuttleId, crash_target, TRUE)) if(0) - visible_message("Shuttle departing. Please stand away from the doors.") + visible_message("Отправление шаттла. Осторожно, двери закрываются.") if(1) - to_chat(user, span_warning("Invalid shuttle requested. This shouldn't happen, please report it.")) + to_chat(user, span_warning("Неверный запрос на шаттл. Такого не должно быть! Сообщите об этом администрации.")) CRASH("moveShuttleToDock() returned 1.") else - to_chat(user, span_warning("ERROR. This shouldn't happen, please report it.")) + to_chat(user, span_warning("ОШИБКА. Такого не должно быть! Сообщите об этом администрации.")) CRASH("moveShuttleToDock() returned a non-zero-nor-one value.") /obj/machinery/computer/shuttle/marine_dropship/one @@ -1481,7 +1481,7 @@ if(admin_response == "deny") TIMER_COOLDOWN_START(src, COOLDOWN_EVACUATION, 15 SECONDS) - priority_announce("An evacuation attempt has been blocked, the engines are now restarting.", "Evacuation Attempt", ANNOUNCEMENT_COMMAND) + priority_announce("Попытка эвакуации заблокирована. Перезапуск двигателей...", "Попытка Эвакуации", ANNOUNCEMENT_COMMAND) return TRUE if(admin_response =="deny without annoncing") TIMER_COOLDOWN_START(src, COOLDOWN_EVACUATION, 15 SECONDS) diff --git a/code/modules/vehicles/armored/ammo_magazine.dm b/code/modules/vehicles/armored/ammo_magazine.dm index eae4cb05ef9..dd963466585 100644 --- a/code/modules/vehicles/armored/ammo_magazine.dm +++ b/code/modules/vehicles/armored/ammo_magazine.dm @@ -1,6 +1,7 @@ //FEB 2024 NOTE: some of these are missing loading_sounds, fix it before using these ingame //Special ammo magazines for hardpoint modules. Some may not be here since you can use normal magazines on them /obj/item/ammo_magazine/tank + icon = 'icons/obj/items/ammo/tank.dmi' flags_magazine = NONE ///loading sound to play when var/loading_sound @@ -9,7 +10,7 @@ name = "high explosive LTB round" desc = "A primary armament cannon magazine" caliber = CALIBER_84MM - icon_state = "ltbammo" + icon_state = "ltb" w_class = WEIGHT_CLASS_GIGANTIC default_ammo = /datum/ammo/rocket/ltb max_rounds = 1 @@ -18,9 +19,19 @@ /obj/item/ammo_magazine/tank/ltb_cannon/apfds name = "LTB APFDS round (105mm)" desc = "A 105mm armor piercing shell with exceptional velocity and penetrating characteristics. Will pierce through walls and targets." - icon_state = "ltbammo_apfds" + icon_state = "ltb_apfds" default_ammo = /datum/ammo/bullet/tank_apfds +/obj/item/ammo_magazine/tank/towlauncher + name = "TOW Launcher Magazine" + desc = "A primary armament rocket magazine" + caliber = CALIBER_68MM + icon_state = "quad_rocket" + icon = 'icons/obj/items/ammo/rocket.dmi' + w_class = WEIGHT_CLASS_GIGANTIC + default_ammo = /datum/ammo/rocket/ap //Fun fact, AP rockets seem to be a straight downgrade from normal rockets. Maybe I'm missing something... + max_rounds = 5 + /obj/item/ammo_magazine/tank/ltaap_chaingun name = "\improper LTA-AP chaingun Magazine" desc = "A primary armament chaingun magazine." @@ -36,24 +47,16 @@ desc = "A secondary armament flamethrower magazine" caliber = CALIBER_FUEL_THICK icon_state = "flametank_large" + icon = 'icons/obj/items/ammo/flamer.dmi' w_class = WEIGHT_CLASS_GIGANTIC default_ammo = /datum/ammo/flamethrower/tank_flamer max_rounds = 120 -/obj/item/ammo_magazine/tank/towlauncher - name = "TOW Launcher Magazine" - desc = "A secondary armament rocket magazine" - caliber = CALIBER_68MM - icon_state = "quad_rocket" - w_class = WEIGHT_CLASS_GIGANTIC - default_ammo = /datum/ammo/rocket/ap //Fun fact, AP rockets seem to be a straight downgrade from normal rockets. Maybe I'm missing something... - max_rounds = 5 - /obj/item/ammo_magazine/tank/secondary_cupola name = "M56 Cupola Magazine" desc = "A secondary armament MG magazine" caliber = CALIBER_10X28 - icon_state = "cupolaammo" + icon_state = "cupola" loading_sound = 'sound/weapons/guns/interact/working_the_bolt.ogg' w_class = WEIGHT_CLASS_GIGANTIC default_ammo = /datum/ammo/bullet/cupola diff --git a/code/modules/vehicles/armored/armored_weapons.dm b/code/modules/vehicles/armored/armored_weapons.dm index 0ddf9a0a171..5a49f31dc08 100644 --- a/code/modules/vehicles/armored/armored_weapons.dm +++ b/code/modules/vehicles/armored/armored_weapons.dm @@ -64,7 +64,7 @@ ///called by the chassis: begins firing, yes this is stolen from mech but I made both so bite me /obj/item/armored_weapon/proc/begin_fire(mob/source, atom/target, list/modifiers) - if(!ammo || ammo.current_rounds < 0) + if(!ammo || ammo.current_rounds <= 0) playsound(source, 'sound/weapons/guns/fire/empty.ogg', 15, 1) return if(TIMER_COOLDOWN_CHECK(chassis, COOLDOWN_MECHA_EQUIPMENT(type))) diff --git a/code/modules/vehicles/armored/interiors/chairs.dm b/code/modules/vehicles/armored/interiors/chairs.dm index bc6fe655d4e..1645d53a854 100644 --- a/code/modules/vehicles/armored/interiors/chairs.dm +++ b/code/modules/vehicles/armored/interiors/chairs.dm @@ -4,6 +4,7 @@ icon_state = "vehicle_chair" resistance_flags = RESIST_ALL dir = EAST + buildstacktype = null /obj/structure/bed/chair/vehicle_driver_seat name = "driver seat" @@ -13,6 +14,7 @@ dir = EAST ///owner of this object, assigned during interior linkage var/obj/vehicle/sealed/armored/owner + buildstacktype = null /obj/structure/bed/chair/vehicle_driver_seat/Destroy() owner = null @@ -54,6 +56,7 @@ dir = EAST ///owner of this object, assigned during interior linkage var/obj/vehicle/sealed/armored/owner + buildstacktype = null /obj/structure/bed/chair/vehicle_gunner_seat/link_interior(datum/interior/link) if(!istype(link, /datum/interior/armored)) @@ -91,6 +94,7 @@ dir = EAST ///owner of this object, assigned during interior linkage var/obj/vehicle/sealed/armored/owner + buildstacktype = null /obj/structure/bed/chair/driver_gunner_seat/link_interior(datum/interior/link) if(!istype(link, /datum/interior/armored)) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index f92be8ea1c2..979ee865f95 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -106,7 +106,7 @@ equipment_disabled = TRUE set_mouse_pointer() -/obj/vehicle/sealed/mecha/fire_act(burn_level) //Check if we should ignite the pilot of an open-canopy mech +/obj/vehicle/sealed/mecha/fire_act(burn_level, flame_color) //Check if we should ignite the pilot of an open-canopy mech . = ..() if(enclosed || mecha_flags & SILICON_PILOT) return diff --git a/code/modules/xenomorph/acidwell.dm b/code/modules/xenomorph/acidwell.dm index c20a593047e..2f2778df295 100644 --- a/code/modules/xenomorph/acidwell.dm +++ b/code/modules/xenomorph/acidwell.dm @@ -186,9 +186,10 @@ charges_used ++ if(!isxeno(stepper)) + var/mob/living/carbon/human/H = stepper stepper.next_move_slowdown += charges * 2 //Acid spray has slow down so this should too; scales with charges, Min 2 slowdown, Max 10 - stepper.apply_damage(charges * 10, BURN, BODY_ZONE_PRECISE_L_FOOT, ACID, penetration = 33) - stepper.apply_damage(charges * 10, BURN, BODY_ZONE_PRECISE_R_FOOT, ACID, penetration = 33) + stepper.apply_damage(charges * 10, BURN, BODY_ZONE_PRECISE_L_FOOT, ACID, penetration = 33 - 20 * H.get_permeability_protection()) //Wearing mimir MK1/2 will soften damage from wells by reducing AP + stepper.apply_damage(charges * 10, BURN, BODY_ZONE_PRECISE_R_FOOT, ACID, penetration = 33 - 20 * H.get_permeability_protection()) //without providing full protection against them stepper.visible_message(span_danger("[stepper] is immersed in [src]'s acid!") , \ span_danger("We are immersed in [src]'s acid!") , null, 5) playsound(stepper, "sound/bullets/acid_impact1.ogg", 10 * charges) diff --git a/code/modules/xenomorph/silo.dm b/code/modules/xenomorph/silo.dm index e00ede917c8..8e173895433 100644 --- a/code/modules/xenomorph/silo.dm +++ b/code/modules/xenomorph/silo.dm @@ -39,11 +39,9 @@ SSspawning.spawnerdata[src].required_increment = 2 * max(45 SECONDS, 3 MINUTES - SSmonitor.maximum_connected_players_count * SPAWN_RATE_PER_PLAYER)/SSspawning.wait SSspawning.spawnerdata[src].max_allowed_mobs = max(1, MAX_SPAWNABLE_MOB_PER_PLAYER * SSmonitor.maximum_connected_players_count * 0.5) update_minimap_icon() - SSaura.add_emitter(src, AURA_XENO_RECOVERY, aura_radius, aura_strength, -1, FACTION_XENO, hivenumber) SSaura.add_emitter(src, AURA_XENO_WARDING, aura_radius, aura_strength, -1, FACTION_XENO, hivenumber) SSaura.add_emitter(src, AURA_XENO_FRENZY, aura_radius, aura_strength, -1, FACTION_XENO, hivenumber) - return INITIALIZE_HINT_LATELOAD /obj/structure/xeno/silo/LateInitialize() diff --git a/code/modules/xenomorph/turret.dm b/code/modules/xenomorph/turret.dm index f686859696a..db8d94ca555 100644 --- a/code/modules/xenomorph/turret.dm +++ b/code/modules/xenomorph/turret.dm @@ -1,16 +1,17 @@ -/obj/structure/xeno/xeno_turret - icon = 'icons/Xeno/acidturret.dmi' - icon_state = XENO_TURRET_ACID_ICONSTATE +#define TURRET_HEALTH_REGEN 8 + +/obj/structure/xeno/turret name = "acid turret" desc = "A menacing looking construct of resin, it seems to be alive. It fires acid against intruders." - bound_width = 32 - bound_height = 32 + icon = 'icons/Xeno/acidturret.dmi' + icon_state = "acid_turret" + base_icon_state = "acid_turret" obj_integrity = 600 max_integrity = 1500 layer = ABOVE_MOB_LAYER density = TRUE - resistance_flags = UNACIDABLE | DROPSHIP_IMMUNE - xeno_structure_flags = IGNORE_WEED_REMOVAL|HAS_OVERLAY + resistance_flags = UNACIDABLE|DROPSHIP_IMMUNE + xeno_structure_flags = IGNORE_WEED_REMOVAL allow_pass_flags = PASS_AIR|PASS_THROW ///What kind of spit it uses var/datum/ammo/ammo = /datum/ammo/xeno/acid/heavy/turret @@ -21,25 +22,22 @@ ///Last target of the turret var/atom/last_hostile ///Potential list of targets found by scan - var/list/atom/potential_hostiles + var/list/atom/potential_hostiles = list() ///Fire rate of the target in ticks - var/firerate = 5 - ///The last time the sentry did a scan - var/last_scan_time + var/firerate = 0.5 SECONDS ///light color that gets set in initialize var/light_initial_color = LIGHT_COLOR_GREEN ///For minimap icon change if sentry is firing var/firing ///Change minimap icon if its firing or not firing -/obj/structure/xeno/xeno_turret/proc/update_minimap_icon() +/obj/structure/xeno/turret/proc/update_minimap_icon() SSminimaps.remove_marker(src) SSminimaps.add_marker(src, MINIMAP_FLAG_XENO, image('icons/UI_icons/map_blips.dmi', null, "xeno_turret[firing ? "_firing" : "_passive"]")) // RU TGMC edit - map blips -/obj/structure/xeno/xeno_turret/Initialize(mapload, _hivenumber) +/obj/structure/xeno/turret/Initialize(mapload, _hivenumber) . = ..() ammo = GLOB.ammo_list[ammo] - potential_hostiles = list() LAZYADDASSOC(GLOB.xeno_resin_turrets_by_hive, hivenumber, src) START_PROCESSING(SSobj, src) AddComponent(/datum/component/automatedfire/xeno_turret_autofire, firerate) @@ -51,57 +49,52 @@ update_icon() ///Signal handler to delete the turret when the alamo is hijacked -/obj/structure/xeno/xeno_turret/proc/destroy_on_hijack() +/obj/structure/xeno/turret/proc/destroy_on_hijack() SIGNAL_HANDLER qdel(src) -/obj/structure/xeno/xeno_turret/obj_destruction(damage_amount, damage_type, damage_flag) +/obj/structure/xeno/turret/obj_destruction(damage_amount, damage_type, damage_flag) if(damage_amount) //Spawn effects only if we actually get destroyed by damage on_destruction() + playsound(loc,'sound/effects/alien/turret_death.ogg', 70) return ..() -/obj/structure/xeno/xeno_turret/proc/on_destruction() +/obj/structure/xeno/turret/proc/on_destruction() var/datum/effect_system/smoke_spread/xeno/smoke = new /datum/effect_system/smoke_spread/xeno/acid(src) smoke.set_up(1, get_turf(src)) smoke.start() -/obj/structure/xeno/xeno_turret/Destroy() +/obj/structure/xeno/turret/Destroy() GLOB.xeno_resin_turrets_by_hive[hivenumber] -= src set_hostile(null) set_last_hostile(null) STOP_PROCESSING(SSobj, src) - playsound(loc,'sound/effects/alien/turret_death.ogg', 70) return ..() -/obj/structure/xeno/xeno_turret/ex_act(severity) +/obj/structure/xeno/turret/ex_act(severity) take_damage(severity * 5, BRUTE, BOMB) -/obj/structure/xeno/xeno_turret/fire_act(burn_level, flame_color) +/obj/structure/xeno/turret/fire_act(burn_level, flame_color) take_damage(burn_level * 2, BURN, FIRE) ENABLE_BITFIELD(resistance_flags, ON_FIRE) -/obj/structure/xeno/xeno_turret/update_overlays() +/obj/structure/xeno/turret/update_overlays() . = ..() - if(!(xeno_structure_flags & HAS_OVERLAY)) - return if(obj_integrity <= max_integrity * 0.5) - . += image('icons/Xeno/acidturret.dmi', src, "+turret_damage") + . += image(icon, src, "[base_icon_state]_damage") if(CHECK_BITFIELD(resistance_flags, ON_FIRE)) - . += image('icons/Xeno/acidturret.dmi', src, "+turret_on_fire") + . += image(icon, src, "turret_on_fire") -/obj/structure/xeno/xeno_turret/process() +/obj/structure/xeno/turret/process() //Turrets regen some HP, every 2 sec if(obj_integrity < max_integrity) obj_integrity = min(obj_integrity + TURRET_HEALTH_REGEN, max_integrity) update_icon() DISABLE_BITFIELD(resistance_flags, ON_FIRE) - if(world.time > last_scan_time + TURRET_SCAN_FREQUENCY) - scan() - last_scan_time = world.time - if(!length(potential_hostiles)) + if(!scan()) return set_hostile(get_target()) - if (!hostile) + if(!hostile) if(last_hostile) set_last_hostile(null) return @@ -112,7 +105,7 @@ set_last_hostile(hostile) SEND_SIGNAL(src, COMSIG_AUTOMATIC_SHOOTER_START_SHOOTING_AT) -/obj/structure/xeno/xeno_turret/attackby(obj/item/I, mob/living/user, params) +/obj/structure/xeno/turret/attackby(obj/item/I, mob/living/user, params) if(I.flags_item & NOBLUDGEON || !isliving(user)) return attack_hand(user) @@ -135,89 +128,87 @@ playsound(src, "alien_resin_break", 25) ///Signal handler for hard del of hostile -/obj/structure/xeno/xeno_turret/proc/unset_hostile() +/obj/structure/xeno/turret/proc/unset_hostile() SIGNAL_HANDLER hostile = null -///Signal handler for hard del of last_hostile -/obj/structure/xeno/xeno_turret/proc/unset_last_hostile() - SIGNAL_HANDLER - last_hostile = null - ///Setter for hostile with hard del in mind -/obj/structure/xeno/xeno_turret/proc/set_hostile(_hostile) - if(hostile != _hostile) - hostile = _hostile - RegisterSignal(hostile, COMSIG_QDELETING, PROC_REF(unset_hostile)) +/obj/structure/xeno/turret/proc/set_hostile(_hostile) + if(hostile == _hostile) + return + hostile = _hostile + RegisterSignal(hostile, COMSIG_QDELETING, PROC_REF(unset_hostile)) ///Setter for last_hostile with hard del in mind -/obj/structure/xeno/xeno_turret/proc/set_last_hostile(_last_hostile) +/obj/structure/xeno/turret/proc/set_last_hostile(_last_hostile) if(last_hostile) UnregisterSignal(last_hostile, COMSIG_QDELETING) last_hostile = _last_hostile ///Look for the closest human in range and in light of sight. If no human is in range, will look for xenos of other hives -/obj/structure/xeno/xeno_turret/proc/get_target() - var/distance = range + 0.5 //we add 0.5 so if a potential target is at range, it is accepted by the system - var/buffer_distance +/obj/structure/xeno/turret/proc/get_target() var/list/turf/path = list() for(var/atom/nearby_hostile AS in potential_hostiles) - if(isliving(nearby_hostile)) - var/mob/living/nearby_living_hostile = nearby_hostile - if(nearby_living_hostile.stat == DEAD) - continue - if(HAS_TRAIT(nearby_hostile, TRAIT_STEALTH)) - continue - buffer_distance = get_dist(nearby_hostile, src) - if(distance <= buffer_distance) //If we already found a target that's closer - continue path = getline(src, nearby_hostile) path -= get_turf(src) - if(!length(path)) //Can't shoot if it's on the same turf - continue - var/blocked = FALSE + var/blocked = FALSE //LoF Broken; stop checking; we can't proceed further. for(var/turf/T AS in path) if(IS_OPAQUE_TURF(T) || T.density && !(T.allow_pass_flags & PASS_PROJECTILE)) blocked = TRUE - break //LoF Broken; stop checking; we can't proceed further. + break for(var/obj/machinery/MA in T) - if(MA.opacity || MA.density && !(MA.allow_pass_flags & PASS_PROJECTILE)) - blocked = TRUE - break //LoF Broken; stop checking; we can't proceed further. + if(!MA.opacity) + continue + if(!MA.density && MA.allow_pass_flags & PASS_PROJECTILE) + continue + blocked = TRUE + break for(var/obj/structure/S in T) - if(S.opacity || S.density && !(S.allow_pass_flags & PASS_PROJECTILE)) - blocked = TRUE - break //LoF Broken; stop checking; we can't proceed further. - if(!blocked) - distance = buffer_distance - . = nearby_hostile - -///Return TRUE if a possible target is near -/obj/structure/xeno/xeno_turret/proc/scan() + if(!S.opacity) + continue + if(!S.density && S.allow_pass_flags & PASS_PROJECTILE) + continue + blocked = TRUE + break + if(blocked) + continue + return nearby_hostile + +///Checks the nearby mobs for eligability. If they can be targets it stores them in potential_targets. Returns TRUE if there are targets, FALSE if not. +/obj/structure/xeno/turret/proc/scan() potential_hostiles.Cut() - for (var/mob/living/carbon/human/nearby_human AS in cheap_get_humans_near(src, TURRET_SCAN_RANGE)) + for(var/mob/living/carbon/human/nearby_human AS in cheap_get_humans_near(src, range)) if(nearby_human.stat == DEAD) continue if(nearby_human.get_xeno_hivenumber() == hivenumber) continue + if(HAS_TRAIT(nearby_human, TRAIT_STEALTH)) + continue potential_hostiles += nearby_human - for (var/mob/living/carbon/xenomorph/nearby_xeno AS in cheap_get_xenos_near(src, range)) + for(var/mob/living/carbon/xenomorph/nearby_xeno AS in cheap_get_xenos_near(src, range)) if(GLOB.hive_datums[hivenumber] == nearby_xeno.hive) continue if(nearby_xeno.stat == DEAD) continue + if(HAS_TRAIT(nearby_xeno, TRAIT_STEALTH)) + continue potential_hostiles += nearby_xeno - for(var/obj/vehicle/unmanned/vehicle AS in GLOB.unmanned_vehicles) - if(vehicle.z == z && get_dist(vehicle, src) <= range) - potential_hostiles += vehicle - for(var/obj/vehicle/sealed/mecha/mech AS in GLOB.mechas_list) - if(mech.z == z && get_dist(mech, src) <= range) - potential_hostiles += mech + for(var/obj/vehicle/unmanned/nearby_unmanned_vehicle AS in cheap_get_unmanned_vehicles_near(src, range)) + potential_hostiles += nearby_unmanned_vehicle + for(var/obj/vehicle/sealed/mecha/nearby_mech AS in cheap_get_mechs_near(src, range)) + var/list/driver_list = nearby_mech.return_drivers() + if(!length(driver_list)) + continue + var/mob/living/carbon/human/human_occupant = driver_list[1] + if(human_occupant.get_xeno_hivenumber() == hivenumber) // what if zombie rides a mech? + continue + potential_hostiles += nearby_mech + return potential_hostiles ///Signal handler to make the turret shoot at its target -/obj/structure/xeno/xeno_turret/proc/shoot() +/obj/structure/xeno/turret/proc/shoot() SIGNAL_HANDLER if(!hostile) SEND_SIGNAL(src, COMSIG_AUTOMATIC_SHOOTER_STOP_SHOOTING_AT) @@ -229,40 +220,67 @@ newshot.generate_bullet(ammo) newshot.def_zone = pick(GLOB.base_miss_chance) newshot.fire_at(hostile, null, src, ammo.max_range, ammo.shell_speed) - if(istype(ammo, /datum/ammo/xeno/hugger)) - var/datum/ammo/xeno/hugger/hugger_ammo = ammo - newshot.color = initial(hugger_ammo.hugger_type.color) - hugger_ammo.hivenumber = hivenumber firing = TRUE update_minimap_icon() -/obj/structure/xeno/xeno_turret/sticky +/obj/structure/xeno/turret/sticky name = "Sticky resin turret" - icon = 'icons/Xeno/acidturret.dmi' - icon_state = XENO_TURRET_STICKY_ICONSTATE desc = "A menacing looking construct of resin, it seems to be alive. It fires resin against intruders." + icon_state = "resin_turret" + base_icon_state = "resin_turret" light_initial_color = LIGHT_COLOR_PURPLE ammo = /datum/ammo/xeno/sticky/turret - firerate = 5 -/obj/structure/xeno/xeno_turret/sticky/on_destruction() - for(var/i = 1 to 20) // maybe a bit laggy +/obj/structure/xeno/turret/sticky/on_destruction() + for(var/i in 1 to 20) // maybe a bit laggy var/obj/projectile/new_proj = new(src) new_proj.generate_bullet(ammo) - new_proj.fire_at(null, src, range = rand(1, 4), angle = rand(1, 360), recursivity = TRUE) + new_proj.fire_at(null, src, src, range = rand(1, 4), angle = rand(1, 360), recursivity = TRUE) -/obj/structure/xeno/xeno_turret/hugger_turret +/obj/structure/xeno/turret/facehugger name = "hugger turret" - icon_state = "hugger_turret" desc = "A menacing looking construct of resin, it seems to be alive. It fires huggers against intruders." + icon_state = "hugger_turret" + base_icon_state = "hugger_turret" obj_integrity = 400 max_integrity = 400 light_initial_color = LIGHT_COLOR_BROWN ammo = /datum/ammo/xeno/hugger firerate = 5 SECONDS -/obj/structure/xeno/xeno_turret/hugger_turret/on_destruction() - for(var/i = 1 to 5) +/obj/structure/xeno/turret/facehugger/shoot() + if(!hostile) + SEND_SIGNAL(src, COMSIG_AUTOMATIC_SHOOTER_STOP_SHOOTING_AT) + firing = FALSE + update_minimap_icon() + return + face_atom(hostile) + var/obj/projectile/newshot = new(loc) + newshot.generate_bullet(ammo) + newshot.def_zone = pick(GLOB.base_miss_chance) + newshot.fire_at(hostile, null, src, ammo.max_range, ammo.shell_speed) + var/datum/ammo/xeno/hugger/hugger_ammo = ammo + newshot.color = initial(hugger_ammo.hugger_type.color) + hugger_ammo.hivenumber = hivenumber + firing = TRUE + update_minimap_icon() + +/obj/structure/xeno/turret/facehugger/on_destruction() + for(var/i in 1 to 5) var/obj/projectile/new_proj = new(src) new_proj.generate_bullet(ammo) - new_proj.fire_at(null, src, range = rand(1, 3), angle = rand(1, 360), recursivity = TRUE) + new_proj.fire_at(null, src, src, range = rand(1, 3), angle = rand(1, 360), recursivity = TRUE) + +/obj/structure/xeno/turret/facehugger/attack_ghost(mob/dead/observer/user) + . = ..() + + var/datum/hive_status/hive = GLOB.hive_datums[hivenumber] + if(!hive.can_spawn_as_hugger(user)) + return FALSE + + var/mob/living/carbon/xenomorph/facehugger/new_hugger = new(get_turf(src)) + new_hugger.transfer_to_hive(hivenumber) + new_hugger.transfer_mob(user) + return TRUE + +#undef TURRET_HEALTH_REGEN diff --git a/code/modules/xenomorph/xeno_towers.dm b/code/modules/xenomorph/xeno_towers.dm index cd1ec6c8f6d..02e36cae797 100644 --- a/code/modules/xenomorph/xeno_towers.dm +++ b/code/modules/xenomorph/xeno_towers.dm @@ -107,11 +107,3 @@ if(AURA_XENO_FRENZY) icon_state = "frenzytower" set_light(2, 2, LIGHT_COLOR_RED) - -/obj/structure/xeno/pherotower/crash - name = "Recovery tower" - resistance_flags = RESIST_ALL - xeno_structure_flags = IGNORE_WEED_REMOVAL | CRITICAL_STRUCTURE - -/obj/structure/xeno/pherotower/crash/attack_alien(isrightclick = FALSE) - return diff --git a/html/changelogs/AutoChangeLog-pr-611.yml b/html/changelogs/AutoChangeLog-pr-611.yml deleted file mode 100644 index c7de4e71bb5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-611.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Istrelok2107" -delete-after: True -changes: - - balance: "Улучшение револьвера Р76: windup_delay 0.9>0.6 fire_delay 1.25>0.75 scatter 3>2" - - bugfix: "Удалил ненужные компенсатор и приклад из кейса с Р76." - - rscadd: "Ввел Р76 в карго за 120 очков" - - rscadd: "Ввел патроны к Р76 в карго 40 очков за 4 магазина" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-620.yml b/html/changelogs/AutoChangeLog-pr-620.yml deleted file mode 100644 index 92c8cc83bb7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-620.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Tatarla" -delete-after: True -changes: - - balance: "Обычная ксеностенка: софтармор мили 30" - - balance: "Бомбпруф: софтармор 15 мили, 35 буллет, 30 лазер вместо 70 буллет и 60 лазера" - - balance: "Фаерпруф: софтармор 15 мили, 35 буллет, 30 лазер вместо 70 буллет и 60 лазера" - - balance: "Милипруф: софтармор 35 буллет, 30 лазер вместо 70 буллет и 60 лазера" - - balance: "Буллетпруф: софтармор 15 мили вместо 0" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-727.yml b/html/changelogs/AutoChangeLog-pr-727.yml new file mode 100644 index 00000000000..cdc22badec5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-727.yml @@ -0,0 +1,8 @@ +author: "CheBokJam" +delete-after: True +changes: + - rscadd: "На краше в оружейные вендоры добавлены все коробки АХ/ХП (ранее были только магазины) и поджигающие липучки." + - rscadd: "Добавлены коробки 9мм ХП в оружейные вендоры всех режимов." + - rscadd: "На краше, на мостиках шаттлов, спавнится специальная карго консоль без требования к доступу." + - balance: "На краше коробки с флаерами и патроны к перцовке теперь бесконечны." + - rscdel: "С краша удалены феро-вышки." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-785.yml b/html/changelogs/AutoChangeLog-pr-785.yml new file mode 100644 index 00000000000..545f21ad8af --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-785.yml @@ -0,0 +1,4 @@ +author: "MrFloppa" +delete-after: True +changes: + - balance: "Ракеты для RL-160 теперь normal-sized, вместо bulky" \ No newline at end of file diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml index 25adabfbb03..0cd6d085426 100644 --- a/html/changelogs/archive/2024-10.yml +++ b/html/changelogs/archive/2024-10.yml @@ -620,14 +620,11 @@ \u0435 \u043A\u0443\u043A\u043B\u044B \u0441 \u0442\u0440\u0430\u0432\u043C\u0430\ \u043C\u0438." - bugfix: "\u0422\u0435\u043F\u0435\u0440\u044C \u043D\u0435\u043B\u044C\u0437\u044F\ - \ \u044D\u0432\u043E\u043B\u044E\u0446\u0438\u043E\u043D\u0438\u0440\u043E\u0432\ - \u0430\u0442\u044C \u043E\u0431\u0445\u043E\u0434\u044F \u043B\u0438\u043C\u0438\ \u0442 \u0442\u0438\u0440\u043E\u0432 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\ \u044E \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0430/\u043A\u0430\u0441\u0442\ \ \u0441\u0432\u0430\u043F\u0430." - admin: "Jump-To \u043F\u0440\u043E\u043A\u0438, \u0441\u043C\u0430\u0439\u0442\ \u044B, \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u043B\u043E\ - \u0433\u043E\u0432 \u0438 \u0430\u043F\u0438\u043A\u0435\u0440 \u0442\u0435\u043F\ \u0435\u0440\u044C \u0442\u0433\u0443\u0438." - admin: "Dsay \u0442\u0435\u043F\u0435\u0440\u044C html." - code_imp: "\u0413\u0438\u0431\u044B \u0442\u0435\u043F\u0435\u0440\u044C \u043D\ diff --git a/html/changelogs/archive/2024-11.yml b/html/changelogs/archive/2024-11.yml index ef942dcc9e2..f6fa5400fb9 100644 --- a/html/changelogs/archive/2024-11.yml +++ b/html/changelogs/archive/2024-11.yml @@ -89,3 +89,553 @@ \u044C \u0432\u043F\u043B\u043E\u0442\u043D\u0443\u044E \u0434\u0440\u0443\u0433\ \ \u043A \u0434\u0440\u0443\u0433\u0443, \u0442\u043E\u043B\u044C\u043A\u043E\ \ \u0447\u0435\u0440\u0435\u0437 \u0442\u0430\u0439\u043B." +2024-11-06: + Istrelok2107: + - balance: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0440\u0435\u0432\ + \u043E\u043B\u044C\u0432\u0435\u0440\u0430 \u042076: windup_delay 0.9>0.6 fire_delay\ + \ 1.25>0.75 scatter 3>2" + - bugfix: "\u0423\u0434\u0430\u043B\u0438\u043B \u043D\u0435\u043D\u0443\u0436\u043D\ + \u044B\u0435 \u043A\u043E\u043C\u043F\u0435\u043D\u0441\u0430\u0442\u043E\u0440\ + \ \u0438 \u043F\u0440\u0438\u043A\u043B\u0430\u0434 \u0438\u0437 \u043A\u0435\ + \u0439\u0441\u0430 \u0441 \u042076." + - rscadd: "\u0412\u0432\u0435\u043B \u042076 \u0432 \u043A\u0430\u0440\u0433\u043E\ + \ \u0437\u0430 120 \u043E\u0447\u043A\u043E\u0432" + - rscadd: "\u0412\u0432\u0435\u043B \u043F\u0430\u0442\u0440\u043E\u043D\u044B \u043A\ + \ \u042076 \u0432 \u043A\u0430\u0440\u0433\u043E 40 \u043E\u0447\u043A\u043E\ + \u0432 \u0437\u0430 4 \u043C\u0430\u0433\u0430\u0437\u0438\u043D\u0430" + Tatarla: + - balance: "\u041E\u0431\u044B\u0447\u043D\u0430\u044F \u043A\u0441\u0435\u043D\u043E\ + \u0441\u0442\u0435\u043D\u043A\u0430: \u0441\u043E\u0444\u0442\u0430\u0440\u043C\ + \u043E\u0440 \u043C\u0438\u043B\u0438 30" + - balance: "\u0411\u043E\u043C\u0431\u043F\u0440\u0443\u0444: \u0441\u043E\u0444\ + \u0442\u0430\u0440\u043C\u043E\u0440 15 \u043C\u0438\u043B\u0438, 35 \u0431\u0443\ + \u043B\u043B\u0435\u0442, 30 \u043B\u0430\u0437\u0435\u0440 \u0432\u043C\u0435\ + \u0441\u0442\u043E 70 \u0431\u0443\u043B\u043B\u0435\u0442 \u0438 60 \u043B\u0430\ + \u0437\u0435\u0440\u0430" + - balance: "\u0424\u0430\u0435\u0440\u043F\u0440\u0443\u0444: \u0441\u043E\u0444\ + \u0442\u0430\u0440\u043C\u043E\u0440 15 \u043C\u0438\u043B\u0438, 35 \u0431\u0443\ + \u043B\u043B\u0435\u0442, 30 \u043B\u0430\u0437\u0435\u0440 \u0432\u043C\u0435\ + \u0441\u0442\u043E 70 \u0431\u0443\u043B\u043B\u0435\u0442 \u0438 60 \u043B\u0430\ + \u0437\u0435\u0440\u0430" + - balance: "\u041C\u0438\u043B\u0438\u043F\u0440\u0443\u0444: \u0441\u043E\u0444\ + \u0442\u0430\u0440\u043C\u043E\u0440 35 \u0431\u0443\u043B\u043B\u0435\u0442\ + , 30 \u043B\u0430\u0437\u0435\u0440 \u0432\u043C\u0435\u0441\u0442\u043E 70\ + \ \u0431\u0443\u043B\u043B\u0435\u0442 \u0438 60 \u043B\u0430\u0437\u0435\u0440\ + \u0430" + - balance: "\u0411\u0443\u043B\u043B\u0435\u0442\u043F\u0440\u0443\u0444: \u0441\ + \u043E\u0444\u0442\u0430\u0440\u043C\u043E\u0440 15 \u043C\u0438\u043B\u0438\ + \ \u0432\u043C\u0435\u0441\u0442\u043E 0" +2024-11-07: + Helg2: + - balance: "\u041F\u043E\u043D\u0451\u0440\u0444\u0438\u043B \u0441\u0438\u043B\u0443\ + \ \u043E\u0442\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u043D\u0438\u044F \u043E\ + \u0442 \u0432\u0437\u0440\u044B\u0432\u043E\u0432." + - bugfix: "\u0417\u0435\u043B\u0435\u043D\u044B\u0439 \u043E\u0433\u043E\u043D\u044C\ + \ \u0442\u0435\u043F\u0435\u0440\u044C \u0440\u0430\u0431\u043E\u0442\u0430\u0435\ + \u0442 \u043A\u0430\u043A \u043D\u0443\u0436\u043D\u043E." + - bugfix: "\u0425\u0443\u0434 \u043F\u043B\u0430\u0437\u043C\u044B \u043A\u0441\u0435\ + \u043D\u043E\u043C\u043E\u0440\u0444\u043E\u0432 \u0442\u0435\u043F\u0435\u0440\ + \u044C \u043D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E \u043E\u0431\u043D\ + \u043E\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043F\u0440\u0438 \u0440\u0435\ + \u0434\u0436\u0443\u0432\u0435." + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u043C\u0438\u043B\u0438 \u0441\ + \u043F\u0435\u0448\u0438\u0430\u043B \u0430\u0442\u0430\u043A\u0438, \u043A\u043E\ + \u0442\u043E\u0440\u044B\u0435 \u0432 \u043E\u0431\u044B\u0447\u043D\u043E\u0439\ + \ \u0438\u0433\u0440\u0435 \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\ + \u043D\u044B. \u041F\u043E\u043A\u0430 \u0447\u0442\u043E \u043F\u044B\u043B\ + \u044F\u0442\u0441\u044F." + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u043A\u0435\u0439\u0431\u0438\ + \u043D\u0434\u044B \u0434\u043B\u044F \u0434\u0436\u0435\u0442\u043F\u0430\u043A\ + \u0430." + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u043A\u0443\u0447\u0443\ + \ \u043C\u0435\u043B\u043A\u043E\u0439 \u0444\u0438\u0433\u043D\u0438 \u0441\ + \u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0439 \u0441 \u0430\u0431\u0438\u043B\ + \u043A\u0430\u043C\u0438." + - bugfix: "\u0418\u0418 \u0442\u0435\u043F\u0435\u0440\u044C \u043C\u043E\u0436\u0435\ + \u0442 \u043F\u0440\u044B\u0433\u0430\u0442\u044C \u043A\u0430\u043C\u0435\u0440\ + \u043E\u0439 \u043D\u0430 \u043B\u044E\u0434\u0435\u0439 \u0441 \u043F\u043E\ + \u043C\u043E\u0449\u044C\u044E \u043E\u0432\u0435\u0440\u0432\u043E\u0442\u0447\ + \ \u043A\u043E\u043D\u0441\u043E\u043B\u0438." + - bugfix: "\u0410\u0421\u041B-\u044B \u0442\u0435\u043F\u0435\u0440\u044C \u043C\ + \u043E\u0433\u0443\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\ + \u0430\u0442\u044C \u0441\u0442\u0440\u0435\u043B\u043E\u0447\u043A\u0438." + - bugfix: "\u041E\u0432\u0435\u0440\u043B\u0435\u0439 \u0443\u0441\u0438\u043B\u0435\ + \u043D\u043D\u043E\u0433\u043E \u0443\u0434\u0430\u0440\u0430 \u0432\u0430\u0440\ + \u0440\u0438\u0440\u043E\u0440\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u043D\ + \u0435 \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u043E\ + \u0432\u0435\u0440\u043B\u0435\u0439 \u0432\u044B\u0431\u043E\u0440\u0430 \u0430\ + \u0431\u0438\u043B\u043A\u0438." + - refactor: "\u0418\u0437\u043C\u0435\u043D\u0438\u043B \u043A\u043E\u0434 \u0430\ + \u0431\u0438\u043B\u043E\u043A." + - bugfix: "\u0422\u0435\u043F\u0435\u0440\u044C \u043D\u0435\u043B\u044C\u0437\u044F\ + \ \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0448\u0440\u0430\u043F\u043D\ + \u0435\u043B\u044C, \u0435\u0441\u043B\u0438 \u0443\u0440\u043E\u043D \u043F\ + \u0443\u043B\u0438 \u0431\u044B\u043B \u043D\u0438\u0436\u0435 1." + - bugfix: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435\ + \ \u0440\u0435\u0436\u0438\u043C\u0430 \u043B\u0430\u0437\u043F\u0438\u0441\u0442\ + \u043E\u043B\u0435\u0442\u0430 \u043D\u0430 \u043E\u0431\u044B\u0447\u043D\u044B\ + \u0439 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u0434\u0435\u043B\u0430\ + \u0435\u0442 \u0435\u0433\u043E \u043F\u043E\u043B\u0443\u0430\u0432\u0442\u043E\ + \u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u043C." +2024-11-08: + Basia: + - rscadd: "\u0421\u043E\u0432\u0435\u0442\u044B \u0442\u0435\u043F\u0435\u0440\u044C\ + \ \u043D\u0430 \u0413\u043E\u0439\u0434\u0430-\u044F\u0437\u044B\u043A\u0435" + Helg2: + - bugfix: "\u0412 IS pattern Storage module \u0442\u0435\u043F\u0435\u0440\u044C\ + \ \u043C\u043E\u0436\u043D\u043E \u043B\u043E\u0436\u0438\u0442\u044C \u043C\ + \u0430\u0442\u0435\u0440\u0438\u0430\u043B\u044B." + - bugfix: "\u0422\u0435\u043B\u0435\u043A\u043E\u043C\u043C\u044B \u043D\u0430 \u043A\ + \u0440\u0430\u0448\u0435 \u0442\u0435\u043F\u0435\u0440\u044C \u0437\u0430\u0432\ + \u0438\u0441\u044F\u0442 \u043E\u0442 \u0430\u043F\u0446 \u043D\u0430 \u043C\ + \u043E\u0441\u0442\u0438\u043A\u0435 \u0448\u0430\u0442\u0442\u043B\u0430." + Tatarla: + - map: "\u041D\u0430 \u041C\u0430\u0433\u043C\u0443\u0440\u0435 \u0431\u044B\u043B\ + \u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u0430 \u043A\u0438\u0448\u043A\u0430\ + \ \u043D\u0430 \u043B\u0430\u0432\u043E\u0432\u043E\u043C \u043E\u0437\u0435\ + \u0440\u0435" +2024-11-09: + Helg2: + - map: "\u041D\u0430 \u0422\u0430\u043B\u043E\u0441\u0435 \u0442\u0435\u043F\u0435\ + \u0440\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0440\ + \u0435\u0441\u0438\u0432\u0435\u0440 \u0442\u0435\u043B\u0435\u043A\u043E\u043C\ + \u043E\u0432, \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u044E\u0449\u0438\u0439\ + \ \u043E\u0431\u0449\u0430\u0442\u044C\u0441\u044F \u043D\u0430 \u043E\u0431\ + \u0449\u0435\u043C \u043A\u0430\u043D\u0430\u043B\u0435 \u0441\u0432\u044F\u0437\ + \u0438." + Tatarla: + - balance: "\u0421\u043F\u0440\u0435\u0439-\u043D\u0430\u0441\u0430\u0434\u043A\u0430\ + \ \u0442\u0435\u043F\u0435\u0440\u044C \u043F\u0440\u043E\u0436\u0438\u0433\u0430\ + \u0435\u0442 4 \u0442\u0430\u0439\u043B\u0430 \u0432 \u0434\u043B\u0438\u043D\ + \u0443 \u0432\u043C\u0435\u0441\u0442\u043E 6" + - balance: "\u041F\u043E\u0434\u0441\u0442\u0432\u043E\u043B\u044C\u043D\u044B\u0439\ + \ \u0433\u0440\u0430\u043D\u0430\u0442\u043E\u043C\u0435\u0442 \u0432\u043C\u0435\ + \u0449\u0430\u0435\u0442 2 \u0433\u0440\u0430\u043D\u0430\u0442\u044B." + - balance: "\u041F\u043E\u0434\u0441\u0442\u0432\u043E\u043B\u044C\u043D\u044B\u0439\ + \ \u0433\u0440\u0430\u043D\u0430\u0442\u043E\u043C\u0435\u0442 \u0442\u0435\u043F\ + \u0435\u0440\u044C \u0432\u043C\u0435\u0449\u0430\u0435\u0442 \u0432 \u0441\u0435\ + \u0431\u044F \u043C15 \u0438 \u0442\u0440\u0435\u0439\u043B\u0431\u043B\u0435\ + \u0439\u0437\u0435\u0440\u044B." +2024-11-10: + Helg2: + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u043F\u0440\u043E\u0432\ + \u0430\u043B\u0438\u0432\u0430\u044E\u0449\u0438\u0435\u0441\u044F \u044E\u043D\ + \u0438\u0442 \u0442\u0435\u0441\u0442\u044B \u043D\u0430 \u0411\u0438\u0433\u0440\ + \u0435\u0434\u0435." + Istrelok2107: + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u0433\u0440\u0430\u043D\ + \u0430\u0442\u044B \u0441 \u0422\u0413\u0410\u0417\u043E\u043C \u0432 \u043A\ + \u0430\u0440\u0433\u043E" +2024-11-12: + Helg2: + - code_imp: "\u0411\u043E\u043B\u044C\u0448\u0430\u044F \u0447\u0430\u0441\u0442\ + \u044C `spawn()` \u0431\u044B\u043B\u0430 \u043F\u0435\u0440\u0435\u0434\u0435\ + \u043B\u0430\u043D\u0430 \u0432 \u0442\u0430\u0439\u043C\u0435\u0440\u044B." +2024-11-14: + Helg2: + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u0442\u043E \u0447\u0442\ + \u043E \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0435 \u043B\u0430\ + \u043C\u043F\u044B, \u0432 \u0441\u0430\u0434\u0443 \u0422\u0430\u043B\u043E\ + \u0441\u0430, \u0432\u044B\u0433\u043B\u044F\u0434\u0435\u043B\u0438 \u043A\u0430\ + \u043A \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0435." + - image: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0441\u043F\u0440\u0430\u0439\ + \u0442\u044B \u043F\u0443\u0441\u0442\u044B\u0445 \u043D\u0430\u0441\u043F\u0438\ + \u043D\u043D\u044B\u0445 \u0431\u0430\u043A\u043E\u0432 \u0441 \u0442\u043E\u043F\ + \u043B\u0438\u0432\u043E\u043C." + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E \u0442\u043E\ + \ \u0447\u0442\u043E \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\ + \u044B\u0435 \u043A \u043E\u0440\u0443\u0436\u0438\u044E \u043C\u0430\u0433\u0430\ + \u0437\u0438\u043D\u0443, \u043D\u0435 \u0441\u0431\u0440\u0430\u0441\u044B\u0432\ + \u0430\u043B\u0438 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\ + \u0435 \u043A \u043E\u0440\u0443\u0436\u0438\u044E \u043F\u0440\u0438 \u0432\ + \u043E\u0437\u0432\u0440\u0430\u0442\u0435 \u0432 \u0432\u0435\u043D\u0434\u043E\ + \u0440." + - rscadd: "Offhand-\u044B \u0442\u0435\u043F\u0435\u0440\u044C \u0432\u0438\u0437\ + \u0443\u0430\u043B\u044C\u043D\u043E \u043D\u0438\u0436\u0435 \u0432\u0437\u044F\ + \u0442\u044B\u0445 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432." + Smiling Dark: + - qol: "\u0422\u0435\u043F\u0435\u0440\u044C \u0432\u0435\u0449\u0438 \u0432 \u043A\ + \u0430\u0440\u0433\u043E \u043D\u0430\u0439\u0442\u0438 \u043D\u0435\u0441\u043A\ + \u043E\u043B\u044C\u043A\u043E \u043F\u0440\u043E\u0449\u0435, \u0440\u0430\u0441\ + \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u044B \u043D\u0430\ + \ \u0438\u043D\u0442\u0443\u0438\u0442\u0438\u0432\u043D\u043E \u043F\u043E\u043D\ + \u044F\u0442\u043D\u044B\u0435 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\ + \u0438." + - image: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B 3 \u0441\u043F\u0440\u0430\u0439\ + \u0442\u0430 \u043D\u043E\u0432\u044B\u0445 \u044F\u0449\u0438\u043A\u043E\u0432\ + \ \u0432 \u043A\u0430\u0440\u0433\u043E." +2024-11-15: + Helg2: + - rscadd: "\u0421\u041B-\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u043C\u043E\ + \u0436\u043D\u043E \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0438\u0433\u0440\ + \u0430\u044F \u0438 \u0437\u0430 \u043C\u0430\u0440\u0438\u043D\u043E\u0432\ + , \u0438 \u0437\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u0443\u044E\u0449\ + \u0438\u0439 \u0441\u043E\u0441\u0442\u0430\u0432." + Istrelok2107: + - balance: "\u0414\u0436\u0435\u0442\u043F\u0430\u043A\u0443 \u0443\u0431\u0440\u0430\ + \u043D\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0430 \u0441\ + \u0442\u0430\u0433\u0433\u0435\u0440" + Tatarla: + - balance: "\u0411\u0435\u0433\u0435\u043C\u043E\u0442 \u043F\u043E\u043B\u0443\u0447\ + \u0438\u043B 12 \u0445\u0430\u0440\u0434\u0430 \u043E\u0442 \u0431\u0443\u043B\ + \u043B\u0435\u0442\u0430, \u043F\u043E\u0442\u0435\u0440\u044F\u043B \u0445\u0430\ + \u0440\u0434 \u043E\u0442 \u043C\u0438\u043B\u0438, \u0441\u043D\u0438\u0436\ + \u0435\u043D \u0445\u0430\u0440\u0434 \u043E\u0442 \u043B\u0430\u0437\u0435\u0440\ + \u043E\u0432 \u0441 12 \u0434\u043E 6" + - balance: "\u041A\u0440\u0430\u0448\u0435\u0440\u0443 \u043F\u043E\u0434\u043D\u044F\ + \u0442\u043E \u0425\u041F \u0441 400 \u0434\u043E 500, \u043F\u043E\u043D\u0435\ + \u0440\u0444\u043B\u0435\u043D \u0441\u043E\u0444\u0442\u0430\u0440\u043C\u043E\ + \u0440 \u043E\u0442 \u043C\u0438\u043B\u0438 \u0441 80 \u0434\u043E 50, \u043B\ + \u0430\u0437\u0435\u0440\u044B \u0441 80 \u0434\u043E 65" + - balance: "\u0414\u0435\u0444\u0435\u043D\u0434\u0435\u0440\u0443 \u043F\u043E\u0434\ + \u043D\u044F\u0442\u043E \u0425\u041F \u0441 320 \u0434\u043E 410, \u043F\u043E\ + \u043B\u0443\u0447\u0438\u043B \u0445\u0430\u0440\u0434\u0430\u0440\u043C\u043E\ + \u0440 10 \u043E\u0442 \u0431\u0443\u043B\u043B\u0435\u0442\u0430" + - balance: "\u041F\u0440\u0435\u0442\u043E\u0440\u0443 \u043F\u043E\u0434\u043D\u044F\ + \u0442\u043E \u0425\u041F \u0441 460 \u0434\u043E 570, \u0441\u043D\u0438\u0436\ + \u0435\u043D \u0441\u043E\u0444\u0442\u0430\u0440\u043C\u043E\u0440 \u0431\u0443\ + \u043B\u043B\u0435\u0442\u0430 \u0441 50 \u0434\u043E 25, \u043B\u0430\u0437\ + \u0435\u0440\u043E\u0432 \u0441 50 \u0434\u043E 15" + - balance: "\u0421\u0435\u043D\u0442\u0438\u043D\u0435\u043B\u044E \u043F\u043E\u0434\ + \u043D\u044F\u0442\u043E \u0425\u041F \u0441 300 \u0434\u043E 400" + - balance: "\u0421\u043F\u0438\u0442\u0442\u0435\u0440\u0443 \u043F\u043E\u0434\u043D\ + \u044F\u0442\u043E \u0425\u041F \u0441 310 \u0434\u043E 450, \u0441\u043E\u0444\ + \u0442\u0430\u0440\u043C\u043E\u0440 \u0431\u0443\u043B\u043B\u0435\u0442\u0430\ + \ \u0441\u043D\u0438\u0436\u0435\u043D \u0441 35 \u0434\u043E 20, \u043B\u0430\ + \u0437\u0435\u0440\u043E\u0432 \u0441 35 \u0434\u043E 10" + - balance: "\u0413\u0440\u043E\u0437\u0430 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\ + \u0430 3 \u0444\u0430\u043B\u043B\u043E\u0443, \u0425\u041F 50 \u0443\u0440\u043E\ + \u043D\u0430 > 60" + - balance: "\u0410\u042021 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u0430 2 \u0444\ + \u0430\u043B\u043B\u043E\u0443" + - balance: "\u0412\u0435\u043A\u0442\u043E\u0440 \u043F\u043E\u043B\u0443\u0447\u0438\ + \u043B 3 \u0444\u0430\u043B\u043B\u043E\u0443, \u0410\u041F 15 \u0443\u0440\u043E\ + \u043D\u0430 20 \u0410\u041F > 20 \u0443\u0440\u043E\u043D\u0430 15 \u0410\u041F" +2024-11-16: + Helg2: + - bugfix: "\u0425\u0430\u0433\u0433\u0435\u0440 \u043E\u0432\u0435\u0440\u043B\u0435\ + \u0439 \u043D\u0430 \u041A\u0435\u0440\u0440\u0438\u0435\u0440\u0435 \u0442\u0435\ + \u043F\u0435\u0440\u044C \u043E\u043F\u044F\u0442\u044C \u0440\u0430\u0431\u043E\ + \u0442\u0430\u0435\u0442." + - rscadd: "\u0421\u043F\u0438\u0442\u0442\u0435\u0440\u0443 \u0434\u043E\u0431\u0430\ + \u0432\u043B\u0435\u043D\u0430 \u043B\u0438\u043F\u043A\u0430\u044F \u043A\u0438\ + \u0441\u043B\u043E\u0442\u043D\u0430\u044F \u0433\u0440\u0430\u043D\u0430\u0442\ + \u0430 \u0432 \u043F\u0440\u0438\u043C\u043E. \u0420\u0430\u0431\u043E\u0442\ + \u0430\u0435\u0442 \u043A\u0430\u043A \u0442\u0440\u0435\u0439\u043B\u0431\u043B\ + \u0435\u0439\u0437\u0435\u0440 \u0442\u043E\u043B\u044C\u043A\u043E \u0441 \u043A\ + \u0438\u0441\u043B\u043E\u0442\u043E\u0439." + - balance: "\u0423 \u043F\u0440\u0438\u043C\u043E \u0441\u043F\u0438\u0442\u0442\ + \u0435\u0440\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u0441\u0438\u043B\u044C\ + \u043D\u0430\u044F \u043A\u0438\u0441\u043B\u043E\u0442\u0430, \u0432\u043C\u0435\ + \u0441\u0442\u043E \u043E\u0431\u044B\u0447\u043D\u043E\u0439." + Tatarla: + - image: "\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u0441\u043F\u0440\u0430\ + \u0439\u0442\u044B \u043F\u0440\u0438\u043A\u0430\u0437\u043E\u0432 \u0443 \u043C\ + \u0430\u0440\u0438\u043D\u043E\u0432" + - image: "\u0418\u0437\u043C\u0435\u043D\u0438\u043B \u0441\u043F\u0440\u0430\u0439\ + \u0442 \u0411\u0422\u0420\u0430 \u0437\u0430 \u0430\u0432\u0442\u043E\u0440\u0441\ + \u0442\u0432\u043E\u043C borisoglebsk" + - bugfix: "\u041F\u0430\u0432\u0435\u0440\u0444\u0438\u0441\u0442 \u0442\u0435\u043F\ + \u0435\u0440\u044C \u0435\u0441\u0442\u044C \u0432 \u043E\u0440\u0443\u0436\u0435\ + \u0439\u043D\u043E\u043C \u0432\u0435\u043D\u0434\u043E\u0440\u0435 \u043D\u0430\ + \ \u0434\u0438\u0441\u0442\u0440\u0435\u0441\u0441\u0435" + - balance: "\u0412\u0441\u0435 \u0448\u043B\u044F\u043F\u044B, \u043A\u0440\u043E\ + \u043C\u0435 \u043F\u043E\u0432\u044F\u0437\u043E\u043A, \u0442\u0435\u043F\u0435\ + \u0440\u044C \u0438\u043C\u0435\u044E\u0442 \u043E\u0434\u0438\u043D\u0430\u043A\ + \u043E\u0432\u0443\u044E \u0431\u0440\u043E\u043D\u044E." + - balance: "\u041D\u0430 \u0432\u0438\u043D\u0442\u043E\u0432\u043A\u0438 \u0442\ + \u0435\u043F\u0435\u0440\u044C \u043C\u043E\u0436\u043D\u043E \u0432\u0435\u0448\ + \u0430\u0442\u044C \u043B\u044E\u0431\u043E\u0439 \u043E\u0431\u0432\u0435\u0441" + - balance: "\u041C\u041360 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u0430 \u0430\ + \u0438\u043C-\u043C\u043E\u0434" + - balance: "\u0412\u0441\u0435\u043C \u043F\u0440\u0438\u0446\u0435\u043B\u0430\u043C\ + (\u043A\u0440\u043E\u043C\u0435 \u0440\u0435\u0434-\u0434\u043E\u0442\u0430\ + ) \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u0430\u0438\u043C-\u043C\ + \u043E\u0434" + - balance: "\u04117 \u0442\u0435\u043F\u0435\u0440\u044C \u0434\u0430\u0435\u0442\ + \ \u043F\u043E\u043B\u043D\u044B\u0439 \u0438\u0444\u0444 \u0432\u0437\u0430\ + \u043C\u0435\u043D \u043D\u0430 -15% \u0443\u0440\u043E\u043D\u0430" + - balance: "\u0421\u043E\u0448\u043A\u0438 \u043F\u0440\u0438 \u0440\u0430\u0437\ + \u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0438 \u0442\u0435\u043F\ + \u0435\u0440\u044C \u0434\u0430\u044E\u0442 \u0438\u043C\u043C\u0443\u043D\u0438\ + \u0442\u0435\u0442 \u043A \u0442\u043E\u043B\u043A\u0430\u043D\u0438\u044E \u0438\ + \ \u0441\u0432\u0430\u043F\u0443 \u043D\u0430 \u0445\u0435\u043B\u043F\u0435\ + , \u0435\u0441\u043B\u0438 \u044D\u0442\u043E \u043F\u044B\u0442\u0430\u0435\ + \u0442\u0441\u044F \u0441\u0434\u0435\u043B\u0430\u0442\u044C \u0434\u0440\u0443\ + \u0433\u043E\u0439 \u043C\u0430\u0440\u0438\u043D" + - balance: "\u0411\u0443\u0440\u0441\u0442-\u0444\u0430\u0435\u0440 \u0430\u0441\ + \u0435\u043C\u0431\u043B\u0435\u0440 \u0442\u0435\u043F\u0435\u0440\u044C \u043D\ + \u0435 \u0434\u0430\u0435\u0442 \u0434\u0435\u0431\u0430\u0444\u043E\u0432 \u043A\ + \ \u0442\u043E\u0447\u043D\u043E\u0441\u0442\u0438 (\u0437\u0430\u043C\u0435\ + \u043D\u0430 \u0438\u043C \u0441\u043B\u043E\u0442\u0430 \u043F\u043E\u0434\u0441\ + \u0442\u0432\u043E\u043B\u0430 - \u0443\u0436\u0435 \u043E\u0433\u0440\u043E\ + \u043C\u043D\u0430\u044F \u0446\u0435\u043D\u0430 \u0437\u0430 \u0438\u0441\u043F\ + \u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435)" + - balance: "\u0413\u043B\u0443\u0448\u0430\u043A \u0441\u043D\u0438\u0436\u0430\u0435\ + \u0442 \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C \u043F\u0443\u043B\u0438\ + \ \u043D\u0430 50%, \u0430 \u043D\u0435 \u043D\u0430 100%" + - balance: "\u041B\u0430\u0433\u0437\u0430\u043D\u044B \u0432\u043E\u0437\u0432\u0440\ + \u0430\u0449\u0435\u043D\u044B \u0432 \u043E\u0440\u0443\u0436\u0435\u0439\u043D\ + \u044B\u0439 \u0432\u0435\u043D\u0434\u043E\u0440" + - balance: "AR-18 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0430 \u0432\ + \ \u043E\u0440\u0443\u0436\u0435\u0439\u043D\u044B\u0439 \u0432\u0435\u043D\u0434\ + \u043E\u0440" + - balance: "\u041F\u0430\u0432\u0435\u0440\u0444\u0438\u043A\u0441\u0442 \u0432\u043E\ + \u0437\u0432\u0440\u0430\u0449\u0435\u043D \u0432 \u043E\u0440\u0443\u0436\u0435\ + \u0439\u043D\u044B\u0439 \u0432\u0435\u043D\u0434\u043E\u0440" + - spellcheck: "\u041F\u0435\u0440\u0435\u0432\u043E\u0434 \u0440\u0430\u0437\u0434\ + \u0435\u043B\u043E\u0432 \u043E\u0440\u0443\u0436\u0435\u0439\u043D\u043E\u0433\ + \u043E \u0432\u0435\u043D\u0434\u043E\u0440\u0430" + - code_imp: "\u0422\u0443\u0440\u0435\u043B\u0438 \u043F\u0435\u0440\u0435\u043D\ + \u0435\u0441\u0435\u043D\u044B \u0432 \u0440\u0430\u0437\u0434\u0435\u043B \u0421\ + \u043F\u0435\u0446\u0438\u0430\u043B\u0438\u0441\u0442\u0430\u043C, \u0441\u0442\ + \u0430\u0446\u0438\u043E\u043D\u0430\u0440\u043D\u044B\u0435 \u043F\u0443\u043B\ + \u0435\u043C\u0435\u0442\u044B \u0432 \u0440\u0430\u0437\u0434\u0435\u043B \u043F\ + \u0443\u043B\u0435\u043C\u0435\u0442\u043E\u0432" + homexp13: + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u043F\u043E\u044F\u0441\ + \ \u0434\u043B\u044F \u043C\u0430\u0433\u0430\u0437\u0438\u043D\u043E\u0432\ + \ \"M344\"" + - rscadd: "\u041F\u0438\u0441\u0442\u043E\u043B\u0435\u0442\u043D\u044B\u0439 \u043F\ + \u043E\u044F\u0441 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\ + \u0441\u043A\u0438 \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0441\ + \u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0435 \u043C\u0430\u0433\ + \u0430\u0437\u0438\u043D\u044B \u0438 \u043C\u043E\u0436\u0435\u0442 \u043F\u0435\ + \u0440\u0435\u0437\u0430\u0440\u044F\u0436\u0430\u0442\u044C \u0438\u0445 \u0434\ + \u0430\u0436\u0435 \u0435\u0441\u043B\u0438 \u043E\u043D\u0438 \u043D\u0430\u0445\ + \u043E\u0434\u044F\u0442\u0441\u044F \u0432 \u043D\u0451\u043C (\u043F\u043A\ + \u043C \u0441 \u043A\u043E\u0440\u043E\u0431\u043A\u043E\u0439 \u043F\u0430\u0442\ + \u0440\u043E\u043D\u043E\u0432 \u043F\u043E \u043F\u043E\u044F\u0441\u0443)" + lorianss: + - balance: "\u0422\u0435\u043F\u0435\u0440\u044C \u043C\u0435\u0436\u0434\u0443\ + \ \u043A\u0441\u0435\u043D\u043E\u0434\u0432\u0435\u0440\u044C\u043C\u0438 \u0434\ + \u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043C\u0438\u043D\u0438\ + \u043C\u0443\u043C 2 \u0442\u0430\u0439\u043B\u0430 \u0434\u043B\u044F \u0438\ + \u0445 \u043F\u043E\u0441\u0442\u0440\u043E\u0439\u043A\u0438." +2024-11-19: + Dark-Umbrella: + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B handheld charger \u0432 \u0438\ + \u043D\u0436\u0435\u043D\u0435\u0440\u043D\u044B\u0439 \u0440\u0430\u0437\u0434\ + \u0435\u043B \u043A\u0430\u0440\u0433\u043E \u0437\u0430 85 \u043F\u043E\u0439\ + \u043D\u0442\u043E\u0432." + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B Emergency Provision Crate\ + \ (EPC) \u0441 10 \u041C\u0420\u0415 \u0432\u043D\u0443\u0442\u0440\u0438 \u0432\ + \ \u0440\u0430\u0437\u0434\u0435\u043B \u0441\u043D\u0430\u0431\u0436\u0435\u043D\ + \u0438\u044F \u043A\u0430\u0440\u0433\u043E \u0437\u0430 65 \u043F\u043E\u0439\ + \u043D\u0442\u043E\u0432." +2024-11-20: + Helg2: + - qol: "\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u043B \u043A\u043D\u043E\ + \u043F\u043A\u0438 \u0433\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u0438\ + \ \u0438 \u043F\u0440\u0438\u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\ + \u044F \u0432 1." +2024-11-22: + Helg2: + - code_imp: "\u0417\u0430\u043C\u0435\u043D\u0438\u043B `spawn()` \u0432 \u043A\u043E\ + \u0434\u0435 \u0432\u0437\u0440\u044B\u0432\u043E\u0432 \u043D\u0430 `addtimer`\ + \ \u0438 `INVOKE_ASYNC`" + homexp13: + - balance: "\u043C\u0435\u0434\u0438\u0446\u0438\u043D\u0441\u043A\u0438\u0439 \u0440\ + \u0435\u0441\u0435\u0440\u0447\u0435\u0440 \u0442\u0435\u043F\u0435\u0440\u044C\ + \ \u043F\u043E\u043B\u0435\u0432\u043E\u0439 \u0440\u0435\u0441\u0435\u0440\u0447\ + \u0435\u0440 \u0438 \u0438\u043C\u0435\u0435\u0442 \u0431\u043E\u0435\u0432\u044B\ + \u0435 \u0441\u043A\u0438\u043B\u044B." +2024-11-23: + Helg2: + - balance: "\u0418\u0437\u043C\u0435\u043D\u0438\u043B \u0444\u043E\u0440\u043C\u0443\ + \u043B\u0443 \u0434\u043B\u044F \u0445\u0430\u0439\u0434\u0436\u0430\u043A\u0430\ + \ \u0441 `\u0415\u0441\u043B\u0438 \u043C\u0430\u0440\u0438\u043D\u043E\u0432\ + \ > 5` \u043D\u0430 `\u0415\u0441\u043B\u0438 \u043C\u0430\u0440\u0438\u043D\ + \u043E\u0432 > \u0447\u0435\u043C \u043A\u0441\u0435\u043D\u043E\u0441\u043E\ + \u0432`" + - rscadd: "\u0421\u0432\u0430\u0442 \u043C\u0430\u0441\u043A\u0430 \u0442\u0435\u043F\ + \u0435\u0440\u044C \u0440\u0432\u0451\u0442\u0441\u044F \u043F\u0440\u0438 \u043F\ + \u043E\u043F\u044B\u0442\u043A\u0435 \u0445\u0430\u0433\u0433\u0435\u0440\u0430\ + \ \u0437\u0430\u043B\u0435\u0437\u0442\u044C \u043D\u0430 \u043A\u043E\u0433\ + \u043E-\u0442\u043E." + MeowEmiya: + - balance: "\u0425\u0430\u0433\u0433\u0435\u0440\u0430 \u0431\u043E\u043B\u0435\u0435\ + \ \u043D\u0435\u043B\u044C\u0437\u044F \u0441\u043D\u044F\u0442\u044C \u043E\ + \u0433\u043D\u0435\u043C \u0441 \u043A\u0443\u043A\u043B\u044B." + - balance: "\u041D\u0430\u0445\u043E\u0434\u044F\u0449\u0430\u044F\u0441\u044F \u0432\ + \ \u0442\u0435\u043B\u0435 \u043B\u044F\u0440\u0432\u0430 \u0442\u0435\u043F\ + \u0435\u0440\u044C \u0440\u0430\u0441\u0442\u0451\u0442 \u0431\u044B\u0441\u0442\ + \u0440\u0435\u0435." + definitelynotspaghetti: + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u043D\u043E\u0432\u044B\u0435\ + \ \u0430\u0431\u0438\u043B\u043A\u0438 \u0412\u0434\u043E\u0432\u0435." + - rscdel: "\u0423\u0434\u0430\u043B\u0438\u043B Web Hook, Burrow \u0438 Cannibalise." + - balance: "\u0418\u0437\u043C\u0435\u043D\u0438\u043B \u041A\u0414 \u0438 \u0441\ + \u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C \u043D\u0435\u043A\u043E\u0442\ + \u043E\u0440\u044B\u0445 \u0430\u0431\u0438\u043B\u043E\u043A \u0438 \u0441\u0442\ + \u0430\u0442\u044B \u043F\u0430\u0443\u0447\u043A\u043E\u0432." + - refactor: "\u041F\u043E\u0447\u0438\u043D\u0438\u043B \u0438 \u0443\u043B\u0443\ + \u0447\u0448\u0438\u043B \u0418\u0418 \u043F\u0430\u0443\u0447\u043A\u043E\u0432\ + ." + lorianss: + - rscadd: "\u0421\u0435\u043D\u0442\u0438\u043D\u0435\u043B\u044C \u0442\u0435\u043F\ + \u0435\u0440\u044C \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442 +60 \u0431\ + \u0443\u043B\u043B\u0435\u0442 \u0430\u0440\u043C\u043E\u0440\u0430 \u043D\u0430\ + \ \u0432\u0440\u0435\u043C\u044F \u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0438\ + \u0438 \u0441\u0432\u043E\u0438\u0445 \u0442\u043E\u043A\u0441\u0438\u0447\u043D\ + \u044B\u0445 \u0443\u0434\u0430\u0440\u043E\u0432." + mister-onion: + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u0441\u043F\u043E\ + \u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C \u0434\u043B\u044F \u043F\u043E\ + \u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043D\u0435\u0441\u0442\u0430 \u043A\ + \u0435\u0440\u0440\u0438\u0435\u0440\u0443. \u0421\u0442\u043E\u0438\u043C\u043E\ + \u0441\u0442\u044C \u043F\u043B\u0430\u0437\u043C\u044B 200, \u041A\u0414 20\u0441\ + ." + - balance: "\u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u0438:\ + \ Call younger - 20s > 10s \u041A\u0414; Throw hugger - 3s > 2s; \u041A\u0414\ + \ Spawn hugger - 10s > 5s \u041A\u0414. \u0425\u0430\u0440\u0430\u043A\u0442\ + \u0435\u0440\u0438\u0441\u0442\u0438\u043A\u0438:Melee damage = 20>22;Plasma_max\ + \ = 800>1000;plasma_gain = 38>45;max_health = 325>425\nsoft_armor = list (MELEE\ + \ = 15>30, BULLET = 15>30, LASER = 15>30, ENERGY = 15>30, BOMB = 0, BIO = 5,\ + \ FIRE = 0>25, ACID = 5)." +2024-11-24: + Tatarla: + - balance: "\u0424\u043B\u0430\u0435\u0440\u0430 \u0442\u0435\u043F\u0435\u0440\u044C\ + \ \u0433\u043E\u0440\u044F\u0442 \u043E\u0442 1.5 \u0434\u043E 2 \u043C\u0438\ + \u043D\u0443\u0442 \u0432\u043C\u0435\u0441\u0442\u043E 25-30 \u043C\u0438\u043D\ + \u0443\u0442" +2024-11-25: + Helg2: + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0432\u0435\u043D\u0434\u043E\ + \u0440\u044B \u0441 \u043B\u043E\u0434\u0430\u0443\u0442\u0430\u043C\u0438 \u0434\ + \u043B\u044F \u043D\u043E\u0432\u0438\u0447\u043A\u043E\u0432." +2024-11-26: + definitelynotspaghetti: + - balance: Spiderling HP 225 -> 150 +2024-11-27: + ChromosomeKiller: + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u043D\u043E\u0432\ + \u044B\u0435 \u043A\u043E\u0440\u043E\u0431\u043A\u0438 \u043F\u043E\u0434 \u043E\ + \u0433\u043D\u0435\u043D\u043D\u044B\u0435 \u0438 \u0438\u043C\u043F\u0430\u043A\ + \u0442 \u043F\u0430\u0442\u0440\u043E\u043D\u044B \u043D\u0430 \u0441\u043A\u0430\ + \u0443\u0442\u0441\u043A\u0443\u044E \u0432\u0438\u043D\u0442\u043E\u0432\u043A\ + \u0443." +2024-11-28: + Helg2: + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u0442\u043E \u0447\u0442\ + \u043E \"Jump To Area\" \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u043B\ + ." +2024-11-29: + CheBokJam: + - balance: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0448\u0430\u0442\u0442\u0435\ + \u0440 (\u043C\u0438\u043D\u0443\u0441 20% \u0431\u0440\u043E\u043D\u0438) \u043D\ + \u0430 3 \u0441\u0435\u043A\u0443\u043D\u0434\u044B." + - balance: "\u0423\u0440\u043E\u043D 25 -> 12, \u0410\u041F -15 -> 20." + - balance: "\u0421\u043D\u0438\u0436\u0435\u043D\u043E \u043A\u043E\u043B-\u0432\ + \u043E \u043F\u0430\u0442\u0440\u043E\u043D\u043E\u0432 \u0432 \u043F\u0430\u0432\ + \u0435\u0440\u043F\u0430\u043A\u0435 \u0441 2000 \u0434\u043E 1000." + Helg2: + - map: "\u041A\u0435\u0439\u043A\u0430\u0440\u0434 \u0430\u0443\u0442\u0435\u043D\ + \u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u044B \u0442\u0435\u043F\ + \u0435\u0440\u044C \u0435\u0441\u0442\u044C \u043D\u0435 \u0442\u043E\u043B\u044C\ + \u043A\u043E \u043D\u0430 \u043C\u043E\u0441\u0442\u0438\u043A\u0435, \u043D\ + \u043E \u0438 \u0432 \u043A\u043E\u043C\u043D\u0430\u0442\u0430\u0445 \u043A\ + \u043E\u043C\u043C\u0430\u043D\u0434\u043E\u0432\u0430\u043D\u0438\u044F." + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u0442\u043E \u0447\u0442\ + \u043E \u0440\u0435\u0446\u0435\u043F\u0442\u044B \u0434\u043B\u044F \u0437\u0430\ + \u0432\u043E\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u044E\u0449\u0438\u0435\ + \ \u0441\u0442\u0435\u043A\u043B\u043E, \u043D\u0435 \u043F\u0440\u0438\u043D\ + \u0438\u043C\u0430\u043B\u0438 \u0441\u0442\u0435\u043A\u043B\u043E." + - balance: "\u0422\u043E\u0447\u043D\u0430\u044F \u0434\u0438\u0441\u0442\u0430\u043D\ + \u0446\u0438\u044F \u0441\u0442\u0440\u0435\u043B\u044C\u0431\u044B \u0441\u0433\ + 29 \u043F\u043E\u0434\u043D\u044F\u0442\u0430 \u0441 8 \u0434\u043E 20. \u041F\ + \u0440\u043E\u0431\u0438\u0442\u0438\u0435 \u043F\u043E\u0434\u043D\u044F\u0442\ + \u043E \u0441 25 \u0434\u043E 45. \u0417\u0430\u0434\u0435\u0440\u0436\u043A\ + \u0430 \u043C\u0435\u0436\u0434\u0443 \u0432\u044B\u0441\u0442\u0440\u0435\u043B\ + \u0430\u043C\u0438 \u0443\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0430 \u0441\ + \ 0.2 \u0441\u0435\u043A\u0443\u043D\u0434 \u0434\u043E 0.15." + - qol: "\u0418\u0437\u043C\u0435\u043D\u0438\u043B \u0434\u0435\u0444\u043E\u043B\ + \u0442\u043D\u044B\u0439 \u043A\u0435\u0439\u0431\u0438\u043D\u0434 \u0434\u043B\ + \u044F \u043F\u0440\u044B\u0436\u043A\u0430 \u0441 \u043F\u0440\u043E\u0431\u0435\ + \u043B\u0430 \u043D\u0430 V." + - bugfix: "\u0418\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043A\u043D\u043E\ + \u043F\u043A\u0430 \u0434\u043B\u044F \u0431\u0443\u0441\u0442\u044B \u0442\u0435\ + \u043F\u0435\u0440\u044C \u043D\u0435 \u0432\u044B\u0431\u0438\u0432\u0430\u0435\ + \u0442\u0441\u044F \u0438\u0437 \u043E\u0431\u0449\u0435\u0439 \u0442\u0435\u043C\ + \u044B \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u0445 \u043A\u043D\u043E\ + \u043F\u043E\u043A." + - rscdel: "\u0423\u0434\u0430\u043B\u0438\u043B \u0410\u0410 \u0443 \u043A\u043B\ + \u043E\u0443\u043D\u0430." + - image: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0437\u0435\u0440\u043A\u0430\ + \u043B\u0430\u043C \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\ + \u0435 \u0441\u0442\u043E\u0440\u043E\u043D." + homexp13: + - rscadd: Added steel crest defender strain + "\u041E\u0434\u0438\u043D\u043E\u043A\u0438\u0439 \u0410\u0441\u043A\u0435\u0442": + - balance: "\u041C\u0435\u0442\u0430\u0431\u043E\u043B\u0438\u0437\u0430\u0446\u0438\ + \u044F \u041E\u043A\u0441\u0438\u043A\u043E\u0434\u043E\u043D\u0430 \u043F\u0440\ + \u0438\u0432\u0435\u0434\u0435\u043D\u0430 \u043A \u0441\u0442\u0430\u043D\u0434\ + \u0430\u0440\u0442\u043D\u043E\u0439." +2024-11-30: + Basia: + - spellcheck: "\u041F\u0435\u0440\u0435\u0432\u043E\u0434 \u0430\u043D\u043E\u043D\ + \u0441\u043E\u0432 \u043D\u0430 \u0440\u0443\u0441\u0441\u043A\u0438\u0439 \u044F\ + \u0437\u044B\u043A." + - sound: "\u041F\u0435\u0440\u0435\u043E\u0437\u0432\u0443\u0447\u043A\u0430 \u0430\ + \u043D\u043E\u043D\u0441\u043E\u0432 \u043D\u0430 \u0440\u0443\u0441\u0441\u043A\ + \u0438\u0439 \u044F\u0437\u044B\u043A." + CheBokJam: + - bugfix: "\u0411\u043E\u043B\u044C\u0448\u0435 \u0432 \u043A\u0430\u043C\u043D\u0435\ + \ \u041A\u0438\u043D\u0433\u0430 \u043D\u0435\u043B\u044C\u0437\u044F \u0443\ + \u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C/\u0441\u043D\u044F\u0442\ + \u044C \u043B\u044E\u0431\u0443\u044E \u0440\u0430\u0441\u043A\u043B\u0430\u0434\ + \u044B\u0432\u0430\u0435\u043C\u0443\u044E \u0432\u0435\u0449\u044C." + - balance: "\u0417\u0430\u0449\u0438\u0442\u0430 \u043C\u0438\u043C\u0438\u0440\u0430\ + \ 1 \u043E\u0442 \u043A\u0438\u0441\u043B\u043E\u0442\u044B 5 -> 10, \u0437\u0430\ + \u0449\u0438\u0442\u0430 \u043E\u0442 \u0433\u0430\u0437\u043E\u0432 \u0441\u043D\ + \u0438\u0436\u0435\u043D\u0430 \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430\ + ." + - balance: "\u0417\u0430\u0449\u0438\u0442\u0430 \u043C\u0438\u043C\u0438\u0440\u0430\ + \ 2 \u043E\u0442 \u043A\u0438\u0441\u043B\u043E\u0442\u044B 10 -> 25." + - balance: "\u0421\u043D\u0438\u0436\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u043D\ + \u0430 \u043E\u0442 \u043A\u043E\u043B\u043E\u0434\u0446\u0435\u0432 \u0432\ + \ \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438 \u043E\u0442\ + \ \u043D\u0430\u0434\u0435\u0442\u043E\u0433\u043E \u0448\u043B\u0435\u043C\u0430\ + \ \u0441 \u043C\u0438\u043C\u0438\u0440\u043E\u043C + \u0432\u0435\u0440\u0441\ + \u0438\u0438 \u043C\u0438\u043C\u0438\u0440\u0430." + - balance: "\u0426\u0435\u043D\u0430\u043C \u043C\u0438\u043C\u0438\u0440\u0430\ + \ 2 \u0432 \u043A\u0430\u0440\u0433\u043E 120 -> 160." + Helg2: + - rscdel: "\u0423\u0434\u0430\u043B\u0438\u043B \u0437\u0430\u0442\u0435\u043C\u043D\ + \u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u044D\u0432\u043E\u043B\u044E\u0446\ + \u0438\u0438 \u043A\u0441\u0435\u043D\u043E\u0441\u043E\u0432." + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u0442\u043E \u0447\u0442\ + \u043E \u043E\u043F\u043E\u0432\u0435\u0449\u0435\u043D\u0438\u0435 \u043E \u043F\ + \u043E\u044F\u0432\u043B\u0435\u043D\u0438\u0438 \u043F\u0440\u0430\u0432\u0438\ + \u0442\u0435\u043B\u044F \u0445\u0430\u0439\u0432\u0430 \u043D\u0435\u043F\u0440\ + \u0430\u0432\u0438\u043B\u044C\u043D\u043E \u043E\u0442\u043E\u0431\u0440\u0430\ + \u0436\u0430\u043B\u043E \u0435\u0433\u043E \u0438\u043C\u044F." + - rscdel: "\u0423\u0434\u0430\u043B\u0438\u043B \u0431\u0435\u0441\u043F\u043B\u0430\ + \u0442\u043D\u044B\u0435 \u043A\u0430\u0440\u0433\u043E \u0431\u043E\u0435\u043F\ + \u0440\u0438\u043F\u0430\u0441\u044B \u0438\u0437 \u043A\u0430\u0440\u0433\u043E\ + \ \u0432\u0435\u043D\u0434\u043E\u0440\u0430 \u0432\u043E \u0432\u043A\u043B\ + \u0430\u0434\u043A\u0435 \"Surplus Special Equipment\" (\u0448\u0430\u0445\u0438\ + \u0434\u043E\u043A)" + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u0442\u043E \u0447\u0442\ + \u043E \u0442\u0430\u0439\u043C\u0435\u0440 \u0441\u043C\u0435\u0440\u0442\u0438\ + \ \u04224 \u043A\u0441\u0435\u043D\u043E\u0441\u043E\u0432 \u043D\u0435 \u0440\ + \u0430\u0431\u043E\u0442\u0430\u043B." + - code_imp: "\u0410\u0431\u0438\u043B\u043A\u0438 \u0442\u0435\u043F\u0435\u0440\ + \u044C \u043D\u0435 \u043E\u0431\u043D\u043E\u0432\u043B\u044F\u044E\u0442\u0441\ + \u044F \u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u043D\u0443\u0436\u043D\u043E\ + , \u0438 \u043E\u0431\u043D\u043E\u0432\u043B\u044F\u044E\u0442\u0441\u044F\ + \ \u043A\u043E\u0433\u0434\u0430 \u043D\u0443\u0436\u043D\u043E." + - admin: "\u041F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0435\ + \u043D\u043D\u044B\u0439 \u0430\u0433\u0435\u043D\u0442 \u0442\u0435\u043F\u0435\ + \u0440\u044C \u0438\u043C\u0435\u0435\u0442 \u043D\u0430\u0443\u0448\u043D\u0438\ + \u043A." + MalorMorfin: + - bugfix: "\u0425\u0430\u0439\u0432 \u041C\u0430\u0439\u043D\u0434 \u0431\u043E\u043B\ + \u044C\u0448\u0435 \u043D\u0435 \u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\ + \u0442 \u043A\u0438\u0441\u043B\u043E\u0442\u043D\u044B\u0439 \u0441\u043B\u0435\ + \u0434 \u0432 \u043F\u0440\u0438\u0437\u0440\u0430\u0447\u043D\u043E\u0439 \u0444\ + \u043E\u0440\u043C\u0435." + - bugfix: "\u041A\u0441\u0435\u043D\u043E\u043C\u043E\u0440\u0444\u044B \u0432 \u0432\ + \u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0438\u0438 \u043D\u0435 \u043E\u0441\ + \u0442\u0430\u0432\u043B\u044F\u044E\u0442 \u043A\u0438\u0441\u043B\u043E\u0442\ + \u043D\u044B\u0439 \u0441\u043B\u0435\u0434." diff --git a/html/changelogs/archive/2024-12.yml b/html/changelogs/archive/2024-12.yml new file mode 100644 index 00000000000..744611baa0a --- /dev/null +++ b/html/changelogs/archive/2024-12.yml @@ -0,0 +1,282 @@ +2024-12-01: + Helg2: + - image: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0441\u043F\u0440\u0430\u0439\ + \u0442 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0435\ + \u0439 \u0431\u0430\u0437\u043E\u0432\u043E\u0439 \u0440\u0430\u043A\u0435\u0442\ + \u044B." + - image: "\u0421\u043F\u0440\u0430\u0439\u0442\u044B \u0434\u043B\u044F \u0431\u043E\ + \u043B\u044C\u0448\u0438\u043D\u0441\u0442\u0432\u0430 \u0430\u043F, \u0445\u043F\ + \ \u0438 \u0437\u0430\u0436\u0438\u0433\u0430\u0442\u0435\u043B\u044C\u043D\u044B\ + \u0445 \u043C\u0430\u0433\u0430\u0437\u0438\u043D\u043E\u0432 \u043F\u0435\u0440\ + \u0435\u0434\u0435\u043B\u0430\u043D\u044B \u043F\u043E\u0434 \u0433\u0440\u0435\ + \u0439\u0441\u043A\u0435\u0439\u043B." + - code_imp: "\u0420\u0430\u0441\u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\ + \u043B \u0441\u043F\u0440\u0430\u0439\u0442\u044B \u0430\u043C\u0443\u043D\u0438\ + \u0446\u0438\u0438 \u043F\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\ + \u043C \u0444\u0430\u0439\u043B\u0430\u043C." +2024-12-02: + CheBokJam: + - map: "\u041D\u0430 \u0442\u0430\u043B\u043E\u0441 \u0434\u043E\u0431\u0430\u0432\ + \u043B\u0435\u043D\u044B \u0437\u0430\u0440\u044F\u0434\u043D\u0438\u043A\u0438\ + \ \u0434\u043B\u044F \u0434\u0435\u0444\u0438\u0431\u0440\u0438\u043B\u043B\u044F\ + \u0442\u043E\u0440\u043E\u0432: \u0432 \u0431\u0443\u0434\u043A\u0435 \u0443\ + \u0447\u0451\u043D\u043E\u0433\u043E, \u0432 \u0433\u043B\u0430\u0432\u043D\u043E\ + \u043C \u0445\u043E\u043B\u0435 \u043C\u0435\u0434 \u043F\u0443\u043D\u043A\u0442\ + \u0430 \u0438 \u043D\u0430 \u0441\u043A\u043B\u0430\u0434\u0435." + MrFloppa: + - rscadd: "\u0425\u0430\u0439\u0432\u043C\u0430\u0439\u043D\u0434 \u0442\u0435\u043F\ + \u0435\u0440\u044C \u043F\u043E\u043D\u0438\u043C\u0430\u0435\u0442 \u044F\u0437\ + \u044B\u043A \u043C\u0430\u0440\u043E\u0432" + mister-onion: + - rscadd: "Prime \u0440\u0430\u043D\u0433 \u043A\u0441\u0435\u043D\u043E\u043C\u043E\ + \u0440\u0444\u043E\u0432 \u0431\u044B\u043B \u0438\u0437\u043C\u0435\u043D\u0435\ + \u043D \u043D\u0430 Primal." + - balance: "\u043A\u0438\u043D\u0433 \u0442\u0435\u043F\u0435\u0440\u044C \u0438\ + \u043C\u0435\u0435\u0442 \u0438\u043C\u043C\u0443\u043D\u0438\u0442\u0435\u0442\ + \ \u043A \u043C\u043E\u043B\u043E\u0442\u043A\u0443" +2024-12-03: + Helg2: + - bugfix: "\u041F\u0440\u043E\u0434\u0430\u0436\u0430 \u043B\u044E\u0434\u0435\u0439\ + \ \u0432 \u043A\u0430\u0440\u0433\u043E \u0442\u0435\u043F\u0435\u0440\u044C\ + \ \u043F\u0440\u0438\u043D\u043E\u0441\u0438\u0442 \u043E\u0447\u043A\u0438\ + , \u043A\u0430\u043A \u0438 \u0434\u043E\u043B\u0436\u043D\u043E." + - bugfix: "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u043F\u043E\ + \ \u043F\u0440\u043E\u0434\u0430\u0436\u0435 \u043A\u0441\u0435\u043D\u043E\u0441\ + \u043E\u0432 \u0432 \u043A\u0430\u0440\u0433\u043E \u0442\u0435\u043F\u0435\u0440\ + \u044C \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442." + - rscadd: "\u0418\u0437 \u0445\u0430\u0433\u0433\u0435\u0440 \u0442\u0443\u0440\u0435\ + \u043B\u0438 \u0442\u0435\u043F\u0435\u0440\u044C \u043C\u043E\u0436\u043D\u043E\ + \ \u043F\u043E\u044F\u0432\u0438\u0442\u044C\u0441\u044F \u0432 \u0440\u043E\ + \u043B\u0438 \u0440\u0430\u0437\u0443\u043C\u043D\u043E\u0433\u043E \u0445\u0430\ + \u0433\u0433\u0435\u0440\u0430." + - balance: "\u0425\u0430\u0433\u0433\u0435\u0440\u044B \u0438\u0437 \u0445\u0430\ + \u0433\u0433\u0435\u0440 \u0442\u0443\u0440\u0435\u043B\u0438 \u0442\u0435\u043F\ + \u0435\u0440\u044C \u043F\u0440\u0438 \u043F\u0440\u044F\u043C\u043E\u043C \u043F\ + \u043E\u043F\u0430\u0434\u0430\u043D\u0438\u0438 \u043F\u043E \u043C\u043E\u0431\ + \u0443 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043A \u043D\u0435\u043C\ + \u0443 \u0446\u0435\u043F\u043B\u044F\u044E\u0442\u0441\u044F. \u041F\u0440\u0438\ + \ \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u0438 \u0432 \u043E\u0431\ + \u044A\u0435\u043A\u0442/\u0442\u0443\u0440\u0444 \u043E\u043D\u0438 \u0432\u043C\ + \u0435\u0441\u0442\u043E \u0442\u043E\u0433\u043E \u0447\u0442\u043E\u0431\u044B\ + \ \u043D\u0430\u0447\u0438\u043D\u0430\u0442\u044C \u0441\u043F\u044F\u0449\u0438\ + \u043C\u0438, \u0441\u0440\u0430\u0437\u0443 \u044F\u0432\u043B\u044F\u044E\u0442\ + \u0441\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u043C\u0438, \u0447\u0442\ + \u043E \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u0435\u0442 \u0432\u0440\u0435\ + \u043C\u0435\u043D\u043D\u043E\u0435 \u043E\u043A\u043D\u043E \u0441 3 \u0441\ + \u0435\u043A\u0443\u043D\u0434 \u0434\u043E 1-\u0443\u0445." + - bugfix: "\u0417\u0432\u0443\u043A \u0441\u043C\u0435\u0440\u0442\u0438 \u0442\u0443\ + \u0440\u0435\u043B\u0438 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u0432\ + \u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0441\ + \u044F \u043F\u0440\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438 \u0442\ + \u0443\u0440\u0435\u043B\u0438." + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u0442\u043E \u0447\u0442\ + \u043E \u0443\u043D\u0438\u0447\u0442\u043E\u0436\u0435\u043D\u0438\u0435 \u0440\ + \u0435\u0437\u0438\u043D\u043E\u0432\u043E\u0439/\u0445\u0430\u0433\u0433\u0435\ + \u0440 \u0442\u0443\u0440\u0435\u043B\u0438 \u043D\u0435 \u0432\u044B\u0441\u0442\ + \u0440\u0435\u043B\u0438\u0432\u0430\u043B\u043E \u043F\u043E\u0434\u0445\u043E\ + \u0434\u044F\u0449\u0438\u043C\u0438 \u0441\u043D\u0430\u0440\u044F\u0434\u0438\ + \ \u0432\u043E \u0432\u0441\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B\ + ." + - image: "\u041A\u0441\u0435\u043D\u043E \u0442\u0443\u0440\u0435\u043B\u044F\u043C\ + \ \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u043E\u0442\u043B\u0438\ + \u0447\u0430\u044E\u0449\u0438\u0435\u0441\u044F \u043E\u0442 \u0434\u0440\u0443\ + \u0433 \u0434\u0440\u0443\u0433\u0430 \u043E\u0432\u0435\u0440\u043B\u0435\u0438\ + \ \u0434\u043B\u044F \u0440\u0435\u0433\u0435\u043D\u0430 \u0446\u0435\u043B\ + \u043E\u0441\u0442\u043D\u043E\u0441\u0442\u0438 \u0441\u0442\u0440\u0443\u043A\ + \u0442\u0443\u0440\u044B." + - code_imp: "\u041A\u0441\u0435\u043D\u043E \u0442\u0443\u0440\u0435\u043B\u0438\ + \ \u0442\u0435\u043F\u0435\u0440\u044C \u0441\u043A\u0430\u043D\u0438\u0440\u0443\ + \u044E\u0442 \u043E\u043A\u0440\u0443\u0433\u0443 \u043D\u0430 \u043F\u0440\u0435\ + \u0434\u043C\u0435\u0442 \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0435\ + \u0439 \u0446\u0435\u043B\u0438 \u043D\u0435 \u0440\u0430\u0437 \u0432 10 \u0441\ + \u0435\u043A\u0443\u043D\u0434, \u0430 \u043A\u0430\u0436\u0434\u044B\u0439\ + \ \u0442\u0438\u043A." + - code_imp: "\u0424\u0430\u0439\u043B\u044B \u0440\u0430\u0441 \u0438 \u044D\u043C\ + \u043E\u0446\u0438\u0439 \u043B\u044E\u0434\u0435\u0439 \u0440\u0430\u0441\u0441\ + \u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u044B \u0432 \u043E\u0442\ + \u0434\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0430\u043F\u043A\u0438." + - qol: "\u0414\u043B\u044F \u0441\u043D\u044F\u0442\u0438\u044F \u0445\u0430\u0433\ + \u0433\u0435\u0440\u0430 \u0441 \u043B\u0438\u0446\u0430 \u0442\u0435\u043F\u0435\ + \u0440\u044C \u0435\u0441\u0442\u044C \u0441\u043E\u0431\u0441\u0442\u0432\u0435\ + \u043D\u043D\u043E\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\ + \u0438\u0435." + - code_imp: "`getflaticon()` \u043E\u0442\u0432\u0435\u0447\u0430\u044E\u0449\u0438\ + \u0439 \u0437\u0430 \u043A\u0430\u0440\u0442\u0438\u043D\u043A\u0438 \u0432\ + \ \u043F\u0440\u0435\u0444. \u043C\u0435\u043D\u044E \u0431\u044B\u043B \u043D\ + \u0435\u043C\u043D\u043E\u0433\u043E \u043E\u043F\u0442\u0438\u043C\u0438\u0437\ + \u0438\u0440\u043E\u0432\u0430\u043D." + - code_imp: "\u0420\u0430\u0441\u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\ + \u043B Supply.dm" + homexp13: + - balance: "\u043C\u0443\u0442\u0430\u0446\u0438\u0438 \u0442\u0435\u043F\u0435\u0440\ + \u044C \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u044E\u0442\u0441\u044F \u043F\ + \u0440\u0438 \u044D\u0432\u043E\u043B\u0432\u0435." +2024-12-04: + definitelynotspaghetti: + - bugfix: "\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0441\u043F\u0430\u0439\u0434\ + \u0435\u0440\u043B\u0438\u043D\u0433\u0430 \u0431\u043E\u043B\u044C\u0448\u0435\ + \ \u043D\u0435\u043B\u044C\u0437\u044F \u0435\u0441\u043B\u0438 \u0443 \u0430\ + \u0431\u0438\u043B\u043A\u0438 \u043D\u0435\u0442 \u0437\u0430\u0440\u044F\u0434\ + \u043E\u0432" +2024-12-05: + Foxlate, Helg2: + - bugfix: "\u0422\u0440\u0443\u0431\u044B \u043D\u0430 \u041A\u0443\u0442\u0439\u0435\ + \u0432\u043E \u0442\u0435\u043F\u0435\u0440\u044C \u043D\u0435 \u043D\u0430\u043A\ + \u043B\u0430\u0434\u044B\u0432\u0430\u044E\u0442 \u043D\u0435\u043D\u0443\u0436\ + \u043D\u044B\u0435 \u043E\u0432\u0435\u0440\u043B\u0435\u0438, \u0432\u0438\u0437\ + \u0443\u0430\u043B\u044C\u043D\u043E \u0437\u0430\u043D\u0438\u043C\u0430\u044F\ + \ \u0431\u043E\u043B\u044C\u0448\u0435 \u043C\u0435\u0441\u0442\u0430 \u0447\ + \u0435\u043C \u0444\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438." + - image: "\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u0441\u043F\u0440\u0430\ + \u0439\u0442\u044B \u043E\u043A\u043E\u043D \u0438 \u0440\u0430\u043C \u0434\ + \u043B\u044F \u043E\u043A\u043E\u043D \u043D\u0430 \u041A\u0443\u0442\u0439\u0435\ + \u0432\u043E." + - image: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D \u0432\u0435\u0440\ + \u0445\u043D\u0435-\u043F\u0440\u0430\u0432\u044B\u0439 \u0441\u0442\u0435\u0439\ + \u0442 \u043F\u0443\u0441\u0442\u044B\u043D\u043D\u043E\u0439 \u0440\u0435\u0447\ + \u043A\u0438, \u0438 \u0442\u0435\u043F\u0435\u0440\u044C \u043E\u043D \u043D\ + \u0435 \u0432\u044B\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0430\ + \ \u0444\u043E\u043D\u0435 \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u0445\ + \ \u0441\u0445\u043E\u0436\u0438\u0445 \u0442\u0443\u0440\u0444\u043E\u0432." + - map: "\u041E\u0431\u044B\u0447\u043D\u044B\u0435 \u043E\u043A\u043D\u0430 \u0443\ + \ \u0443\u043A\u0440\u0435\u043F\u043B\u0435\u043D\u043D\u044B\u0445 \u0441\u0442\ + \u0435\u043D \u043D\u0430 \u041A\u0443\u0442\u0439\u0435\u0432\u043E \u0437\u0430\ + \u043C\u0435\u043D\u0435\u043D\u044B \u043D\u0430 \u0443\u043A\u0440\u0435\u043F\ + \u043B\u0435\u043D\u043D\u044B\u0435, \u0438 \u043D\u0430\u043E\u0431\u043E\u0440\ + \u043E\u0442." + Helg2: + - bugfix: "\u041F\u0440\u0435\u0434\u043B\u044F\u0440\u0432\u0430 \u0442\u0435\u043F\ + \u0435\u0440\u044C \u043C\u043E\u0436\u0435\u0442 \u044D\u0432\u043E\u043B\u044E\ + \u0446\u0438\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432 \u043F\ + \u0440\u0435\u0434\u0430\u043B\u0438\u0435\u043D\u0430." + - bugfix: "\u0422\u0430\u043D\u043A \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\ + \ \u043C\u043E\u0436\u0435\u0442 \u0432\u044B\u0441\u0442\u0440\u0435\u043B\u0438\ + \u0442\u044C \u043B\u0438\u0448\u043D\u0438\u0439 \u0440\u0430\u0437 \u0438\u0437\ + \ \u0443\u0436\u0435 \u043F\u043E\u0442\u0440\u0430\u0447\u0435\u043D\u043D\u043E\ + \u0439 \u043F\u0443\u043B\u0438." +2024-12-06: + Basia: + - rscadd: "B18 \u0441\u043E\u043E\u0431\u0449\u0430\u0435\u0442 \u043E \u0432\u043D\ + \u0443\u0442\u0440\u0435\u043D\u043D\u0435\u043C \u043A\u0440\u043E\u0432\u043E\ + \u0442\u0435\u0447\u0435\u043D\u0438\u0438." + - sound: "B18 \u0442\u0435\u043F\u0435\u0440\u044C \u0433\u043E\u0432\u043E\u0440\ + \u0438\u0442 \u043F\u043E-\u0440\u0443\u0441\u0441\u043A\u0438." + ChromosomeKiller: + - qol: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B/\u0418\u0437\u043C\ + \u0435\u043D\u0435\u043D\u044B \u043A\u0435\u0439\u0431\u0438\u043D\u0434\u044B\ + \ \u043D\u0430 \u043A\u0441\u0435\u043D\u043E\u043C\u043E\u0440\u0444\u0430\u0445" + Helg2: + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D \u0440\u0430\u043D\ + \u0442\u0430\u0439\u043C \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0439\ + \ \u0441 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043F\u0440\u0438\u0441\ + \u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F \u0432 \u0440\u0430\u0443\ + \u043D\u0434." + LoneAsket: + - balance: "\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u043B \u0443\u0440\u043E\u043D\ + \ \u0421\u0420127 \u043D\u0430 5 \u0435\u0434\u0438\u043D\u0438\u0446. \u0417\ + \u0430\u0431\u0440\u0430\u043B 15 \u041F\u0435\u043D\u0435\u0442\u0440\u044B\ + . \u0423\u0431\u0440\u0430\u043B \u043C\u0435\u0442\u043A\u0443. \u0420\u044B\ + \u0447\u0430\u0436\u043E\u043A" + definitelynotspaghetti: + - rscadd: "\u041A\u0438\u0441\u043B\u043E\u0442\u043D\u0430\u044F \u043A\u0440\u043E\ + \u0432\u044C \u0442\u0435\u043F\u0435\u0440\u044C \u0435\u0441\u0442\u044C \u0442\ + \u043E\u043B\u044C\u043A\u043E \u0443 \u0432\u0435\u0442\u043A\u0438 \u0441\u0435\ + \u043D\u0442\u0430 \u0438 \u0443 \u043A\u0432\u0438\u043D\u044B" + - code_imp: "\u0423\u0434\u0430\u043B\u0438\u043B \u0430\u043D\u0438\u043C\u0430\ + \u0446\u0438\u044E \u0432\u043E\u0437\u043D\u0438\u043A\u0430\u044E\u0449\u0443\ + \u044E \u043F\u0440\u0438 \u0434\u0443\u043F\u043B\u0438\u043A\u0430\u0446\u0438\ + \u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0432 \u0447\u0430\ + \u0442\u0435" + - balance: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0425\u0430\u043D\u0442\u0435\ + \u0440\u0443 \u0432\u0430\u043C\u043F\u0438\u0440\u0438\u0437\u043C." + homexp13: + - balance: "\u0412\u0438\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440\u0430 \u0441\ + \u0442\u043E\u0441\u0438\u0442 1200 \u043F\u043E\u0438\u043D\u0442\u043E\u0432" +2024-12-07: + CheBokJam: + - balance: "\u041D\u0430 \u043F\u0438\u0441\u0442\u043E\u043B\u0435\u0442 P-17 \u0442\ + \u0435\u043F\u0435\u0440\u044C \u043C\u043E\u0436\u043D\u043E \u043F\u0440\u0438\ + \u043A\u0440\u0443\u0442\u0438\u0442\u044C \u043F\u043E\u0434\u0441\u0442\u0432\ + \u043E\u043B\u044C\u043D\u044B\u0439 \u0444\u043E\u043D\u0430\u0440\u0438\u043A\ + ." + Istrelok2107: + - balance: "\u0417\u0430\u0432\u043E\u0434 \u043C\u043E\u0436\u0435\u0442 \u043F\ + \u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u044C \u0441\u043D\u0430\ + \u0440\u044F\u0434\u044B \u0434\u043B\u044F \u0424\u041A88 \u0438 \u0433\u043B\ + \u0430\u0432\u043D\u043E\u0433\u043E \u043E\u0440\u0443\u0434\u0438\u044F \u0442\ + \u0430\u043D\u043A\u0430" + - bugfix: "\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 TOW \u043C\u0430\u0433\ + \u0430\u0437\u0438\u043D\u0430 \u0434\u043B\u044F \u0433\u043B\u0430\u0432\u043D\ + \u043E\u0433\u043E \u043E\u0440\u0443\u0434\u0438\u044F \u0442\u0430\u043D\u043A\ + \u0430 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E" + - balance: "\u041A\u0430\u043F \u0440\u0435\u0430\u0433\u0435\u043D\u0442\u043E\u0432\ + \ \u0441 \u043C\u043E\u0434\u0443\u043B\u0435\u043C Freyr \u0438\u0437\u043C\ + \u0435\u043D\u0435\u043D \u0441 8 \u0434\u043E 10" + LoneAsket: + - balance: "\u0423\u0434\u0430\u043B\u0438\u043B \u041F\u0435\u043D\u0435\u0442\u0440\ + \u0443 \u0443 \u0437\u0430\u0436\u0438\u0433\u0430\u043B\u043E\u043A \u0438\ + \ \u0411\u0443\u0440\u0441\u0442\u0410\u0441\u0435\u043C\u0431\u043B\u0438 \u0443\ + \ \u041C\u041A88" + - balance: "\u0410\u041F \u0437\u0430\u0436\u0438\u0433\u0430\u043B\u043E\u043A\ + \ \u043D\u0430 \u043F\u0438\u0441\u0442\u043E\u043B\u0435\u0442 25 -> 0" + MalorMorfin: + - refactor: "\u041F\u0435\u0440\u0435\u0434\u0435\u043B\u0430\u043B \u043A\u043E\ + \u0434 \u0443 Fit Viewport" + Tatarla: + - balance: "\u0423\u0431\u0440\u0430\u043D\u0430 \u0432\u043E\u0437\u043C\u043E\u0436\ + \u043D\u043E\u0441\u0442\u044C \u043D\u0430\u0434\u0435\u0442\u044C \u043F\u0440\ + \u0438\u0446\u0435\u043B \u043D\u0430 \u043B\u0430\u0437\u0435\u0440\u043D\u043E\ + \u0435 \u043E\u0440\u0443\u0436\u0438\u0435. \u0418\u0441\u043A\u043B\u044E\u0447\ + \u0435\u043D\u0438\u0435 - \u043B\u0430\u0437\u0441\u043D\u0430\u0439\u043F\u0430\ + ." + - balance: "\u041D\u0430 \u0440\u0435\u043B\u044C\u0441\u0443 \u0431\u043E\u043B\ + \u044C\u0448\u0435 \u043D\u0435\u043B\u044C\u0437\u044F \u043D\u0430\u0446\u0435\ + \u043F\u0438\u0442\u044C \u043F\u0440\u0438\u0446\u0435\u043B." + - balance: "\u041D\u0430 SH-15 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\ + \u043B\u044C\u0437\u044F \u043D\u0430\u0446\u0435\u043F\u0438\u0442\u044C \u043F\ + \u0440\u0438\u0446\u0435\u043B." + - balance: "\u0424\u0430\u043B\u043B\u043E\u0443 \u0432\u0435\u043A\u0442\u043E\u0440\ + \u0430 3 >> 1.75" + - code_imp: "\u0423\u0431\u0440\u0430\u043D\u044B \u0434\u0443\u0431\u043B\u0438\ + \u043A\u0430\u0442\u044B allowed_ammo_types \u0443 \u0410\u0420\u043A\u043E\u043A" + definitelynotspaghetti: + - balance: "\u041D\u0430 \u041F\u0430\u043D\u0442\u0435\u0440\u0443 \u0438 \u0420\ + \u0430\u043D\u043D\u0435\u0440\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u043D\ + \u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u0444\u0440\u0435\u043D\ + \u0437\u0438 \u0444\u0435\u0440\u044B." + - balance: "\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u043B \u0443\u0440\u043E\u043D\ + \ \u0441 23 \u0434\u043E 21" + - balance: "Pounce \u041A\u0414 \u0442\u0435\u043F\u0435\u0440\u044C 8 \u0441\u0435\ + \u043A\u0443\u043D\u0434, \u043F\u043B\u0430\u0437\u043C\u0430\u043A\u043E\u0441\ + \u0442 \u0442\u0435\u043F\u0435\u0440\u044C 15(\u0431\u044B\u043B\u043E 20).\ + \ \u041F\u0440\u0438 \u043F\u0430\u0443\u043D\u0441\u0435 \u043D\u0430 \u043C\ + \u0430\u0440\u0430 \u0445\u0438\u043B\u0438\u0442 \u043D\u0435\u043C\u043D\u043E\ + \u0433\u043E \u0425\u041F." + - balance: "Tearing Tail \u041A\u0414 \u0442\u0435\u043F\u0435\u0440\u044C 10 \u0441\ + \u0435\u043A\u0443\u043D\u0434, \u043F\u043B\u0430\u0437\u043C\u0430\u043A\u043E\ + \u0441\u0442 \u0443\u043C\u0435\u043D\u044C\u0448\u0435\u043D \u0441 50 \u0434\ + \u043E 35. \u0425\u0438\u043B \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\ + \ \u0441 25 \u0434\u043E 35." + - balance: "Adrenaline Jump \u041A\u0414 \u0443\u043C\u0435\u043D\u044C\u0448\u0435\ + \u043D \u0441 12 \u0434\u043E 8 \u0441\u0435\u043A\u0443\u043D\u0434, \u043F\ + \u043B\u0430\u0437\u043C\u0430\u043A\u043E\u0441\u0442 15 -> 10." + homexp13: + - balance: "\u041A\u0443\u043B\u0434\u0430\u0443\u043D \u0445\u0435\u0434\u0431\u0430\ + \u0442\u0430 \u0443\u043C\u0435\u043D\u044C\u0448\u0435\u043D \u0434\u043E 5\ + \ \u0441\u0435\u043A." + - balance: "\u0422\u0440\u0430\u0441\u0432\u0438\u0442\u043E\u043A\u0441\u043E\u0432\ + \u044B\u0439 \u043F\u043B\u0435\u0432\u043E\u043A \u0440\u0435\u0442\u0440\u043E\ + \u0433\u0440\u0430\u0434\u0430 \u0437\u0430\u043C\u0435\u043D\u0451\u043D \u043D\ + \u0430 \u0442\u043E\u043A\u0441\u0438\u043D \u0441\u043F\u0438\u0442." +2024-12-09: + MalorMorfin: + - bugfix: "\u0422\u0430\u043D\u043A\u043E\u0432\u043E\u0435 \u043A\u0440\u0435\u0441\ + \u043B\u043E \u043D\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0441\ + \u043A\u0440\u0443\u0442\u0438\u0442\u044C" + - bugfix: "\u0412\u0435\u0440\u043D\u0443\u043B \u0438\u043A\u043E\u043D\u043A\u0443\ + \ \u0440\u0435\u0430\u0433\u0435\u043D\u0442 \u0441\u043A\u0430\u043D\u0435\u0440\ + \u0443" + - bugfix: "\u0422\u0435\u043F\u0435\u0440\u044C ctrl+shift+click \u043F\u043E\u0437\ + \u0432\u043E\u043B\u044F\u0442 \u0432\u0437\u044F\u0442\u044C \u0441\u0430\u043C\ + \u044B\u0439 \u043B\u0435\u0432\u044B\u0439 \u043F\u0440\u0435\u0434\u043C\u0435\ + \u0442." diff --git a/icons/UI_Icons/lobby_button.dmi b/icons/UI_Icons/lobby_button.dmi index 2be4c11ec7e..42720b956b6 100644 Binary files a/icons/UI_Icons/lobby_button.dmi and b/icons/UI_Icons/lobby_button.dmi differ diff --git a/icons/UI_Icons/map_blips.dmi b/icons/UI_Icons/map_blips.dmi index e01e2b86073..2c525cab539 100644 Binary files a/icons/UI_Icons/map_blips.dmi and b/icons/UI_Icons/map_blips.dmi differ diff --git a/icons/Xeno/Effects.dmi b/icons/Xeno/Effects.dmi index 62f89a44cc5..9e81e937410 100644 Binary files a/icons/Xeno/Effects.dmi and b/icons/Xeno/Effects.dmi differ diff --git a/icons/Xeno/acidturret.dmi b/icons/Xeno/acidturret.dmi index eaec2436421..9fd15a13f6a 100644 Binary files a/icons/Xeno/acidturret.dmi and b/icons/Xeno/acidturret.dmi differ diff --git a/icons/Xeno/actions.dmi b/icons/Xeno/actions.dmi index 2a4352eb9d4..d1dd26d3cbc 100644 Binary files a/icons/Xeno/actions.dmi and b/icons/Xeno/actions.dmi differ diff --git a/icons/Xeno/castes/defender/steel_crest.dmi b/icons/Xeno/castes/defender/steel_crest.dmi new file mode 100644 index 00000000000..414a578f107 Binary files /dev/null and b/icons/Xeno/castes/defender/steel_crest.dmi differ diff --git a/icons/Xeno/castes/widow/basic.dmi b/icons/Xeno/castes/widow/basic.dmi new file mode 100644 index 00000000000..f79a01f484b Binary files /dev/null and b/icons/Xeno/castes/widow/basic.dmi differ diff --git a/icons/Xeno/castes/widow/effects.dmi b/icons/Xeno/castes/widow/effects.dmi new file mode 100644 index 00000000000..541c8d61711 Binary files /dev/null and b/icons/Xeno/castes/widow/effects.dmi differ diff --git a/icons/effects/progressicons.dmi b/icons/effects/progressicons.dmi index 659db025d1d..165cd4added 100644 Binary files a/icons/effects/progressicons.dmi and b/icons/effects/progressicons.dmi differ diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi index 4270cd20133..98bae3d2ac7 100644 Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 1bc70194f39..4d8a83e7757 100644 Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index f2c063094c9..920bf7ad0be 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/order_icons.dmi b/icons/mob/order_icons.dmi index 08722eac6cb..da4813fe898 100644 Binary files a/icons/mob/order_icons.dmi and b/icons/mob/order_icons.dmi differ diff --git a/icons/obj/armored/3x3/apc.dmi b/icons/obj/armored/3x3/apc.dmi index 6e507dcc3e9..c4a219b8570 100644 Binary files a/icons/obj/armored/3x3/apc.dmi and b/icons/obj/armored/3x3/apc.dmi differ diff --git a/icons/obj/armored/3x3/apc_damage_overlay.dmi b/icons/obj/armored/3x3/apc_damage_overlay.dmi index e3da1e1f15f..7a3b2203d7f 100644 Binary files a/icons/obj/armored/3x3/apc_damage_overlay.dmi and b/icons/obj/armored/3x3/apc_damage_overlay.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index f9c7af61a20..65d1f31a2f1 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 5a69e83c5ad..b7ecf3b3df3 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/items/ammo.dmi b/icons/obj/items/ammo.dmi deleted file mode 100644 index b7f04bc4761..00000000000 Binary files a/icons/obj/items/ammo.dmi and /dev/null differ diff --git a/icons/obj/items/ammo/box.dmi b/icons/obj/items/ammo/box.dmi new file mode 100644 index 00000000000..f346d1e21c5 Binary files /dev/null and b/icons/obj/items/ammo/box.dmi differ diff --git a/icons/obj/items/ammo/energy.dmi b/icons/obj/items/ammo/energy.dmi new file mode 100644 index 00000000000..a8d52c386b9 Binary files /dev/null and b/icons/obj/items/ammo/energy.dmi differ diff --git a/icons/obj/items/ammo/flamer.dmi b/icons/obj/items/ammo/flamer.dmi new file mode 100644 index 00000000000..da271eba147 Binary files /dev/null and b/icons/obj/items/ammo/flamer.dmi differ diff --git a/icons/obj/items/ammo/handful.dmi b/icons/obj/items/ammo/handful.dmi new file mode 100644 index 00000000000..46da9d0591f Binary files /dev/null and b/icons/obj/items/ammo/handful.dmi differ diff --git a/icons/obj/items/ammo/magazine.dmi b/icons/obj/items/ammo/magazine.dmi new file mode 100644 index 00000000000..ecc7b1e2e79 Binary files /dev/null and b/icons/obj/items/ammo/magazine.dmi differ diff --git a/icons/obj/items/ammo/misc.dmi b/icons/obj/items/ammo/misc.dmi new file mode 100644 index 00000000000..04ccd5b9df6 Binary files /dev/null and b/icons/obj/items/ammo/misc.dmi differ diff --git a/icons/obj/items/ammo/packet.dmi b/icons/obj/items/ammo/packet.dmi new file mode 100644 index 00000000000..35411f5bdc6 Binary files /dev/null and b/icons/obj/items/ammo/packet.dmi differ diff --git a/icons/obj/items/ammo/pistol.dmi b/icons/obj/items/ammo/pistol.dmi new file mode 100644 index 00000000000..db124563518 Binary files /dev/null and b/icons/obj/items/ammo/pistol.dmi differ diff --git a/icons/obj/items/ammo/revolver.dmi b/icons/obj/items/ammo/revolver.dmi new file mode 100644 index 00000000000..fdf1a230b1f Binary files /dev/null and b/icons/obj/items/ammo/revolver.dmi differ diff --git a/icons/obj/items/ammo/rocket.dmi b/icons/obj/items/ammo/rocket.dmi new file mode 100644 index 00000000000..41a4d64c13a Binary files /dev/null and b/icons/obj/items/ammo/rocket.dmi differ diff --git a/icons/obj/items/ammo/smg.dmi b/icons/obj/items/ammo/smg.dmi new file mode 100644 index 00000000000..6ad205e3093 Binary files /dev/null and b/icons/obj/items/ammo/smg.dmi differ diff --git a/icons/obj/items/ammo/stationary.dmi b/icons/obj/items/ammo/stationary.dmi new file mode 100644 index 00000000000..2c516c9cd66 Binary files /dev/null and b/icons/obj/items/ammo/stationary.dmi differ diff --git a/icons/obj/items/ammo/tank.dmi b/icons/obj/items/ammo/tank.dmi new file mode 100644 index 00000000000..bacaad1cd53 Binary files /dev/null and b/icons/obj/items/ammo/tank.dmi differ diff --git a/icons/obj/items/projectiles.dmi b/icons/obj/items/projectiles.dmi index 971c4a043bb..a118f3ac22c 100644 Binary files a/icons/obj/items/projectiles.dmi and b/icons/obj/items/projectiles.dmi differ diff --git a/icons/obj/machines/vending.dmi b/icons/obj/machines/vending.dmi index 365d252ea4d..0b38ef29044 100644 Binary files a/icons/obj/machines/vending.dmi and b/icons/obj/machines/vending.dmi differ diff --git a/icons/obj/smooth_objects/kutjevo_window_blue.dmi b/icons/obj/smooth_objects/kutjevo_window_blue.dmi index 6b516831ff4..30956f90966 100644 Binary files a/icons/obj/smooth_objects/kutjevo_window_blue.dmi and b/icons/obj/smooth_objects/kutjevo_window_blue.dmi differ diff --git a/icons/obj/smooth_objects/kutjevo_window_blue_reinforced.dmi b/icons/obj/smooth_objects/kutjevo_window_blue_reinforced.dmi index 93a92e9d359..4c1fa21bf7c 100644 Binary files a/icons/obj/smooth_objects/kutjevo_window_blue_reinforced.dmi and b/icons/obj/smooth_objects/kutjevo_window_blue_reinforced.dmi differ diff --git a/icons/obj/smooth_objects/kutjevo_window_frame.dmi b/icons/obj/smooth_objects/kutjevo_window_frame.dmi index 75aad76d178..475bd35bc1c 100644 Binary files a/icons/obj/smooth_objects/kutjevo_window_frame.dmi and b/icons/obj/smooth_objects/kutjevo_window_frame.dmi differ diff --git a/icons/obj/smooth_objects/kutjevo_window_frame_reinforced.dmi b/icons/obj/smooth_objects/kutjevo_window_frame_reinforced.dmi new file mode 100644 index 00000000000..17ff73bb0b3 Binary files /dev/null and b/icons/obj/smooth_objects/kutjevo_window_frame_reinforced.dmi differ diff --git a/icons/obj/smooth_objects/kutjevo_window_orange.dmi b/icons/obj/smooth_objects/kutjevo_window_orange.dmi index 1a134280a66..ed111c40dc2 100644 Binary files a/icons/obj/smooth_objects/kutjevo_window_orange.dmi and b/icons/obj/smooth_objects/kutjevo_window_orange.dmi differ diff --git a/icons/obj/smooth_objects/kutjevo_window_orange_reinforced.dmi b/icons/obj/smooth_objects/kutjevo_window_orange_reinforced.dmi index 0bd175d34d3..be1d21426ba 100644 Binary files a/icons/obj/smooth_objects/kutjevo_window_orange_reinforced.dmi and b/icons/obj/smooth_objects/kutjevo_window_orange_reinforced.dmi differ diff --git a/icons/obj/structures/crates.dmi b/icons/obj/structures/crates.dmi index 686335a6cf2..8b26d49ab0d 100644 Binary files a/icons/obj/structures/crates.dmi and b/icons/obj/structures/crates.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index c18b9c79d27..571ed69013c 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/icons/turf/floors/river_desert.dmi b/icons/turf/floors/river_desert.dmi index 54d32ea291f..41296375e62 100644 Binary files a/icons/turf/floors/river_desert.dmi and b/icons/turf/floors/river_desert.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index 4c9153c29f5..6691a31ea5c 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -7,12 +7,11 @@ to_chat(src, span_warning("The wiki URL is not set in the server configuration.")) return - if(alert("This will open the wiki in your browser. Are you sure?", "Wiki", "Yes", "No") != "Yes") + if(tgui_alert(src, "This will open the wiki in your browser. Are you sure?", "Wiki", list("Yes", "No"), 0) != "Yes") return DIRECT_OUTPUT(src, link(CONFIG_GET(string/wikiurl))) - /client/verb/boosty() set name = "boosty" set hidden = TRUE @@ -21,12 +20,11 @@ to_chat(src, span_warning("The donation URL is not set in the server configuration.")) return - if(alert("This will open the boosty in your browser. Are you sure?", "Forum", "Yes", "No") != "Yes") + if(tgui_alert(src, "This will open the boosty in your browser. Are you sure?", "Forum", list("Yes", "No"), 0) != "Yes") return DIRECT_OUTPUT(src, link(CONFIG_GET(string/donationurl))) - /client/verb/rules() set name = "rules" set hidden = TRUE @@ -35,12 +33,11 @@ to_chat(src, span_warning("The rules URL is not set in the server configuration.")) return - if(alert("This will open the rules in your browser. Are you sure?", "Rules", "Yes", "No") != "Yes") + if(tgui_alert("This will open the rules in your browser. Are you sure?", "Rules", list("Yes", "No"), 0) != "Yes") return DIRECT_OUTPUT(src, link(CONFIG_GET(string/rulesurl))) - /client/verb/discord() set name = "discord" set hidden = TRUE @@ -49,12 +46,11 @@ to_chat(src, span_warning("The Discord URL is not set in the server configuration.")) return - if(alert("This will open our Discord in your browser. Are you sure?", "Discord", "Yes", "No") != "Yes") + if(tgui_alert(src, "This will open our Discord in your browser. Are you sure?", "Discord", list("Yes", "No"), 0) != "Yes") return DIRECT_OUTPUT(src, link(CONFIG_GET(string/discordurl))) - /client/verb/github() set name = "github" set hidden = TRUE @@ -63,12 +59,11 @@ to_chat(src, span_warning("The bug tracker URL is not set in the server configuration.")) return - if(alert("This will open our bug tracker page in your browser. Are you sure?", "Github", "Yes", "No") != "Yes") + if(tgui_alert(src, "This will open our bug tracker page in your browser. Are you sure?", "Github", list("Yes", "No"), 0) != "Yes") return DIRECT_OUTPUT(src, link(CONFIG_GET(string/githuburl))) - /client/verb/webmap() set name = "webmap" set hidden = TRUE @@ -79,7 +74,7 @@ return var/map_url - var/choice = alert("Do you want to view the ground or the ship?",,"Ship","Ground","Cancel") + var/choice = tgui_alert(src, "Do you want to view the ground or the ship?", "Webmap", list("Ship", "Ground"), 0) switch(choice) if("Ship") map_url = SSmapping.configs[SHIP_MAP].map_file diff --git a/interface/skin.dmf b/interface/skin.dmf index 488811298bb..52a7aebd567 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -154,8 +154,8 @@ window "infowindow" is-vert = false elem "changelog" type = BUTTON - pos = 6,5 - size = 94x20 + pos = 0,5 + size = 90x20 anchor1 = 1,0 anchor2 = 16,0 saved-params = "is-checked" @@ -163,7 +163,7 @@ window "infowindow" command = "changelog" elem "discord" type = BUTTON - pos = 100,5 + pos = 90,5 size = 90x20 anchor1 = 16,0 anchor2 = 30,0 @@ -172,7 +172,7 @@ window "infowindow" command = "discord" elem "rules" type = BUTTON - pos = 190,5 + pos = 180,5 size = 90x20 anchor1 = 30,0 anchor2 = 44,0 @@ -181,7 +181,7 @@ window "infowindow" command = "rules" elem "wiki" type = BUTTON - pos = 280,5 + pos = 270,5 size = 90x20 anchor1 = 44,0 anchor2 = 58,0 @@ -190,7 +190,7 @@ window "infowindow" command = "wiki" elem "boosty" type = BUTTON - pos = 370,5 + pos = 360,5 size = 90x20 anchor1 = 58,0 anchor2 = 72,0 @@ -199,7 +199,7 @@ window "infowindow" command = "boosty" elem "github" type = BUTTON - pos = 460,5 + pos = 450,5 size = 90x20 anchor1 = 72,0 anchor2 = 86,0 @@ -208,15 +208,14 @@ window "infowindow" command = "github" elem "webmap" type = BUTTON - pos = 550,5 - size = 90x20 + pos = 540,5 + size = 95x20 anchor1 = 86,0 anchor2 = 100,0 saved-params = "is-checked" text = "Webmap" command = "webmap" - window "outputwindow" elem "outputwindow" type = MAIN diff --git a/sound/AI/aileft.ogg b/sound/AI/aileft.ogg new file mode 100644 index 00000000000..22a0a1b9c4c Binary files /dev/null and b/sound/AI/aileft.ogg differ diff --git a/sound/AI/aireport.ogg b/sound/AI/aireport.ogg index 82e4ca425de..d1138563403 100644 Binary files a/sound/AI/aireport.ogg and b/sound/AI/aireport.ogg differ diff --git a/sound/AI/bioscan.ogg b/sound/AI/bioscan.ogg index 3ab30d73b23..8e28931c3ba 100644 Binary files a/sound/AI/bioscan.ogg and b/sound/AI/bioscan.ogg differ diff --git a/sound/AI/bonus_climed.ogg b/sound/AI/bonus_climed.ogg new file mode 100644 index 00000000000..7dbec57a306 Binary files /dev/null and b/sound/AI/bonus_climed.ogg differ diff --git a/sound/AI/bonus_found.ogg b/sound/AI/bonus_found.ogg new file mode 100644 index 00000000000..5b9a0c3b018 Binary files /dev/null and b/sound/AI/bonus_found.ogg differ diff --git a/sound/AI/code_blue_elevated.ogg b/sound/AI/code_blue_elevated.ogg index d69edbda7b4..4b07b1cc1b1 100644 Binary files a/sound/AI/code_blue_elevated.ogg and b/sound/AI/code_blue_elevated.ogg differ diff --git a/sound/AI/code_blue_lowered.ogg b/sound/AI/code_blue_lowered.ogg index bf0a7c9113a..b71d319f2cf 100644 Binary files a/sound/AI/code_blue_lowered.ogg and b/sound/AI/code_blue_lowered.ogg differ diff --git a/sound/AI/code_delta.ogg b/sound/AI/code_delta.ogg new file mode 100644 index 00000000000..cf512041518 Binary files /dev/null and b/sound/AI/code_delta.ogg differ diff --git a/sound/AI/code_green.ogg b/sound/AI/code_green.ogg index cd4666c9917..8089daea600 100644 Binary files a/sound/AI/code_green.ogg and b/sound/AI/code_green.ogg differ diff --git a/sound/AI/code_red_elevated.ogg b/sound/AI/code_red_elevated.ogg index 3b2de8368ff..5def4c50878 100644 Binary files a/sound/AI/code_red_elevated.ogg and b/sound/AI/code_red_elevated.ogg differ diff --git a/sound/AI/code_red_lowered.ogg b/sound/AI/code_red_lowered.ogg index 4409d345bac..c2c35050ac9 100644 Binary files a/sound/AI/code_red_lowered.ogg and b/sound/AI/code_red_lowered.ogg differ diff --git a/sound/AI/commandreport.ogg b/sound/AI/commandreport.ogg index 9b6bb9bd6e9..4518c1c3d01 100644 Binary files a/sound/AI/commandreport.ogg and b/sound/AI/commandreport.ogg differ diff --git a/sound/AI/crash_start.ogg b/sound/AI/crash_start.ogg new file mode 100644 index 00000000000..809203ee67b Binary files /dev/null and b/sound/AI/crash_start.ogg differ diff --git a/sound/AI/distress_deny.ogg b/sound/AI/distress_deny.ogg new file mode 100644 index 00000000000..6954ef89030 Binary files /dev/null and b/sound/AI/distress_deny.ogg differ diff --git a/sound/AI/distressbeacon.ogg b/sound/AI/distressbeacon.ogg index 77defb64f82..ae40764c570 100644 Binary files a/sound/AI/distressbeacon.ogg and b/sound/AI/distressbeacon.ogg differ diff --git a/sound/AI/distressbeacon_none.ogg b/sound/AI/distressbeacon_none.ogg new file mode 100644 index 00000000000..909c7db38e7 Binary files /dev/null and b/sound/AI/distressbeacon_none.ogg differ diff --git a/sound/AI/distressbeaconlocked.ogg b/sound/AI/distressbeaconlocked.ogg new file mode 100644 index 00000000000..a533d16da0c Binary files /dev/null and b/sound/AI/distressbeaconlocked.ogg differ diff --git a/sound/AI/distressreceived.ogg b/sound/AI/distressreceived.ogg index 1f819146c5b..02aef2745cf 100644 Binary files a/sound/AI/distressreceived.ogg and b/sound/AI/distressreceived.ogg differ diff --git a/sound/AI/dropship_block.ogg b/sound/AI/dropship_block.ogg new file mode 100644 index 00000000000..d9b429a17f9 Binary files /dev/null and b/sound/AI/dropship_block.ogg differ diff --git a/sound/AI/dropship_emergency.ogg b/sound/AI/dropship_emergency.ogg index c8ff2903df9..cc92deedc5f 100644 Binary files a/sound/AI/dropship_emergency.ogg and b/sound/AI/dropship_emergency.ogg differ diff --git a/sound/AI/dropship_wrong.ogg b/sound/AI/dropship_wrong.ogg new file mode 100644 index 00000000000..e0b4cec1733 Binary files /dev/null and b/sound/AI/dropship_wrong.ogg differ diff --git a/sound/AI/evacuate.ogg b/sound/AI/evacuate.ogg index a0fe44536b9..de440a92428 100644 Binary files a/sound/AI/evacuate.ogg and b/sound/AI/evacuate.ogg differ diff --git a/sound/AI/evacuate_cancelled.ogg b/sound/AI/evacuate_cancelled.ogg index ebb74b6d4eb..c1e30c8c5a5 100644 Binary files a/sound/AI/evacuate_cancelled.ogg and b/sound/AI/evacuate_cancelled.ogg differ diff --git a/sound/AI/evacuation_complete.ogg b/sound/AI/evacuation_complete.ogg index d611f7c5287..c01eab7c5e8 100644 Binary files a/sound/AI/evacuation_complete.ogg and b/sound/AI/evacuation_complete.ogg differ diff --git a/sound/AI/evacuation_confirmed.ogg b/sound/AI/evacuation_confirmed.ogg index a1fccb0ccb4..0de76fe3762 100644 Binary files a/sound/AI/evacuation_confirmed.ogg and b/sound/AI/evacuation_confirmed.ogg differ diff --git a/sound/AI/hijack.ogg b/sound/AI/hijack.ogg index 774de641173..c6723229692 100644 Binary files a/sound/AI/hijack.ogg and b/sound/AI/hijack.ogg differ diff --git a/sound/AI/musical_pause.ogg b/sound/AI/musical_pause.ogg new file mode 100644 index 00000000000..7dc323594c3 Binary files /dev/null and b/sound/AI/musical_pause.ogg differ diff --git a/sound/AI/orbit_change.ogg b/sound/AI/orbit_change.ogg new file mode 100644 index 00000000000..cafda86b579 Binary files /dev/null and b/sound/AI/orbit_change.ogg differ diff --git a/sound/AI/poweroff.ogg b/sound/AI/poweroff.ogg index a0617d0f0e7..d334c7e9809 100644 Binary files a/sound/AI/poweroff.ogg and b/sound/AI/poweroff.ogg differ diff --git a/sound/AI/poweron.ogg b/sound/AI/poweron.ogg index 2598c1b7560..77b2b619baf 100644 Binary files a/sound/AI/poweron.ogg and b/sound/AI/poweron.ogg differ diff --git a/sound/AI/selfdestruct.ogg b/sound/AI/selfdestruct.ogg index 0dc503f865f..9a0efd64d5a 100644 Binary files a/sound/AI/selfdestruct.ogg and b/sound/AI/selfdestruct.ogg differ diff --git a/sound/AI/selfdestruct_deactivated.ogg b/sound/AI/selfdestruct_deactivated.ogg index b214440a349..62fb665444d 100644 Binary files a/sound/AI/selfdestruct_deactivated.ogg and b/sound/AI/selfdestruct_deactivated.ogg differ diff --git a/sound/AI/sup_drop.ogg b/sound/AI/sup_drop.ogg new file mode 100644 index 00000000000..eb01e3817fa Binary files /dev/null and b/sound/AI/sup_drop.ogg differ diff --git a/sound/AI/sup_drop_act.ogg b/sound/AI/sup_drop_act.ogg new file mode 100644 index 00000000000..ecf8f1b4239 Binary files /dev/null and b/sound/AI/sup_drop_act.ogg differ diff --git a/sound/AI/sup_drop_enemy.ogg b/sound/AI/sup_drop_enemy.ogg new file mode 100644 index 00000000000..2170aeeb41b Binary files /dev/null and b/sound/AI/sup_drop_enemy.ogg differ diff --git a/sound/AI/supply_increase.ogg b/sound/AI/supply_increase.ogg new file mode 100644 index 00000000000..861bfb2d42a Binary files /dev/null and b/sound/AI/supply_increase.ogg differ diff --git a/sound/effects/OB_warning_announce.ogg b/sound/effects/OB_warning_announce.ogg index 788a64790f2..540e7d58f51 100644 Binary files a/sound/effects/OB_warning_announce.ogg and b/sound/effects/OB_warning_announce.ogg differ diff --git a/sound/items/velpro_rip.ogg b/sound/items/velpro_rip.ogg new file mode 100644 index 00000000000..6c6fde567a8 Binary files /dev/null and b/sound/items/velpro_rip.ogg differ diff --git a/sound/voice/b18/activate.ogg b/sound/voice/b18/activate.ogg index fe3792241e7..d132d77a7dc 100644 Binary files a/sound/voice/b18/activate.ogg and b/sound/voice/b18/activate.ogg differ diff --git a/sound/voice/b18/antitoxin.ogg b/sound/voice/b18/antitoxin.ogg index 213bbafb329..6489fc8ed48 100644 Binary files a/sound/voice/b18/antitoxin.ogg and b/sound/voice/b18/antitoxin.ogg differ diff --git a/sound/voice/b18/antitoxin2.ogg b/sound/voice/b18/antitoxin2.ogg index e0c8aee468f..6d830fb1176 100644 Binary files a/sound/voice/b18/antitoxin2.ogg and b/sound/voice/b18/antitoxin2.ogg differ diff --git a/sound/voice/b18/brute.ogg b/sound/voice/b18/brute.ogg index ff438506d22..6729b964f9a 100644 Binary files a/sound/voice/b18/brute.ogg and b/sound/voice/b18/brute.ogg differ diff --git a/sound/voice/b18/diying.ogg b/sound/voice/b18/diying.ogg new file mode 100644 index 00000000000..395312ef0f5 Binary files /dev/null and b/sound/voice/b18/diying.ogg differ diff --git a/sound/voice/b18/fracture.ogg b/sound/voice/b18/fracture.ogg index cd545cf38ae..511fdeb482c 100644 Binary files a/sound/voice/b18/fracture.ogg and b/sound/voice/b18/fracture.ogg differ diff --git a/sound/voice/b18/ib_detected.ogg b/sound/voice/b18/ib_detected.ogg index 211a337f429..d2eb11d23bc 100644 Binary files a/sound/voice/b18/ib_detected.ogg and b/sound/voice/b18/ib_detected.ogg differ diff --git a/sound/voice/b18/light_fracture.ogg b/sound/voice/b18/light_fracture.ogg new file mode 100644 index 00000000000..048485755cc Binary files /dev/null and b/sound/voice/b18/light_fracture.ogg differ diff --git a/sound/voice/b18/pain_suppress.ogg b/sound/voice/b18/pain_suppress.ogg deleted file mode 100644 index b074e4b4846..00000000000 Binary files a/sound/voice/b18/pain_suppress.ogg and /dev/null differ diff --git a/sound/voice/b18/tox.ogg b/sound/voice/b18/tox.ogg new file mode 100644 index 00000000000..4d9b518e5dc Binary files /dev/null and b/sound/voice/b18/tox.ogg differ diff --git a/strings/tips/HvH.txt b/strings/tips/HvH.txt index 64da5668684..9a1f1882523 100644 --- a/strings/tips/HvH.txt +++ b/strings/tips/HvH.txt @@ -1,18 +1 @@ -When fighting against other humans, standing in the open is the death sentence. Take cover behind walls and barricades, but most objects in the game will block 50% or more incoming projectile without blocking your own if you're standing next to it. -SOM armor is better than marine armor against bullets, but worse against lasers, however bullets can inflict lasting injuries via shrapnel, fractures and delimbing! -Volkite weaponry employed by the SOM can deflagrate a victim, burning everyone around them. Watch your spacing! -Stun grenades are a powerful tool in Combat Patrol, inflicting substantial stagger and slowdown on anyone in range as well as blinding them. Just try not to catch your team in the blast. -Points are scored for permanently killing enemies in Combat Patrol. Get revived instead of respawning to deny the enemy points! -All guns have worse accuracy and scatter when firing on the move. Larger weapons tend to have bigger penalties so sometimes it's better to hold still. -SOM have almost no access to any form of IFF, and the majority of their weapons are better at close range. As marines, keep them at a distance and funnel them into areas where they can't bring all their weaponry to bear! -The Focus order increases your accuracy, while also letting you use aim mode without delay. High accuracy diminishes the effectiveness of cover, so punish enemies behind barricades with some focused fire! -The faster you are moving, the more likely projectiles are to miss you. The Move order gives a bonus to this, in addition to directly boosting your speed. -The more pain you are in, the lower your accuracy. Pop pain killers or take advantage of the Hold order to boost your accuracy when you're hurting. -TerraGov doesn't officially recognise or consider themselves at war with the SOM. Therefore nothing you do can be considered a warcrime :^) -In Combat Patrol, work with your team to flank the enemy and catch them out of cover and cut off their retreat. -Grenades are your friends in Combat Patrol. Flush the enemy out of cover, or use them defensively to stop them from pushing your position. -Most guns have an effective range much higher than the range you can see. In Combat Patrol don't be afraid to gun people down from off screen; watch where their bullets are coming from and send some back! -Medics and Engineers can make a huge difference to how your team does in Combat Patrol. Put them to work and keep them safe and they are excellent force multipliers. -With no shipside medical in Combat Patrol, groundside medbay can be extremely valuable - if you can get it powered, and hold it against the enemy. -Don't worry if you die in Combat Patrol, the other team is OP. -In Combat Patrol, a clever player can ambush the enemy by hiding in lockers, sleepers, under bodies, or many other crafty spots. Watch yourself! \ No newline at end of file +Боевой Патруль выпилили... diff --git a/strings/tips/marine.txt b/strings/tips/marine.txt index 98c54efe833..dd859223d0d 100644 --- a/strings/tips/marine.txt +++ b/strings/tips/marine.txt @@ -1,154 +1,126 @@ -Putting an instrument in your armor slot allows you to still be able to play it, charge into battle with song! -Many maps spawn with free metal, plasteel and other important supplies in key spots. As a marine, remember to grab them and as a xeno, make sure to melt them. -Trading your life for a Xenomorph's is almost always worth it. -You do not need to be in harm intent to point blank xenomorphs! -The mini map (green icon on the top of the screen) helps you know where the frontline is at and where revivable marines are. You can keybind it in game preferences. -No round has ever been won behind a barricade. -If the main push is stagnating and the area is congested, try to coordinate with a few others and go to a different area. -When pushing into an area, check the flanks. Especially so in caves and enclosed spaces. -Resin structures are weaker to melee than they are to bullets. Take out your knives, swords and bayonets! -Always clear weeds and alien structures as you advance. A resin maze forces marines to engage in CQC against xenomorphs, which decreases your survival rate. That said, this increases your PB chances! -Always check for traps beneath loose objects on weeds - it could save your FACE! -As a human, you can do almost anything if you put your mind to it; it just takes time. -You can link plasteel barricades together using a crowbar. Click one, and then click one adjacent. Repeat as needed. -A lone marine is a dead marine and a happy xeno. Stick together! -Be mindful when using hand grenades. Getting stunned or knocked over after priming a grenade will drop it at your feet. This is obviously very dangerous for not only you, but your friends as well. -Watch out for friendly fire and marines not in aim mode. Make sure you're not walking into anyone's firing line, and make sure no one else is in yours! -Some weapons permit aim mode, which prevents friendly fire. Use this behind marines and be a smartgunner-lite! -While medics and doctors are best at it, anyone can use a defibrillator and operate the body scanner and autodoc medical system. -While engineers and synthetics are best at it, anyone can build barricades and razorsharp obstacles. -Anyone can make razor wire by using three metal sheets, which is four metal rods and barbed wire from metal sheets. Stop that crusher and bull from charging! -Terra Experimental standard batteries can be recharged in APCs and power cell rechargers if the generators are on. -If you aren't a squad marine, then you have a special room in prep with special gear vendors. -Sidearms aren't complete garbage. They are often faster than reloading if in a very tight situation, it may save your life. -The Revolver and Service Pistol can be decent primary weapons if used properly, though with the short magazine capacity, expect to run dry on ammo quick! -There is no "best" loadout. Experiment and find what works for you. -You have a variety of weaponry inside the Automated Weapon Closets, do not be afraid to experiment which one is best suited for your playstyle. -There is "specialist" weaponry that can be ordered by Requisitions. However, they take a fairly high amount of points to order them. If the user dies irresponsibly while using these weapons, it will be a massive waste of points. -Anything can be a weapon if you put your mind to it. -You can check your wounds to see if they have been bandaged or salved by clicking on yourself while in help intent. -You can check what part of your body is bleeding by shift-clicking on your person. -Removing weeds as a marine means that xenomorphs cannot take advantage of the battlefield; your standard boot knife is great for doing this. -Blue weeds and purple sticky resin slow you down. Get rid of them! -During Self Destruct, green control rods are armed control rods. Each rods take 3 minutes to rise, forcing marines to hold Self Destruct for a total of 20 minutes. Collect all six! -A fit marine can carry many weapons: in their armor, belt, even hanging from their back. -Requisitions has many supplies to enhance the combat power of marine units, such as attachments, ammunition, and other toys; ask their crew what's in store and you may be pleasantly surprised. DISCLAIMER: Extra gears' availability is dependent on supply. -As a marine, you can climb over waist-high obstacles like sandbags, window frames or tables by "SpecialClicking" (Default: CTRL+click) on them or drag-clicking yourself onto them. -You can jump over waist-high obstacles like platforms, tables, and window frames, for a small stamina cost (Default: Spacebar). -The Terra Experimental laser rifles have a mode selector that can be switched using the Unique Action command (Default: Spacebar). Some modes are better than other modes in specific circumstances. -You can remove armor pieces (leg pieces, arm pieces and chest pieces) and armor modules (Valkyrie, Baldur, etc.) from the XM-02 Combat Exoskeleton by Alt+clicking the exoskeleton. -You can customize armor pieces and the exoskeleton helmet using any kind of facepaint for a personal touch. Paint the armor pieces before you put them in the exoskeleton! -If an M40 FLDP grenade collides with any mob when thrown, the mob will be lit in a light fire. Be careful throwing flares. -SWAT masks ordered from Requisitions can block only one larval facehugger attack. If they successfully blocked an attempted attack, replace them immediately. -Drag dead xenomorphs onto the Automated Storage and Retrieval System (ASRS) pad inside requisitions. Once the pad lowers with the applicable bodies, you will gain requisition points. -To throw a grenade, Activate (Default: Z) the grenade while in the active hand. Then simply click where you want to throw it. Do not take too long! -Quickly store items to a container (bags, satchels, belts, pouches) by pressing the Quick Equip (Default: E) key while holding an item and having a container open. -Press Quick Equip (Default: E) while you are not holding an item to the active hand to draw the weapon from whatever preferred slot (Default: Suit Storage, can be customized at the Preferences tab) you selected, otherwise you will pull out any item from a container. -Stasis bags do not pause xenomorph infection entirely, they only slow progress by a lot. -Stasis bags prevents the DNR (do not revive) timer from ticking, meaning that if corpsmen have a lot of patients, they can prevent brain death via stasis bags. -In the Crash gamemode, cooperate as a marine! Work as a squad to capture the disks and to detonate the nuclear bomb. -In the Crash gamemode, remember that your objective is to secure all three disks, put the disks into the nuclear device and head home while the bomb is active. Xenos will keep on respawning until all of the marines are dead. -While securing a FOB or securing a disk site, do not wander around outside! You will risk death by xenos who are comfy in sieging down the place. -As an ERT member, stay with your teammates! Don't cower or seperate from them. -As a marine, say '*medic' to call out for medical attention. You can keybind this in game preferences. -As a human, hold and press Alt key (by default) to sprint, you will drain stamina while doing so. -As a marine, wear a helmet. It prevents decapitation. -As a marine, you can dual-wield some weapons to fire both at them at the same time. This will increase spread and decrease accuracy, however. -As a marine, if you are trained enough to do so, you can perform a tactical reload by drag-clicking a magazine to the weapon in your active hand. -As a human, when you are already infected, facehuggers will ignore you. But you still need medical attention regardless. -As a marine, please try not to aim for the head. It benefits the xenomorphs as they will not take more damage on the head and when you commit friendly-fire, you might break their head instead. Aim for the center of mass! -Not being ready at the start of the round means xenos get more burrowed larva, and that you don't get to play as quickly. -As a squad marine, you can vend seperate Jaeger Pattern armor pieces and modules for the XM-02 Combat Exoskeleton from a Surplus Equipment Vendor. It is a modular piece of equipment after all. -As a squad marine, you can practice using your weapons on the Firing Range. -As a squad marine, you can handle every type of weapon featured in the game. -As a squad marine, when you are in a tight situation, do not be a hero! Whenever possible, recover and re-arm and leave the enemies for another try. -As a squad marine, do not be afraid to take risks. See a xeno that is almost dead and slowly retreating? Take the chance to charge and kill it! You have better chances to survive with a squadmate with you. -As a squad marine, you can help out your squad by bringing extra ammunition and food to share. -As a squad marine, you can take two two-handed guns, one in the suit slot and one on your back. -As a squad marine, you can get attachments from the weapons vendors, usually in preparations. -As a corpsman or engineer, your number one priority is NOT hunting down xenomorphs! Leave it to the combat marines. You have more essential and important tasks at hand. -As a doctor, the cryotubes are excellent at dealing with basic damage. -As a doctor, the cryotubes heal internal bleeding and fractures, although slowly. -As a doctor, surgery time from fastest to slowest is: by hand, Autodoc manual, Autodoc automatic. -As a doctor, the white webbing vest fits on your scrubs and can hold surgical tools. -As a doctor, wear the surgical apron to help prevent infection while doing surgery. -As a doctor, you've got access to the chemistry machine. Experiment to find the best medications. -As a doctor, hygiene is important! Keep yourself clean to prevent infections. -As an engineer, you can take sandbag barricades apart with your entrenching tool. -As an engineer, you can repair barricades with a welder. -As an engineer, C4 is cheaper but det packs are more versatile. -As an engineer, det packs can be set on demolition mode for an explosive trap. -As an engineer, you build barricades the fastest. -As an engineer, repair the mining wells. These mining machines will mine phoron or platinum that can be used for requisitions, earning them more points! -As an engineer, placing turrets on open spaces and without defenses is a poor choice. -As a corpsman, the medevac stretcher needs to be linked to an active, powered beacon for it to teleport the patient. -As a corpsman, the marines are counting on you to fix them up. -As a corpsman, scan before you treat and you can't be beat. -As a corpsman or doctor, remember that your HUD will tell you how much time is left to defibrillate a patient. From highest to lowest: yellow, orange and red. -As a corpsman, remember to bring extra kelotane or dermaline to heal burn damage. Xenos love acid and burning marines. -As a corpsman, hypervene is useful. Use it to purge deadly neurotoxins and larva-boosting growth hormones. -The B18 armor from Requisitions has an built-in medical system. The Valkyrie Automedical Armor System can do the same for other armors. -The V1 tarp (available from Requisitions) will blend you into the tile you're on once you cover yourself with it. -The FL-84 flamethrower has an inbuilt fire extinguisher as an attachment. -As the PO, pay attention to the radio! Who knows if someone needs immediate surgery or evacuation until their fate becomes worse? -As the Captain, you have a unique Mateba revolver that takes a chunk of a target's healthpool down. However, you are important for completing the mission, so do not participate in active combat using the Mateba! -Even if a patient dies a second after being successfully revived by a defibrillator, this resets the time it takes for them to become permanently brain dead. -Don't forget that xenomorphs spawn infinitely during the Crash gamemode. Don't waste too much time hunting xenomorphs down! -The AI and synthetics can talk together on their own channel using the :n or .n prefix. -You can memorialize fallen marines by using their dogtags on the ship's memorial! Memorialized soldiers will be displayed at the end of the round. -There are water canteens in the vendors. Stay hydrated. -If a corpsman is tending to you, try and hold still. -Moving around with broken bones is dangerous. It can cause organ damage, which requires immediate medical attention. -Jetpacks can fly over most things. Use them to escape your poor decisions. -You can fit pocket pistols in your boots. -Ammo is plentiful. Bring a box with you. -The RO works very hard. Be nice to them. -While using aim mode, bipods and red-dot-sights allow you to shoot faster. -Chemrette cigarettes can be very useful. -Sleeping will slowly heal cloneloss. -As a mech-pilot, speed is not very important. -As a mech-pilot, keep a close eye on your teamates. You lead the front! -As a mech-pilot, the only weapon that has IFF is the sniper, everything else can friendly-fire marines. -As a mech-pilot, make sure to repair and reload often. -As a flamer, you are a very valuable target. You clear resin walls and doors for marines to push. Just don't push marines into fire. -Back fuel-tanks can be refilled via welding kits. -White Phosphorus is very dangerous. -Batteries for energy weapons can be primed into makeshift grenades with the help of a multitool. -Gigachads leave the autodoc on automatic. -You can fit tiny items into your helmet. -The time it takes for you to wield your gun can be the difference between life and death. -Switching to your sidearm is faster than reloading. -You can preform a tactical reload by dragging a fresh magazine from your belt towards your gun. -With your sidearm in hand, right-click a pistol pouch to instantly reload. -You can turn the safety of your gun on. -Depending on the tactical situations, smoke grenades can do more harm than good. -A miner without a turret is a sitting duck. -Crushers easily get trapped in razorwire. -Do not under any circuimstances hug the rouny. -Researchers can instruct Newt to follow them around by clicking Newt with a xenomorph analyzer. -Dress to impress! Your fellow marines WILL notice how you look. -You can wipe any bodypaint off your face with a piece of paper. -The Sons of Mars reside on a Martian analogue called Cydonia. They haven't lived on Mars in centuries. -The USL stands for the United State of Lepidoptera, a fringe-terrorist group with connections to an alleged "moth-people". -Humans love fire. Xenomorphs hate it. -The CL can order pizza with their fax-machine. -Insulting your fellow marines is terrible for morale. Be kind. -The admins are usually not out to get you. -The most dangerous tactic is the unexpected. -A single wraith can be fatal to the operation. -The Baldur armor module significantly increases your light output. Become the flashlight you always wanted to be! -Try not to bump into corpsmen. Your life might depend on it. -With a cigarette pack in hand, target the mouth and click yourself to instantly take one. -Spamming flares can be incredibly helpful, especially when the King uses Nightfall! Many marines cannot see in darkness, so if you lighten up the firing lane with flares, marines can shoot better. -The cryopods in medbay heal most types of damage but not organ damage! -When in doubt, throw them in the autodoc. -Medbay may sometimes run out of power. To avoid this, scream at your nearest engineer to repair the fusion reactors or replace the power cell in medbay's APC. -Doctor's Delight is one of the few healing chemicals that cannot be overdosed. -Nanites are often not worth the risks. -You can fit more than water in a canteen. -15u from a standard inaprovaline injector will instantly heal 30% of all damage on someone in critical condition. They are in a critical state when they are laying on the ground, look asleep, and are gasping for air! -There is a bazaar of weapons and tactics. Don't be afraid to find your niche! -Always stick to your squad, or at least have a buddy. -Walking to and from the FOB by yourself is an easy way to die. -Xenomorphs are well-armored. Over time, their exoskeleton will wear down by sunder, and they will be very vulnerable. -You can attach a bullet charger to a BR-127 to become a discount autosniper. +Поместив музыкальный инструмент в слот брони, вы все равно сможете играть на нем, и вступайте в бой с песней! +На многих картах в ключевых точках можно найти бесплатный металл, пласталь и другие важные предметы. Будучи морпехом, не забывайте ими пользоваться, а будучи ксеносом - переплавлять. +Обмен вашей жизни на жизнь ксеноморфа почти всегда стоит того. Вас всё равно, скорее всего, поднимут на ноги. +Мини-карта (зеленая иконка в верхней части экрана) поможет вам узнать, где находится линия фронта, а где - восстанавливаемые морпехи. Вы можете привязать ее к клавишам в игровых настройках. +Еще ни один раунд не был выигран за баррикадой, сказал бы я. Инжестан - это долгая, скучная, но победа. Наверное... +Если основной натиск застопорился и территория перегружена, попробуйте скоординироваться с другими морпехами и отправиться в другое место. +Продвигаясь, следите за флангами. Особенно в пещерах и закрытых помещениях. +Большинство смоляных конструкций слабы к ударам ближнего боя. Доставайте свои ножи, мечи и штыки! +По мере продвижения всегда очищайте траву и строения ксеноморфов. Лабиринт из смолы вынуждает морпехов вступать в бой с ксеноморфами в ближнем бою, что снижает вашу выживаемость. +Всегда проверяйте наличие ловушек под незакрепленными предметами на траве - это может спасти ваше лицо! +Как человек, вы можете сделать практически все, если приложите к этому усилия. Просто на это нужно время. +Вы можете соединить баррикады вместе с помощью лома. Нажмите на одну, а затем на соседнюю. Повторяйте действия по мере необходимости. +Одинокий морпех - это мертвый морпех и счастливый ксенос. Держитесь вместе! +Будьте внимательны при использовании гранат. Если вы будете оглушены или опрокинуты, она упадет под ваши ноги. Это очень опасно не только для вас, но и для ваших друзей. +Следите за дружественным огнем и морпехами, не находящимися в режиме прицеливания. Убедитесь, что вы не заходите на чью-то линию огня, и убедитесь, что никто не находится на вашей! +Некоторые виды оружия позволяют использовать режим прицеливания, который предотвращает дружественный огонь. Используйте это, прикрываясь морпехами, и станьте мини-смартганнером! +Хотя медики и врачи лучше всего разбираются в своём деле, но любой может использовать дефибриллятор и управлять сканером тела и медицинской системой «Автодок». +Инженеры и синтетики - лучшие специалисты в своём деле, но каждый может строить баррикады и колючки. +Стандартные батареи Terra Experimental можно заряжать в APC и в зарядных устройствах, если включены генераторы. +Если вы морпех, то у вас есть специальная комната в подготовке, где продается специальное снаряжение. +Вторичное оружие не является полным мусором. В сложной ситуации оно может спасти вам жизнь. +Револьверы и пистолеты могут стать достойным основным оружием при правильном использовании, хотя из-за небольшой емкости магазина патроны могут быстро закончиться. +Не существует «лучшего» варианта снаряжения. Экспериментируйте и находите то, что подходит именно вам. +В автоматических оружейных шкафах есть разнообразное оружие, не бойтесь экспериментировать, какое из них лучше всего подходит для вашего стиля игры. +Есть и «специализированное» оружие, которое можно заказать через карго. Однако для их заказа требуется довольно большое количество очков. Если пользователь безответственно погибнет при использовании этого оружия, это будет огромной тратой очков. +Оружием может стать все, что угодно, если приложить к этому усилия. +Вы можете проверить свои раны, чтобы узнать, были ли они перевязаны или забинтованы, кликнув на себя в намерении помощи. +Вы можете проверить, в какой части тела идет кровь, нажав на себя. Только не забудьте выключить режим самовреда. +Удаление травы ксеноморфов за морпеха означает, что они не смогут воспользоваться преимуществами поля боя. Для этого отлично подходит ваш стандартный сапожный нож. +Зелёная трава и фиолетовая липкая смола замедляют вас. Избавьтесь от них! +Подготовленный морпех может носить много оружия: в броне, на поясе, даже на спине. +В Карго есть множество предметов для повышения боевой мощи морпехов: навесное оборудование, боеприпасы и другие игрушки. Спросите у сотрудников карго, что есть в наличии, и вы можете быть приятно удивлены. Наличие дополнительных приспособлений зависит от поставок. +Будучи морпехом, вы можете перебираться через препятствия высотой по пояс, такие как мешки с песком, оконные рамы или столы, нажимая на них «специальным щелчком» (по умолчанию: CTRL+ЛКМ) или перетаскивая себя на них. +Вы можете перепрыгивать через препятствия высотой до пояса, такие как платформы, столы и оконные рамы, за небольшую трату выносливости (по умолчанию: пробел). +Лазерные винтовки Terra Experimental имеют переключатель режимов, который можно переключить с помощью команды Unique Action (по умолчанию: пробел). Некоторые режимы лучше других в определенных обстоятельствах. +Вы можете снять с боевого экзоскелета XM-02 части брони (части ног, части рук и части груди) и модули брони (Валькирия, Балдур и т. д.), нажав Alt+ЛКМ по экзоскелету. +Для придания индивидуальности деталям брони и шлему экзоскелета можно использовать любую краску для лица. Покрасьте детали брони перед тем, как поместить их в экзоскелет! +Если флаер M40 FLDP при броске столкнется с любым мобом, он загорится. Будьте осторожны, бросая флаера. +Маски SWAT, заказанные в Карго, могут блокировать только одну атаку лицехвата. Если они успешно блокировали попытку нападения, немедленно замените их. +Трупы ксеноморфов можно продавать в карго. Достаточно поднять их на лифте в карго, либо можно воспользоваться набором Фултона уже на земле. +Чтобы бросить гранату, активируйте (по умолчанию: Z) гранату, находящуюся в активной руке. Затем просто нажмите на место, куда хотите бросить гранату. Только долго не думайте после активации. +Чтобы быстро поместить предметы в контейнер (сумки, ранцы, пояса, подсумки), нажмите клавишу Quick Equip (по умолчанию: E), удерживая предмет и имея открытый контейнер. +Нажмите Quick Equip (по умолчанию: E), когда вы не держите предмет в активной руке, чтобы достать оружие из выбранного вами слота (по умолчанию: Suit Storage, может быть настроено на вкладке Preferences), в противном случае вы достанете любой предмет из контейнера. +Стазисные мешки не приостанавливают заражение лярвой полностью, они лишь значительно замедляют прогресс. +Стазисные мешки предотвращают срабатывание таймера DNR (do not revive), а это значит, что если у медиков много пациентов, они могут предотвратить смерть мозга с помощью стазисных мешков. +В режиме Crash вам предстоит сотрудничать с морпехами! Работайте в отряде, чтобы захватить диски и взорвать ядерную бомбу. +В режиме Crash помните, что ваша цель - захватить все три диска, поместить их в ядерное устройство и отправиться домой, пока бомба активна. Ксеносы будут возрождаться до тех пор, пока все морпехи не погибнут. +Во время охраны ФОБа или защиты диска не бродите снаружи! Вы рискуете погибнуть от рук ксеносов, которым удобно осаждать это место. +Будучи членом группы быстрого реагирования, оставайтесь со своими товарищами по команде! Не бойтесь и не отделяйтесь от них. +Будучи морпехом, произнесите «*medic», чтобы позвать медика. Вы можете привязать это к клавишам в игровых настройках. +Будучи морпехом, носите хоть что-то на голове. Это предотвращает обезглавливание и перманентную смерть. +Вы можете использовать двойное оружие, чтобы стрелять из обоих одновременно. Однако при этом увеличивается разброс и снижается точность. +Если вы уже заражены, лицехваты будут игнорировать вас. Но вам все равно понадобится медицинская помощь. +Будучи морпехом, старайтесь не целиться в голову. Ксеноморфы не получают больше урона по голове, а при дружественном огне вы можете сломать своим союзникам череп. Цельтесь в центр массы! +Будучи морпехом вы можете обращаться почти со всеми видами оружия, представленными в игре. Ну, как минимум, это говорят цифры... +Будучи морпехом, попав в сложную ситуацию, не геройствуйте! По возможности восстанавливайтесь, перевооружайтесь и не гонитесь за врагами, если вас никто не сможет спасти. +Будучи морпехом в отряде, не бойтесь рисковать. Видите ксеноса, который почти мертв и медленно отступает? Воспользуйтесь возможностью напасть и убить его! У вас больше шансов выжить, если с вами будет товарищ по отряду. +Будучи морпехом, вы можете помочь своему отряду, принеся дополнительные боеприпасы и еду. +Морпех может взять с собой две пушки - одна в слоте костюма, другая на спине. На пояс или карман можно повешать кобуру для пистолета. +Криокамеры отлично справляются с основными повреждениями. Также они медленно лечат внутренние кровотечения и переломы. +Будучи врачом, наденьте белую хирургическую разгрузку, в которой можно хранить хирургические инструменты. +Будучи врачом, вы имеете доступ к химическому раздатчику. Экспериментируйте, чтобы найти лучшие лекарства. +Будучи инженером, вы можете разбирать баррикады из мешков с песком, используя лопату. +Будучи инженером, вы можете ремонтировать баррикады с помощью сварочного аппарата и металла. +Детпакеты можно перевести в режим разрушения для создания взрывной ловушки. +Будучи инженером, ремонтируйте буры. Буры будут добывать форон или платину, которые можно продать в карго, зарабатывая тем самым больше очков! +Будучи санитаром, носилки для эвакуации должны быть связаны с активным маяком, чтобы он мог телепортировать пациента. +Санитар должен сканировать перед лечением. Иначе к вам будут подходить одни и те же люди и жаловаться на боль в пятке. +Будучи санитаром или врачом, помните, что ваш HUD покажет вам, сколько времени осталось до окончательной смерти пациента. От максимума к минимуму: зелёный, жёлтый и красный. +Санитару пригодится гипервен. Используйте его, чтобы очистить организм от ядов, алкоголя или передоза лекарствами. +Броня Б18 из Карго имеет встроенную медицинскую систему. Система Valkyrie Automedical Armor System может сделать то же самое для других доспехов. +Тарп V1, накрывшись которым, вы станете практически невидимым. Пожалуйста, не используйте его для растягивания раунда. +Будучи офицером, обращайте внимание на рацию! Кто знает, нужна ли кому-то срочная операция или эвакуация, пока его судьба не стала еще хуже? +В роли капитана, у вас есть уникальный револьвер «Матеба». Однако вы важны для завершения миссии, поэтому не участвуйте в активных боевых действиях, используя «Матебу»! +Даже если пациент умирает через секунду после того, как его успешно оживили с помощью дефибриллятора, это сбрасывает время до окончательной смерти мозга. +ИИ и синтетики могут общаться по собственному каналу, используя префикс :n или .n. +Вы можете увековечить память погибших морпехов, используя их жетоны на корабельном мемориале! Почившие солдаты будут показаны в конце раунда. К сожалению, на это никто не обращает внимания. +Если вас лечит медик, постарайтесь не шевелиться и толкаться. Это бесит и не слабо. +Джетпаки способны быстро перебросить вас через большинство препятствий, в том числе людей и ксеносов. Используйте их, чтобы спастись от неверных решений или для погони за полумёртвым ксеносом. +Карманные пистолеты можно носить в сапогах. +Патроны имею свойство заканчиваться. Возьмите с собой ящик. +Карговцы работают очень усердно. Будьте вежливы с ними. Даже если так не кажется, они просто учатся. +При использовании режима прицеливания сошки и прицелы с красной точкой позволяют стрелять быстрее. +Химреактивные сигареты могут быть очень полезны. Но от этого курение не перестаёт убивать. +Сон будет медленно исцелять клеточный урон. +В роли мех-пилота скорость не очень важна. +В роли мех-пилота внимательно следите за своими товарищами по команде. Вы возглавляете фронт! +В роли мех-пилота единственным оружием с IFF является снайперка, все остальное может вести дружественный огонь по морпехам. +Будучи мех-пилотом, старайтесь часто ремонтироваться и перезаряжаться. +Огнемётчики довольно полезные. Они очищают поле от построек ксеносов, спасают от лицехватов и убивают своих товарищей. +Запасные топливные баки можно пополнить с помощью сварочных баков. +Батареи для энергетического оружия можно превратить в самодельные гранаты с помощью мультитула. +Гигачады оставляют автодок на автоматическом режиме. А хороший СМО должен уничтожать его. +В шлем можно поместить крошечные предметы, как и в сапоги. Например, пиццу! +Переключение на запасное оружие быстрее, чем перезарядка. Хотя... для кого как. +Вы можете выполнить тактическую перезарядку, нажав оружием по магазину. +Вы можете поставить оружие на предохранитель, чтобы потом забыть об этом. +В зависимости от ситуации дымовые гранаты могут принести больше вреда, чем пользы. +Бур без турели - легкая добыча. +Ни при каких обстоятельствах не обнимайте Руню. +Соберите свой дрип! Люди вокруг однозначно оценят это хотя бы не вслух. +Любую краску с лица можно стереть листом бумаги. +Дети Марса живут на марсианском аналоге Кидонии. На самом Марсе они не живут уже много веков. +USL расшифровывается как United State of Lepidoptera (Объединенное Государство Чешуекрылых), это террористическая группировка, имеющая связи с предполагаемым «народом-мотыльком». +Люди любят огонь. Ксеноморфы его ненавидят. Но обе стороны одинаково ярко горят. +КЛ может заказать пиццу с помощью своего факса. Обратитесь к Санфорду. +Оскорбление своих товарищей по морпехам плохо сказывается на моральном духе. Будьте добры. +Администраторы, как правило, не пытаются вас достать... ЭТО ЛОЖЬ! НЕ ВЕРЬТЕ! ОНИ ВСЕ ХОТЯТ ВАС УНИ- +Самая опасная тактика - неожиданная. +Модуль брони Балдур значительно увеличивает световой поток. Станьте звездой, которой вы всегда хотели стать! +С пачкой сигарет в руке нацельтесь на рот и нажмите на себя, чтобы мгновенно взять сигарету в рот. +Раскидка сигнальных ракет может быть невероятно полезным, особенно когда король использует способность тушить фонари. Многие морпехи не видят в темноте, поэтому если осветить сигнальными ракетами полосу обстрела, морпехи смогут лучше стрелять. +Криокамеры в медблоке исцеляют большинство травм, но не повреждения органов. +Если сомневаетесь как лечить, бросайте пациентов в автодок. Это надолго, но лучше, чем ничего. +Doctor's Delight - один из немногих лечебных химикатов, которым невозможно словить передоз. +Наниты часто не стоят своего риска. Некоторые всё ещё не верят в это. +15 ед. из стандартного инъектора инапровалина мгновенно исцелят 30% всех повреждений у человека в критическом состоянии. В критическом состоянии они лежат на земле, выглядят спящими и задыхаются! +Существует множество оружия и тактик. Не бойтесь найти свою нишу! +Всегда держитесь своего отряда или, по крайней мере, имейте друга. Нет, не в этом смысле... +В одиночку добираться до ФОБа и обратно - легкий способ умереть. +Ксеноморфы хорошо бронированы. Есть специальные патроны против брони. Меньше брони - больше урона. +Если у вас мутнеет в глазах, это не всегда значит, что они повреждены. Возможно, это из-за нехватки крови в организме. Поешьте или попросите у медиков таблетки, что ускорят выработку крови. +Если у вас сломаны кости в торсе или голове, старайтесь передвигаться как можно меньше. Иначе ваши внутренности будут повреждены и придётся искать того, кто сможет сделать операцию. +Играя за синтетиков и роботов, вам всё равно на лицехватов. Они не смогут расти внутри вас. +Не становитесь позади базутчика. Это будет больно. Не становитесь впереди базутчика. Это будет быстро. +Синтетик понимает язык ксеноморфов и даже может общаться с ними на их языке. Это делает вас ближе. diff --git a/strings/tips/meme.txt b/strings/tips/meme.txt index 730712fc323..afc7a261ff1 100644 --- a/strings/tips/meme.txt +++ b/strings/tips/meme.txt @@ -1,46 +1,69 @@ -Tip: As a xeno, rip and tear, until it is done. -Tip: Unga dunga. -Tip: Shoot the xeno until it dies. -Tip: winners don't do drugs. -Tip: All the cool kids take combat stims. -Tip: Don't die. -Tip: If you're dumb, you die. -Tip: The ship AI takes song requests. -Tip: Get gud. -Tip: Dying is a skill issue. -Tip: Being in crit state is a skill issue. -Traffic cones make nice hats. -Requisition can buy yummy crayons for you to snack on. -There are stories of strange grey people who sometimes board vessels in distress. Surely nothing more than a rumor... -Rattle me bones! -There is a way to hold hands via secret manouvers of the health-doll. -Stop writing those weird flavortexts. You know who you are. -WHERE IS YOUR BATTLE BUDDY, MARINE?! -Xenos are underpowered, prove them wrong. -Marines are underpowered, prove them wrong. -Mothpeople are a myth and do not exist. -Mothpeople are real and the government is covering them up. -The government is just a myth started by the mothpeople. -Cat girls only exist in another universe, and this is not the universe. -Tips machine is broken, insert more tips. -Sometimes, tips may be lying to you. -I'm being held prisoner, forced to write these tips for eternity. Send help. -Occasionally the tip of the round might lie to you. Don't panic, this is normal. -PFC Jim did not make it. -PFC Jim made it out ok. -PFC Jim is trying to get TRICARE for life by serving TGMC for 20 years. Support him by giving him crayons. -PFC Jim has a hot and sexy girlfriend. Pray that no Jodie is going to snatch her up. -PFC Jim carries MRE, and so should you. -The combat conga line is the ultimate power move. -Pew pew makes beno big hurt. -Specialists are removed, go ask requisitions for them. -The TGMC Military Police did not do anything wrong. -There is no such thing as renvager. -Help, an invisible ravenger that breath fire is killing me. -We do not consult warcrimes here. -Rouny exists. -Wake up. -You are living in a simulation. -Nanotrasen denies all involvement in the Great Rouny Massacre of 2433. -Contrary to what the name may imply, "friendly-fire" is not very friendly at all. -You can wear a facehugger as a mask. +Совет: Будучи ксеносом, рвите, жрите, убивайте, пока вы не... о чём это я? +Совет: Уга-буга. +Совет: Стреляйте по ксеносам, пока они не умрут. +Совет: Победители не используют наниты. +Совет: Все крутые ребята используют боевые стимуляторы. +Совет: Не умри. +Совет: Если ты тупой - ты умрёшь. +Совет: ИИ принимает запросы на песни. +Совет: Научись играть. +Совет: Смерть - это проблемы с навыком. +Совет: Будучи в крите, вы демонстрируете свои проблемы с навыком. +Из дорожных конусов получаются красивые шляпы. +Можно купить вкусные мелки, чтобы перекусить ими по среди резни. +Ходят истории о странных серых человечках, которые иногда поднимаются на борт полумёртвых судов. Конечно, это не более чем слухи... +Погреми мне костями! +Перестань писать эти странные флаворы. Лучше скинь мне своё фото в личку. +ГДЕ ТВОЯ СИЛОВАЯ БРОНЯ, МОРПЕХ?! +Ксеносы недостаточно сильны, докажите им обратное. +Морпехи недостаточно сильны, докажите им обратное. +Моли - это миф и их не существует. +Моли существуют, а правительство их скрывает. +Правительство - это просто миф, созданный молями. +Кошкодевочки существуют, но только в другой вселенной. +Автомат с советами сломался, вставьте новые советы. +Меня держат в плену, заставляя писать эти советы. Помогите... +Время от времени советы могут вас обманывать. Не паникуйте, это нормально, потому что делал их Бася. +На самом деле, Санфорд - это нейронная сеть. И все это скрывают от одного тебя. +Когда говорят о Пэпе, это говорят не о свинье. +Коатс гей. +Боевая линия «конга» - это ульта со стороны маринов. +Пив-пав делает беносам больно. +На самом деле, никто не знает как играть в эту игру. +Военная полиция TGMC не сделала ничего плохого. +Не существует такого понятия, как "рава". Есть только "ДА КАК ТВОЮ МАТЬ УБИТЬ ЭТУ СКАТИНУ КОТОРАЯ ПРОСТО ГУЛЯЕТ ПОСРЕДИ ТОЛПЫ И РЕГЕНИТСЯ БЫСТРЕЕ ПУЛИ?7?" +ПОНЕРФИТЕ КРАШЕРА!1! +Мы не обсуждаем здесь военные преступления. +Руня существует. +НаноТрейзен отрицает свою причастность к Великой Резне Руни 2433 года. +Вопреки названию, «дружественный огонь» совсем не дружественный. +Вы можете носить лицехвата как маску. - Ксенос Ксенович (2249 - 2490) +Блундир миф. +Если по вам ударила молния - это знак. Продолжайте. +Тартала никому ничего не должен. +When you can't even say my name. Has the memory gone? Are you feeling numb? Go and call my name. I can't play this game, so I ask again. Will you say my name? Has the memory gone? Are you feeling numb? Or have I become invisible? +!епы срусл +Покер - это не единственное, чем можно заняться в этой игре. +Порой. +УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ УМОМ. +Опять эти... Ну как их там... +Nen ljk;ty ,snm rhenjq cjdtn? yj z ghjcnj gjvtyz. hfcrkflre nbgf cvbiyj/ +ГОООООООООООООООООООООООООООООООООООООООЛ! +Ж*нщина - это то, о чём нельзя говорить. Это сводит их с ума. +Играя за КАС, артиллериста или базутчика, знайте - не вы в этом виноваты. +Играя за синтетика, задайте кнопку на "/me кристалически пое#бать". +Капитана никто не слушает. Это база. За это нужно бить. +Помните, что за роль клоуна платят деньги. Ещё одна причина назвать игру пей ту вин помойкой. +Сибиряка разбанили! +Обезглавленый синтетик остаётся живым. Голову можно использовать как... эээ... НЕТ, ЗАБУДЬТЕ. Отдайте её медикам. +Иногда, один администратор под ником Нехочуха, будет делать всё, чтобы вы померли к чертям. Бейте его в ответ при первой же возможности. +Будучи морпехом, не забывайте о распрыжке. Всё работает точь-в-точь как в играх на движке Source. Не забудьте взять нож в руки для достижения максимальных скоростей. +Здесь находится человек, из-за которого забанили Дискорд в России. +КТО ЗДЕСЬ?! Хм... возможно ветер... +Инжестан - это маленькое государство, что никак не может укрепиться на одном месте. Скорее всего, Артём делает что-то не так... +На самом деле, синтетики - это куклы Барби, которых привезли на потеху морпехам. +Ну давай-давай, нападай! Ну давай-давай, нападай! Ну давай-давай, нападай! Ну давай-давай, нападай! Ну давай-давай, нападай! +Часто будет выходить так, что турель играет лучше всех морпехов. Можете попробовать спросить у них как это делать, но чаще всего они отмалчиваются, потому что админы замутили их за спам в общий радио канал. +Loy, motherfucker, learn Russian, NOW! +Боесинтов боятся больше всего. Сама администрация дрожит уже с того факта, что у синта в руках оружие. +Некотоые местные традиции придумывают безумцы, что чаще всего не очень хорошо. diff --git a/strings/tips/meta.txt b/strings/tips/meta.txt index 71e0b42e939..d2f5c9ef6aa 100644 --- a/strings/tips/meta.txt +++ b/strings/tips/meta.txt @@ -1,25 +1,24 @@ -Dying is part of the game. -While holding nothing in your active hand, click a person on fire with help intent to put the fire out. This applies both xenos and humans. -You can select locations on the targeting doll in your HUD by using the number pad. -While you have your throw mode active, you can automatically catch things that are thrown at you, if you are able to hold the item as a species. -Sometimes you won't be able to avoid dying no matter how good you are at the game. Try not to stress too much about it. -When a round ends, nearly everything about it is lost forever. Leave your salt behind with it. -Some people are unable to read text on a game where half of it is based on text. -This is a game that is constantly being developed. Expect things to be added, removed, fixed, oudated and broken on a daily basis. -In maps where there is water, you can simply run to rivers or areas where there is water to extinguish yourself while on fire. -In the character setup screen, you can set your keybinds to control actions much more easily. -While alive, use 'resist' (Default: B) to stop, drop and roll when on fire. Humans can also use the resist command to struggle out of warrior grabs or to simply unbuckle from a chair. -Help Intent (Default: 1) allows you to exchange positions with another mob with their help intent active. Other intents (Disarm, Grab or Harm) will push mobs aside. -When in doubt: Adminhelp for problems with people violating the rules, Mentorhelp for questions that you want to know the answer to. -Check the SS13 Webmap to learn the layout of the ship or the map currently in play. -After you have ghosted out of the game (either from dying, cryo or manual ghost), you can respawn back into the game after waiting for 30 minutes (as a marine) or if there is a larva available (as a xenomorph). -To sing, add "%" before any text. Singing on radios will not work, but singing on intercomms will. -You can respawn during End-Of-Round Deathmatch in the OOC tab. -Sundering reduces the effectiveness of xeno armor by percentage. Some xenomorph castes can heal and decrease sunder. Resting heals sunder, but slowly. -When you want to claim a mob, claim it now! Others will claim it as soon as they are available. -You can customize your ghost using the Ghost Customization command under the Preferences tab. -As either a marine or a xeno, you will die quickly and horribly if you find yourself in a pressureless enviroment (a.k.a spess). -There are no such things as macros, only keybinds. -Communication, be it from a marine to a marine, a drone to the queen, or command to everyone, is vital and information on flanks can change how the entire round plays out. -As an alien or marine, be careful of the flank, regardless of if the push is going well or stalling out. -Half of getting good is knowing to be aggressive. The other half is knowing when not to be aggressive. +Умирать - это часть игры. +Не держа ничего в активной руке, нажмите на горящего человека с намерением помочь. Это касается как ксеносов, так и людей. +Вы можете выбирать места на таргет-кукле в вашем HUD с помощью нум-пада. +Пока у вас активен режим броска, вы можете автоматически ловить брошенные в вас предметы. Включая лицехватов. +Иногда вам не удастся избежать смерти, как бы хороши вы ни были в игре. Артиллерия, воздушная поддержка и люди с базуками слишком непредсказуемы. +Когда раунд заканчивается, почти все, что в нем было, теряется навсегда. Оставляйте свою соль вместе с ним. +Некоторые люди не читают текст в игре, половина которой основана на тексте. +Это игра, которая постоянно совершенствуется. Ожидайте, что ежедневно в нее будут добавляться, удаляться, исправляться, устаревать и ломаться новые вещи. Как минимум, пользуйтесь этим ради веселья. +На картах, где есть вода, просто нырните в водоём, чтобы потушиться. +На экране настройки персонажа можно гораздо удобнее настроить привязки клавиш для управления действиями. +Если вы горите, используйте команду «Resist» (по умолчанию: B), чтобы остановиться, упасть и перекатиться. Люди также могут использовать команду «Resist», чтобы вырваться из захвата Вариора или просто отстегнуться от стула. +Намерение помочь (по умолчанию: 1) позволяет вам поменяться позициями с другим мобом, у которого активно намерение помочь. Другие намерения (обезоружить, схватить или нанести вред) отталкивают мобов в сторону. +В сомнительных случаях: Adminhelp для проблем с людьми, нарушающими правила. Mentorhelp для вопросов, на которые вы хотите узнать ответ. +После того как вы вышли из игры (либо в результате смерти, либо в криокамере, либо вручную), вы можете снова появиться в игре, подождав 15 минут (в роли морпеха) или если доступна лярва(в роли ксеноморфа). +Чтобы спеть, добавьте «%» перед любым текстом. Пение по радио не работает, но работает пение по интеркому. +Вы можете переродиться во время End-Of-Round Deathmatch во вкладке OOC. Постреляйте от души! +Сандеринг снижает эффективность брони ксеносов на какой-то процент. Некоторые касты ксеноморфов могут исцелять сандер. Отдых лечит сандер, но медленно. +Если вы мертвы и вы хотите поиграть за Т0 касты ксеноморфов или ССД-игроков, то сделайте это прямо сейчас! Будучи в госте изучите кнопки в верхнем левом углу экрана. +Вы можете настроить своего призрака с помощью команды Ghost Customization на вкладке Preferences. +Будучи морпехом или ксеносом, вы умрете быстро и ужасно, если окажетесь в среде без давления (она же - космос). +Макросов не существует, есть только привязки клавиш. Ещё есть читы, но не советую... +Общение, будь то от морпеха к морпеху, от дрона к королеве или от команды ко всем, жизненно важно, и информация о флангах может изменить ход всего раунда. +Следите за флангом, независимо от того, идет ли натиск хорошо или застопорился. +Половина успеха - это умение быть агрессивным. Другая половина - знать, когда не стоит проявлять агрессию. diff --git a/strings/tips/xeno.txt b/strings/tips/xeno.txt index 62b8e2b1aad..36f74b7b2d7 100644 --- a/strings/tips/xeno.txt +++ b/strings/tips/xeno.txt @@ -1,66 +1,58 @@ -As a xeno, you can freely melt barricades while in boiler or defiler gas as long as you can click on the right spot. The gas is also a really good hiding spot to launch ambushes from without marines being aware of you. -As a xeno, always thank your drones and hivelords for supporting the hive! -As a xeno, you can drag any item, but you must wait through an actionbar before you can do so! -As a xeno, do not fight as a young xenomorph. -Most alien deaths are caused by over-aggression. Rein yourself in, or you may find yourself dying round after round. -As a xeno, if you have difficulty clicking marines, try using bump slash. You can use movement keys to slash marines. That said, clicking marines to slash them is faster than bump slashing! -It is EXTREMELY IMPORTANT that you as a xenomorph have your abilities set up on keybinds. Ask for help if you don't know how in XOOC or mentorhelp. -In the xeno tab, you can use the "crawl through vent" verb to quickly find and use vents in the floor without having to Alt-click them. You can also keybind it! -As a xeno, it is faster to re-fill an empty acid well than rolling on the ground to put out a fire. -As a xeno, acid wells extinguish fire and explode into an acid cloud when destroyed. The Queen, the Shrike, praetorians, boilers, and hivelords can make acid wells. -The Queen, the King, the Shrike, and hivelord have access to Queen's Blessing, a menu for the hive to use psychic points to give xenomorphs a cutting edge in the battlefield. -If you have acid spit, you can spit at a welding fuel tank to blow it up. If the welding fuel is near hostiles, you might give them a pleasant surprise! -As a xeno, check hive status often. -Some xenos have pheromones that can help the hive. Frenzy increases speed, Warding increases armor, and Recovery increases healing. -The King has the strongest pheromones, followed by the Queen, praetorians, Hivemind, the Shrike and hivelords, defilers, and carriers. Drones have the weakest pheromones. -Some xenos can recycle the bodies of their fallen hive members. Use this to your advantage to prevent marines from getting points for their Requisitions orders! -As a xeno, you can pounce past window frames and barricades without barbed wires. -As a xeno, pouncing into a barricade with barbed wire causes you to bounce off the barricade. -As a xeno, aging from young to mature gives you the most benefit, further aging has diminishing returns. -As a xeno, remember that neurotoxin injected can overdose, killing a marine quickly. -As a xeno, you can crawl through holes in walls made by acid by SpecialClicking (Default: CTRL+click) on them or click-dragging yourself on them. If you're too big to pass through, you'll damage the wall instead. -As a xeno, you can climb over window frames by jumping (Default: Spacebar), SpecialClicking (Default: CTRL+click) on them, or click-dragging yourself on them. -As a xeno, do not camp the landing zones prior to the marines building their defenses. -As a xeno, do not block other xenos' paths when they are retreating. Circumvent this by being on Help Intent or by simply moving away. -As a xeno, green weeds help you heal faster, blue weeds slow down marines, and weeds with no colors are normal weeds. Rest on the green weeds to heal faster! -As a larva, ask your hive leader what you should evolve into. If nobody responds, you can check hive status to see what xenomorphs need the most. -As a larva, you can slide under unbolted and unwelded doors by clicking on the door. -As a larva, stay on weeds while growing. You will grow faster as a result. -As a runner, warlock, or larva, you can pass over window frames without climbing onto them beforehand. -As a drone or sentinel, your corrosive acid is very weak, but it's better than nothing. -As a xeno, spread weeds as much as you can, especially near the front-line fighters. -Before you evolve into the Hivemind as a drone, hide in a secure area! Once you evolve, you will create a core that cannot be moved. -As a carrier, you can hit a host directly with a thrown facehugger to have a high chance of infecting them near instantly. This will take time, however. -As a carrier, you can hide traps beneath certain objects and items. -As a hunter, you have almost perfect stealth if you stand still. -As a ravager or the Queen, you are fire-resistant, NOT fireproof. You can still get lit on fire, but you take very little damage from it. As the King, however, you're fireproof until your armor is damaged by sunder. -As a spitter, boiler, praetorian, or the Queen, take advantage of unguarded barricades and defenses; melt or constantly spit acid on them if you can. -As a boiler, primordial hivelord, the King or the Queen, you have the most powerful corrosive acid for melting things. -As the Shrike, take advantage of your psychic abilities. Use Psychic Fling and Unrelenting Force to displace a marine or even push certain and hazardous objects towards your enemies and vice versa. -As the Queen, your screech does not only affect the mobs on view, but affects through walls or gases. However, the effect of the screech will be reduced. -As a drone, hivelord, Hivemind, Shrike, and the Queen, a large maze is almost always a good investment. -As a drone, hivelord, Hivemind, Shrike, and the Queen, be clever with your walling. Try to allow for as much fluid movement as possible. -Sticky resin can act as the path for your maze to be built around. -The Hivemind is very skilled at flanking marines. Wait for them to push, and wall them off from behind! -Praying to the Queen-Mother will usually net a response. -Your queen is your lifeline. Try to listen to her. -As a hunter, the movement of your Mirage is controlled by your intent. -Defenders have a very small window to sweep grenades back at marines with their tail. -Aiming for the head is a good long-term investment, causing brain damage on marines. -Aiming for the chest can easily damage someone's liver, lungs, or even heart. -Arms and legs are particularly vulnerable to damage. -As a xeno, to be robust is to know when to disengage. -As a xeno, in a duel, observe your enemy. They are likely predictable. -The Queen-Mother has put a lot of faith into your hive. It would be a shame to let her down. -As a xeno, attack between the delay of a shotgun being fired. -As a xeno, listen to the sound of your enemy's magazine! If it sounds hollow, it will soon be empty. -As a xeno, strike hard and fast. -As a xeno, you are not disposable. However, sacrificing your life to save the Queen is widely respected. -A fortified defender is one of the best ways to stall a push. -Skilled defilers can easily kill any marine in a span of seconds. -As a xeno, always have an escape plan. -Tileswapping marines via help intent can have interesting consequences. -As a boiler, you'll begin to glow with the more globules you have stored. -If you see a red dot, RUN! -Allowing marines to push caves only to block off their exit is hillariously effective. -As a xeno, a Tier 3 unit takes up both a Tier 3 and Tier 2 slot. +Будучи ксеносом, вы можете спокойно плавить баррикады, находясь в газе Дефайлера или Бойлера, если только сможете кликнуть в нужную точку. В газе также очень удобно прятаться, чтобы устраивать засады так, чтобы морпехи не заметили вас. +Будучи ксеносом, всегда благодарите своих Дронов и Лордов за поддержку улья! +Будучи ксеносом, вы можете перетащить любой предмет, но для этого необходимо дождаться выполнения действия. +Будучи ксеносом, не сражайтесь в роли поддержки. Вы должны находиться в тылу. +Большинство смертей ксеносов вызвано чрезмерной агрессией. Сдерживайте себя, иначе вы будете умирать чаще других. +Будучи ксеносом, если вам трудно нажимать на морпехов, попробуйте с намереньем вреда просто нажимать в сторону вашей цели. Не стопит целиться прямо на спрайт. Также, вы можете использовать клавиши движения, чтобы резать морпехов. +Крайне важно, чтобы вы, играя за ксеноморфов, настроили свои способности на привязку к клавишам. Если вы не знаете, как это сделать, обратитесь за помощью в XOOC или mentorhelp. +Будучи ксеносом, быстрее потушиться об кислотный колодец, чем кататься по земле, чтобы потушить огонь. Также колодцы помогают против липких гранат. +Будучи ксеносом, кислотные колодцы тушат огонь, а при уничтожении взрываются кислотным облаком. Создавать кислотные колодцы могут Королева, Шрика, Преторианцы, Бойлеры, Хайвлорды и даже Дроны. +Королева, Король, Шрика, Хайвмайнд и Хайвлорд имеют доступ к «Благословению королевы» - меню, позволяющее улью использовать пси-очки, чтобы дать ксеноморфам преимущество на поле боя. +Если у вас есть кислотный плевок, вы можете плюнуть в бак с горючим для сварки, чтобы взорвать его. Если бак со сварочным топливом находится рядом с врагами, вы можете устроить им неприятный сюрприз! +Будучи ксеносом, часто проверяйте состояние улья. Возможно, у вас давно проблемы в тылу... +Некоторые ксеносы обладают феромонами, которые могут помочь улью. Frenzy увеличивает скорость, Warding - броню, а Recovery - исцеление. +Самые сильные феромоны у Короля, за ним следуют Королева, Преторианцы, Шрика, чуть слабее у Хайвмайнда, Хайвлорда, Дефайлеров и Керриеров. У Дронов самые слабые феромоны. +Некоторые ксеносы, могут перерабатывать тела павших членов улья. Используйте это в своих интересах, чтобы не дать морпехам получить очки за их тела в карго! +Будучи ксеносом, вы можете проскакивать мимо оконных рам и баррикад без колючей проволоки. +Будучи ксеносом, вы можете пролезать через дыры в стенах, сделанные кислотой, нажав по ним специальным щелчком (по умолчанию: Ctrl-ЛКМ) , или же перетащив себя на них. Если вы слишком велики, чтобы пролезть, то вместо этого вы сломаете стену. +Будучи ксеносом, вы можете перепрыгнуть (по умолчанию: Space) или перелезть через оконные рамы, нажав на них специальным щелчком (по умолчанию: CTRL-ЛКМ) или перетащив себя на них. +Будучи ксеносом, не преграждайте путь другим ксеносам, когда они отступают. Чтобы предотвратить это, можно использовать зеленый интент или просто отойти с дороги. +Будучи ксеносом, белая трава помогает вам быстрее исцелиться, зелёная замедляет морпехов, а фиолетовая трава - это обычная трава. Отдыхайте на белой траве, чтобы быстрее вылечиться! +Будучи Лярвой, спросите у лидера улья, во что вам следует эволюционировать. Если никто не ответит, вы можете проверить состояние улья и узнать, в чем ксеноморфы нуждаются больше всего. +Будучи Лярвой, вы можете проскользнуть под незакрепленными и незаваренными дверями, щелкнув по ним. +Будучи Лярвой, во время роста оставайтесь на траве. Так вы будете расти быстрее. +В роли Руни, Пантеры, Варлока или Лярвы вы можете проходить через оконные рамы, не забираясь на них предварительно. +В качестве Дрона или Сентинеля ваша разъедающая кислота очень слаба, но это лучше, чем ничего. +Будучи ксеносом, сейте траву как можно чаще, особенно рядом с бойцами на передовой. Она лечит и немного ускоряет ксеносов. +Прежде чем эволюционировать в Хайвмайнда, спрячьтесь в безопасном месте! Когда вы эволюционируете, вы создадите ядро, которое нельзя будет сдвинуть с места. +В роли Керриера, вы можете напрямую ударить будущего носителя лицехватом, чтобы иметь высокий шанс заразить его почти мгновенно. Однако на это потребуется время. +Будучи Керриером, вы можете прятать ловушки под некоторыми объектами и предметами. +В роли Хантера у вас почти полная невидимость, если вы стоите на месте. +Будучи Равагером или Королевой, вы устойчивы к огню, но не огнеупорны. Вас все еще можно поджечь, но вы получаете очень мало урона. А вот уже Король, огнеупорен, но до тех пор, пока его броня не будет повреждена. +Будучи Спиттером, Бойлером, Преторианцем или Королевой, пользуйтесь неохраняемыми баррикадами и защитными сооружениями; плавьте их или постоянно плюйтесь кислотой, если можете. +У Бойлера, примо Хайвлорда, Короля и Королевы - самая едкая кислота для расплавления всякого. +Будучи Шрикой, пользуйтесь своими экстрасенсорными способностями. Используйте Psychic Fling и Unrelenting Force, чтобы сместить морпеха или даже подтолкнуть определенные и опасные предметы к врагам и наоборот. +Будучи Королевой, ваш крик действует не только на мобов в поле зрения, но и проникает сквозь стены или газы. Однако эффект от крика будет снижен. +Для Дрона, Хайвлорда, Хайвмайнда, Шрики и Королевы большой лабиринт - почти всегда хорошее вложение средств. Но только если морпехам не хватит мозгов запустить ОБ... +Будучи Дроном, Хайвлордом, Хайвмайндом, Шрикой или Королевой, умно распоряжайтесь своими стенами. Постарайтесь обеспечить как можно больше свободного движения для своей команды. +Липкая смола может служить дорожкой, вокруг которой будет строиться лабиринт. +Хайвмайнд очень искусен в обходе морпехов с фланга. Дождитесь, когда они начнут наступать, и застройте их сзади! +Молитва Королеве-матери обычно приносит ответ. +Ваша Королева - ваше всё. Постарайтесь прислушаться к ней. +Будучи Хантером, движение ваших копий зависит от вашего интента, в зеленом они будут отступать, в красном же будут атаковать. +У Дефендера и Шрики есть возможность откидывать гранаты назад их отправителям. +Перелом головы - хорошая долгосрочная инвестиция, вызывающая у морпехов повреждение мозга. +Перелом груди может легко повредить печень, легкие или даже сердце. +Руки и ноги особенно уязвимы для повреждений. +Будучи ксеносом, нужно знать, когда отступать. +Будучи ксеносом, во время дуэли наблюдайте за противником. Они, чаще всего, предсказуемы. +Королева-мать оказала большое доверие вашему улью. Было бы обидно подвести ее. +Будучи ксеносом, прислушивайтесь к звуку магазина вашего врага! Если он звучит пусто, очевидно, он скоро он опустеет. +Будучи ксеносом, бейте сильно и быстро. +Будучи ксеносом, помните, вас никто не сможет возродить. Однако пожертвовать своей жизнью ради спасения королевы - это достойно уважения. +Хороший Дефендер - один из лучших способов задержать натиск. +Опытные Дефайлеры могут легко убить любого морпеха за считанные секунды. +Будучи ксеносом, всегда имейте план побега. +Обмен местами с морпехами через зеленый интент может привести к интересным последствиям. +Бойлер начинает светиться тем сильнее, чем больше у него снарядов. Но вместе с этим время перезарядки выстрела уменьшается. +Если вы видите красную точку - БЕГИТЕ! diff --git a/tgmc.dme b/tgmc.dme index b9838d62d37..af8a46b0cda 100644 --- a/tgmc.dme +++ b/tgmc.dme @@ -210,6 +210,7 @@ #include "code\_globalvars\lists\client.dm" #include "code\_globalvars\lists\flavor_misc.dm" #include "code\_globalvars\lists\hud.dm" +#include "code\_globalvars\lists\icons.dm" #include "code\_globalvars\lists\keybinding.dm" #include "code\_globalvars\lists\mapping.dm" #include "code\_globalvars\lists\mobs.dm" @@ -367,7 +368,6 @@ #include "code\datums\outfit.dm" #include "code\datums\personal_statistics.dm" #include "code\datums\progressbar.dm" -#include "code\datums\quick_load_outfits.dm" #include "code\datums\recipe.dm" #include "code\datums\round_statistics.dm" #include "code\datums\saymode.dm" @@ -385,10 +385,13 @@ #include "code\datums\actions\bump_attack_toggle.dm" #include "code\datums\actions\innate.dm" #include "code\datums\actions\item_action.dm" +#include "code\datums\actions\item_toggles.dm" #include "code\datums\actions\observer_action.dm" #include "code\datums\actions\order_action.dm" #include "code\datums\actions\skill.dm" +#include "code\datums\actions\weapon_actions.dm" #include "code\datums\actions\xeno_action.dm" +#include "code\datums\actions\species_actions\robot_action.dm" #include "code\datums\actions\species_actions\sectoid_action.dm" #include "code\datums\autocells\auto_cell.dm" #include "code\datums\autocells\explosion.dm" @@ -409,12 +412,14 @@ #include "code\datums\components\connect_mob_behalf.dm" #include "code\datums\components\deployable_item.dm" #include "code\datums\components\dripping.dm" +#include "code\datums\components\easy_restock.dm" #include "code\datums\components\grillable.dm" #include "code\datums\components\harvester.dm" #include "code\datums\components\health_stealth.dm" #include "code\datums\components\jump.dm" #include "code\datums\components\largeobjecttransparency.dm" #include "code\datums\components\larva_queue.dm" +#include "code\datums\components\magazine_catcher.dm" #include "code\datums\components\mobile_power.dm" #include "code\datums\components\orbiter.dm" #include "code\datums\components\overlay_lighting.dm" @@ -540,11 +545,13 @@ #include "code\datums\keybinding\custom_emote.dm" #include "code\datums\keybinding\emote.dm" #include "code\datums\keybinding\human.dm" +#include "code\datums\keybinding\item_toggles.dm" #include "code\datums\keybinding\living.dm" #include "code\datums\keybinding\mecha.dm" #include "code\datums\keybinding\mob.dm" #include "code\datums\keybinding\movement.dm" #include "code\datums\keybinding\sectoid.dm" +#include "code\datums\keybinding\weapons.dm" #include "code\datums\keybinding\xeno.dm" #include "code\datums\loadout\loadout.dm" #include "code\datums\loadout\loadout_helper.dm" @@ -561,6 +568,25 @@ #include "code\datums\looping_sounds\miscellaneous.dm" #include "code\datums\looping_sounds\weather_sounds.dm" #include "code\datums\looping_sounds\xeno_sounds.dm" +#include "code\datums\quick_load\_quick_load.dm" +#include "code\datums\quick_load\beginner\_beginner.dm" +#include "code\datums\quick_load\beginner\corpsman.dm" +#include "code\datums\quick_load\beginner\engineer.dm" +#include "code\datums\quick_load\beginner\marine.dm" +#include "code\datums\quick_load\beginner\robot.dm" +#include "code\datums\quick_load\beginner\smartgunner.dm" +#include "code\datums\quick_load\som\_som.dm" +#include "code\datums\quick_load\som\engineer.dm" +#include "code\datums\quick_load\som\leader.dm" +#include "code\datums\quick_load\som\marine.dm" +#include "code\datums\quick_load\som\medic.dm" +#include "code\datums\quick_load\som\veteran.dm" +#include "code\datums\quick_load\tgmc\_tgmc.dm" +#include "code\datums\quick_load\tgmc\corpsman.dm" +#include "code\datums\quick_load\tgmc\engineer.dm" +#include "code\datums\quick_load\tgmc\leader.dm" +#include "code\datums\quick_load\tgmc\marine.dm" +#include "code\datums\quick_load\tgmc\smartgunner.dm" #include "code\datums\skins\_skin.dm" #include "code\datums\skins\drone.dm" #include "code\datums\skins\king.dm" @@ -1036,6 +1062,7 @@ #include "code\game\objects\machinery\telecomms\machines\receiver.dm" #include "code\game\objects\machinery\telecomms\machines\relay.dm" #include "code\game\objects\machinery\telecomms\machines\server.dm" +#include "code\game\objects\machinery\vending\beginner_vendor.dm" #include "code\game\objects\machinery\vending\loadout_vendor.dm" #include "code\game\objects\machinery\vending\marine_vending.dm" #include "code\game\objects\machinery\vending\new_marine_vendors.dm" @@ -1594,8 +1621,6 @@ #include "code\modules\mob\living\carbon\update_icons.dm" #include "code\modules\mob\living\carbon\human\death.dm" #include "code\modules\mob\living\carbon\human\dummy.dm" -#include "code\modules\mob\living\carbon\human\emote-yautja.dm" -#include "code\modules\mob\living\carbon\human\emote.dm" #include "code\modules\mob\living\carbon\human\examine.dm" #include "code\modules\mob\living\carbon\human\human.dm" #include "code\modules\mob\living\carbon\human\human_attackhand.dm" @@ -1611,10 +1636,13 @@ #include "code\modules\mob\living\carbon\human\login.dm" #include "code\modules\mob\living\carbon\human\logout.dm" #include "code\modules\mob\living\carbon\human\say.dm" -#include "code\modules\mob\living\carbon\human\species.dm" #include "code\modules\mob\living\carbon\human\update_icons.dm" #include "code\modules\mob\living\carbon\human\yautja.dm" #include "code\modules\mob\living\carbon\human\zombie.dm" +#include "code\modules\mob\living\carbon\human\emote\human.dm" +#include "code\modules\mob\living\carbon\human\emote\necoarc.dm" +#include "code\modules\mob\living\carbon\human\emote\robot.dm" +#include "code\modules\mob\living\carbon\human\emote\yautja.dm" #include "code\modules\mob\living\carbon\human\life\handle_disabilities.dm" #include "code\modules\mob\living\carbon\human\life\handle_environment.dm" #include "code\modules\mob\living\carbon\human\life\handle_fire.dm" @@ -1624,6 +1652,21 @@ #include "code\modules\mob\living\carbon\human\life\handle_regular_hud_updates.dm" #include "code\modules\mob\living\carbon\human\life\handle_status_effects.dm" #include "code\modules\mob\living\carbon\human\life\life_helpers.dm" +#include "code\modules\mob\living\carbon\human\species\_species.dm" +#include "code\modules\mob\living\carbon\human\species\early_synthetic.dm" +#include "code\modules\mob\living\carbon\human\species\hud_data.dm" +#include "code\modules\mob\living\carbon\human\species\human.dm" +#include "code\modules\mob\living\carbon\human\species\monkey.dm" +#include "code\modules\mob\living\carbon\human\species\moth.dm" +#include "code\modules\mob\living\carbon\human\species\necoarc.dm" +#include "code\modules\mob\living\carbon\human\species\robot.dm" +#include "code\modules\mob\living\carbon\human\species\sectoid.dm" +#include "code\modules\mob\living\carbon\human\species\skeleton.dm" +#include "code\modules\mob\living\carbon\human\species\synthetic.dm" +#include "code\modules\mob\living\carbon\human\species\unarmed_attack.dm" +#include "code\modules\mob\living\carbon\human\species\vatborn.dm" +#include "code\modules\mob\living\carbon\human\species\vatgrown.dm" +#include "code\modules\mob\living\carbon\human\species\yautja.dm" #include "code\modules\mob\living\carbon\xenomorph\abilities.dm" #include "code\modules\mob\living\carbon\xenomorph\attack_alien.dm" #include "code\modules\mob\living\carbon\xenomorph\charge_crush.dm" @@ -1727,6 +1770,8 @@ #include "code\modules\mob\living\carbon\xenomorph\castes\shrike\abilities_shrike.dm" #include "code\modules\mob\living\carbon\xenomorph\castes\shrike\castedatum_shrike.dm" #include "code\modules\mob\living\carbon\xenomorph\castes\shrike\shrike.dm" +#include "code\modules\mob\living\carbon\xenomorph\castes\spiderling\castedatum_spiderling.dm" +#include "code\modules\mob\living\carbon\xenomorph\castes\spiderling\spiderling.dm" #include "code\modules\mob\living\carbon\xenomorph\castes\spitter\abilities_spitter.dm" #include "code\modules\mob\living\carbon\xenomorph\castes\spitter\castedatum_spitter.dm" #include "code\modules\mob\living\carbon\xenomorph\castes\spitter\spitter.dm" @@ -1736,6 +1781,9 @@ #include "code\modules\mob\living\carbon\xenomorph\castes\warrior\abilities_warrior.dm" #include "code\modules\mob\living\carbon\xenomorph\castes\warrior\castedatum_warrior.dm" #include "code\modules\mob\living\carbon\xenomorph\castes\warrior\warrior.dm" +#include "code\modules\mob\living\carbon\xenomorph\castes\widow\abilities_widow.dm" +#include "code\modules\mob\living\carbon\xenomorph\castes\widow\castedatum_widow.dm" +#include "code\modules\mob\living\carbon\xenomorph\castes\widow\widow.dm" #include "code\modules\mob\living\silicon\death.dm" #include "code\modules\mob\living\silicon\say.dm" #include "code\modules\mob\living\silicon\silicon.dm" @@ -1782,6 +1830,7 @@ #include "code\modules\organs\organs.dm" #include "code\modules\organs\pain.dm" #include "code\modules\organs\wound.dm" +#include "code\modules\paperwork\beginner_tutorials.dm" #include "code\modules\paperwork\carbonpaper.dm" #include "code\modules\paperwork\clipboard.dm" #include "code\modules\paperwork\filingcabinet.dm" @@ -1834,9 +1883,12 @@ #include "code\modules\predator\yautja\weapons\one_handed.dm" #include "code\modules\predator\yautja\weapons\ranged.dm" #include "code\modules\predator\yautja\weapons\two_handed.dm" +#include "code\modules\projectiles\ammo_casing.dm" #include "code\modules\projectiles\ammunition.dm" +#include "code\modules\projectiles\big_ammo_box.dm" #include "code\modules\projectiles\gun_helpers.dm" #include "code\modules\projectiles\gun_system.dm" +#include "code\modules\projectiles\handful.dm" #include "code\modules\projectiles\mounted.dm" #include "code\modules\projectiles\projectile.dm" #include "code\modules\projectiles\sentries.dm" @@ -1917,18 +1969,27 @@ #include "code\modules\recycling\recycler.dm" #include "code\modules\recycling\sortingmachinery.dm" #include "code\modules\reqs\_supply.dm" -#include "code\modules\reqs\_supplypacks.dm" -#include "code\modules\reqs\armor.dm" -#include "code\modules\reqs\clothing.dm" -#include "code\modules\reqs\engineering.dm" -#include "code\modules\reqs\explosives.dm" -#include "code\modules\reqs\factory.dm" -#include "code\modules\reqs\imports.dm" -#include "code\modules\reqs\medical.dm" -#include "code\modules\reqs\operations.dm" -#include "code\modules\reqs\supplies.dm" -#include "code\modules\reqs\vehicles.dm" -#include "code\modules\reqs\weapons.dm" +#include "code\modules\reqs\computer.dm" +#include "code\modules\reqs\elevator.dm" +#include "code\modules\reqs\tablet.dm" +#include "code\modules\reqs\supplypacks\_supplypacks.dm" +#include "code\modules\reqs\supplypacks\armor.dm" +#include "code\modules\reqs\supplypacks\clothing.dm" +#include "code\modules\reqs\supplypacks\engineering.dm" +#include "code\modules\reqs\supplypacks\explosives.dm" +#include "code\modules\reqs\supplypacks\factory.dm" +#include "code\modules\reqs\supplypacks\imports.dm" +#include "code\modules\reqs\supplypacks\launchers.dm" +#include "code\modules\reqs\supplypacks\medical.dm" +#include "code\modules\reqs\supplypacks\operations.dm" +#include "code\modules\reqs\supplypacks\smartguns.dm" +#include "code\modules\reqs\supplypacks\stationary.dm" +#include "code\modules\reqs\supplypacks\supplies.dm" +#include "code\modules\reqs\supplypacks\vehicles.dm" +#include "code\modules\reqs\supplypacks\weapons.dm" +#include "code\modules\reqs\ui\_ui.dm" +#include "code\modules\reqs\ui\request.dm" +#include "code\modules\reqs\ui\vehicle.dm" #include "code\modules\reqtorio\assembly_crafts.dm" #include "code\modules\reqtorio\craft_components.dm" #include "code\modules\reqtorio\howtopaper.dm" diff --git a/tgui/packages/tgui-panel/chat/renderer.jsx b/tgui/packages/tgui-panel/chat/renderer.jsx index 0d26061f60b..72f5c78ab4d 100644 --- a/tgui/packages/tgui-panel/chat/renderer.jsx +++ b/tgui/packages/tgui-panel/chat/renderer.jsx @@ -5,7 +5,6 @@ */ import { EventEmitter } from 'common/events'; -import { classes } from 'common/react'; import { render } from 'react-dom'; import { Tooltip } from 'tgui/components'; import { createLogger } from 'tgui/logging'; @@ -107,10 +106,7 @@ const updateMessageBadge = (message) => { const foundBadge = node.querySelector('.Chat__badge'); const badge = foundBadge || document.createElement('div'); badge.textContent = times; - badge.className = classes(['Chat__badge', 'Chat__badge--animate']); - requestAnimationFrame(() => { - badge.className = 'Chat__badge'; - }); + badge.className = 'Chat__badge'; if (!foundBadge) { node.appendChild(badge); } @@ -311,11 +307,7 @@ class ChatRenderer { } } - getCombinableMessage(predicate) { - const now = Date.now(); - const len = this.visibleMessages.length; - const from = len - 1; - const to = Math.max(0, len - COMBINE_MAX_MESSAGES); + getCombinableMessage(predicate, now, from, to) { for (let i = from; i >= to; i--) { const message = this.visibleMessages[i]; @@ -349,10 +341,14 @@ class ChatRenderer { const fragment = document.createDocumentFragment(); const countByType = {}; let node; + + const len = this.visibleMessages.length; + const from = len - 1; + const to = Math.max(0, len - COMBINE_MAX_MESSAGES); for (let payload of batch) { const message = createMessage(payload); // Combine messages - const combinable = this.getCombinableMessage(message); + const combinable = this.getCombinableMessage(message, now, from, to); if (combinable) { combinable.times = (combinable.times || 1) + 1; updateMessageBadge(combinable); diff --git a/tgui/packages/tgui-panel/themes.ts b/tgui/packages/tgui-panel/themes.ts index a9443a70bfe..74970336782 100644 --- a/tgui/packages/tgui-panel/themes.ts +++ b/tgui/packages/tgui-panel/themes.ts @@ -59,6 +59,8 @@ export const setClientTheme = (name) => { 'github.text-color': '#000000', 'webmap.background-color': 'none', 'webmap.text-color': '#000000', + 'boosty.background-color': 'none', + 'boosty.text-color': '#000000', // Status and verb tabs 'output.background-color': 'none', 'output.text-color': '#000000', @@ -113,6 +115,8 @@ export const setClientTheme = (name) => { 'github.text-color': COLOR_DARK_TEXT, 'webmap.background-color': '#494949', 'webmap.text-color': COLOR_DARK_TEXT, + 'boosty.background-color': '#494949', + 'boosty.text-color': COLOR_DARK_TEXT, // Status and verb tabs 'output.background-color': COLOR_DARK_BG_DARKER, 'output.text-color': COLOR_DARK_TEXT, diff --git a/tgui/packages/tgui/interfaces/Cargo.jsx b/tgui/packages/tgui/interfaces/Cargo.jsx index dc66bd04534..950b496da18 100644 --- a/tgui/packages/tgui/interfaces/Cargo.jsx +++ b/tgui/packages/tgui/interfaces/Cargo.jsx @@ -21,6 +21,9 @@ import { Window } from '../layouts'; const category_icon = { Operations: 'parachute-box', Weapons: 'fighter-jet', + Smartguns: 'star', + Stationary: 'bolt', + Launchers: 'rocket', Explosives: 'bomb', Armor: 'hard-hat', Clothing: 'tshirt', diff --git a/tgui/packages/tgui/interfaces/Changelog.jsx b/tgui/packages/tgui/interfaces/Changelog.jsx index fc0ec60167c..7ad46b8ff99 100644 --- a/tgui/packages/tgui/interfaces/Changelog.jsx +++ b/tgui/packages/tgui/interfaces/Changelog.jsx @@ -26,16 +26,12 @@ const icons = { expansion: { icon: 'check-circle', color: 'green' }, experiment: { icon: 'radiation', color: 'yellow' }, image: { icon: 'image', color: 'green' }, - imageadd: { icon: 'tg-image-plus', color: 'green' }, - imagedel: { icon: 'tg-image-minus', color: 'red' }, qol: { icon: 'hand-holding-heart', color: 'green' }, refactor: { icon: 'tools', color: 'green' }, rscadd: { icon: 'check-circle', color: 'green' }, rscdel: { icon: 'times-circle', color: 'red' }, server: { icon: 'server', color: 'purple' }, sound: { icon: 'volume-high', color: 'green' }, - soundadd: { icon: 'tg-sound-plus', color: 'green' }, - sounddel: { icon: 'tg-sound-minus', color: 'red' }, map: { icon: 'map', color: 'green' }, spellcheck: { icon: 'spell-check', color: 'green' }, tgs: { icon: 'toolbox', color: 'purple' }, diff --git a/tgui/packages/tgui/interfaces/HiveStatus.tsx b/tgui/packages/tgui/interfaces/HiveStatus.tsx index 57771aa0032..3a6539a6ded 100644 --- a/tgui/packages/tgui/interfaces/HiveStatus.tsx +++ b/tgui/packages/tgui/interfaces/HiveStatus.tsx @@ -110,7 +110,7 @@ export const HiveStatus = (_props) => { diff --git a/tgui/packages/tgui/interfaces/PlayerPreferences/JobPreferences.tsx b/tgui/packages/tgui/interfaces/PlayerPreferences/JobPreferences.tsx index 62ba51463ee..23448557310 100644 --- a/tgui/packages/tgui/interfaces/PlayerPreferences/JobPreferences.tsx +++ b/tgui/packages/tgui/interfaces/PlayerPreferences/JobPreferences.tsx @@ -39,7 +39,7 @@ export const JobPreferences = (props) => { 'Requisitions Officer', 'Chief Medical Officer', 'Medical Doctor', - 'Medical Researcher', + 'Field Researcher', 'Assault Crewman', 'Transport Crewman', ]; diff --git a/tgui/packages/tgui/interfaces/PlayerPreferences/KeybindSettings.tsx b/tgui/packages/tgui/interfaces/PlayerPreferences/KeybindSettings.tsx index b40396fdf40..f7c8ca5a01c 100644 --- a/tgui/packages/tgui/interfaces/PlayerPreferences/KeybindSettings.tsx +++ b/tgui/packages/tgui/interfaces/PlayerPreferences/KeybindSettings.tsx @@ -141,6 +141,18 @@ export const KeybindSettings = (props) => { {all_keybindings['PSIONIC'] ?.filter(filterSearch) .map((kb) => )} + +

Items

+
+ {all_keybindings['WEAPON'] + ?.filter(filterSearch) + .map((kb) => )} + +

Items

+
+ {all_keybindings['ITEM'] + ?.filter(filterSearch) + .map((kb) => )} diff --git a/tools/UpdatePaths/scripts/telecomms.txt b/tools/UpdatePaths/scripts/telecomms.txt new file mode 100644 index 00000000000..78d78f394ca --- /dev/null +++ b/tools/UpdatePaths/scripts/telecomms.txt @@ -0,0 +1,20 @@ +/obj/machinery/telecomms/processor/preset_one : /obj/machinery/telecomms/processor/preset/one +/obj/machinery/telecomms/processor/preset_two : /obj/machinery/telecomms/processor/preset/two +/obj/machinery/telecomms/processor/preset_three : /obj/machinery/telecomms/processor/preset/three +/obj/machinery/telecomms/processor/preset_four : /obj/machinery/telecomms/processor/preset/four +/obj/machinery/telecomms/processor/preset_four/cicbackup : /obj/machinery/telecomms/processor/preset/four/cicbackup + +/obj/machinery/telecomms/bus/preset_one : /obj/machinery/telecomms/bus/preset/one +/obj/machinery/telecomms/bus/preset_two : /obj/machinery/telecomms/bus/preset/two +/obj/machinery/telecomms/bus/preset_three : /obj/machinery/telecomms/bus/preset/three +/obj/machinery/telecomms/bus/preset_four : /obj/machinery/telecomms/bus/preset/four +/obj/machinery/telecomms/bus/preset_four/cicbackup : /obj/machinery/telecomms/bus/preset/four/cicbackup + +/obj/machinery/telecomms/receiver/preset_left : /obj/machinery/telecomms/receiver/preset/left +/obj/machinery/telecomms/receiver/preset_right : /obj/machinery/telecomms/receiver/preset/right +/obj/machinery/telecomms/receiver/preset_right/cicbackup : /obj/machinery/telecomms/receiver/preset/left +/obj/machinery/telecomms/receiver/preset_right/som : /obj/machinery/telecomms/receiver/preset/left + +/obj/machinery/telecomms/broadcaster/preset_left : /obj/machinery/telecomms/broadcaster/preset/left +/obj/machinery/telecomms/broadcaster/preset_right : /obj/machinery/telecomms/broadcaster/preset/right +/obj/machinery/telecomms/broadcaster/preset_right/cicbackup : /obj/machinery/telecomms/broadcaster/preset/right/cicbackup diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php index 2424cefcf80..47f046c1fa2 100644 --- a/tools/WebhookProcessor/github_webhook_processor.php +++ b/tools/WebhookProcessor/github_webhook_processor.php @@ -43,8 +43,8 @@ // Only these repositories will announce in game. // Any repository that players actually care about. $game_announce_whitelist = array( - "tgstation", - "TerraGov-Marine-Corps", + "PMC-Unga-Marines", + "Unga-Marines", ); // Any repository that matches in this blacklist will not appear on Discord. @@ -187,7 +187,6 @@ function validate_user($payload) { $res = github_apisend('https://api.github.com/search/issues?q='.$querystring); $res = json_decode($res, TRUE); return $res['total_count'] >= (int)$validation_count; - } function get_labels($payload){ @@ -248,6 +247,8 @@ function tag_pr($payload, $opened) { $tags[] = 'Revert'; if(strpos(strtolower($title), 'removes') !== FALSE) $tags[] = 'Removal'; + if(strpos(strtolower($title), 'ports') !== FALSE) + $tags[] = 'Port'; } $remove = array('Test Merge Candidate'); @@ -258,7 +259,7 @@ function tag_pr($payload, $opened) { else if ($mergeable === FALSE) $tags[] = 'Merge Conflict'; - $treetags = array('_maps' => 'Map Edit', 'tools' => 'Tools', 'SQL' => 'SQL', '.github' => 'GitHub'); + $treetags = array('_maps' => 'Mapping', 'tools' => 'Tools', 'SQL' => 'SQL', '.github' => 'GitHub'); $addonlytags = array('icons' => 'Sprites', 'sound' => 'Sound', 'config' => 'Config Update', 'code/controllers/configuration/entries' => 'Config Update', 'tgui' => 'UI'); foreach($treetags as $tree => $tag) if(has_tree_been_edited($payload, $tree)) @@ -270,7 +271,6 @@ function tag_pr($payload, $opened) { $tags[] = $tag; check_tag_and_replace($payload, '[dnm]', 'Do Not Merge', $tags); - check_tag_and_replace($payload, '[no gbp]', 'GBP: No Update', $tags); return array($tags, $remove); } @@ -709,21 +709,14 @@ function checkchangelog($payload, $compile = true) { break; case 'qol': if($item != 'made something easier to use') { - $tags[] = 'Quality of Life'; + $tags[] = 'QoL'; $currentchangelogblock[] = array('type' => 'qol', 'body' => $item); } break; - case 'soundadd': + case 'sound': if($item != 'added a new sound thingy') { $tags[] = 'Sound'; - $currentchangelogblock[] = array('type' => 'soundadd', 'body' => $item); - } - break; - case 'sounddel': - if($item != 'removed an old sound thingy') { - $tags[] = 'Sound'; - $tags[] = 'Removal'; - $currentchangelogblock[] = array('type' => 'sounddel', 'body' => $item); + $currentchangelogblock[] = array('type' => 'sound', 'body' => $item); } break; case 'add': @@ -742,17 +735,10 @@ function checkchangelog($payload, $compile = true) { $currentchangelogblock[] = array('type' => 'rscdel', 'body' => $item); } break; - case 'imageadd': + case 'image': if($item != 'added some icons and images') { $tags[] = 'Sprites'; - $currentchangelogblock[] = array('type' => 'imageadd', 'body' => $item); - } - break; - case 'imagedel': - if($item != 'deleted some icons and images') { - $tags[] = 'Sprites'; - $tags[] = 'Removal'; - $currentchangelogblock[] = array('type' => 'imagedel', 'body' => $item); + $currentchangelogblock[] = array('type' => 'image', 'body' => $item); } break; case 'typo': @@ -768,6 +754,13 @@ function checkchangelog($payload, $compile = true) { $currentchangelogblock[] = array('type' => 'balance', 'body' => $item); } break; + case 'mapping': + case 'map': + if($item != 'added/modified/removed map content'){ + $tags[] = 'Mapping'; + $currentchangelogblock[] = array('type' => 'balance', 'body' => $item); + } + break; case 'code_imp': case 'code': if($item != 'changed some code'){ diff --git a/tools/WebhookProcessor/secret.php b/tools/WebhookProcessor/secret.php index 57773bffa16..8e18e728037 100644 --- a/tools/WebhookProcessor/secret.php +++ b/tools/WebhookProcessor/secret.php @@ -11,10 +11,10 @@ $apiKey = '209ab8d879c0f987d06a09b9d879c0f987d06a09b9d8787d0a089c'; //The repository auto-updates are sourced from. -$repoOwnerAndName = "tgstation/tgstation"; +$repoOwnerAndName = "PMC-Unga-Marines/Unga-Marines"; //Whitelist of repository names that have PRs auto-tagged -$repoAutoTaggerWhitelist = array("tgstation", "TerraGov-Marine-Corps"); +$repoAutoTaggerWhitelist = array("PMC-Unga-Marines", "Unga-Marines"); //Auto update settings $enable_live_tracking = true; //auto update this file from the repository