From 76783e0dc37bc4752f6e360f75201b397f857d2c Mon Sep 17 00:00:00 2001 From: githubuser4141 <61243846+githubuser4141@users.noreply.github.com> Date: Sat, 4 May 2024 18:48:48 +1200 Subject: [PATCH 01/68] Update wardrobes.dm --- code/modules/vending/wardrobes.dm | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index cb021aa0cb1..71ccf0f5b8a 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -36,7 +36,7 @@ refill_canister = /obj/item/vending_refill/wardrobe/sec_wardrobe payment_department = ACCOUNT_SEC cost_multiplier_per_dept = list(ACCOUNT_SEC = 0) - default_price = PRICE_ABOVE_NORMAL + default_price = PRICE_CHEAP extra_price = PRICE_EXPENSIVE /obj/item/vending_refill/wardrobe/sec_wardrobe @@ -74,6 +74,7 @@ /obj/item/storage/fancy/cigarettes = 5) premium = list(/obj/item/clothing/head/flatcap = 1) refill_canister = /obj/item/vending_refill/wardrobe/det_wardrobe + default_price = PRICE_CHEAP extra_price = 350 payment_department = ACCOUNT_SEC @@ -122,6 +123,7 @@ /obj/item/clothing/suit/toggle/labcoat/emt/red = 5, /obj/item/clothing/suit/toggle/labcoat/emt/highvis = 5) refill_canister = /obj/item/vending_refill/wardrobe/medi_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_MED cost_multiplier_per_dept = list(ACCOUNT_MED = 0) @@ -153,6 +155,7 @@ /obj/item/clothing/head/hardhat = 5, /obj/item/clothing/head/hardhat/weldhat = 3) refill_canister = /obj/item/vending_refill/wardrobe/engi_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_ENG cost_multiplier_per_dept = list(ACCOUNT_ENG = 0) @@ -176,6 +179,7 @@ /obj/item/clothing/under/rank/engineering/atmospheric_technician/skirt = 5, /obj/item/clothing/shoes/sneakers/black = 5) refill_canister = /obj/item/vending_refill/wardrobe/atmos_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_ENG cost_multiplier_per_dept = list(ACCOUNT_ENG = 0) @@ -199,6 +203,7 @@ /obj/item/clothing/head/soft = 5, /obj/item/radio/headset/headset_cargo = 3) refill_canister = /obj/item/vending_refill/wardrobe/cargo_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_CAR cost_multiplier_per_dept = list(ACCOUNT_CAR = 0) @@ -227,6 +232,7 @@ /obj/item/clothing/under/misc/mechsuitblue = 1) contraband = list(/obj/item/clothing/suit/hooded/techpriest = 2) refill_canister = /obj/item/vending_refill/wardrobe/robo_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_SCI cost_multiplier_per_dept = list(ACCOUNT_SCI = 0) @@ -268,6 +274,7 @@ /obj/item/clothing/under/misc/mechsuitwhite = 1, /obj/item/clothing/under/misc/mechsuitblue = 1) refill_canister = /obj/item/vending_refill/wardrobe/science_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_SCI cost_multiplier_per_dept = list(ACCOUNT_SCI = 0) @@ -289,6 +296,7 @@ /obj/item/clothing/under/rank/civilian/hydroponics/skirt = 5, /obj/item/clothing/mask/bandana = 4) refill_canister = /obj/item/vending_refill/wardrobe/hydro_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_SRV cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) @@ -315,6 +323,7 @@ /obj/item/clothing/glasses/regular/jamjar = 1, /obj/item/storage/bag/books = 1) refill_canister = /obj/item/vending_refill/wardrobe/curator_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_CIV cost_multiplier_per_dept = list(ACCOUNT_CIV = 0) @@ -350,6 +359,7 @@ /obj/item/clothing/neck/petcollar = 3, /obj/item/storage/belt/bandolier = 1) refill_canister = /obj/item/vending_refill/wardrobe/bar_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_SRV cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) @@ -376,6 +386,7 @@ /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2, /obj/item/book/granter/crafting_recipe/coldcooking = 2) refill_canister = /obj/item/vending_refill/wardrobe/chef_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_SRV cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) @@ -414,6 +425,7 @@ /obj/item/screwdriver = 2, /obj/item/stack/cable_coil/random = 4) refill_canister = /obj/item/vending_refill/wardrobe/jani_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_SRV cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) @@ -447,6 +459,7 @@ /obj/item/clothing/shoes/laceup = 3, /obj/item/clothing/accessory/lawyers_badge = 3) refill_canister = /obj/item/vending_refill/wardrobe/law_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_CIV cost_multiplier_per_dept = list(ACCOUNT_CIV = 0) @@ -474,6 +487,7 @@ /obj/item/storage/fancy/candle_box = 3) refill_canister = /obj/item/vending_refill/wardrobe/chap_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_CIV cost_multiplier_per_dept = list(ACCOUNT_CIV = 0) @@ -497,6 +511,7 @@ /obj/item/storage/bag/chemistry = 3, /obj/item/fermichem/pHbooklet = 3)//pH indicator) refill_canister = /obj/item/vending_refill/wardrobe/chem_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_MED cost_multiplier_per_dept = list(ACCOUNT_MED = 0) @@ -517,6 +532,7 @@ /obj/item/storage/backpack/genetics = 3, /obj/item/storage/backpack/satchel/gen = 3) refill_canister = /obj/item/vending_refill/wardrobe/gene_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_MED cost_multiplier_per_dept = list(ACCOUNT_MED = 0) @@ -539,6 +555,7 @@ /obj/item/storage/backpack/virology = 3, /obj/item/storage/backpack/satchel/vir = 3) refill_canister = /obj/item/vending_refill/wardrobe/viro_wardrobe + default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_MED cost_multiplier_per_dept = list(ACCOUNT_MED = 0) From 446a81d50b0aaa92e426f767150a7bd327d19593 Mon Sep 17 00:00:00 2001 From: githubuser4141 <61243846+githubuser4141@users.noreply.github.com> Date: Sat, 4 May 2024 19:14:52 +1200 Subject: [PATCH 02/68] Revert "Update wardrobes.dm" This reverts commit 76783e0dc37bc4752f6e360f75201b397f857d2c. --- code/modules/vending/wardrobes.dm | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 71ccf0f5b8a..cb021aa0cb1 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -36,7 +36,7 @@ refill_canister = /obj/item/vending_refill/wardrobe/sec_wardrobe payment_department = ACCOUNT_SEC cost_multiplier_per_dept = list(ACCOUNT_SEC = 0) - default_price = PRICE_CHEAP + default_price = PRICE_ABOVE_NORMAL extra_price = PRICE_EXPENSIVE /obj/item/vending_refill/wardrobe/sec_wardrobe @@ -74,7 +74,6 @@ /obj/item/storage/fancy/cigarettes = 5) premium = list(/obj/item/clothing/head/flatcap = 1) refill_canister = /obj/item/vending_refill/wardrobe/det_wardrobe - default_price = PRICE_CHEAP extra_price = 350 payment_department = ACCOUNT_SEC @@ -123,7 +122,6 @@ /obj/item/clothing/suit/toggle/labcoat/emt/red = 5, /obj/item/clothing/suit/toggle/labcoat/emt/highvis = 5) refill_canister = /obj/item/vending_refill/wardrobe/medi_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_MED cost_multiplier_per_dept = list(ACCOUNT_MED = 0) @@ -155,7 +153,6 @@ /obj/item/clothing/head/hardhat = 5, /obj/item/clothing/head/hardhat/weldhat = 3) refill_canister = /obj/item/vending_refill/wardrobe/engi_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_ENG cost_multiplier_per_dept = list(ACCOUNT_ENG = 0) @@ -179,7 +176,6 @@ /obj/item/clothing/under/rank/engineering/atmospheric_technician/skirt = 5, /obj/item/clothing/shoes/sneakers/black = 5) refill_canister = /obj/item/vending_refill/wardrobe/atmos_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_ENG cost_multiplier_per_dept = list(ACCOUNT_ENG = 0) @@ -203,7 +199,6 @@ /obj/item/clothing/head/soft = 5, /obj/item/radio/headset/headset_cargo = 3) refill_canister = /obj/item/vending_refill/wardrobe/cargo_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_CAR cost_multiplier_per_dept = list(ACCOUNT_CAR = 0) @@ -232,7 +227,6 @@ /obj/item/clothing/under/misc/mechsuitblue = 1) contraband = list(/obj/item/clothing/suit/hooded/techpriest = 2) refill_canister = /obj/item/vending_refill/wardrobe/robo_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_SCI cost_multiplier_per_dept = list(ACCOUNT_SCI = 0) @@ -274,7 +268,6 @@ /obj/item/clothing/under/misc/mechsuitwhite = 1, /obj/item/clothing/under/misc/mechsuitblue = 1) refill_canister = /obj/item/vending_refill/wardrobe/science_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_SCI cost_multiplier_per_dept = list(ACCOUNT_SCI = 0) @@ -296,7 +289,6 @@ /obj/item/clothing/under/rank/civilian/hydroponics/skirt = 5, /obj/item/clothing/mask/bandana = 4) refill_canister = /obj/item/vending_refill/wardrobe/hydro_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_SRV cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) @@ -323,7 +315,6 @@ /obj/item/clothing/glasses/regular/jamjar = 1, /obj/item/storage/bag/books = 1) refill_canister = /obj/item/vending_refill/wardrobe/curator_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_CIV cost_multiplier_per_dept = list(ACCOUNT_CIV = 0) @@ -359,7 +350,6 @@ /obj/item/clothing/neck/petcollar = 3, /obj/item/storage/belt/bandolier = 1) refill_canister = /obj/item/vending_refill/wardrobe/bar_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_SRV cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) @@ -386,7 +376,6 @@ /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2, /obj/item/book/granter/crafting_recipe/coldcooking = 2) refill_canister = /obj/item/vending_refill/wardrobe/chef_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_SRV cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) @@ -425,7 +414,6 @@ /obj/item/screwdriver = 2, /obj/item/stack/cable_coil/random = 4) refill_canister = /obj/item/vending_refill/wardrobe/jani_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_SRV cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) @@ -459,7 +447,6 @@ /obj/item/clothing/shoes/laceup = 3, /obj/item/clothing/accessory/lawyers_badge = 3) refill_canister = /obj/item/vending_refill/wardrobe/law_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_CIV cost_multiplier_per_dept = list(ACCOUNT_CIV = 0) @@ -487,7 +474,6 @@ /obj/item/storage/fancy/candle_box = 3) refill_canister = /obj/item/vending_refill/wardrobe/chap_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_CIV cost_multiplier_per_dept = list(ACCOUNT_CIV = 0) @@ -511,7 +497,6 @@ /obj/item/storage/bag/chemistry = 3, /obj/item/fermichem/pHbooklet = 3)//pH indicator) refill_canister = /obj/item/vending_refill/wardrobe/chem_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_MED cost_multiplier_per_dept = list(ACCOUNT_MED = 0) @@ -532,7 +517,6 @@ /obj/item/storage/backpack/genetics = 3, /obj/item/storage/backpack/satchel/gen = 3) refill_canister = /obj/item/vending_refill/wardrobe/gene_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_MED cost_multiplier_per_dept = list(ACCOUNT_MED = 0) @@ -555,7 +539,6 @@ /obj/item/storage/backpack/virology = 3, /obj/item/storage/backpack/satchel/vir = 3) refill_canister = /obj/item/vending_refill/wardrobe/viro_wardrobe - default_price = PRICE_REALLY_CHEAP payment_department = ACCOUNT_MED cost_multiplier_per_dept = list(ACCOUNT_MED = 0) From 270f5b35a30a9051fcbaa540f9cefc2adb37245f Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sun, 22 Sep 2024 18:01:35 +1200 Subject: [PATCH 03/68] Equipment V1 --- code/game/mecha/combat/combat.dm | 5 +- code/game/mecha/combat/gygax.dm | 1 - code/game/mecha/combat/marauder.dm | 11 +- code/game/mecha/combat/phazon.dm | 1702 ----------------- code/game/mecha/equipment/mecha_equipment.dm | 52 +- .../mecha/equipment/tools/medical_tools.dm | 11 - .../mecha/equipment/tools/mining_tools.dm | 6 - .../game/mecha/equipment/tools/other_tools.dm | 9 +- code/game/mecha/equipment/tools/work_tools.dm | 13 - code/game/mecha/equipment/weapons/weapons.dm | 14 +- code/game/mecha/fallout/armoured.dm | 30 + code/game/mecha/fallout/birds.dm | 303 +++ code/game/mecha/fallout/buggies.dm | 210 ++ code/game/mecha/fallout/carriages.dm | 101 + code/game/mecha/fallout/cars.dm | 99 + code/game/mecha/fallout/pickuptrucks.dm | 230 +++ code/game/mecha/fallout/trucks.dm | 167 ++ code/game/mecha/mecha.dm | 11 +- code/game/mecha/mecha_actions.dm | 9 +- code/game/mecha/mecha_topic.dm | 30 +- code/game/mecha/medical/medical.dm | 5 +- code/game/mecha/working/ripley.dm | 14 +- code/game/mecha/working/working.dm | 4 + hailmary.dme | 7 + 24 files changed, 1260 insertions(+), 1784 deletions(-) create mode 100644 code/game/mecha/fallout/armoured.dm create mode 100644 code/game/mecha/fallout/birds.dm create mode 100644 code/game/mecha/fallout/buggies.dm create mode 100644 code/game/mecha/fallout/carriages.dm create mode 100644 code/game/mecha/fallout/cars.dm create mode 100644 code/game/mecha/fallout/pickuptrucks.dm create mode 100644 code/game/mecha/fallout/trucks.dm diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 92e90c6d27a..a29c4c721c1 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -4,9 +4,12 @@ armor = ARMOR_VALUE_HEAVY mouse_pointer = 'icons/mecha/mecha_mouse.dmi' deflect_chance = 0 - max_equip = 4 stepsound = 'sound/mecha/neostep2.ogg' + max_weapons_equip = 3 + max_utility_equip = 1 + max_misc_equip = 2 + /obj/mecha/combat/proc/max_ammo() //Max the ammo stored for Nuke Ops mechs, or anyone else that calls this for(var/obj/item/I in equipment) if(istype(I, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/)) diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 4e81f0510bc..4200a63e885 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -29,7 +29,6 @@ max_temperature = 35000 leg_overload_coeff = 100 wreckage = /obj/structure/mecha_wreckage/gygax/dark - max_equip = 4 /obj/mecha/combat/gygax/dark/loaded/Initialize() . = ..() diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 825a3da6f41..d88ec6ffb00 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -52,7 +52,10 @@ wreckage = /obj/structure/mecha_wreckage/seraph internal_damage_threshold = 20 force = 65 - max_equip = 5 + + max_weapons_equip = 3 + max_utility_equip = 2 + max_misc_equip = 2 /obj/mecha/combat/marauder/seraph/Initialize() . = ..() @@ -74,7 +77,11 @@ name = "\improper Mauler" icon_state = "mauler" wreckage = /obj/structure/mecha_wreckage/mauler - max_equip = 5 + + max_weapons_equip = 3 + max_utility_equip = 2 + max_misc_equip = 2 + /obj/mecha/combat/marauder/mauler/loaded/Initialize() . = ..() diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 7d4ce7995ee..a14037ecb03 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -14,7 +14,6 @@ add_req_access = 1 internal_damage_threshold = 25 force = 15 - max_equip = 3 phase_state = "phazon-phase" /obj/mecha/combat/phazon/GrantActions(mob/living/user, human_occupant = 0) @@ -27,1704 +26,3 @@ ..() switch_damtype_action.Remove(user) phasing_action.Remove(user) - -//////////// VERTIBIRD ////////////// - -/obj/mecha/combat/phazon/vertibird - name = "\improper Vertibird" - desc = "A real useable, and working vertibird, maintained with luck, sweat, and ducktape. This one seems to be more focused toward combat." - icon = 'icons/mecha/vb-vertibird.dmi' - icon_state = "vb" - pixel_x = -138 - pixel_y = -138 - layer = ABOVE_MOB_LAYER - can_be_locked = TRUE - dna_lock - step_in = 0.6 - dir_in = 2 - normal_step_energy_drain = 0.75 - step_energy_drain = 0.75 - max_integrity = 150 - deflect_chance = 30 - armor = ARMOR_VALUE_LIGHT - max_temperature = 25000 - infra_luminosity = 1 - wreckage = /obj/structure/mecha_wreckage/vertibird - add_req_access = 1 - internal_damage_threshold = 25 - force = 15 - max_equip = 6 - opacity = 0 - canstrafe = TRUE - movement_type = FLYING - stepsound = 'sound/f13machines/vertibird_loop.ogg' - turnsound = 'sound/f13machines/vertibird_loop.ogg' - -/obj/structure/mecha_wreckage/vertibird - name = "\improper Vertibird Wreck" - desc = "Mayday, Mayday, Vertibird going down... IN STYLE." - icon = 'icons/mecha/vb-vertibird.dmi' - icon_state = "vb-broken" - pixel_x = -138 - pixel_y = -138 - -/obj/mecha/combat/phazon/vertibird/GrantActions(mob/living/user, human_occupant = 0) - internals_action.Grant(user, src) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - strafing_action.Grant(user, src) - zoom_action.Grant(user, src) - eject_action.Grant(user, src) - landing_action.Grant(user, src) - -/obj/mecha/combat/phazon/vertibird/RemoveActions(mob/living/user, human_occupant = 0) - internals_action.Remove(user) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - strafing_action.Remove(user) - zoom_action.Remove(user) - eject_action.Remove(user) - landing_action.Remove(user) - -/obj/mecha/combat/phazon/vertibird/obj_destruction() - for(var/mob/M in src) - to_chat(M, span_brass("The vertibird is going to crash!")) - M.dust() - playsound(src, 'sound//f13machines//vertibird_crash.ogg', 100, 0) - src.visible_message(span_userdanger("The reactor has gone critical, its going to blow!")) - addtimer(CALLBACK(src,.proc/go_critical),breach_time) - -/obj/mecha/combat/phazon/vertibird/proc/go_critical() - explosion(get_turf(loc)) - Destroy(src) - -/obj/mecha/combat/phazon/vertibird/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/medical/sleeper - ME.attach(src) - max_ammo() - -///NCR VERTIBIRD - -/obj/mecha/combat/phazon/vertibird/ncr - name = "\improper NCR Vertibird" - desc = "A real useable, and working vertibird, maintained with luck, sweat, and ducktape. This one seems to be more focused toward Troop transport, and his painted in the colors of the NCR." - icon = 'icons/mecha/vb-vertibird-ncr.dmi' - icon_state = "vb" - pixel_x = -138 - pixel_y = -138 - layer = ABOVE_MOB_LAYER - can_be_locked = TRUE - dna_lock - step_in = 0.8 - dir_in = 2 - normal_step_energy_drain = 0.7 - step_energy_drain = 0.7 - max_integrity = 200 - deflect_chance = 30 - armor = ARMOR_VALUE_LIGHT - max_temperature = 25000 - infra_luminosity = 1 - wreckage = /obj/structure/mecha_wreckage/vertibird - add_req_access = 1 - internal_damage_threshold = 25 - force = 15 - max_equip = 8 - opacity = 0 - canstrafe = TRUE - movement_type = FLYING - stepsound = 'sound/f13machines/vertibird_loop.ogg' - turnsound = 'sound/f13machines/vertibird_loop.ogg' - -/obj/mecha/combat/phazon/vertibird/ncr/GrantActions(mob/living/user, human_occupant = 0) - internals_action.Grant(user, src) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - strafing_action.Grant(user, src) - zoom_action.Grant(user, src) - eject_action.Grant(user, src) - smoke_action.Grant(user, src) - landing_action.Grant(user, src) - -/obj/mecha/combat/phazon/vertibird/ncr/RemoveActions(mob/living/user, human_occupant = 0) - internals_action.Remove(user) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - strafing_action.Remove(user) - zoom_action.Remove(user) - eject_action.Remove(user) - smoke_action.Remove(user) - landing_action.Remove(user) - -/obj/mecha/combat/phazon/vertibird/ncr/obj_destruction() - for(var/mob/M in src) - to_chat(M, span_brass("The vertibird is going to crash!")) - M.dust() - playsound(src, 'sound//f13machines//vertibird_crash.ogg', 100, 0) - src.visible_message(span_userdanger("The reactor has gone critical, its going to blow!")) - addtimer(CALLBACK(src,.proc/go_critical),breach_time) - -/obj/mecha/combat/phazon/vertibird/ncr/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/medical/sleeper - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/medical/sleeper - ME.attach(src) - max_ammo() - -///VERTIBIRD ENCLAVE - -/obj/mecha/combat/phazon/vertibird/enclave - name = "\improper Enclave Naval Vertibird" - desc = "A real useable, and working vertibird, maintained with luck, sweat, and ducktape. This one seems to be more focused toward combat, and be stored in a ship. Thats peak Enclave tech." - icon = 'icons/mecha/vb-vertibird-enclave.dmi' - icon_state = "vb" - pixel_x = -138 - pixel_y = -138 - layer = ABOVE_MOB_LAYER - can_be_locked = TRUE - dna_lock - step_in = 0.6 - dir_in = 2 - normal_step_energy_drain = 0.75 - step_energy_drain = 0.75 - max_integrity = 150 - deflect_chance = 30 - armor = ARMOR_VALUE_LIGHT - max_temperature = 25000 - infra_luminosity = 1 - wreckage = /obj/structure/mecha_wreckage/vertibird - add_req_access = 1 - internal_damage_threshold = 25 - force = 15 - max_equip = 6 - opacity = 0 - canstrafe = TRUE - movement_type = FLYING - stepsound = 'sound/f13machines/vertibird_loop.ogg' - turnsound = 'sound/f13machines/vertibird_loop.ogg' - -/obj/mecha/combat/phazon/vertibird/enclave/GrantActions(mob/living/user, human_occupant = 0) - internals_action.Grant(user, src) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - strafing_action.Grant(user, src) - zoom_action.Grant(user, src) - eject_action.Grant(user, src) - landing_action.Grant(user, src) - -/obj/mecha/combat/phazon/vertibird/enclave/RemoveActions(mob/living/user, human_occupant = 0) - internals_action.Remove(user) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - strafing_action.Remove(user) - zoom_action.Remove(user) - eject_action.Remove(user) - landing_action.Remove(user) - -/obj/mecha/combat/phazon/vertibird/enclave/obj_destruction() - for(var/mob/M in src) - to_chat(M, span_brass("The vertibird is going to crash!")) - M.dust() - playsound(src, 'sound//f13machines//vertibird_crash.ogg', 100, 0) - src.visible_message(span_userdanger("The reactor has gone critical, its going to blow!")) - addtimer(CALLBACK(src,.proc/go_critical),breach_time) - -/obj/mecha/combat/phazon/vertibird/enclave/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - max_ammo() - -/// BOS Vertibird - -/obj/mecha/combat/phazon/vertibird/brotherhood - name = "\improper Brotherhood Vertibird" - desc = "A real useable, and working vertibird, maintained with luck, sweat, and ducktape. This one seems to be more focused toward combat, and marked with brotherhood markings." - icon = 'icons/mecha/vb-vertibird-bos.dmi' - icon_state = "vb" - pixel_x = -138 - pixel_y = -138 - layer = ABOVE_MOB_LAYER - can_be_locked = TRUE - dna_lock - step_in = 0.6 - dir_in = 2 - normal_step_energy_drain = 0.75 - step_energy_drain = 0.75 - max_integrity = 150 - deflect_chance = 30 - armor = ARMOR_VALUE_LIGHT - max_temperature = 25000 - infra_luminosity = 1 - wreckage = /obj/structure/mecha_wreckage/vertibird - add_req_access = 1 - internal_damage_threshold = 25 - force = 15 - max_equip = 6 - opacity = 0 - canstrafe = TRUE - movement_type = FLYING - stepsound = 'sound/f13machines/vertibird_loop.ogg' - turnsound = 'sound/f13machines/vertibird_loop.ogg' - -/obj/mecha/combat/phazon/vertibird/brotherhood/GrantActions(mob/living/user, human_occupant = 0) - internals_action.Grant(user, src) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - strafing_action.Grant(user, src) - zoom_action.Grant(user, src) - eject_action.Grant(user, src) - landing_action.Grant(user, src) - -/obj/mecha/combat/phazon/vertibird/brotherhood/RemoveActions(mob/living/user, human_occupant = 0) - internals_action.Remove(user) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - strafing_action.Remove(user) - zoom_action.Remove(user) - eject_action.Remove(user) - landing_action.Remove(user) - -/obj/mecha/combat/phazon/vertibird/brotherhood/obj_destruction() - for(var/mob/M in src) - to_chat(M, span_brass("The vertibird is going to crash!")) - M.dust() - playsound(src, 'sound//f13machines//vertibird_crash.ogg', 100, 0) - src.visible_message(span_userdanger("The reactor has gone critical, it's going to blow!")) - addtimer(CALLBACK(src,.proc/go_critical),breach_time) - -/obj/mecha/combat/phazon/vertibird/brotherhood/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - max_ammo() - -///Legion balloon - -/obj/mecha/combat/phazon/vertibird/balloon - name = "\improper Legion Recon balloon" - desc = "The legion maybe doesn't have fancy birds, but will still by the will of Caesar, get wings... And hot air." - icon = 'icons/mecha/legionballoon.dmi' - icon_state = "legionballoon" - pixel_x = -138 - pixel_y = 0 - layer = ABOVE_MOB_LAYER - can_be_locked = TRUE - dna_lock - step_in = 4 - dir_in = 2 - step_energy_drain = 0.2 - max_integrity = 100 - deflect_chance = 0 - armor = ARMOR_VALUE_SALVAGE - max_temperature = 25000 - infra_luminosity = 1 - wreckage = /obj/structure/mecha_wreckage/vertibird - add_req_access = 1 - internal_damage_threshold = 25 - force = 15 - max_equip = 4 - opacity = 0 - canstrafe = TRUE - movement_type = FLYING - stepsound = 'sound/f13ambience/ambigen_15.ogg' - turnsound = 'sound/f13ambience/ambigen_15.ogg' - -/obj/mecha/combat/phazon/vertibird/balloon/GrantActions(mob/living/user, human_occupant = 0) - internals_action.Grant(user, src) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - strafing_action.Grant(user, src) - zoom_action.Grant(user, src) - eject_action.Grant(user, src) - smoke_action.Grant(user, src) - landing_action.Grant(user, src) - -/obj/mecha/combat/phazon/vertibird/balloon/RemoveActions(mob/living/user, human_occupant = 0) - internals_action.Remove(user) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - strafing_action.Remove(user) - zoom_action.Remove(user) - eject_action.Remove(user) - smoke_action.Remove(user) - landing_action.Remove(user) - -/obj/mecha/combat/phazon/vertibird/balloon/obj_destruction() - for(var/mob/M in src) - to_chat(M, " The balloon is going to crash!") - M.dust() - playsound(src, 'sound//f13machines//vertibird_crash.ogg', 100, 0) - src.visible_message("The balloon's burner is about to blow!") - addtimer(CALLBACK(src,.proc/go_critical),breach_time) - -/obj/mecha/combat/phazon/vertibird/balloon/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - -//////////// NCR TRUCK ////////////// - -/obj/mecha/combat/phazon/ncrtruck - name = "\improper NCR Truck" - desc = "A truck running on fuel. Nice eh? Still a wreck, though." - icon = 'icons/mecha/ncrtruck.dmi' - icon_state = "ncrtruck" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 0.9 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 600 - armor = ARMOR_VALUE_HEAVY - max_equip = 8 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/ncrtruck - var/list/cargo = new - var/cargo_capacity = 30 - var/hides = 0 - -/obj/structure/mecha_wreckage/ncrtruck - name = "\improper NCR Truck wreckage" - desc = "It's a truck! BROKEN TRUCK." - icon = 'icons/fallout/vehicles/medium_vehicles.dmi' - icon_state = "derelict" - -/obj/mecha/combat/phazon/ncrtruck/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/ncrtruck/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/ncrtruck/Destroy() - for(var/atom/movable/A in cargo) - A.forceMove(drop_location()) - step_rand(A) - cargo.Cut() - return ..() - -/obj/mecha/combat/phazon/ncrtruck/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/ncrtruck/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/ncrtruck/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//////////// NCR TRUCK MP ////////////// - -/obj/mecha/combat/phazon/ncrtruck/mp - name = "\improper NCR MP Truck" - desc = "A truck running on fuel. Nice eh? Still a wreck, though. This truck has been given to the NCR MPs, and has been modified to go a bit faster. But, it has less seats and is a bit less solid." - icon = 'icons/mecha/ncrtruck-mp.dmi' - icon_state = "ncrtruck" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 0.9 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 600 - armor = ARMOR_VALUE_HEAVY - max_equip = 4 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/ncrtruck - -/obj/mecha/combat/phazon/ncrtruck/mp/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/ncrtruck/mp/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/ncrtruck/mp/Destroy() - for(var/atom/movable/A in cargo) - A.forceMove(drop_location()) - step_rand(A) - cargo.Cut() - return ..() - -/obj/mecha/combat/phazon/ncrtruck/mp/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - sirens_action.Grant(user, src) - -/obj/mecha/combat/phazon/ncrtruck/mp/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - sirens_action.Remove(user) - -/obj/mecha/combat/phazon/ncrtruck/mp/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//Buggy - -/obj/mecha/combat/phazon/buggy - name = "\improper Buggy" - desc = "A light vehicle, not very powerful or solid, running on fuel." - icon = 'icons/mecha/buggy.dmi' - icon_state = "buggygreen" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 0.8 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 200 - armor = ARMOR_VALUE_LIGHT - max_equip = 2 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/structure/mecha_wreckage/buggy - name = "\improper Buggy wreckage" - desc = "Its a buggy! Won't bug you anymore." - icon_state = "buggy-broken" - -/obj/mecha/combat/phazon/buggy/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/buggy/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/buggy/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//Buggydune - -/obj/mecha/combat/phazon/buggy/dune - name = "\improper Buggy" - desc = "A light vehicle, not very powerful or solid, running on fuel." - icon = 'icons/mecha/buggy.dmi' - icon_state = "buggydune" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 0.8 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 200 - armor = ARMOR_VALUE_LIGHT - max_equip = 2 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/buggy/dune/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/dune/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/dune/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/buggy/dune/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/buggy/dune/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//Buggyred - -/obj/mecha/combat/phazon/buggy/red - name = "\improper Buggy" - desc = "A light vehicle, not very powerful or solid, running on fuel." - icon = 'icons/mecha/buggy.dmi' - icon_state = "buggyred" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 0.8 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 200 - armor = ARMOR_VALUE_LIGHT - max_equip = 2 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/buggy/red/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/red/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/red/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/buggy/red/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/buggy/red/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//Buggyblue - -/obj/mecha/combat/phazon/buggy/blue - name = "\improper Minutemen Buggy" - desc = "A light vehicle, not very powerful or solid, running on fuel." - icon = 'icons/mecha/buggy.dmi' - icon_state = "buggyblue" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 0.8 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 200 - armor = ARMOR_VALUE_LIGHT - max_equip = 2 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/buggy/blue/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/blue/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/blue/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/buggy/blue/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/buggy/blue/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//Buggyflame - -/obj/mecha/combat/phazon/buggy/flamme - name = "\improper Buggy" - desc = "A light vehicle, not very powerful or solid, running on fuel." - icon = 'icons/mecha/buggy.dmi' - icon_state = "buggyflame" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 0.8 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 200 - armor = ARMOR_VALUE_LIGHT - max_equip = 2 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/buggy/flamme/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/flamme/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/flamme/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/buggy/flamme/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/buggy/flamme/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//Buggy Ranger - -/obj/mecha/combat/phazon/buggy/ranger - name = "\improper Ranger Buggy" - desc = "A light vehicle, not very powerful or solid, running on fuel. This one has been recolored by the Rangers." - icon = 'icons/mecha/hanlonbuggy.dmi' - icon_state = "hanlonbuggy" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 0.8 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 200 - armor = ARMOR_VALUE_LIGHT - max_equip = 2 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/buggy/ranger/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/ranger/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/ranger/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/buggy/ranger/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/buggy/ranger/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//Buggy Ranger AND RICO - -/obj/mecha/combat/phazon/buggy/rangerarmed - name = "\improper Vet Ranger Buggy with gunner" - desc = "A light vehicle, not very powerful or solid, running on fuel. This one has been recolored by the Rangers... And Ranger Rico ''Gunner'' Davberger is gonna shoot with his shotgun." - icon = 'icons/mecha/buggyrangergun.dmi' - icon_state = "rangergun" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 1 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 200 - armor = ARMOR_VALUE_LIGHT - max_equip = 3 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/buggy/rangerarmed/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/rangerarmed/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/rangerarmed/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - smoke_action.Grant(user, src) - -/obj/mecha/combat/phazon/buggy/rangerarmed/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - smoke_action.Remove(user) - -/obj/mecha/combat/phazon/buggy/rangerarmed/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot - ME.attach(src) - max_ammo() - -//Legion Chariot - -/obj/mecha/combat/phazon/buggy/legion - name = "\improper Legion Chariot" - desc = "A light vehicle, not very powerful or solid, running on fuel... Okay, that's a lie. It's actually run on power generated by the horse... The fuel is here to make sure that some component of the buggy half works." - icon = 'icons/mecha/buggy-legion.dmi' - icon_state = "legionbuggy" - pixel_x = -18 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 1.2 - opacity = 0 - dir_in = 8 - step_energy_drain = 0.2 - max_temperature = 20000 - max_integrity = 250 - armor = ARMOR_VALUE_MEDIUM - max_equip = 2 - stepsound = 'sound/effects/footstep/gallop2.ogg' - turnsound = 'sound/effects/footstep/gallop1.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/buggy/legion/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/legion/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/legion/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/buggy/legion/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/buggy/legion/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//Buggy Legion AND MESALLA - -/obj/mecha/combat/phazon/buggy/legionarmed - name = "\improper Legion Chariot with gunner" - desc = "A light vehicle, not very powerful or solid, running on fuel... Okay, that's a lie. It's actually run on power generated by the horse...The fuel is here to make sure that some component of the buggy half works. This one has been recolored by the Legion... And Prime Decanus Messala ''Gunner'' Davius is gonna shoot with his shotgun." - icon = 'icons/mecha/buggy-legiongun.dmi' - icon_state = "legiongun" - pixel_x = -18 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 1.2 - opacity = 0 - dir_in = 8 - step_energy_drain = 0.2 - max_temperature = 20000 - max_integrity = 250 - armor = ARMOR_VALUE_MEDIUM - max_equip = 3 - stepsound = 'sound/effects/footstep/gallop2.ogg' - turnsound = 'sound/effects/footstep/gallop1.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/buggy/legionarmed/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/legionarmed/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/buggy/legionarmed/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - smoke_action.Grant(user, src) - -/obj/mecha/combat/phazon/buggy/legionarmed/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - smoke_action.Remove(user) - -/obj/mecha/combat/phazon/buggy/legionarmed/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot - ME.attach(src) - max_ammo() - -//Highwayman - -/obj/mecha/combat/phazon/highwayman - name = "\improper highwayman eco" - desc = "A fast vehicle, running on fuel. YUP! IT'S THE HIGHWAYMAN! Kinda. It's not the original, but a budget version." - icon = 'icons/mecha/highwayman.dmi' - icon_state = "highwayman" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 0.7 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 250 - armor = list("melee" = 30, "bullet" = 25, "laser" = 20, "energy" = 20, "bomb" = 40, "bio" = 0, "rad" = 100, "fire" = 100, "acid" = 100) - max_equip = 2 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/highwayman/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/highwayman/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/highwayman/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/highwayman/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/highwayman/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//corvega - -/obj/mecha/combat/phazon/corvega - name = "\improper Corvega" - desc = "A old vehicle, running on fuel." - icon = 'icons/mecha/corvega.dmi' - icon_state = "corvega" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 0.75 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 280 - armor = ARMOR_VALUE_MEDIUM - max_equip = 3 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/corvega/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/corvega/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/corvega/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/corvega/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/corvega/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//corvega police - -/obj/mecha/combat/phazon/corvega/police - name = "\improper Police Corvega" - desc = "A old vehicle, running on fuel. Seems to have been the proprety of the pre-war Yuma PD." - icon = 'icons/mecha/corvega-police.dmi' - icon_state = "corvega" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 0.75 - opacity = 0 - dir_in = 8 - step_energy_drain = 1.3 - max_temperature = 20000 - max_integrity = 280 - armor = ARMOR_VALUE_MEDIUM - max_equip = 3 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/corvega/police/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/corvega/police/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/corvega/police/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - sirens_action.Grant(user, src) - -/obj/mecha/combat/phazon/corvega/police/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - sirens_action.Remove(user) - -/obj/mecha/combat/phazon/corvega/police/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//pickuptruck - -/obj/mecha/combat/phazon/pickuptruck - name = "\improper pickup truck" - desc = "A old vehicle, running on fuel." - icon = 'icons/mecha/pickuptruck.dmi' - icon_state = "pickuptruck" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 1.4 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 300 - armor = ARMOR_VALUE_MEDIUM - max_equip = 4 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/pickuptruck/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/pickuptruck/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/pickuptruck/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/pickuptruck/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/pickuptruck/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//pickuptruck blue - -/obj/mecha/combat/phazon/pickuptruck/blue - name = "\improper pickup truck" - desc = "A old vehicle, running on fuel." - icon = 'icons/mecha/pickuptruck-blue.dmi' - icon_state = "pickuptruck" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 1.4 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 300 - armor = ARMOR_VALUE_MEDIUM - max_equip = 4 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/pickuptruck/blue/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/pickuptruck/blue/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/pickuptruck/blue/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/pickuptruck/blue/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/pickuptruck/blue/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//pickuptruck bos - -/obj/mecha/combat/phazon/pickuptruck/bos - name = "\improper BoS pickup truck" - desc = "A old vehicle, running on fuel." - icon = 'icons/mecha/pickuptruck-bos.dmi' - icon_state = "pickuptruck" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 1.4 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 300 - armor = ARMOR_VALUE_MEDIUM - max_equip = 4 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/pickuptruck/bos/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/pickuptruck/bos/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/pickuptruck/bos/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/pickuptruck/bos/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/pickuptruck/bos/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//pickuptruck bos AND Kiana - -/obj/mecha/combat/phazon/pickuptruck/bos/armed - name = "\improper BoS pickup truck with gunner" - desc = "A old vehicle, running on fuel. Its a modified brotherhood truck, with the addition of a laser rifle at the back, manned by Paladin Kiana Davberg. Consumes more fuel and is more fragile." - icon = 'icons/mecha/pickuptruck-gunbos.dmi' - icon_state = "pickuptruck" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 1.4 - opacity = 0 - dir_in = 8 - step_energy_drain = 1.5 - max_temperature = 20000 - max_integrity = 300 - armor = ARMOR_VALUE_MEDIUM - max_equip = 4 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/pickuptruck/bos/armed/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/pickuptruck/bos/armed/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/pickuptruck/bos/armed/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/pickuptruck/bos/armed/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/pickuptruck/bos/armed/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//truckcaravan - -/obj/mecha/combat/phazon/truckcaravan - name = "\improper Truck caravan" - desc = "A vehicle, not very powerful or solid, running on fuel... Okay, that's a lie. It's pulled by two brahmins...The fuel is here to make sure that some component of the buggy half works." - icon = 'icons/mecha/truckcaravan.dmi' - icon_state = "truckcaravan" - pixel_x = -20 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 1.6 - opacity = 0 - dir_in = 8 - step_energy_drain = 0.6 - max_temperature = 20000 - max_integrity = 250 - armor = ARMOR_VALUE_HEAVY - max_equip = 2 - stepsound = 'sound/effects/footstep/gallop2.ogg' - turnsound = 'sound/effects/footstep/gallop1.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/truckcaravan/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/truckcaravan/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/truckcaravan/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/truckcaravan/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/truckcaravan/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//pickuptruck mechanic - -/obj/mecha/combat/phazon/pickuptruck/mechanic - name = "\improper mechanic pickup truck" - desc = "A old vehicule, with a crane runing on fuel." - icon = 'icons/mecha/pickuptruck-mechanics.dmi' - icon_state = "pickuptruckmechanic" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 1.4 - opacity = 0 - dir_in = 8 - step_energy_drain = 0.6 - max_temperature = 20000 - max_integrity = 150 - armor = ARMOR_VALUE_HEAVY - max_equip = 4 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/pickuptruck/mechanic/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/pickuptruck/mechanic/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/pickuptruck/mechanic/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/pickuptruck/mechanic/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/pickuptruck/mechanic/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//jeep - -/obj/mecha/combat/phazon/jeep - name = "\improper pickup truck" - desc = "A old vehicule, runing on fuel." - icon = 'icons/mecha/jeep.dmi' - icon_state = "jeep" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 1.35 - opacity = 0 - dir_in = 8 - step_energy_drain = 0.6 - max_temperature = 20000 - max_integrity = 200 - armor = ARMOR_VALUE_HEAVY - max_equip = 4 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/jeep/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/jeep/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/jeep/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/jeep/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/jeep/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -//jeep Enclave - -/obj/mecha/combat/phazon/jeep/enclave - name = "\improper pickup truck" - desc = "A old military vehicule, runing on fuel., and recolored" - icon = 'icons/mecha/jeepenclave.dmi' - icon_state = "jeepenclave" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 1.35 - opacity = 0 - dir_in = 8 - step_energy_drain = 0.6 - max_temperature = 20000 - max_integrity = 200 - armor = ARMOR_VALUE_HEAVY - max_equip = 4 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/jeep/enclave/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/jeep/enclave/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/jeep/enclave/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/jeep/enclave/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/jeep/enclave/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - -///jeep BOS - -/obj/mecha/combat/phazon/jeep/bos - name = "\improper pickup truck" - desc = "A old military vehicule, runing on fuel, and recolored" - icon = 'icons/mecha/jeepbos.dmi' - icon_state = "jeepbos" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 1.35 - opacity = 0 - dir_in = 8 - step_energy_drain = 0.6 - max_temperature = 20000 - max_integrity = 200 - armor = ARMOR_VALUE_HEAVY - max_equip = 4 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/jeep/bos/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/jeep/bos/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/jeep/bos/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - -/obj/mecha/combat/phazon/jeep/bos/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - -/obj/mecha/combat/phazon/jeep/bos/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - - //Ambulance - -/obj/mecha/combat/phazon/ambulance - name = "\improper Ambulance" - desc = "A Modified vehicule made to carry people in need to a hospital." - icon = 'icons/mecha/ambulance.dmi' - icon_state = "ambulance" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 1.15 - opacity = 0 - dir_in = 8 - step_energy_drain = 0.6 - max_temperature = 20000 - max_integrity = 300 - armor = ARMOR_VALUE_HEAVY - max_equip = 5 - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - -/obj/mecha/combat/phazon/ambulance/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/ambulance/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - - -/obj/mecha/combat/phazon/ambulance/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) - sirens_action.Grant(user, src) - -/obj/mecha/combat/phazon/ambulance/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) - sirens_action.Remove(user) - -/obj/mecha/combat/phazon/ambulance/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/medical/sleeper - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/medical/sleeper - ME.attach(src) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index de211d0daa9..d3d004ec20a 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -1,6 +1,10 @@ //DO NOT ADD MECHA PARTS TO THE GAME WITH THE DEFAULT "SPRITE ME" SPRITE! //I'm annoyed I even have to tell you this! SPRITE FIRST, then commit. +#define EQUIP_WEAPON "weapon" +#define EQUIP_UTILITY "utility" +#define EQUIP_MISC "misc" + /obj/item/mecha_parts/mecha_equipment name = "mecha equipment" icon = 'icons/mecha/mecha_equipment.dmi' @@ -20,6 +24,7 @@ var/selectable = 1 // Set to 0 for passive equipment such as mining scanner or armor plates var/harmful = FALSE //Controls if equipment can be used to attack by a pacifist. //var/destroy_sound = 'sound/mecha/critdestr.ogg' + var/equip_type = EQUIP_UTILITY /obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page() if(chassis) @@ -118,11 +123,26 @@ if(!chassis || chassis.loc != C || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir)) return 0 -/obj/item/mecha_parts/mecha_equipment/proc/can_attach(obj/mecha/M) - if(M.equipment.len The balloon is going to crash!") + M.dust() + playsound(src, 'sound//f13machines//vertibird_crash.ogg', 100, 0) + src.visible_message("The balloon's burner is about to blow!") + addtimer(CALLBACK(src,.proc/go_critical),breach_time) + +/obj/mecha/combat/phazon/vertibird/balloon/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat \ No newline at end of file diff --git a/code/game/mecha/fallout/buggies.dm b/code/game/mecha/fallout/buggies.dm new file mode 100644 index 00000000000..5b3a928a094 --- /dev/null +++ b/code/game/mecha/fallout/buggies.dm @@ -0,0 +1,210 @@ +//Buggy + +/obj/mecha/combat/phazon/buggy + name = "\improper Buggy" + desc = "A light vehicle, not very powerfull or solid, running on a powercell." + icon = 'icons/mecha/buggy.dmi' + icon_state = "buggygreen" + pixel_x = -15 + pixel_y = -5 + max_integrity = 200 + step_in = 0.8 + armor = ARMOR_VALUE_LIGHT + stepsound = 'sound/f13machines/buggy_loop.ogg' + turnsound = 'sound/f13machines/buggy_loop.ogg' + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/structure/mecha_wreckage/buggy + name = "\improper Buggy wreckage" + desc = "Its a buggy ! Won't bug you anymore." + icon_state = "buggy-broken" + +/obj/mecha/combat/phazon/buggy/go_out() + ..() + update_icon() + +/obj/mecha/combat/phazon/buggy/moved_inside(mob/living/carbon/human/H) + ..() + update_icon() + +/obj/mecha/combat/phazon/buggy/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + +/obj/mecha/combat/phazon/buggy/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + +/obj/mecha/combat/phazon/buggy/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//Buggydune + +/obj/mecha/combat/phazon/buggy/dune + name = "\improper Buggy" + desc = "A light vehicle, not very powerfull or solid, running on a powercell." + icon = 'icons/mecha/buggy.dmi' + icon_state = "buggydune" + max_integrity = 200 + armor = ARMOR_VALUE_LIGHT + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/mecha/combat/phazon/buggy/dune/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//Buggyred + +/obj/mecha/combat/phazon/buggy/red + name = "\improper Buggy" + desc = "A light vehicle, not very powerfull or solid, running on a powercell." + icon = 'icons/mecha/buggy.dmi' + icon_state = "buggyred" + max_integrity = 200 + armor = ARMOR_VALUE_LIGHT + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/mecha/combat/phazon/buggy/red/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//Buggyflame + +/obj/mecha/combat/phazon/buggy/flamme + name = "\improper Buggy" + desc = "A light vehicle, not very powerfull or solid, running on a powercell." + icon = 'icons/mecha/buggy.dmi' + icon_state = "buggyflame" + max_integrity = 200 + armor = ARMOR_VALUE_LIGHT + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/mecha/combat/phazon/buggy/flamme/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//Buggy Ranger + +/obj/mecha/combat/phazon/buggy/ranger + name = "\improper Ranger Buggy" + desc = "A light vehicle, not very powerfull or solid, running on a powercell. This one as been recolored by the Rangers." + icon = 'icons/mecha/hanlonbuggy.dmi' + icon_state = "hanlonbuggy" + max_integrity = 200 + armor = ARMOR_VALUE_LIGHT + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/mecha/combat/phazon/buggy/ranger/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//Buggy Ranger AND RICO + +/obj/mecha/combat/phazon/buggy/rangerarmed + name = "\improper Vet Ranger Buggy with gunner" + desc = "A light vehicle, not very powerfull or solid, running on a powercell. This one as been recolored by the Rangers... And Ranger Rico ''Gunner'' Davberger is gonna shoot with his shotgun." + icon = 'icons/mecha/buggyrangergun.dmi' + icon_state = "rangergun" + max_integrity = 200 + armor = ARMOR_VALUE_LIGHT + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/mecha/combat/phazon/buggy/rangerarmed/go_out() + ..() + update_icon() + +/obj/mecha/combat/phazon/buggy/rangerarmed/moved_inside(mob/living/carbon/human/H) + ..() + update_icon() + +/obj/mecha/combat/phazon/buggy/rangerarmed/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + smoke_action.Grant(user, src) + +/obj/mecha/combat/phazon/buggy/rangerarmed/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + smoke_action.Remove(user) + +/obj/mecha/combat/phazon/buggy/rangerarmed/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot + ME.attach(src) + max_ammo() + +//Buggyblue + +/obj/mecha/combat/phazon/buggy/blue + name = "\improper Minutemen Buggy" + desc = "A light vehicle, not very powerful or solid, running on fuel." + icon = 'icons/mecha/buggy.dmi' + icon_state = "buggyblue" + pixel_x = -15 + pixel_y = 0 + can_be_locked = TRUE + dna_lock + step_in = 0.8 + opacity = 0 + dir_in = 8 + step_energy_drain = 1 + max_temperature = 20000 + max_integrity = 200 + armor = ARMOR_VALUE_LIGHT + stepsound = 'sound/f13machines/buggy_loop.ogg' + turnsound = 'sound/f13machines/buggy_loop.ogg' + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/mecha/combat/phazon/buggy/blue/go_out() + ..() + update_icon() + +/obj/mecha/combat/phazon/buggy/blue/moved_inside(mob/living/carbon/human/H) + ..() + update_icon() + +/obj/mecha/combat/phazon/buggy/blue/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + +/obj/mecha/combat/phazon/buggy/blue/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + +/obj/mecha/combat/phazon/buggy/blue/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) diff --git a/code/game/mecha/fallout/carriages.dm b/code/game/mecha/fallout/carriages.dm new file mode 100644 index 00000000000..82ff2251434 --- /dev/null +++ b/code/game/mecha/fallout/carriages.dm @@ -0,0 +1,101 @@ +//Legion Chariot + +/obj/mecha/combat/phazon/buggy/legion + name = "\improper Legion Chariot" + desc = "A light vehicle, not very powerfull or solid, running on a power cell... Okay, its a lie. Its actually run on power generated by the horse...The cell is here to make sure that some componant of the half buggy pulled by horses works." + icon = 'icons/mecha/buggy-legion.dmi' + icon_state = "legionbuggy" + pixel_x = -18 + pixel_y = 0 + max_integrity = 250 + step_energy_drain = 0.8 + step_in = 1.2 + armor = ARMOR_VALUE_HEAVY + stepsound = 'sound/effects/footstep/gallop2.ogg' + turnsound = 'sound/effects/footstep/gallop1.ogg' + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/mecha/combat/phazon/buggy/legion/go_out() + ..() + update_icon() + +/obj/mecha/combat/phazon/buggy/legion/moved_inside(mob/living/carbon/human/H) + ..() + update_icon() + +/obj/mecha/combat/phazon/buggy/legion/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + +/obj/mecha/combat/phazon/buggy/legion/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + +/obj/mecha/combat/phazon/buggy/legion/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//Buggy Legion AND MESALLA + +/obj/mecha/combat/phazon/buggy/legionarmed + name = "\improper Legion Chariot with gunner" + desc = "A light vehicle, not very powerfull or solid, running on a power cell... Okay, its a lie. Its actually run on power generated by the horse...The cell is here to make sure that some componant of the half buggy pulled by horses works. This one as been recolored by the legions... And Prime Decanus Messala ''Gunner'' Davius is gonna shoot with his shotgun." + icon = 'icons/mecha/buggy-legiongun.dmi' + icon_state = "legiongun" + max_integrity = 250 + step_energy_drain = 0.8 + step_in = 1.2 + armor = ARMOR_VALUE_HEAVY + +/obj/mecha/combat/phazon/buggy/legionarmed/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + smoke_action.Grant(user, src) + +/obj/mecha/combat/phazon/buggy/legionarmed/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + smoke_action.Remove(user) + +/obj/mecha/combat/phazon/buggy/legionarmed/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot + ME.attach(src) + max_ammo() + +//truckcaravan + +/obj/mecha/combat/phazon/truckcaravan + name = "\improper Truck caravan" + desc = "A vehicle, not very powerfull or solid, running on a power cell... Okay, its a lie. Its pulled by two brahmins...The cell is here to make sure that some componant of the half buggy pulled by brahmins works." + icon = 'icons/mecha/truckcaravan.dmi' + icon_state = "truckcaravan" + pixel_x = -20 + pixel_y = 0 + max_integrity = 250 + step_in = 1.6 + step_energy_drain = 0.8 + armor = ARMOR_VALUE_HEAVY + +/obj/mecha/combat/phazon/truckcaravan/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) \ No newline at end of file diff --git a/code/game/mecha/fallout/cars.dm b/code/game/mecha/fallout/cars.dm new file mode 100644 index 00000000000..67eef535aec --- /dev/null +++ b/code/game/mecha/fallout/cars.dm @@ -0,0 +1,99 @@ +//Highwayman + +/obj/mecha/combat/phazon/highwayman + name = "\improper highwayman eco" + desc = "A fast vehicule, runing on powercell. YUP ! ITS THE HIGHWAYMAN ! Kinda. Its not the original, but a budget version." + icon = 'icons/mecha/highwayman.dmi' + icon_state = "highwayman" + pixel_x = -16 + pixel_y = -5 + max_integrity = 250 + step_energy_drain = 1 + step_in = 0.7 + armor = ARMOR_VALUE_MEDIUM + stepsound = 'sound/f13machines/buggy_loop.ogg' + turnsound = 'sound/f13machines/buggy_loop.ogg' + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/mecha/combat/phazon/highwayman/go_out() + ..() + update_icon() + +/obj/mecha/combat/phazon/highwayman/moved_inside(mob/living/carbon/human/H) + ..() + update_icon() + +/obj/mecha/combat/phazon/highwayman/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + +/obj/mecha/combat/phazon/highwayman/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + +/obj/mecha/combat/phazon/highwayman/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//corvega + +/obj/mecha/combat/phazon/corvega + name = "\improper Corvega" + desc = "A old vehicule, runing on powercell." + icon = 'icons/mecha/corvega.dmi' + icon_state = "corvega" + max_integrity = 280 + armor = ARMOR_VALUE_MEDIUM + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/mecha/combat/phazon/corvega/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//corvega police + +/obj/mecha/combat/phazon/corvega/police + name = "\improper Police Corvega" + desc = "A old vehicule, runing on powercell. Seems to have been the proprety of the PreWar Yuma PD." + icon = 'icons/mecha/corvega-police.dmi' + icon_state = "corvega" + max_integrity = 280 + step_energy_drain = 1.3 + armor = ARMOR_VALUE_MEDIUM + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/mecha/combat/phazon/corvega/police/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + sirens_action.Grant(user, src) + +/obj/mecha/combat/phazon/corvega/police/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + sirens_action.Remove(user) + +/obj/mecha/combat/phazon/corvega/police/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) \ No newline at end of file diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm new file mode 100644 index 00000000000..a8ca1888e6e --- /dev/null +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -0,0 +1,230 @@ +//pickuptruck + +/obj/mecha/combat/phazon/pickuptruck + name = "\improper pickup truck" + desc = "A old vehicule, runing on powercell." + icon = 'icons/mecha/pickuptruck.dmi' + icon_state = "pickuptruck" + pixel_x = -17 + pixel_y = -3 + max_integrity = 300 + step_in = 1.4 + step_energy_drain = 1.5 + armor = ARMOR_VALUE_MEDIUM + stepsound = 'sound/f13machines/buggy_loop.ogg' + turnsound = 'sound/f13machines/buggy_loop.ogg' + wreckage = /obj/structure/mecha_wreckage/buggy + + max_weapons_equip = 1 + max_utility_equip = 3 + max_misc_equip = 1 + +/obj/mecha/combat/phazon/pickuptruck/go_out() + ..() + update_icon() + +/obj/mecha/combat/phazon/pickuptruck/moved_inside(mob/living/carbon/human/H) + ..() + update_icon() + +/obj/mecha/combat/phazon/pickuptruck/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + +/obj/mecha/combat/phazon/pickuptruck/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + +/obj/mecha/combat/phazon/pickuptruck/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//pickuptruck blue + +/obj/mecha/combat/phazon/pickuptruck/blue + name = "\improper pickup truck" + desc = "A old vehicule, runing on powercell." + icon = 'icons/mecha/pickuptruck-blue.dmi' + icon_state = "pickuptruck" + max_integrity = 300 + armor = ARMOR_VALUE_MEDIUM + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/mecha/combat/phazon/pickuptruck/blue/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//pickuptruck bos + +/obj/mecha/combat/phazon/pickuptruck/bos + name = "\improper BoS pickup truck" + desc = "A old vehicule, runing on powercell." + icon = 'icons/mecha/pickuptruck-bos.dmi' + icon_state = "pickuptruck" + max_integrity = 300 + armor = ARMOR_VALUE_MEDIUM + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/mecha/combat/phazon/pickuptruck/bos/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//pickuptruck bos AND Kiana + +/obj/mecha/combat/phazon/pickuptruck/bos/armed + name = "\improper BoS pickup truck with gunner" + desc = "A old vehicule, runing on powercell. Its a A modified brotherhood truck, with the addition of a laser rifle at the back, maned by Paladin Kiana Davberg." + icon = 'icons/mecha/pickuptruck-gunbos.dmi' + icon_state = "pickuptruck" + max_integrity = 300 + armor = ARMOR_VALUE_MEDIUM + wreckage = /obj/structure/mecha_wreckage/buggy + +/obj/mecha/combat/phazon/pickuptruck/bos/armed/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy + ME.attach(src) + +//pickuptruck mechanic + +/obj/mecha/combat/phazon/pickuptruck/mechanic + name = "\improper mechanic pickup truck" + desc = "A old vehicule, with a crane runing on fuel." + icon = 'icons/mecha/pickuptruck-mechanics.dmi' + icon_state = "pickuptruckmechanic" + step_in = 1.4 + step_energy_drain = 0.6 + max_integrity = 150 + armor = ARMOR_VALUE_HEAVY + + max_weapons_equip = 1 + max_utility_equip = 4 + max_misc_equip = 1 + +/obj/mecha/combat/phazon/pickuptruck/mechanic/go_out() + ..() + update_icon() + +/obj/mecha/combat/phazon/pickuptruck/mechanic/moved_inside(mob/living/carbon/human/H) + ..() + update_icon() + +/obj/mecha/combat/phazon/pickuptruck/mechanic/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + +/obj/mecha/combat/phazon/pickuptruck/mechanic/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + +/obj/mecha/combat/phazon/pickuptruck/mechanic/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//jeep + +/obj/mecha/combat/phazon/jeep + name = "\improper pickup truck" + desc = "A old vehicule, runing on fuel." + icon = 'icons/mecha/jeep.dmi' + icon_state = "jeep" + pixel_x = -15 + pixel_y = 0 + step_in = 1.35 + step_energy_drain = 0.6 + max_integrity = 200 + armor = ARMOR_VALUE_HEAVY + stepsound = 'sound/f13machines/buggy_loop.ogg' + turnsound = 'sound/f13machines/buggy_loop.ogg' + wreckage = /obj/structure/mecha_wreckage/buggy + + max_weapons_equip = 1 + max_utility_equip = 3 + max_misc_equip = 1 + +/obj/mecha/combat/phazon/jeep/go_out() + ..() + update_icon() + +/obj/mecha/combat/phazon/jeep/moved_inside(mob/living/carbon/human/H) + ..() + update_icon() + +/obj/mecha/combat/phazon/jeep/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + +/obj/mecha/combat/phazon/jeep/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + +/obj/mecha/combat/phazon/jeep/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//jeep Enclave + +/obj/mecha/combat/phazon/jeep/enclave + name = "\improper pickup truck" + desc = "A old military vehicule, runing on fuel., and recolored" + icon = 'icons/mecha/jeepenclave.dmi' + icon_state = "jeepenclave" + +///jeep BOS + +/obj/mecha/combat/phazon/jeep/bos + name = "\improper pickup truck" + desc = "A old military vehicule, runing on fuel, and recolored" + icon = 'icons/mecha/jeepbos.dmi' + icon_state = "jeepbos" diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm new file mode 100644 index 00000000000..d0c7cebe11e --- /dev/null +++ b/code/game/mecha/fallout/trucks.dm @@ -0,0 +1,167 @@ +//////////// NCR TRUCK ////////////// + +/obj/mecha/combat/phazon/ncrtruck + name = "\improper NCR Truck" + desc = "A truck running on powercells. Nice eh ? still a wreck." + icon = 'icons/mecha/ncrtruck.dmi' + icon_state = "ncrtruck" + pixel_x = -22 + pixel_y = -5 + max_integrity = 600 + step_in = 1 + armor = ARMOR_VALUE_MEDIUM + step_energy_drain = 0.6 + stepsound = 'sound/f13machines/buggy_loop.ogg' + turnsound = 'sound/f13machines/buggy_loop.ogg' + wreckage = /obj/structure/mecha_wreckage/ncrtruck + var/list/cargo = new + var/cargo_capacity = 30 + var/hides = 0 + + max_weapons_equip = 1 + max_utility_equip = 8 + max_misc_equip = 1 + +/obj/structure/mecha_wreckage/ncrtruck + name = "\improper NCR Truck wreckage" + desc = "Its a truck ! BROKEN TRUCK." + icon = 'icons/fallout/vehicles/medium_vehicles.dmi' + icon_state = "derelict" + +/obj/mecha/combat/phazon/ncrtruck/go_out() + ..() + update_icon() + +/obj/mecha/combat/phazon/ncrtruck/moved_inside(mob/living/carbon/human/H) + ..() + update_icon() + +/obj/mecha/combat/phazon/ncrtruck/Destroy() + for(var/atom/movable/A in cargo) + A.forceMove(drop_location()) + step_rand(A) + cargo.Cut() + return ..() + +/obj/mecha/combat/phazon/ncrtruck/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + strafing_action.Grant(user, src) + +/obj/mecha/combat/phazon/ncrtruck/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + strafing_action.Remove(user, src) + +/obj/mecha/combat/phazon/ncrtruck/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + +//////////// NCR TRUCK MP ////////////// + +/obj/mecha/combat/phazon/ncrtruck/mp + name = "\improper NCR MP Truck" + desc = "A truck running on powercells. Nice eh ? still a wreck. This Truck has been given to the NCR MPs, the running gear has been improved." + icon = 'icons/mecha/ncrtruck-mp.dmi' + icon_state = "ncrtruck" + max_integrity = 600 + step_in = 0.8 + armor = ARMOR_VALUE_MEDIUM + wreckage = /obj/structure/mecha_wreckage/ncrtruck + +/obj/mecha/combat/phazon/ncrtruck/mp/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + sirens_action.Grant(user, src) + +/obj/mecha/combat/phazon/ncrtruck/mp/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + sirens_action.Remove(user) + +/obj/mecha/combat/phazon/ncrtruck/mp/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + + //Ambulance + +/obj/mecha/combat/phazon/ambulance + name = "\improper Ambulance" + desc = "A Modified vehicule made to carry people in need to a hospital." + icon = 'icons/mecha/ambulance.dmi' + icon_state = "ambulance" + step_in = 1.15 + max_integrity = 300 + + max_weapons_equip = 1 + max_utility_equip = 5 + max_misc_equip = 1 + +/obj/mecha/combat/phazon/ambulance/go_out() + ..() + update_icon() + +/obj/mecha/combat/phazon/ambulance/moved_inside(mob/living/carbon/human/H) + ..() + update_icon() + + +/obj/mecha/combat/phazon/ambulance/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + sirens_action.Grant(user, src) + +/obj/mecha/combat/phazon/ambulance/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + sirens_action.Remove(user) + +/obj/mecha/combat/phazon/ambulance/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/medical/sleeper + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/medical/sleeper + ME.attach(src) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index afcaf470d86..f304a71c8cf 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -92,9 +92,16 @@ var/list/equipment = new var/obj/item/mecha_parts/mecha_equipment/selected - var/max_equip = 3 var/datum/events/events + var/max_utility_equip = 3 // Seats, clamps, etc. + var/max_weapons_equip = 1 // Weapons, duh. + var/max_misc_equip = 1 // Anything that isn't a utility or a weapon. + + var/list/weapon_equipment = new + var/list/utility_equipment = new + var/list/misc_equipment = new + var/stepsound = 'sound/mecha/mechstep.ogg' var/turnsound = 'sound/mecha/mechturn.ogg' var/attacksound = 'sound/weapons/punch4.ogg' @@ -195,7 +202,7 @@ return fuel_holder /obj/mecha/rust_heretic_act() - take_damage(50, BRUTE) + take_damage(50, BRUTE) /obj/mecha/Destroy() if(occupant) diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index d6f85f06a21..2eedd4f7e5e 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -8,10 +8,9 @@ if(haslights) lights_action.Grant(user, src) stats_action.Grant(user, src) - if(canstrafe) + if(strafing_flags) strafing_action.Grant(user, src) - /obj/mecha/proc/RemoveActions(mob/living/user, human_occupant = 0) if(human_occupant) eject_action.Remove(user) @@ -160,10 +159,10 @@ return TRUE /obj/mecha/proc/toggle_strafe() - strafe = !strafe + strafing = !strafing - occupant_message("Toggled strafing mode [strafe?"on":"off"].") - mecha_log_message("Toggled strafing mode [strafe?"on":"off"].") + occupant_message("Toggled strafing mode [strafing?"on":"off"].") + mecha_log_message("Toggled strafing mode [strafing?"on":"off"].") strafing_action.UpdateButtonIcon() //////////////////////////////////////// Specific Ability Actions /////////////////////////////////////////////// diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 64f03afb52a..9d7e4f73c49 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -122,25 +122,32 @@ /obj/mecha/proc/get_equipment_menu() //outputs mecha html equipment menu - . = "" + var/output if(equipment.len) - . += {"
+ output += {"
Equipment
" - + for(var/obj/item/mecha_parts/mecha_equipment/W in weapon_equipment) + output += "Weapon Module: [W.name] Detach
" + for(var/obj/item/mecha_parts/mecha_equipment/W in utility_equipment) + output += "Utility Module: [W.name] Detach
" + for(var/obj/item/mecha_parts/mecha_equipment/W in misc_equipment) + output += "Miscellaneous Module: [W.name] Detach
" + output += {"Available weapon slots: [max_weapons_equip-weapon_equipment.len]
+ Available utility slots: [max_utility_equip-utility_equipment.len]
+ Available miscellaneous slots: [max_misc_equip-misc_equipment.len]
+
+ "} + return output /obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html if(!equipment.len) return - . = "Equipment:
" + var/output = "Equipment:
" for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) - . += "
[MT.get_equip_info()]
" - . += "
" + output += "
[MT.get_equip_info()]
" + output += "
" + return output @@ -355,4 +362,3 @@ else occupant_message(span_warning("Recalibration failed!")) mecha_log_message("Recalibration of coordination system failed with 1 error.", color="red") - diff --git a/code/game/mecha/medical/medical.dm b/code/game/mecha/medical/medical.dm index 00183443adf..c061ca42540 100644 --- a/code/game/mecha/medical/medical.dm +++ b/code/game/mecha/medical/medical.dm @@ -4,7 +4,10 @@ deflect_chance = 0 light_power = 9 light_range = 10 - max_equip = 4 + + max_utility_equip = 3 + max_weapons_equip = 1 + max_misc_equip = 3 /obj/mecha/medical/mechturn(direction) setDir(direction) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 9456580ad06..1531a06d28e 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -6,7 +6,9 @@ max_temperature = 20000 max_integrity = 300 armor = ARMOR_VALUE_MEDIUM - max_equip = 6 + max_utility_equip = 4 + max_weapons_equip = 2 + max_misc_equip = 2 wreckage = /obj/structure/mecha_wreckage/ripley var/list/cargo = new var/cargo_capacity = 15 @@ -41,7 +43,6 @@ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF lights_power = 7 armor = ARMOR_VALUE_MEDIUM - max_equip = 5 // More armor, less tools wreckage = /obj/structure/mecha_wreckage/ripley/firefighter @@ -57,6 +58,10 @@ wreckage = /obj/structure/mecha_wreckage/ripley/deathripley step_energy_drain = 0 + max_utility_equip = 3 + max_weapons_equip = 1 + max_misc_equip = 2 + /obj/mecha/working/ripley/deathripley/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill @@ -85,11 +90,14 @@ lights_power = 7 step_energy_drain = 30 //slightly higher energy drain since you movin those wheels FAST armor = ARMOR_VALUE_MEDIUM - max_equip = 5 wreckage = /obj/structure/mecha_wreckage/clarke cargo_capacity = 10 canstrafe = FALSE + max_weapons_equip = 2 + max_utility_equip = 2 + max_misc_equip = 2 + /obj/mecha/working/clarke/moved_inside(mob/living/carbon/human/H) . = ..() if(.) diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm index 39a98799790..d4b7027773d 100644 --- a/code/game/mecha/working/working.dm +++ b/code/game/mecha/working/working.dm @@ -5,6 +5,10 @@ light_power = 9 light_range = 10 + max_weapons_equip = 2 + max_utility_equip = 2 + max_misc_equip = 2 + /obj/mecha/working/Move() . = ..() if(.) diff --git a/hailmary.dme b/hailmary.dme index 1b25d0bd690..142185aa936 100644 --- a/hailmary.dme +++ b/hailmary.dme @@ -1004,6 +1004,13 @@ #include "code\game\mecha\equipment\tools\work_tools.dm" #include "code\game\mecha\equipment\weapons\mecha_ammo.dm" #include "code\game\mecha\equipment\weapons\weapons.dm" +#include "code\game\mecha\fallout\armoured.dm" +#include "code\game\mecha\fallout\birds.dm" +#include "code\game\mecha\fallout\buggies.dm" +#include "code\game\mecha\fallout\carriages.dm" +#include "code\game\mecha\fallout\cars.dm" +#include "code\game\mecha\fallout\pickuptrucks.dm" +#include "code\game\mecha\fallout\trucks.dm" #include "code\game\mecha\medical\medical.dm" #include "code\game\mecha\medical\medigax.dm" #include "code\game\mecha\medical\odysseus.dm" From d1efdf02f3b56e1037583f4db7f801d45db907b6 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Mon, 23 Sep 2024 02:32:23 +1200 Subject: [PATCH 04/68] V2 --- code/__DEFINES/mech_wires.dm | 108 +++++++++ code/__DEFINES/mecha_defines.dm | 14 ++ code/__DEFINES/traits.dm | 1 + code/__DEFINES/wires.dm | 17 ++ code/_globalvars/traits.dm | 1 + code/datums/wires/mech_wires.dm | 108 +++++++++ .../mecha/equipment/tools/vision_tools.dm | 32 +++ code/game/mecha/mecha.dm | 49 ++++- code/game/mecha/mecha_actions.dm | 12 +- code/game/mecha/mecha_defense.dm | 206 +++++++++++++++--- code/game/mecha/mecha_topic.dm | 12 + code/modules/mob/living/carbon/carbon.dm | 4 + hailmary.dme | 3 + 13 files changed, 527 insertions(+), 40 deletions(-) create mode 100644 code/__DEFINES/mech_wires.dm create mode 100644 code/__DEFINES/mecha_defines.dm create mode 100644 code/datums/wires/mech_wires.dm create mode 100644 code/game/mecha/equipment/tools/vision_tools.dm diff --git a/code/__DEFINES/mech_wires.dm b/code/__DEFINES/mech_wires.dm new file mode 100644 index 00000000000..d4d5a82b919 --- /dev/null +++ b/code/__DEFINES/mech_wires.dm @@ -0,0 +1,108 @@ + +/datum/wires/mech + holder_type = /obj/mecha +// wire_count = 12 // 8 actual, 4 duds + proper_name = "Mecha" + +/datum/wires/mech/New(atom/_holder) + wires = list(WIRE_MECH_DIRECTION, WIRE_MECH_DNA, WIRE_MECH_POWER , WIRE_MECH_SELECT_MODULE, WIRE_MECH_USE_MODULE, WIRE_MECH_WALK, WIRE_MECH_RADIO , WIRE_MECH_VISUALDATA) + return ..() + +/datum/wires/mech/interactable(mob/user) + var/obj/mecha/A = holder + if(A.state == MECHA_OPEN_HATCH || A.maintenance_panel_status == MECHA_PANEL_6) + return TRUE + return FALSE + +/datum/wires/mech/get_status() + . = ..() + . += "The high-voltage power indicator blinks [is_cut(WIRE_MECH_POWER) ? "red" : "green"]" + . += "The module selection data-bus indicator is [is_cut(WIRE_MECH_SELECT_MODULE) ? "off" : "on"]" + . += "The module data-transfer data-bus light is [is_cut(WIRE_MECH_USE_MODULE) ? "not blinking" : "blinking"]" + . += "The internal radio wire is [is_cut(WIRE_MECH_RADIO) ? "cut" : "intact"]" + . += "The internal gyroscope-direction assembly wire is [is_cut(WIRE_MECH_DIRECTION) ? "cut" : "intact"]" + . += "The wire leading to the mech actuators is [is_cut(WIRE_MECH_WALK) ? "cut" : "intact"]" + . += "The wire leading to the internal display screens is [is_cut(WIRE_MECH_VISUALDATA) ? "cut" : "intact"]" + . += "The DNA lock light is [is_cut(WIRE_MECH_DNA) ? "blinking red" : "showing green"]" + +/datum/wires/mech/on_cut(wire, mend) + var/obj/mecha/A = holder + switch(wire) + if(WIRE_MECH_DIRECTION) + return + if(WIRE_MECH_POWER) + return + if(WIRE_MECH_SELECT_MODULE) + return + if(WIRE_MECH_USE_MODULE) + return + if(WIRE_MECH_WALK) + return + if(WIRE_MECH_RADIO) + if(mend) + A.radio.broadcasting = TRUE + A.radio.listening = FALSE + else + A.radio.broadcasting = FALSE + A.radio.listening = FALSE + return + if(WIRE_MECH_VISUALDATA) + if(mend) + A.grant_vision() + else + A.remove_vision() + return + + . = ..() + +/datum/wires/mech/on_pulse(wire) + var/obj/mecha/A = holder + switch(wire) + if(WIRE_MECH_DIRECTION) + A.mechturn(pick(NORTH, SOUTH , EAST, WEST, SOUTHEAST , SOUTHWEST, NORTHEAST, NORTHWEST)) + return + if(WIRE_MECH_DNA) + A.dna = null + return + if(WIRE_MECH_POWER) + return + if(WIRE_MECH_SELECT_MODULE) + if(length(A.equipment)) + var/obj/item/mecha_parts/mecha_equipment/thing = pick(A.equipment) + if(!thing.selectable) + thing = null + A.selected = thing + return + if(WIRE_MECH_USE_MODULE) + if(!A.selected) + return + var/list/targets = list() + var/turf/real_target + var/x = A.dir & NORTH - A.dir & SOUTH + var/y = A.dir & EAST - A.dir & WEST + if(A.selected.range & MECHA_RANGED) + real_target = locate(A.x + round(rand(1,5)*x), A.y + round(rand(1,5)*y), A.z) + // why shoot map edge.. + if(!real_target) + return + targets = block(real_target.x-1, real_target.y-1, A.z, real_target.x+1, real_target.y+1, A.z) + while(targets.Find(null)) + targets.Remove(null) + else + real_target = locate(A.x + x, A.y + y, A.z) + if(!real_target) + return + targets = list(real_target) + A.selected.action(pick(targets)) + return + if(WIRE_MECH_WALK) + A.domove(A.dir) + return + if(WIRE_MECH_RADIO) + A.radio.broadcasting = !A.radio.broadcasting + A.radio.listening = !A.radio.listening + return + if(WIRE_MECH_VISUALDATA) + return + + . = ..() diff --git a/code/__DEFINES/mecha_defines.dm b/code/__DEFINES/mecha_defines.dm new file mode 100644 index 00000000000..26e738a3ab6 --- /dev/null +++ b/code/__DEFINES/mecha_defines.dm @@ -0,0 +1,14 @@ +/// Defines for mecha panel dismantling states +#define MECHA_PANEL_0 "untarnished" +#define MECHA_PANEL_1 "welded1" // welder +#define MECHA_PANEL_2 "crowbared1" // crowbar +#define MECHA_PANEL_3 "welded2" // welder +#define MECHA_PANEL_4 "crowbared2" // crowbar +#define MECHA_PANEL_5 "wirecutter" // wirecutter +#define MECHA_PANEL_6 "opened" + +#define MECHA_MAINT_OFF 0 +#define MECHA_MAINT_ON 1 +#define MECHA_BOLTS_UP 2 +#define MECHA_OPEN_HATCH 3 +#define MECHA_BATTERY_UNSCREW 4 \ No newline at end of file diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 65336d6f09c..c662aa95a33 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -245,6 +245,7 @@ #define TRAIT_FREESPRINT "free_sprinting" #define TRAIT_XRAY_VISION "xray_vision" #define TRAIT_THERMAL_VISION "thermal_vision" +#define TRAIT_MESON_VISION "meson_vision" #define TRAIT_NO_TELEPORT "no-teleport" //you just can't #define TRAIT_NO_INTERNALS "no-internals" #define TRAIT_NO_ALCOHOL "alcohol_intolerance" diff --git a/code/__DEFINES/wires.dm b/code/__DEFINES/wires.dm index fdcd6306cef..2459351af9f 100644 --- a/code/__DEFINES/wires.dm +++ b/code/__DEFINES/wires.dm @@ -52,3 +52,20 @@ #define WIRE_RECORD "Record" #define WIRE_STOP "Stop" #define WIRE_PLAY "Play" + +/// The power supply! +#define WIRE_MECH_POWER "Mech power supply" +/// Walks foward +#define WIRE_MECH_WALK "Mech walk" +/// DNA wire +#define WIRE_MECH_DNA "Wire DNA" +/// Random direction +#define WIRE_MECH_DIRECTION "Mech direction" +/// Random since you aren't the internal computer telling it how to do stuff +#define WIRE_MECH_SELECT_MODULE "Mech module selection" +/// Random turfs infront of the mech (a ton or few depending on the range) +#define WIRE_MECH_USE_MODULE "Mech use module" +/// Radio transmission +#define WIRE_MECH_RADIO "Mech radio" +/// Visual modifiers +#define WIRE_MECH_VISUALDATA "Mech visuals" diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index fc1a0c72700..87650cc26a6 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -83,6 +83,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER, "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION, "TRAIT_THERMAL_VISION" = TRAIT_THERMAL_VISION, + "TRAIT_MESON_VISION" = TRAIT_MESON_VISION, "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING, "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING, "TRAIT_SURGEON" = TRAIT_SURGEON, diff --git a/code/datums/wires/mech_wires.dm b/code/datums/wires/mech_wires.dm new file mode 100644 index 00000000000..48464235cc9 --- /dev/null +++ b/code/datums/wires/mech_wires.dm @@ -0,0 +1,108 @@ + +/datum/wires/mech + holder_type = /obj/mecha +// wire_count = 12 // 8 actual, 4 duds + proper_name = "Mecha" + +/datum/wires/mech/New(atom/_holder) + wires = list(WIRE_MECH_DIRECTION, WIRE_MECH_DNA, WIRE_MECH_POWER , WIRE_MECH_SELECT_MODULE, WIRE_MECH_USE_MODULE, WIRE_MECH_WALK, WIRE_MECH_RADIO , WIRE_MECH_VISUALDATA) + return ..() + +/datum/wires/mech/interactable(mob/user) + var/obj/mecha/A = holder + if(A.state == MECHA_OPEN_HATCH || A.maintenance_panel_status == MECHA_PANEL_6) + return TRUE + return FALSE + +/datum/wires/mech/get_status() + . = ..() + . += "The high-voltage power indicator blinks [is_cut(WIRE_MECH_POWER) ? "red" : "green"]" + . += "The module selection data-bus indicator is [is_cut(WIRE_MECH_SELECT_MODULE) ? "off" : "on"]" + . += "The module data-transfer data-bus light is [is_cut(WIRE_MECH_USE_MODULE) ? "not blinking" : "blinking"]" + . += "The internal radio wire is [is_cut(WIRE_MECH_RADIO) ? "cut" : "intact"]" + . += "The internal gyroscope-direction assembly wire is [is_cut(WIRE_MECH_DIRECTION) ? "cut" : "intact"]" + . += "The wire leading to the mech actuators is [is_cut(WIRE_MECH_WALK) ? "cut" : "intact"]" + . += "The wire leading to the internal display screens is [is_cut(WIRE_MECH_VISUALDATA) ? "cut" : "intact"]" + . += "The DNA lock light is [is_cut(WIRE_MECH_DNA) ? "blinking red" : "showing green"]" + +/datum/wires/mech/on_cut(wire, mend) + var/obj/mecha/A = holder + switch(wire) + if(WIRE_MECH_DIRECTION) + return + if(WIRE_MECH_POWER) + return + if(WIRE_MECH_SELECT_MODULE) + return + if(WIRE_MECH_USE_MODULE) + return + if(WIRE_MECH_WALK) + return + if(WIRE_MECH_RADIO) + if(mend) + A.radio.broadcasting = TRUE + A.radio.listening = FALSE + else + A.radio.broadcasting = FALSE + A.radio.listening = FALSE + return + if(WIRE_MECH_VISUALDATA) + if(mend) + A.grant_vision() + else + A.remove_vision() + return + + . = ..() + +/datum/wires/mech/on_pulse(wire) + var/obj/mecha/A = holder + switch(wire) + if(WIRE_MECH_DIRECTION) + A.mechturn(pick(NORTH, SOUTH , EAST, WEST, SOUTHEAST , SOUTHWEST, NORTHEAST, NORTHWEST)) + return + if(WIRE_MECH_DNA) + A.dna_lock = null + return + if(WIRE_MECH_POWER) + return + if(WIRE_MECH_SELECT_MODULE) + if(length(A.equipment)) + var/obj/item/mecha_parts/mecha_equipment/thing = pick(A.equipment) + if(!thing.selectable) + thing = null + A.selected = thing + return + if(WIRE_MECH_USE_MODULE) + if(!A.selected) + return + var/list/targets = list() + var/turf/real_target + var/x = A.dir & NORTH - A.dir & SOUTH + var/y = A.dir & EAST - A.dir & WEST + if(A.selected.range == RANGED) + real_target = locate(A.x + round(rand(1,5)*x), A.y + round(rand(1,5)*y), A.z) + // why shoot map edge.. + if(!real_target) + return + targets = block(real_target.x-1, real_target.y-1, A.z, real_target.x+1, real_target.y+1, A.z) + while(targets.Find(null)) + targets.Remove(null) + else + real_target = locate(A.x + x, A.y + y, A.z) + if(!real_target) + return + targets = list(real_target) + A.selected.action(pick(targets)) + return + if(WIRE_MECH_WALK) + A.domove(A.dir) + return + if(WIRE_MECH_RADIO) + A.radio.broadcasting = !A.radio.broadcasting + A.radio.listening = !A.radio.listening + return + if(WIRE_MECH_VISUALDATA) + return + + . = ..() diff --git a/code/game/mecha/equipment/tools/vision_tools.dm b/code/game/mecha/equipment/tools/vision_tools.dm new file mode 100644 index 00000000000..f29213b3a88 --- /dev/null +++ b/code/game/mecha/equipment/tools/vision_tools.dm @@ -0,0 +1,32 @@ +/// Subtype for vision-granting equipments +/obj/item/mecha_parts/mecha_equipment/vision + name = "vision trait giver subtype module for exosuits" + desc = "you shouldn't be seeing this." + selectable = FALSE + var/list/vision_traits + +/obj/item/mecha_parts/mecha_equipment/vision/attach(obj/mecha/M) + . = ..() + M.remove_vision() + M.vision_modes |= vision_traits + M.grant_vision() + +/obj/item/mecha_parts/mecha_equipment/vision/detach(atom/moveto) + chassis.remove_vision() + chassis.vision_modes -= vision_traits + . = ..() + chassis.grant_vision() + +/obj/item/mecha_parts/mecha_equipment/vision/meson_scanner + name = "exosuit meson scanner" + desc = "An exosuit module that integrates a meson scanner." + icon_state = "mecha_meson" + energy_drain = 100 + vision_traits = list(TRAIT_MESON_VISION, TRAIT_NIGHT_VISION) + +/obj/item/mecha_parts/mecha_equipment/vision/thermal_scanner + name = "exosuit thermal scanner" + desc = "An exosuit module that integrates a thermal scanner." + icon_state = "mecha_thermal" + energy_drain = 100 + vision_traits = list(TRAIT_THERMAL_VISION, TRAIT_NIGHT_VISION) \ No newline at end of file diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f304a71c8cf..6b21915a89f 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -48,6 +48,7 @@ armor = ARMOR_VALUE_HEAVY var/list/facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.5) //var/obj/item/stock_parts/cell/cell + var/datum/wires/mech/internal_wiring var/obj/item/reagent_containers/fuel_tank/fuel_holder var/state = 0 var/list/log = new @@ -87,6 +88,7 @@ var/list/internals_req_access = list()//REQUIRED ACCESS LEVEL TO OPEN CELL COMPARTMENT var/wreckage + var/repairing = FALSE var/canZmove = TRUE @@ -102,6 +104,12 @@ var/list/utility_equipment = new var/list/misc_equipment = new + /// a list of all vision traits to give to the occupant. + var/list/vision_modes = list() + /// The current status of the mech maintenance panel , theres 5 states of progression (welder ,crowbar, welder ,crowbar , wirecutter) to forcing it open. + /// Having maintenance permitted cuts this down to the normal wrench + crowbar + var/maintenance_panel_status = MECHA_PANEL_0 + var/stepsound = 'sound/mecha/mechstep.ogg' var/turnsound = 'sound/mecha/mechturn.ogg' var/attacksound = 'sound/weapons/punch4.ogg' @@ -188,6 +196,14 @@ diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() + internal_wiring = new(src) + +/obj/mecha/proc/grant_vision() + if(!occupant) + return + if(internal_wiring.is_cut(WIRE_MECH_VISUALDATA)) + return + for(var/mode in vision_modes) /obj/mecha/attacked_by(obj/item/I, mob/living/user, attackchain_flags, damage_multiplier) if(istype(I, /obj/item/reagent_containers) && fuel_holder) @@ -196,7 +212,7 @@ c.reagents.trans_id_to(fuel_holder, /datum/reagent/fuel, min((fuel_holder.volume - fuel_holder.reagents.total_volume), c.amount_per_transfer_from_this)) return TRUE . = ..() - + /obj/mecha/proc/get_fuel_tank() return fuel_holder @@ -207,6 +223,7 @@ /obj/mecha/Destroy() if(occupant) occupant.SetSleeping(destruction_sleep_duration) + remove_vision() go_out() var/mob/living/silicon/ai/AI for(var/mob/M in src) //Let's just be ultra sure @@ -401,6 +418,8 @@ if(occupant) if(fuel_holder) var/fuelamount = fuel_holder.reagents.total_volume/fuel_holder.volume + if(internal_wiring.is_cut(WIRE_MECH_POWER)) + fuelamount = 0 switch(fuelamount) if(0.75 to INFINITY) occupant.clear_alert("charge") @@ -453,6 +472,8 @@ /obj/mecha/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) . = ..() + if(internal_wiring.is_cut(WIRE_MECH_RADIO)) + return if(speaker == occupant) if(radio.broadcasting) radio.talk_into(speaker, text, , spans, message_language) @@ -482,6 +503,9 @@ return if(user.incapacitated()) return + if(internal_wiring.is_cut(WIRE_MECH_USE_MODULE)) + occupant_message("Error transmitting command to module") + return if(state) occupant_message("Maintenance protocols in effect.") return @@ -560,6 +584,9 @@ /obj/mecha/relaymove(mob/user,direction) if(completely_disabled) return + if(internal_wiring.is_cut(WIRE_MECH_WALK)) + to_chat(user , "Error transmitting command to actuators.") + return if(!direction) return if(user != occupant) //While not "realistic", this piece is player friendly. @@ -595,6 +622,11 @@ set_glide_size(DELAY_TO_GLIDE_SIZE(step_in)) move_result = mechsteprand() else if(dir != direction && (!strafe || occupant.client.keys_held["Alt"])) + if(internal_wiring.is_cut(WIRE_MECH_DIRECTION)) + if(world.time - last_message > 2 SECONDS) + to_chat(occupant, "Error transmitting direction-switch command to actuators.") + last_message = world.time + return move_result = mechturn(direction) else set_glide_size(DELAY_TO_GLIDE_SIZE(step_in)) @@ -809,7 +841,7 @@ if(AI.stat || !AI.client) to_chat(user, "[AI.name] is currently unresponsive, and cannot be uploaded.") return - if(occupant || dna_lock) //Normal AIs cannot steal mechs! + if(occupant || (dna_lock && !internal_wiring.is_cut(WIRE_MECH_DNA))) //Normal AIs cannot steal mechs! to_chat(user, "Access denied. [name] is [occupant ? "currently occupied" : "secured with a DNA lock"].") return AI.control_disabled = 0 @@ -907,7 +939,7 @@ to_chat(usr, "The [name] is already occupied!") log_append_to_last("Permission denied.") return - if(dna_lock) + if(dna_lock && !internal_wiring.is_cut(WIRE_MECH_DNA)) var/passed = FALSE if(user.has_dna()) var/mob/living/carbon/C = user @@ -953,6 +985,7 @@ H.update_mouse_pointer() add_fingerprint(H) GrantActions(H, human_occupant=1) + grant_vision() forceMove(loc) log_append_to_last("[H] moved in as pilot.") icon_state = initial(icon_state) @@ -974,7 +1007,7 @@ else if(occupant) to_chat(user, "Occupant detected!") return FALSE - else if(dna_lock && (!mmi_as_oc.brainmob.stored_dna || (dna_lock != mmi_as_oc.brainmob.stored_dna.unique_enzymes))) + else if(dna_lock && !internal_wiring.is_cut(WIRE_MECH_DNA) && (!mmi_as_oc.brainmob.stored_dna || (dna_lock != mmi_as_oc.brainmob.stored_dna.unique_enzymes))) to_chat(user, "Access denied. [name] is secured with a DNA lock.") return FALSE @@ -1016,6 +1049,7 @@ if(!internal_damage) SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) GrantActions(brainmob) + grant_vision() return TRUE /obj/mecha/container_resist(mob/living/user) @@ -1030,6 +1064,7 @@ /obj/mecha/proc/go_out(forced, atom/newloc = loc) if(!occupant) return + remove_vision() var/atom/movable/mob_container occupant.clear_alert("charge") occupant.clear_alert("mech damage") @@ -1128,6 +1163,8 @@ return (get_charge()>=amount) /obj/mecha/proc/get_charge() + if(internal_wiring.is_cut(WIRE_MECH_POWER)) + return 0 for(var/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/R in equipment) var/relay_charge = R.get_charge() if(relay_charge) @@ -1136,12 +1173,16 @@ return max(0, fuel_holder.reagents.total_volume) /obj/mecha/proc/use_power(amount) + if(internal_wiring.is_cut(WIRE_MECH_POWER)) + return FALSE amount = amount*0.5 //cut it in half since gasoline is expensive if(get_charge() && fuel_holder.reagents.remove_reagent(/datum/reagent/fuel, amount)) return 1 return 0 /obj/mecha/proc/give_power(amount) + if(internal_wiring.is_cut(WIRE_MECH_POWER)) + return FALSE if(!isnull(get_charge())) fuel_holder.reagents.add_reagent(/datum/reagent/fuel, amount) return 1 diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index 2eedd4f7e5e..3791219622f 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -8,7 +8,7 @@ if(haslights) lights_action.Grant(user, src) stats_action.Grant(user, src) - if(strafing_flags) + if(canstrafe) strafing_action.Grant(user, src) /obj/mecha/proc/RemoveActions(mob/living/user, human_occupant = 0) @@ -77,6 +77,10 @@ if(!owner || !chassis || chassis.occupant != owner) return + if(chassis.internal_wiring.is_cut(WIRE_MECH_SELECT_MODULE)) + chassis.occupant_message("Error, no response from module.") + return + var/list/available_equipment = list() for(var/obj/item/mecha_parts/mecha_equipment/M in chassis.equipment) if(M.selectable) @@ -159,10 +163,10 @@ return TRUE /obj/mecha/proc/toggle_strafe() - strafing = !strafing + strafe = !strafe - occupant_message("Toggled strafing mode [strafing?"on":"off"].") - mecha_log_message("Toggled strafing mode [strafing?"on":"off"].") + occupant_message("Toggled strafing mode [strafe?"on":"off"].") + mecha_log_message("Toggled strafing mode [strafe?"on":"off"].") strafing_action.UpdateButtonIcon() //////////////////////////////////////// Specific Ability Actions /////////////////////////////////////////////// diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index c7f31906c0d..0588e5c2865 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -197,44 +197,14 @@ to_chat(user, span_warning("Invalid ID: Access denied.")) else to_chat(user, span_warning("Maintenance protocols disabled by operator.")) - else if(istype(W, /obj/item/wrench)) +/* else if(istype(W, /obj/item/wrench)) if(state==1) state = 2 to_chat(user, span_notice("You undo the securing bolts.")) else if(state==2) state = 1 to_chat(user, span_notice("You tighten the securing bolts.")) - return - else if(istype(W, /obj/item/crowbar)) - if(state==2) - state = 3 - to_chat(user, span_notice("You open the hatch to the power unit.")) - else if(state==3) - state=2 - to_chat(user, span_notice("You close the hatch to the power unit.")) - return - else if(istype(W, /obj/item/stack/cable_coil)) - if(state == 3 && (internal_damage & MECHA_INT_SHORT_CIRCUIT)) - if(W.use_tool(src, user, 0, 2)) - clearInternalDamage(MECHA_INT_SHORT_CIRCUIT) - to_chat(user, span_notice("You replace the fused wires.")) - else - to_chat(user, span_warning("You need two lengths of cable to fix this mech!")) - return - else if(istype(W, /obj/item/screwdriver) && user.a_intent != INTENT_HARM) - if(internal_damage & MECHA_INT_TEMP_CONTROL) - clearInternalDamage(MECHA_INT_TEMP_CONTROL) - to_chat(user, span_notice("You repair the damaged temperature controller.")) - else if(state==3 && fuel_holder) - fuel_holder.forceMove(loc) - fuel_holder = null - state = 4 - to_chat(user, span_notice("You unsecure the fuel tank.")) - mecha_log_message("Fuel tank removed") - else if(state==4 && fuel_holder) - state=3 - to_chat(user, span_notice("You secure the fuel_tank in place.")) - return + return*/ else if(istype(W, /obj/item/reagent_containers/fuel_tank)) if(state==4) @@ -273,6 +243,178 @@ else return ..() +/obj/mecha/crowbar_act(mob/user, obj/item/I) + if(user.a_intent != INTENT_HELP) + switch(maintenance_panel_status) + if(MECHA_PANEL_1) + to_chat(user, "You begin bending the hatches on \the [src] out of place") + if(I.use_tool(src, user, 12 SECONDS, volume = 50)) + to_chat(user, "You bend the hatches on \the [src], you can now heat up the security screws.") + maintenance_panel_status = MECHA_PANEL_2 + return TRUE + if(MECHA_PANEL_2) + to_chat(user, "You begin repairing the hatches on \the [src]") + if(I.use_tool(src, user, 12 SECONDS, volume = 50)) + to_chat(user, "You repair the hatches on \the [src].") + maintenance_panel_status = MECHA_PANEL_0 + return TRUE + if(MECHA_PANEL_3) + to_chat(user, "You begin removing the security pins on [src]'s hatch") + if(I.use_tool(src, user, 12 SECONDS, volume = 50)) + to_chat(user, "You remove the security pins on \the [src].") + maintenance_panel_status = MECHA_PANEL_5 + return TRUE + if(MECHA_PANEL_4) + to_chat(user, "You begin replacing the security pins on [src]'s hatch") + if(I.use_tool(src, user, 12 SECONDS, volume = 50)) + to_chat(user, "You replace the security pins on \the [src]'s hatch.") + maintenance_panel_status = MECHA_PANEL_2 + return TRUE + if(MECHA_PANEL_6) + if(state != MECHA_OPEN_HATCH && state != MECHA_BATTERY_UNSCREW) + to_chat(user, "You begin opening [src]'s hatch") + if(I.use_tool(src, user, 3 SECONDS, volume = 50)) + to_chat(user, "You open [src]'s hatch.") + state = MECHA_OPEN_HATCH + return TRUE + else if(state == MECHA_OPEN_HATCH) + to_chat(user, "You begin closing [src]'s hatch") + if(I.use_tool(src, user, 3 SECONDS, volume = 50)) + to_chat(user, "You close [src]'s hatch.") + state = MECHA_MAINT_OFF + return TRUE + + if(state != MECHA_BOLTS_UP && state != MECHA_OPEN_HATCH && !(state == MECHA_BATTERY_UNSCREW && occupant)) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = 50)) + return + if(state == MECHA_BOLTS_UP) + state = MECHA_OPEN_HATCH + to_chat(user, "You open the hatch to the power unit") + else if(state == MECHA_OPEN_HATCH) + state = MECHA_BOLTS_UP + to_chat(user, "You close the hatch to the power unit") + else if(ishuman(occupant)) + user.visible_message("[user] begins levering out the driver from the [src].", "You begin to lever out the driver from the [src].") + to_chat(occupant, "[user] is prying you out of the exosuit!") + if(I.use_tool(src, user, 8 SECONDS, volume = 50)) + user.visible_message("[user] pries the driver out of the [src]!", "You finish removing the driver from the [src]!") + go_out() + else + // Since having maint protocols available is controllable by the MMI, I see this as a consensual way to remove an MMI without destroying the mech + user.visible_message("[user] begins levering out the MMI from [src].", "You begin to lever out the MMI from [src].") + to_chat(occupant, "[user] is prying you out of the exosuit!") + if(I.use_tool(src, user, 8 SECONDS, volume = 50) && occupant == mmi_as_oc) + user.visible_message("[user] pries the MMI out of [src]!", "You finish removing the MMI from [src]!") + go_out() + +/obj/mecha/screwdriver_act(mob/user, obj/item/I) + if(user.a_intent == INTENT_HARM) + return + if(!(state == MECHA_OPEN_HATCH && fuel_holder) && !(state == MECHA_BATTERY_UNSCREW && fuel_holder)) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = 50)) + return + if(internal_damage & MECHA_INT_TEMP_CONTROL) + clearInternalDamage(MECHA_INT_TEMP_CONTROL) + to_chat(user, "You repair the damaged temperature controller.") + else if(state == MECHA_OPEN_HATCH && fuel_holder) + fuel_holder.forceMove(loc) + fuel_holder = null + state = MECHA_BATTERY_UNSCREW + to_chat(user, "You unscrew and pry out the fuel holder.") + log_message("Fuel cell removed") + else if(state == MECHA_BATTERY_UNSCREW && fuel_holder) + state = MECHA_OPEN_HATCH + to_chat(user, "You screw the fuel holder in place.") +/obj/mecha/wrench_act(mob/user, obj/item/I) + if(state != MECHA_MAINT_ON && state != MECHA_BOLTS_UP) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = 50)) + return + if(state == MECHA_MAINT_ON) + state = MECHA_BOLTS_UP + to_chat(user, "You undo the securing bolts.") + else + state = MECHA_MAINT_ON + to_chat(user, "You tighten the securing bolts.") +/obj/mecha/welder_act(mob/user, obj/item/I) + if(user.a_intent == INTENT_HARM) + return + if(user.a_intent != INTENT_HELP) + switch(maintenance_panel_status) + if(MECHA_PANEL_0) + to_chat(user, "You begin heating up the hatches on \the [src]") + if(I.use_tool(src, user, 12 SECONDS, volume = 50)) + to_chat(user, "You heat up the hatches on \the [src], they can now be pried out of place.") + maintenance_panel_status = MECHA_PANEL_1 + return TRUE + if(MECHA_PANEL_2) + to_chat(user, "You begin softening the security pins on \the [src]") + if(I.use_tool(src, user, 12 SECONDS, volume = 50)) + to_chat(user, "You soften the security pins on \the [src], they can now be pried out") + maintenance_panel_status = MECHA_PANEL_3 + return TRUE + . = TRUE + if(!I.tool_use_check(user, 0)) + return + if((obj_integrity >= max_integrity) && !internal_damage) + to_chat(user, "[src] is at full integrity!") + return + if(repairing) + to_chat(user, "[src] is currently being repaired!") + return + if(state == MECHA_MAINT_OFF) // If maint protocols are not active, the state is zero + to_chat(user, "[src] can not be repaired without maintenance protocols active!") + return + WELDER_ATTEMPT_REPAIR_MESSAGE + repairing = TRUE + if(I.use_tool(src, user, 15, volume = 50)) + if(internal_damage & MECHA_INT_TANK_BREACH) + clearInternalDamage(MECHA_INT_TANK_BREACH) + user.visible_message("[user] repairs the damaged gas tank.", "You repair the damaged gas tank.") + else if(obj_integrity < max_integrity) + user.visible_message("[user] repairs some damage to [name].", "You repair some damage to [name].") + obj_integrity += min(10, max_integrity - obj_integrity) + else + to_chat(user, "[src] is at full integrity!") + repairing = FALSE + +/obj/mecha/wirecutter_act(mob/living/user, obj/item/I) + if(user.a_intent != INTENT_HELP) + switch(maintenance_panel_status) + if(MECHA_PANEL_5) + to_chat(user, "You begin cutting the [src]'s locking mechanism.") + if(I.use_tool(src, user, 12 SECONDS, volume = 50)) + to_chat(user, "You cut \the [src]'s locking mechanism apart. The maintenance hatch can be opened by prying it!") + maintenance_panel_status = MECHA_PANEL_6 + return TRUE + if(MECHA_PANEL_6) + to_chat(user, "You begin repairing the [src]'s locking mechanism.") + if(I.use_tool(src, user, 12 SECONDS, volume = 50)) + to_chat(user, "You repair \the [src]'s locking mechanism . The maintenance hatch is no longer openable by prying.") + maintenance_panel_status = MECHA_PANEL_4 + return TRUE + + if(state != MECHA_OPEN_HATCH && maintenance_panel_status != MECHA_PANEL_6) + return +// internal_wiring.attempt_wire_interaction(user) + return TRUE + +/obj/mecha/multitool_act(mob/living/user, obj/item/I) + if(state != MECHA_OPEN_HATCH && maintenance_panel_status != MECHA_PANEL_6) + return +// internal_wiring.attempt_wire_interaction(user) + return TRUE + +/obj/mecha/_try_interact(mob/user) + if(state == MECHA_OPEN_HATCH && maintenance_panel_status != MECHA_PANEL_6) + return TRUE + return ..() + /obj/mecha/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) mecha_log_message("Attacked by [I]. Attacker - [user]") return ..() diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 9d7e4f73c49..2122b175c10 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -272,6 +272,9 @@ if(href_list["select_equip"]) var/obj/item/mecha_parts/mecha_equipment/equip = locate(href_list["select_equip"]) in src + if(internal_wiring.is_cut(WIRE_MECH_SELECT_MODULE)) + to_chat(occupant, "Error communicating with installed equipment!") + return if(equip && equip.selectable) selected = equip occupant_message("You switch to [equip]") @@ -279,14 +282,17 @@ send_byjax(usr, "exosuit.browser","eq_list", get_equipment_list()) if(href_list["rmictoggle"]) + if(internal_wiring.is_cut(WIRE_MECH_RADIO)) return radio.broadcasting = !radio.broadcasting send_byjax(usr,"exosuit.browser","rmicstate",(radio.broadcasting?"Engaged":"Disengaged")) if(href_list["rspktoggle"]) + if(internal_wiring.is_cut(WIRE_MECH_RADIO)) return radio.listening = !radio.listening send_byjax(usr,"exosuit.browser","rspkstate",(radio.listening?"Engaged":"Disengaged")) if(href_list["rfreq"]) + if(internal_wiring.is_cut(WIRE_MECH_RADIO)) return var/new_frequency = (radio.frequency + text2num(href_list["rfreq"])) if (!radio.freerange || (radio.frequency < MIN_FREE_FREQ || radio.frequency > MAX_FREE_FREQ)) new_frequency = sanitize_frequency(new_frequency) @@ -340,6 +346,9 @@ if(!istype(C) || !C.dna) to_chat(C, span_danger(" You do not have any DNA!")) return + if(internal_wiring.is_cut(WIRE_MECH_DNA)) + to_chat(occupant, "Error communicating with DNA machinery!") + return if(can_be_locked) dna_lock = C.dna.unique_enzymes occupant_message("You feel a prick as the needle takes your DNA sample.") @@ -348,6 +357,9 @@ return if(href_list["reset_dna"]) + if(internal_wiring.is_cut(WIRE_MECH_DNA)) + to_chat(occupant, "Error communicating with DNA machinery!") + return dna_lock = null if(href_list["repair_int_control_lost"]) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index cba96cf3ccf..829f3d52811 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -693,6 +693,10 @@ if(M.name == XRAY) sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) see_in_dark = max(see_in_dark, 8) + + if(HAS_TRAIT(src, TRAIT_MESON_VISION)) + sight |= (SEE_TURFS) + if(HAS_TRAIT(src, TRAIT_THERMAL_VISION)) sight |= (SEE_MOBS) lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) diff --git a/hailmary.dme b/hailmary.dme index 142185aa936..07f341b6b5e 100644 --- a/hailmary.dme +++ b/hailmary.dme @@ -14,6 +14,7 @@ // END_PREFERENCES // BEGIN_INCLUDE +#include "code\__DEFINES\mecha_defines.dm" #include "_maps\_basemap.dm" #include "code\_byond_version_compat.dm" #include "code\_compile_options.dm" @@ -759,6 +760,7 @@ #include "code\datums\wires\autolathe.dm" #include "code\datums\wires\emitter.dm" #include "code\datums\wires\explosive.dm" +#include "code\datums\wires\mech_wires.dm" #include "code\datums\wires\microwave.dm" #include "code\datums\wires\mulebot.dm" #include "code\datums\wires\particle_accelerator.dm" @@ -1001,6 +1003,7 @@ #include "code\game\mecha\equipment\tools\medical_tools.dm" #include "code\game\mecha\equipment\tools\mining_tools.dm" #include "code\game\mecha\equipment\tools\other_tools.dm" +#include "code\game\mecha\equipment\tools\vision_tools.dm" #include "code\game\mecha\equipment\tools\work_tools.dm" #include "code\game\mecha\equipment\weapons\mecha_ammo.dm" #include "code\game\mecha\equipment\weapons\weapons.dm" From 8e165c5a7f64c22f980b49a46dddd17304c89ce3 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Mon, 23 Sep 2024 02:32:30 +1200 Subject: [PATCH 05/68] Update mecha.dm --- code/game/mecha/mecha.dm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 6b21915a89f..2cdbbd823ff 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -204,6 +204,15 @@ if(internal_wiring.is_cut(WIRE_MECH_VISUALDATA)) return for(var/mode in vision_modes) + ADD_TRAIT(occupant, mode, TRAIT_GENERIC) + occupant.update_sight() + +/obj/mecha/proc/remove_vision() + if(!occupant) + return + for(var/mode in vision_modes) + REMOVE_TRAIT(occupant, mode, TRAIT_GENERIC) + occupant.update_sight() /obj/mecha/attacked_by(obj/item/I, mob/living/user, attackchain_flags, damage_multiplier) if(istype(I, /obj/item/reagent_containers) && fuel_holder) From 55f3c7e1f825cf5d4b12927d08afb8ebda44f0cf Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Thu, 26 Sep 2024 03:31:39 +1200 Subject: [PATCH 06/68] V3 --- .../crafting/recipes/vehicle_parts.dm | 153 +++++---- code/datums/mutable_appearance.dm | 14 +- code/datums/wires/mech_wires.dm | 2 +- .../equipment/tools/fallout/vision_modules.dm | 32 ++ .../mecha/equipment/tools/vision_tools.dm | 32 -- .../equipment/weapons/fallout/ballistics.dm | 177 +++++++++++ .../mecha/equipment/weapons/fallout/lasers.dm | 34 ++ .../equipment/weapons/fallout/launchers.dm | 100 ++++++ .../mecha/equipment/weapons/mecha_ammo.dm | 9 +- code/game/mecha/equipment/weapons/weapons.dm | 293 ------------------ code/game/mecha/fallout/armoured.dm | 24 +- code/game/mecha/fallout/birds.dm | 8 +- code/game/mecha/mecha_defense.dm | 3 +- .../projectiles/projectile/bullets/pistol.dm | 104 ++++--- .../projectiles/projectile/bullets/shotgun.dm | 44 ++- hailmary.dme | 6 +- icons/mecha/armoured_jeep.dmi | Bin 0 -> 4697 bytes icons/mecha/mecha_ammo.dmi | Bin 874 -> 897 bytes 18 files changed, 572 insertions(+), 463 deletions(-) create mode 100644 code/game/mecha/equipment/tools/fallout/vision_modules.dm create mode 100644 code/game/mecha/equipment/weapons/fallout/ballistics.dm create mode 100644 code/game/mecha/equipment/weapons/fallout/lasers.dm create mode 100644 code/game/mecha/equipment/weapons/fallout/launchers.dm create mode 100644 icons/mecha/armoured_jeep.dmi diff --git a/code/datums/components/crafting/recipes/vehicle_parts.dm b/code/datums/components/crafting/recipes/vehicle_parts.dm index 592fd37ebe8..4abe3eff0ce 100644 --- a/code/datums/components/crafting/recipes/vehicle_parts.dm +++ b/code/datums/components/crafting/recipes/vehicle_parts.dm @@ -40,52 +40,52 @@ category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS -//HMG +//LMG -/datum/crafting_recipe/gun/HMGvehicle - name = "Improvised HMG (for vehicles)" - result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/hobo +/datum/crafting_recipe/gun/vehicle/lmg_improvised + name = "Improvised vehicular LMG" + result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/improvised reqs = list(/obj/item/gun/ballistic/automatic/autopipe = 2, /obj/item/stack/crafting/metalparts = 5, /obj/item/stack/sheet/prewar = 5, /obj/item/stack/sheet/mineral/titanium = 5, /obj/item/stack/rods = 2) tools = list(TOOL_WORKBENCH) - time = 180 + time = 1 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS -/datum/crafting_recipe/gun/HMGvehicle/normal - name = "Normal HMG (for vehicles)" +/datum/crafting_recipe/gun/vehicle/lmg_normal + name = "Standard vehicular LMG" result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg - reqs = list(/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/hobo = 1, + reqs = list(/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/improvised = 1, /obj/item/stack/crafting/metalparts = 2, /obj/item/stack/sheet/prewar = 6, /obj/item/stack/sheet/mineral/titanium = 6, /obj/item/stack/rods = 2) tools = list(TOOL_AWORKBENCH) - time = 180 + time = 1 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS -/datum/crafting_recipe/gun/HMGvehicle/upgraded - name = "Upgraded HMG (for vehicles)" - result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/auto +/datum/crafting_recipe/gun/vehicle/lmg_rapid + name = "Rapid-fire vehicular LMG" + result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid reqs = list(/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg = 1, /obj/item/stack/crafting/metalparts = 5, /obj/item/stack/sheet/prewar = 8, /obj/item/stack/sheet/mineral/titanium = 8, /obj/item/stack/rods = 2) tools = list(TOOL_AWORKBENCH) - time = 180 + time = 1 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS -/datum/crafting_recipe/lmgammo - name = "LMG Ammo for vehicles" +/datum/crafting_recipe/lmg_ammo + name = "Vehicular LMG ammunition" result = /obj/item/mecha_ammo/lmg/craftable - reqs = list(/obj/item/stack/crafting/metalparts = 5, - /obj/item/stack/sheet/prewar = 5, + reqs = list(/obj/item/stack/crafting/metalparts = 3, + /obj/item/stack/sheet/prewar = 3, /obj/item/stack/ore/blackpowder = 1, /obj/item/stack/sheet/mineral/titanium = 1, ) @@ -94,8 +94,10 @@ category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS -/*/datum/crafting_recipe/gun/minigunVehicle - name = "Minigun" +// Minigun and Ammo + +/datum/crafting_recipe/gun/vehicle/minigun + name = "Vehicular Minigun" result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun reqs = list(/obj/item/stack/crafting/metalparts = 10, /obj/item/stack/crafting/goodparts = 5, @@ -107,9 +109,66 @@ /obj/item/advanced_crafting_components/receiver = 1, /obj/item/advanced_crafting_components/alloys = 1) tools = list(TOOL_WORKBENCH) - time = 180 + time = 1 // test test!! + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/mech_ammo/minigun_ammo + name = "Vehicular Minigun ammunition" + result = /obj/item/mecha_ammo/minigun + reqs = list(/obj/item/stack/crafting/metalparts = 5, + /obj/item/stack/sheet/metal = 5, + /obj/item/stack/sheet/mineral/titanium = 5, + /obj/item/stack/ore/blackpowder = 5) + tools = list(TOOL_WORKBENCH) + time = 1 category = CAT_WEAPONRY - subcategory = CAT_WEAPON*/ + subcategory = CAT_AMMO + + +/datum/crafting_recipe/box/lotsofgoodstuff + name = "testing box o truth and goodies" + result = /obj/item/box/allsortsofgoodstuff + reqs = list(/obj/item/stack/rods = 1) + tools = list(TOOL_WORKBENCH) + time = 1 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/obj/item/box/allsortsofgoodstuff #warn // remove this + name = "good box" + +/obj/item/storage/box/allsortsofgoodstuff/PopulateContents() //less uranium because radioactive + var/static/items_inside = list( + /obj/item/stack/sheet/metal/fifty=1,\ + /obj/item/stack/sheet/glass/fifty=1,\ + /obj/item/stack/sheet/rglass=50,\ + /obj/item/stack/sheet/plasmaglass=50,\ + /obj/item/stack/sheet/titaniumglass=50,\ + /obj/item/stack/sheet/plastitaniumglass=50,\ + /obj/item/stack/sheet/plasteel=50,\ + /obj/item/stack/sheet/mineral/plastitanium=50,\ + /obj/item/stack/sheet/mineral/titanium=50,\ + /obj/item/stack/sheet/mineral/gold=50,\ + /obj/item/stack/sheet/mineral/silver=50,\ + /obj/item/stack/sheet/mineral/plasma=50,\ + /obj/item/stack/sheet/mineral/uranium=50,\ + /obj/item/stack/sheet/mineral/diamond=50,\ + /obj/item/stack/sheet/mineral/wood=50,\ + /obj/item/stack/sheet/plastic/fifty=1,\ + /obj/item/stack/sheet/runed_metal/fifty=1, + /obj/item/stack/sheet/prewar = 50, + /obj/item/stack/crafting/metalparts = 50, + /obj/item/stack/sheet/prewar = 50, + /obj/item/stack/crafting/goodparts = 50, + /obj/item/stack/crafting/electronicparts = 50, + /obj/item/stack/rods = 50, + /obj/item/stack/ore/blackpowder = 50, + /obj/item/advanced_crafting_components/alloys = 1 + ) + generate_items_inside(items_inside, src) + +// Pneumatic launcher /datum/crafting_recipe/gun/PheumonicLauncherVehicle name = "Mounted Pheumonic launcher" @@ -123,68 +182,56 @@ /obj/item/advanced_crafting_components/assembly = 1, /obj/item/advanced_crafting_components/receiver = 1) tools = list(TOOL_WORKBENCH) - time = 180 + time = 1 category = CAT_WEAPONRY subcategory = CAT_WEAPON -/*/datum/crafting_recipe/mech_ammo/brm8_missiles - name = "Minigun Ammo Pack" - result = /obj/item/mecha_ammo/minigun - reqs = list(/obj/item/ammo_box/magazine/ammobelt/m1919 = 3, - /obj/item/stack/sheet/metal = 10, - /obj/item/stack/sheet/mineral/titanium = 20, - /obj/item/stack/crafting/powder = 30) - tools = list(TOOL_WORKBENCH) - time = 180 - category = CAT_WEAPONRY - subcategory = CAT_AMMO*/ +// Shotgun -//shotgun - -/datum/crafting_recipe/gun/shotgunvehicle - name = "Improvised Shotgun (for vehicles)" - result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/hobo +/datum/crafting_recipe/gun/vehicle/shotgun_improvised + name = "Improvised vehicular shotgun" + result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/improvised reqs = list(/obj/item/gun/ballistic/revolver/hobo/single_shotgun = 2, /obj/item/stack/crafting/metalparts = 5, /obj/item/stack/sheet/prewar = 5, /obj/item/stack/sheet/mineral/titanium = 5, /obj/item/stack/rods = 2) tools = list(TOOL_WORKBENCH) - time = 180 + time = 1 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS -/datum/crafting_recipe/gun/shotgunvehicle/normal - name = "Shotgun (for vehicles)" +/datum/crafting_recipe/gun/vehicle/shotgun_normal + name = "Standard vehicular shotgun" result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot - reqs = list(/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/hobo = 1, + reqs = list(/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/improvised = 1, /obj/item/stack/crafting/metalparts = 2, /obj/item/stack/sheet/prewar = 6, /obj/item/stack/sheet/mineral/titanium = 6, /obj/item/stack/rods = 2) tools = list(TOOL_WORKBENCH) - time = 180 + time = 1 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS -/datum/crafting_recipe/gun/HMGvehicle/upgraded - name = "Upgraded Shotgun (for vehicles)" - result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/auto +/datum/crafting_recipe/gun/vehicle/shotgun_upgraded + name = "Upgraded vehicular shotgun" + result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/rapid reqs = list(/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot = 1, /obj/item/stack/crafting/metalparts = 5, /obj/item/stack/sheet/prewar = 8, /obj/item/stack/sheet/mineral/titanium = 8, /obj/item/stack/rods = 2) tools = list(TOOL_AWORKBENCH) - time = 180 + time = 1 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS -/datum/crafting_recipe/lmgammo - name = "Shotgun Ammo for vehicles" +/datum/crafting_recipe/shotgun_ammo + name = "Vehicular shotgun ammunition" result = /obj/item/mecha_ammo/scattershot - reqs = list(/obj/item/stack/crafting/metalparts = 5, - /obj/item/stack/sheet/prewar = 5, + reqs = list(/obj/item/stack/crafting/metalparts = 3, + /obj/item/stack/sheet/prewar = 3, /obj/item/stack/ore/blackpowder = 1, /obj/item/stack/sheet/mineral/titanium = 1, ) @@ -267,7 +314,7 @@ /datum/crafting_recipe/vehiculearmor name = "Armor booster module (Close Combat Weaponry)" result = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster - reqs = list(/obj/item/stack/crafting/electronicparts = 40, + reqs = list(/obj/item/stack/sheet/prewar = 10, /obj/item/stack/crafting/metalparts = 10, /obj/item/advanced_crafting_components/alloys = 2, /obj/item/stack/crafting/goodparts = 4) @@ -279,7 +326,7 @@ /datum/crafting_recipe/vehiculearmor/distance name = "Armor booster module (Ranged Weaponry)" result = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster - reqs = list(/obj/item/stack/crafting/electronicparts = 40, + reqs = list(/obj/item/stack/sheet/prewar = 10, /obj/item/stack/crafting/metalparts = 10, /obj/item/advanced_crafting_components/alloys = 2, /obj/item/stack/crafting/goodparts = 4) diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index 31023b3fc7f..eb8802b94cc 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -4,10 +4,16 @@ // Mutable appearances are children of images, just so you know. -/mutable_appearance/New() +#if DM_BUILD > 1642 +/mutable_appearance/proc/New(mutable_appearance/to_copy) + if(!to_copy) + plane = FLOAT_PLANE +#else +/mutable_appearance/New(mutable_appearance/to_copy) ..() - plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE - // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var + if(!to_copy) + plane = FLOAT_PLANE +#endif // Fix for broken proc on latest version of BYOND. // Helper similar to image() /proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, color = "#FFFFFF") @@ -17,4 +23,4 @@ MA.layer = layer MA.plane = plane MA.color = color - return MA + return MA \ No newline at end of file diff --git a/code/datums/wires/mech_wires.dm b/code/datums/wires/mech_wires.dm index 48464235cc9..98512cc7844 100644 --- a/code/datums/wires/mech_wires.dm +++ b/code/datums/wires/mech_wires.dm @@ -80,7 +80,7 @@ var/turf/real_target var/x = A.dir & NORTH - A.dir & SOUTH var/y = A.dir & EAST - A.dir & WEST - if(A.selected.range == RANGED) + if(A.selected.range != 1) real_target = locate(A.x + round(rand(1,5)*x), A.y + round(rand(1,5)*y), A.z) // why shoot map edge.. if(!real_target) diff --git a/code/game/mecha/equipment/tools/fallout/vision_modules.dm b/code/game/mecha/equipment/tools/fallout/vision_modules.dm new file mode 100644 index 00000000000..f29213b3a88 --- /dev/null +++ b/code/game/mecha/equipment/tools/fallout/vision_modules.dm @@ -0,0 +1,32 @@ +/// Subtype for vision-granting equipments +/obj/item/mecha_parts/mecha_equipment/vision + name = "vision trait giver subtype module for exosuits" + desc = "you shouldn't be seeing this." + selectable = FALSE + var/list/vision_traits + +/obj/item/mecha_parts/mecha_equipment/vision/attach(obj/mecha/M) + . = ..() + M.remove_vision() + M.vision_modes |= vision_traits + M.grant_vision() + +/obj/item/mecha_parts/mecha_equipment/vision/detach(atom/moveto) + chassis.remove_vision() + chassis.vision_modes -= vision_traits + . = ..() + chassis.grant_vision() + +/obj/item/mecha_parts/mecha_equipment/vision/meson_scanner + name = "exosuit meson scanner" + desc = "An exosuit module that integrates a meson scanner." + icon_state = "mecha_meson" + energy_drain = 100 + vision_traits = list(TRAIT_MESON_VISION, TRAIT_NIGHT_VISION) + +/obj/item/mecha_parts/mecha_equipment/vision/thermal_scanner + name = "exosuit thermal scanner" + desc = "An exosuit module that integrates a thermal scanner." + icon_state = "mecha_thermal" + energy_drain = 100 + vision_traits = list(TRAIT_THERMAL_VISION, TRAIT_NIGHT_VISION) \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/vision_tools.dm b/code/game/mecha/equipment/tools/vision_tools.dm index f29213b3a88..e69de29bb2d 100644 --- a/code/game/mecha/equipment/tools/vision_tools.dm +++ b/code/game/mecha/equipment/tools/vision_tools.dm @@ -1,32 +0,0 @@ -/// Subtype for vision-granting equipments -/obj/item/mecha_parts/mecha_equipment/vision - name = "vision trait giver subtype module for exosuits" - desc = "you shouldn't be seeing this." - selectable = FALSE - var/list/vision_traits - -/obj/item/mecha_parts/mecha_equipment/vision/attach(obj/mecha/M) - . = ..() - M.remove_vision() - M.vision_modes |= vision_traits - M.grant_vision() - -/obj/item/mecha_parts/mecha_equipment/vision/detach(atom/moveto) - chassis.remove_vision() - chassis.vision_modes -= vision_traits - . = ..() - chassis.grant_vision() - -/obj/item/mecha_parts/mecha_equipment/vision/meson_scanner - name = "exosuit meson scanner" - desc = "An exosuit module that integrates a meson scanner." - icon_state = "mecha_meson" - energy_drain = 100 - vision_traits = list(TRAIT_MESON_VISION, TRAIT_NIGHT_VISION) - -/obj/item/mecha_parts/mecha_equipment/vision/thermal_scanner - name = "exosuit thermal scanner" - desc = "An exosuit module that integrates a thermal scanner." - icon_state = "mecha_thermal" - energy_drain = 100 - vision_traits = list(TRAIT_THERMAL_VISION, TRAIT_NIGHT_VISION) \ No newline at end of file diff --git a/code/game/mecha/equipment/weapons/fallout/ballistics.dm b/code/game/mecha/equipment/weapons/fallout/ballistics.dm new file mode 100644 index 00000000000..54f2e2c7e9d --- /dev/null +++ b/code/game/mecha/equipment/weapons/fallout/ballistics.dm @@ -0,0 +1,177 @@ +// Shotguns! + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot + name = "\improper heavy vehicular shotgun" + desc = "A shotgun that's modified to be mounted on a vehicle, fires a volley of heavy pellets." + icon_state = "mecha_scatter" + fire_sound = 'sound/weapons/sound_weapons_mech_shotgun.ogg' + equip_cooldown = 15 + projectile = /obj/item/projectile/bullet/pellet/shotgun_trainshot/tracer + projectiles = 24 + projectiles_cache = 24 + projectiles_cache_max = 144 + projectiles_per_shot = 6 + variance = 25 + harmful = TRUE + ammo_type = "scattershot" + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/improvised + name = "\improper improvised vehicular shotgun" + desc = "A shotgun built from scrap metal, fits to a combat vehicle, fires a volley of pellets." + icon_state = "mecha_scatter" + fire_sound = 'sound/f13weapons/auto5.ogg' + equip_cooldown = 20 + projectile = /obj/item/projectile/bullet/pellet/shotgun_buckshot/tracer + projectiles = 40 + projectiles_cache = 40 + projectiles_cache_max = 160 + projectiles_per_shot = 7 + variance = 25 + harmful = TRUE + ammo_type = "scattershot" + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/rapid + name = "\improper rapid-fire vehicular shotgun" + desc = "A rapid-fire shotgun fitted for mounting on a combat vehicle, fires fewer heavy pellets, but faster." + icon_state = "mecha_scatter" + fire_sound = 'sound/weapons/sound_weapons_mech_mortar.ogg' + equip_cooldown = 8 + projectile = /obj/item/projectile/bullet/pellet/shotgun_trainshot/tracer + projectiles = 40 + projectiles_cache = 40 + projectiles_cache_max = 200 + projectiles_per_shot = 5 + variance = 25 + is_automatic = TRUE + harmful = TRUE + ammo_type = "scattershot" + +// LMG! + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg + name = "\improper Ultra AC 2" + desc = "A machinegun chambered in 9mm to be mounted on combat vehicles. Fires a three-round burst." + icon_state = "mecha_uac2" + fire_sound = 'sound/weapons/sound_weapons_mech_autocannon.ogg' + equip_cooldown = 10 + projectile = /obj/item/projectile/bullet/c9mm/tracer + projectiles = 300 + projectiles_cache = 300 + projectiles_cache_max = 1200 + projectiles_per_shot = 3 + is_automatic = TRUE + variance = 6 + randomspread = 1 + projectile_delay = 2 + harmful = TRUE + ammo_type = "lmg" + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid + name = "\improper AC AUTO" + desc = "A machinegun that's a real machinegun. Can be fired in full-auto by holding down the trigger, for combat vehicles." + icon_state = "mecha_uac2" + fire_sound = 'sound/f13weapons/bozar_fire.ogg' + equip_cooldown = 1 + projectile = /obj/item/projectile/bullet/c9mm/tracer + projectiles = 50 + projectiles_cache = 50 + projectiles_cache_max = 500 + variance = 6 + projectiles_per_shot = 1 + randomspread = 1.08 + harmful = TRUE + ammo_type = "lmg" + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/improvised + name = "\improper Improvised LMG" + desc = "A improvised machinegun chambered in 9mm, fitted for combat vehicles." + icon_state = "mecha_uac2" + fire_sound = 'sound/f13weapons/boltfire.ogg' + equip_cooldown = 10 + projectile = /obj/item/projectile/bullet/c9mm/improvised/tracer + projectiles = 25 + projectiles_cache = 25 + projectiles_cache_max = 1200 + projectiles_per_shot = 2 + variance = 6 + is_automatic = TRUE + randomspread = 1.2 + harmful = TRUE + ammo_type = "lmg" + +// Minigun! + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun + name = "\improper Minigun" + desc = "A minigun, capable of firing in full-auto but builds up heat rapidly. fitted for combat vehicles." + icon_state = "mecha_uac2" + fire_sound = 'sound/f13weapons/antimaterielfire.ogg' + equip_cooldown = 1 + projectile = /obj/item/projectile/bullet/c9mm/improvised/tracer + projectiles = 100 + projectiles_cache = 200 + projectiles_cache_max = 600 + projectiles_per_shot = 1 + variance = 6 + is_automatic = TRUE + randomspread = 112 + harmful = TRUE + ammo_type = "minigun" + var/overheat = 0 + var/overheat_max = 200 + var/heat_diffusion = 2.5 //How much heat is lost per tick + var/damage = 25 + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun/process() + overheat = max(0, overheat - heat_diffusion) + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun/action(atom/target, params) + if(!action_checks(target)) + return 0 + var/turf/curloc = get_turf(chassis) + var/turf/targloc = get_turf(target) + if (!targloc || !istype(targloc) || !curloc) + return 0 + if (targloc == curloc) + return 0 + if(overheat < overheat_max) + overheat += projectiles_per_shot + else + chassis.occupant_message("The gun's heat sensor locked the trigger to prevent barrel damage.") + return + chassis.occupant.DelayNextAction(3) + set_ready_state(0) + for(var/i=1 to get_shot_amount()) + var/obj/item/projectile/A = new projectile(curloc) + A.firer = chassis.occupant + A.original = target + A.damage = damage + if(!A.suppressed && firing_effect_type) + new firing_effect_type(get_turf(src), chassis.dir) + + var/spread = 0 + if(variance) + if(randomspread) + spread = round((rand() - 0.5) * variance) + else + spread = round((i / projectiles_per_shot - 0.5) * variance) + A.preparePixelProjectile(target, chassis.occupant, params, spread) + + A.fire() + overheat++ + projectiles-- + playsound(chassis, fire_sound, 50, 1) + chassis.occupant.DelayNextAction(1) + + if(kickback) + chassis.newtonian_move(turn(chassis.dir,180)) + + return 1 diff --git a/code/game/mecha/equipment/weapons/fallout/lasers.dm b/code/game/mecha/equipment/weapons/fallout/lasers.dm new file mode 100644 index 00000000000..1506dad9185 --- /dev/null +++ b/code/game/mecha/equipment/weapons/fallout/lasers.dm @@ -0,0 +1,34 @@ +// Small laser! + +/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser + equip_cooldown = 7 + name = "\improper CH-PS \"Immolator\" laser" + desc = "A weapon for combat exosuits. Shoots basic lasers." + icon_state = "mecha_laser" + energy_drain = 50 + projectile = /obj/item/projectile/beam/laser/mech/light + fire_sound = 'sound/weapons/laser.ogg' + harmful = TRUE + +// Big laser! + +/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy + equip_cooldown = 14 + name = "\improper CH-LC \"Solaris\" laser cannon" + desc = "A weapon for combat exosuits. Shoots heavy lasers." + icon_state = "mecha_laser" + energy_drain = 75 + projectile = /obj/item/projectile/beam/laser/mech/heavy + fire_sound = 'sound/weapons/lasercannonfire.ogg' + +// Pulse! + +/obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse + equip_cooldown = 40 + name = "\improper MKII heavy pulse cannon" + desc = "A weapon for combat exosuits. Shoots powerful destructive blasts." + icon_state = "mecha_pulse" + energy_drain = 500 + projectile = /obj/item/projectile/beam/laser/mech/pulse + fire_sound = 'sound/weapons/marauder.ogg' + harmful = TRUE diff --git a/code/game/mecha/equipment/weapons/fallout/launchers.dm b/code/game/mecha/equipment/weapons/fallout/launchers.dm new file mode 100644 index 00000000000..113a2b89ed8 --- /dev/null +++ b/code/game/mecha/equipment/weapons/fallout/launchers.dm @@ -0,0 +1,100 @@ +// Thingy launcher! + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind + name = "\improper Pheumonic launcher" + desc = "A weapon for combat exosuits. anything loaded in it." + icon_state = "mecha_grenadelnchr" + projectile = null + fire_sound = 'sound/weapons/grenadelaunch.ogg' + projectiles = 0 + projectiles_cache = 15 + projectiles_cache_max = 20 + missile_speed = 1.5 + equip_cooldown = 10 + var/det_time = 20 + ammo_type = "Anything" + var/list/obj/stuffs = new + var/open = FALSE + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/action(target) + if(!action_checks(target)) + return + if(!stuffs.len) + chassis.occupant_message("Nothing to shoot!") + return + var/obj/O = stuffs[1] + playsound(chassis, fire_sound, 50, 1) + mecha_log_message("Launched a [O.name] from [name], targeting [target].") + stuffs -= stuffs[1] + proj_init(O) + var/turf/nextt = (get_turf(src)) + O.forceMove(nextt) + O.throw_at(target, missile_range, missile_speed, chassis.occupant, FALSE, diagonals_first = diags_first) + return 1 + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/proj_init(obj/ammo) + var/turf/T = get_turf(src) + message_admins("[ADMIN_LOOKUPFLW(chassis.occupant)] fired a [src] in [ADMIN_VERBOSEJMP(T)]") + log_game("[key_name(chassis.occupant)] fired a [src] in [AREACOORD(T)]") + if(istype(ammo, /obj/item/grenade/)) + var/obj/item/grenade/payload = ammo + addtimer(CALLBACK(payload, TYPE_PROC_REF(/obj/item/grenade, prime)), det_time) + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/attackby(obj/item/W, mob/user, params) + if(open) + if(stuffs.len < projectiles_cache_max) + W.forceMove(src) + stuffs += W + projectiles++ + else + to_chat(user, "The [src] is full!") + return + . = ..() + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/screwdriver_act(mob/living/carbon/user, obj/item/I) + if(user.a_intent != INTENT_DISARM) + if(open) + to_chat(user, "You close the [src]!.") + else + to_chat(user, "You open the [src]!.") + open = !open + return TRUE + . = ..() + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/attack_self(mob/user) + if(open && stuffs.len) + var/obj/selectedthing = input(user, "Chosee an item to take out.", "Stuffs inside") as null|anything in stuffs + if(!selectedthing) + return + stuffs -= selectedthing + projectiles-- + selectedthing.forceMove(get_turf(src)) + user.put_in_hand(selectedthing) + return + . = ..() + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/AltClick(mob/user) + if(open && stuffs.len) + for(var/obj/I in stuffs) + I.forceMove(get_turf(src)) + stuffs -= I + projectiles-- + to_chat(user, "You empty the [src]!.") + return + . = ..() + +// Frag-grenade launcher! + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/fragmentation + name = "\improper SOB-3 grenade launcher" + desc = "A weapon for combat exosuits. Launches primed fragmentation grenades." + fire_sound = 'sound/weapons/grenadelaunch.ogg' + projectiles = 8 + projectiles_cache = 8 + projectiles_cache_max = 8 + missile_speed = 1.5 + equip_cooldown = 10 + disabledreload = TRUE + projectile = /obj/item/grenade/f13/frag + equip_cooldown = 90 + ammo_type = "fragmentation" diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/game/mecha/equipment/weapons/mecha_ammo.dm index d4845716cdf..c16f20f4419 100644 --- a/code/game/mecha/equipment/weapons/mecha_ammo.dm +++ b/code/game/mecha/equipment/weapons/mecha_ammo.dm @@ -82,7 +82,6 @@ load_audio = "sound/weapons/bulletinsert.ogg" ammo_type = "missiles_he" - /obj/item/mecha_ammo/flashbang name = "launchable flashbangs" desc = "A box of smooth flashbangs, for use with a large exosuit launcher. Cannot be primed by hand." @@ -100,6 +99,14 @@ direct_load = TRUE ammo_type = "clusterbang" +/obj/item/mecha_ammo/fragmentation + name = "launchable flashbang clusters" + desc = "A box of clustered flashbangs, for use with a specialized exosuit cluster launcher. Cannot be primed by hand." + icon_state = "fragmentation" + rounds = 8 + round_term = "frag grenade" + ammo_type = "fragmentation" + /obj/item/mecha_ammo/minigun name = "Minigun ammo pack" desc = "A box of high caliber ammo, ready to be consumed in nano seconds. Cannot be primed by hand." diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index c0a4fe32c17..278cf988153 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -67,24 +67,7 @@ chassis.use_power(energy_drain*get_shot_amount()) addtimer(CALLBACK(src, PROC_REF(set_ready_state), 1), equip_cooldown) -/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser - equip_cooldown = 7 - name = "\improper CH-PS \"Immolator\" laser" - desc = "A weapon for combat exosuits. Shoots basic lasers." - icon_state = "mecha_laser" - energy_drain = 50 - projectile = /obj/item/projectile/beam/laser/mech/light - fire_sound = 'sound/weapons/laser.ogg' - harmful = TRUE -/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy - equip_cooldown = 14 - name = "\improper CH-LC \"Solaris\" laser cannon" - desc = "A weapon for combat exosuits. Shoots heavy lasers." - icon_state = "mecha_laser" - energy_drain = 75 - projectile = /obj/item/projectile/beam/laser/mech/heavy - fire_sound = 'sound/weapons/lasercannonfire.ogg' /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion equip_cooldown = 16 @@ -105,16 +88,6 @@ fire_sound = 'sound/magic/lightningbolt.ogg' harmful = TRUE -/obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse - equip_cooldown = 40 - name = "\improper MKII heavy pulse cannon" - desc = "A weapon for combat exosuits. Shoots powerful destructive blasts." - icon_state = "mecha_pulse" - energy_drain = 500 - projectile = /obj/item/projectile/beam/laser/mech/pulse - fire_sound = 'sound/weapons/marauder.ogg' - harmful = TRUE - /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma equip_cooldown = 6 name = "217-D Heavy Plasma Cutter" @@ -216,54 +189,6 @@ harmful = TRUE ammo_type = "incendiary" -//Shotgun - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot - name = "\improper LBX AC 10 \"Scattershot\"" - desc = "A weapon for vehicules. Usualy carried by a pilot of the passengers. Shoots a spread of pellets." - icon_state = "mecha_scatter" - fire_sound = 'sound/weapons/sound_weapons_mech_shotgun.ogg' - equip_cooldown = 20 - projectile = /obj/item/projectile/bullet/scattershot - projectiles = 40 - projectiles_cache = 40 - projectiles_cache_max = 160 - projectiles_per_shot = 4 - variance = 25 - harmful = TRUE - ammo_type = "scattershot" - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/hobo - name = "\improper Hobot vehicule Shotgun" - desc = "A modified shotgun used to kick some ass from a vehicule." - icon_state = "mecha_scatter" - fire_sound = 'sound/f13weapons/auto5.ogg' - equip_cooldown = 20 - projectile = /obj/item/projectile/bullet/scattershot - projectiles = 20 - projectiles_cache = 20 - projectiles_cache_max = 130 - projectiles_per_shot = 3 - variance = 25 - harmful = TRUE - ammo_type = "scattershot" - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/auto - name = "\improper Upgraded vehicule Shotgun" - desc = "A modified shotgun used to kick some ass from a vehicule." - icon_state = "mecha_scatter" - fire_sound = 'sound/weapons/sound_weapons_mech_mortar.ogg' - equip_cooldown = 8 - projectile = /obj/item/projectile/bullet/scattershot - projectiles = 15 - projectiles_cache = 15 - projectiles_cache_max = 250 - projectiles_per_shot = 5 - variance = 25 - is_automatic = TRUE - harmful = TRUE - ammo_type = "scattershot" - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/seedscatter name = "\improper Melon Seed \"Scattershot\"" desc = "A weapon for combat exosuits. Shoots a spread of pellets, shaped as seed." @@ -278,141 +203,6 @@ harmful = TRUE ammo_type = "scattershot" -//HMG - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg - name = "\improper Ultra AC 2" - desc = "A weapon for combat exosuits. Shoots a rapid, three shot burst." - icon_state = "mecha_uac2" - fire_sound = 'sound/weapons/sound_weapons_mech_autocannon.ogg' - equip_cooldown = 10 - projectile = /obj/item/projectile/bullet/lmg - projectiles = 300 - projectiles_cache = 300 - projectiles_cache_max = 1200 - projectiles_per_shot = 3 - is_automatic = TRUE - variance = 6 - randomspread = 1 - projectile_delay = 2 - harmful = TRUE - ammo_type = "lmg" - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/auto - name = "\improper AC AUTO" - desc = "A weapon for combat exosuits. Automatic." - icon_state = "mecha_uac2" - fire_sound = 'sound/f13weapons/bozar_fire.ogg' - equip_cooldown = 2 - projectile = /obj/item/projectile/bullet/lmg/auto - projectiles = 150 - projectiles_cache = 150 - projectiles_cache_max = 1200 - variance = 6 - projectiles_per_shot = 3 - randomspread = 1.08 - harmful = TRUE - ammo_type = "lmg" - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/hobo - name = "\improper Improvised HMG" - desc = "A automatic machine gun make with scraps." - icon_state = "mecha_uac2" - fire_sound = 'sound/f13weapons/boltfire.ogg' - equip_cooldown = 10 - projectile = /obj/item/projectile/bullet/lmg/hobo - projectiles = 25 - projectiles_cache = 25 - projectiles_cache_max = 1200 - projectiles_per_shot = 2 - variance = 6 - is_automatic = TRUE - randomspread = 1.2 - harmful = TRUE - ammo_type = "lmg" - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun - name = "\improper Minigun" - desc = "A heavy machine gun capable of rapidly firing 7.62mm rounds. ready for vehicle mounting, with internal ammo box." - icon_state = "mecha_uac2" - fire_sound = 'sound/f13weapons/antimaterielfire.ogg' - equip_cooldown = 1 - projectile = /obj/item/projectile/bullet/a762 - projectiles = 300 - projectiles_cache = 300 - projectiles_cache_max = 600 - projectiles_per_shot = 1 - variance = 6 - is_automatic = TRUE - randomspread = 112 - harmful = TRUE - ammo_type = "minigun" - var/overheat = 0 - var/overheat_max = 160 - var/heat_diffusion = 2.5 //How much heat is lost per tick - var/damage = 25 - - - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun/Initialize() - . = ..() - START_PROCESSING(SSobj, src) - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun/process() - overheat = max(0, overheat - heat_diffusion) - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun/action(atom/target, params) - if(!action_checks(target)) - return 0 - var/turf/curloc = get_turf(chassis) - var/turf/targloc = get_turf(target) - if (!targloc || !istype(targloc) || !curloc) - return 0 - if (targloc == curloc) - return 0 - if(overheat < overheat_max) - overheat += projectiles_per_shot - else - chassis.occupant_message("The gun's heat sensor locked the trigger to prevent barrel damage.") - return - chassis.occupant.DelayNextAction(3) - set_ready_state(0) - for(var/i=1 to get_shot_amount()) - var/obj/item/projectile/A = new projectile(curloc) - A.firer = chassis.occupant - A.original = target - A.damage = damage - if(!A.suppressed && firing_effect_type) - new firing_effect_type(get_turf(src), chassis.dir) - - var/spread = 0 - if(variance) - if(randomspread) - spread = round((rand() - 0.5) * variance) - else - spread = round((i / projectiles_per_shot - 0.5) * variance) - A.preparePixelProjectile(target, chassis.occupant, params, spread) - - A.fire() - overheat++ - projectiles-- - playsound(chassis, fire_sound, 50, 1) - chassis.occupant.DelayNextAction(1) - - if(kickback) - chassis.newtonian_move(turn(chassis.dir,180)) - - return 1 - - - - - - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack name = "\improper SRM-8 missile rack" desc = "A weapon for combat exosuits. Launches light explosive missiles." @@ -461,89 +251,6 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/proc/proj_init(obj/O) return -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind - name = "\improper Pheumonic launcher" - desc = "A weapon for combat exosuits. anything loaded in it." - icon_state = "mecha_grenadelnchr" - projectile = null - fire_sound = 'sound/weapons/grenadelaunch.ogg' - projectiles = 0 - projectiles_cache = 15 - projectiles_cache_max = 20 - missile_speed = 1.5 - equip_cooldown = 10 - var/det_time = 20 - ammo_type = "Anything" - var/list/obj/stuffs = new - var/open = FALSE - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/action(target) - if(!action_checks(target)) - return - if(!stuffs.len) - chassis.occupant_message("Nothing to shoot!") - return - var/obj/O = stuffs[1] - playsound(chassis, fire_sound, 50, 1) - mecha_log_message("Launched a [O.name] from [name], targeting [target].") - stuffs -= stuffs[1] - proj_init(O) - var/turf/nextt = (get_turf(src)) - O.forceMove(nextt) - O.throw_at(target, missile_range, missile_speed, chassis.occupant, FALSE, diagonals_first = diags_first) - return 1 - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/proj_init(obj/ammo) - var/turf/T = get_turf(src) - message_admins("[ADMIN_LOOKUPFLW(chassis.occupant)] fired a [src] in [ADMIN_VERBOSEJMP(T)]") - log_game("[key_name(chassis.occupant)] fired a [src] in [AREACOORD(T)]") - if(istype(ammo, /obj/item/grenade/)) - var/obj/item/grenade/payload = ammo - addtimer(CALLBACK(payload, TYPE_PROC_REF(/obj/item/grenade, prime)), det_time) - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/attackby(obj/item/W, mob/user, params) - if(open) - if(stuffs.len < projectiles_cache_max) - W.forceMove(src) - stuffs += W - projectiles++ - else - to_chat(user, "The [src] is full!") - return - . = ..() - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/screwdriver_act(mob/living/carbon/user, obj/item/I) - if(user.a_intent != INTENT_DISARM) - if(open) - to_chat(user, "You close the [src]!.") - else - to_chat(user, "You open the [src]!.") - open = !open - return TRUE - . = ..() - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/attack_self(mob/user) - if(open && stuffs.len) - var/obj/selectedthing = input(user, "Chosee an item to take out.", "Stuffs inside") as null|anything in stuffs - if(!selectedthing) - return - stuffs -= selectedthing - projectiles-- - selectedthing.forceMove(get_turf(src)) - user.put_in_hand(selectedthing) - return - . = ..() - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/anykind/AltClick(mob/user) - if(open && stuffs.len) - for(var/obj/I in stuffs) - I.forceMove(get_turf(src)) - stuffs -= I - projectiles-- - to_chat(user, "You empty the [src]!.") - return - . = ..() - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang name = "\improper SGL-6 grenade launcher" diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index 87efbae835f..5e4e89c7d85 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -1,30 +1,24 @@ -/obj/mecha/combat/phazon/armored +/obj/mecha/combat/phazon/armored_jeep name = "\improper uparmored M38" desc = "A apparently original M38 jeep, modified with a almost fully armored chassis." -// icon = 'icons/mecha/armoredjeep.dmi' - icon_state = "armoredjeep" - max_integrity = 400 + icon = 'icons/mecha/armored_jeep.dmi' + icon_state = "armored_jeep" + max_integrity = 500 step_energy_drain = 1.5 step_in = 1.5 - armor = ARMOR_VALUE_PA + armor = ARMOR_VALUE_SALVAGE wreckage = /obj/structure/mecha_wreckage/buggy max_utility_equip = 2 max_weapons_equip = 1 max_misc_equip = 1 -/obj/mecha/combat/phazon/armoredjeep/rangerarmed/go_out() - ..() - update_icon() - -/obj/mecha/combat/phazon/armoredjeep/rangerarmed/moved_inside(mob/living/carbon/human/H) - ..() - update_icon() - -/obj/mecha/combat/phazon/armoredjeep/rangerarmed/loaded/Initialize() +/obj/mecha/combat/phazon/armored_jeep/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/hobo + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid ME.attach(src) max_ammo() \ No newline at end of file diff --git a/code/game/mecha/fallout/birds.dm b/code/game/mecha/fallout/birds.dm index 0c1e1f9ac47..5bdf4de87b0 100644 --- a/code/game/mecha/fallout/birds.dm +++ b/code/game/mecha/fallout/birds.dm @@ -66,7 +66,7 @@ /obj/mecha/combat/phazon/vertibird/loaded/Initialize() . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/auto + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) @@ -117,7 +117,7 @@ /obj/mecha/combat/phazon/vertibird/ncr/loaded/Initialize() . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/auto + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) @@ -179,7 +179,7 @@ /obj/mecha/combat/phazon/vertibird/enclave/loaded/Initialize() . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/auto + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) @@ -235,7 +235,7 @@ /obj/mecha/combat/phazon/vertibird/brotherhood/loaded/Initialize() . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/auto + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 0588e5c2865..1e46b196551 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -301,13 +301,14 @@ if(I.use_tool(src, user, 8 SECONDS, volume = 50)) user.visible_message("[user] pries the driver out of the [src]!", "You finish removing the driver from the [src]!") go_out() +/* else // Since having maint protocols available is controllable by the MMI, I see this as a consensual way to remove an MMI without destroying the mech user.visible_message("[user] begins levering out the MMI from [src].", "You begin to lever out the MMI from [src].") to_chat(occupant, "[user] is prying you out of the exosuit!") if(I.use_tool(src, user, 8 SECONDS, volume = 50) && occupant == mmi_as_oc) user.visible_message("[user] pries the MMI out of [src]!", "You finish removing the MMI from [src]!") - go_out() + go_out() */ /obj/mecha/screwdriver_act(mob/user, obj/item/I) if(user.a_intent == INTENT_HARM) diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm index 3d73983fdb4..1ef1e263687 100644 --- a/code/modules/projectiles/projectile/bullets/pistol.dm +++ b/code/modules/projectiles/projectile/bullets/pistol.dm @@ -26,7 +26,7 @@ wound_bonus = BULLET_WOUND_PISTOL_22 bare_wound_bonus = BULLET_WOUND_PISTOL_22_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_22 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -47,10 +47,10 @@ wound_bonus = RUBBERY_WOUND_PISTOL_22 bare_wound_bonus = BULLET_WOUND_PISTOL_22_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_22 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT - + sharpness = SHARP_NONE zone_accuracy_type = ZONE_WEIGHT_PRECISION // Rubbers go where you want @@ -71,7 +71,7 @@ wound_bonus = BULLET_WOUND_PISTOL_22 * BULLET_WOUND_SHOCK bare_wound_bonus = BULLET_WOUND_PISTOL_22_NAKED_MULT * BULLET_NAKED_WOUND_SHOCK wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_22 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -110,7 +110,7 @@ wound_bonus = BULLET_WOUND_PISTOL_9MM bare_wound_bonus = BULLET_WOUND_PISTOL_9MM_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_9MM damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT armour_penetration = 0.1 @@ -133,7 +133,7 @@ wound_bonus = BULLET_WOUND_PISTOL_9MM_HANDLOAD bare_wound_bonus = BULLET_WOUND_PISTOL_9MM_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_9MM_HANDLOAD damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -154,7 +154,7 @@ wound_bonus = RUBBERY_WOUND_PISTOL_9MM bare_wound_bonus = BULLET_WOUND_PISTOL_9MM_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_9MM damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT sharpness = SHARP_NONE @@ -178,7 +178,7 @@ wound_bonus = BULLET_WOUND_PISTOL_9MM * BULLET_WOUND_ACID bare_wound_bonus = BULLET_WOUND_PISTOL_9MM_NAKED_MULT * BULLET_NAKED_WOUND_ACID wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_9MM damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -216,7 +216,7 @@ wound_bonus = BULLET_WOUND_PISTOL_9MM * BULLET_WOUND_FIRE bare_wound_bonus = BULLET_WOUND_PISTOL_9MM_NAKED_MULT * BULLET_NAKED_WOUND_FIRE wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_9MM damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -258,7 +258,7 @@ wound_bonus = BULLET_WOUND_PISTOL_9MM bare_wound_bonus = BULLET_WOUND_PISTOL_9MM_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_9MM * 0.5 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -294,7 +294,7 @@ wound_bonus = BULLET_WOUND_PISTOL_38 bare_wound_bonus = BULLET_WOUND_PISTOL_38_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_38 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -308,7 +308,7 @@ wound_bonus = RUBBERY_WOUND_PISTOL_38 bare_wound_bonus = BULLET_WOUND_PISTOL_38_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_38 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -325,7 +325,7 @@ wound_bonus = BULLET_WOUND_PISTOL_38_HANDLOAD bare_wound_bonus = BULLET_WOUND_PISTOL_38_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_38_HANDLOAD damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -339,7 +339,7 @@ wound_bonus = BULLET_WOUND_PISTOL_38 * BULLET_WOUND_ACID bare_wound_bonus = BULLET_WOUND_PISTOL_38_NAKED_MULT * BULLET_NAKED_WOUND_ACID wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_38 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -369,7 +369,7 @@ wound_bonus = BULLET_WOUND_PISTOL_38 * BULLET_WOUND_FIRE bare_wound_bonus = BULLET_WOUND_PISTOL_38_NAKED_MULT * BULLET_NAKED_WOUND_FIRE wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_38 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -412,10 +412,10 @@ wound_bonus = BULLET_WOUND_PISTOL_NEEDLE bare_wound_bonus = BULLET_WOUND_PISTOL_NEEDLE_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_NEEDLE damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT - + var/piercing = FALSE // not sure what this does /obj/item/projectile/bullet/needle/improvised @@ -429,7 +429,7 @@ wound_bonus = BULLET_WOUND_PISTOL_NEEDLE_HANDLOAD bare_wound_bonus = BULLET_WOUND_PISTOL_NEEDLE_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_NEEDLE_HANDLOAD damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -463,7 +463,7 @@ wound_bonus = BULLET_WOUND_PISTOL_10MM bare_wound_bonus = BULLET_WOUND_PISTOL_10MM_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_10MM damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -484,7 +484,7 @@ wound_bonus = BULLET_WOUND_PISTOL_10MM_HANDLOAD bare_wound_bonus = BULLET_WOUND_PISTOL_10MM_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_10MM_HANDLOAD damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -505,7 +505,7 @@ wound_bonus = BULLET_WOUND_PISTOL_10MM_HANDLOAD bare_wound_bonus = BULLET_WOUND_PISTOL_10MM_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_10MM_HANDLOAD * 0.5 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -526,10 +526,10 @@ wound_bonus = RUBBERY_WOUND_PISTOL_10MM bare_wound_bonus = BULLET_WOUND_PISTOL_10MM_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_10MM damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT - + sharpness = SHARP_NONE zone_accuracy_type = ZONE_WEIGHT_PRECISION // Rubbers go where you want @@ -550,7 +550,7 @@ wound_bonus = BULLET_WOUND_PISTOL_10MM * BULLET_WOUND_FIRE bare_wound_bonus = BULLET_WOUND_PISTOL_10MM_NAKED_MULT * BULLET_NAKED_WOUND_FIRE wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_10MM damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -596,7 +596,7 @@ wound_bonus = BULLET_WOUND_PISTOL_45ACP bare_wound_bonus = BULLET_WOUND_PISTOL_45ACP_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_45ACP damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -617,7 +617,7 @@ wound_bonus = BULLET_WOUND_PISTOL_45ACP_HANDLOAD bare_wound_bonus = BULLET_WOUND_PISTOL_45ACP_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_45ACP_HANDLOAD damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -631,7 +631,7 @@ wound_bonus = BULLET_WOUND_PISTOL_45ACP_HANDLOAD bare_wound_bonus = BULLET_WOUND_PISTOL_45ACP_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_45ACP_HANDLOAD * 0.65 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -655,7 +655,7 @@ wound_bonus = RUBBERY_WOUND_PISTOL_45ACP bare_wound_bonus = BULLET_WOUND_PISTOL_45ACP_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_45ACP damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -679,7 +679,7 @@ wound_bonus = BULLET_WOUND_PISTOL_45ACP * BULLET_WOUND_FIRE bare_wound_bonus = BULLET_WOUND_PISTOL_45ACP_NAKED_MULT * BULLET_NAKED_WOUND_FIRE wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_45ACP damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -727,7 +727,7 @@ wound_bonus = BULLET_WOUND_PISTOL_38 bare_wound_bonus = BULLET_WOUND_PISTOL_38_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_38 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -748,7 +748,7 @@ wound_bonus = BULLET_WOUND_PISTOL_38_HANDLOAD bare_wound_bonus = BULLET_WOUND_PISTOL_38_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_38_HANDLOAD damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -769,7 +769,7 @@ wound_bonus = BULLET_WOUND_PISTOL_38 bare_wound_bonus = BULLET_WOUND_PISTOL_38_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_38 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -796,7 +796,7 @@ wound_bonus = BULLET_WOUND_PISTOL_38_MATCH * BULLET_WOUND_ACID bare_wound_bonus = BULLET_WOUND_PISTOL_38_NAKED_MULT * BULLET_NAKED_WOUND_ACID wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_38_MATCH damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -832,7 +832,7 @@ wound_bonus = BULLET_WOUND_PISTOL_38_MATCH * BULLET_WOUND_FIRE bare_wound_bonus = BULLET_WOUND_PISTOL_38_NAKED_MULT * BULLET_NAKED_WOUND_FIRE wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_38_MATCH damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -875,7 +875,7 @@ wound_bonus = BULLET_WOUND_PISTOL_44 bare_wound_bonus = BULLET_WOUND_PISTOL_44_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_44 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -896,7 +896,7 @@ wound_bonus = BULLET_WOUND_PISTOL_44_HANDLOAD bare_wound_bonus = BULLET_WOUND_PISTOL_44_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_44_HANDLOAD damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -917,7 +917,7 @@ wound_bonus = BULLET_WOUND_PISTOL_44_HANDLOAD bare_wound_bonus = BULLET_WOUND_PISTOL_44_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_44_HANDLOAD damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -939,7 +939,7 @@ wound_bonus = BULLET_WOUND_PISTOL_44 * BULLET_WOUND_FIRE bare_wound_bonus = BULLET_WOUND_PISTOL_44_NAKED_MULT * BULLET_NAKED_WOUND_FIRE wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_44 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -982,7 +982,7 @@ wound_bonus = BULLET_WOUND_PISTOL_14MM bare_wound_bonus = BULLET_WOUND_PISTOL_14MM_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_14MM damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -1003,7 +1003,7 @@ wound_bonus = BULLET_WOUND_PISTOL_14MM_HANDLOAD bare_wound_bonus = BULLET_WOUND_PISTOL_14MM_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_14MM_HANDLOAD damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -1024,7 +1024,7 @@ wound_bonus = BULLET_WOUND_PISTOL_14MM * BULLET_WOUND_POISON bare_wound_bonus = BULLET_WOUND_PISTOL_14MM_NAKED_MULT * BULLET_NAKED_WOUND_POISON wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_14MM damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT var/smoke_radius = 1 @@ -1078,7 +1078,7 @@ wound_bonus = BULLET_WOUND_PISTOL_45ACP bare_wound_bonus = BULLET_WOUND_PISTOL_45ACP_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_45ACP damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -1106,7 +1106,7 @@ wound_bonus = BULLET_WOUND_PISTOL_45ACP_HANDLOAD bare_wound_bonus = BULLET_WOUND_PISTOL_45ACP_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_PISTOL_45ACP_HANDLOAD damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -1129,7 +1129,7 @@ wound_bonus = BULLET_WOUND_GHOUL_ROCK bare_wound_bonus = BULLET_WOUND_GHOUL_ROCK_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_GHOUL_ROCK damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -1254,3 +1254,19 @@ SOPORIFIC ROUND CODE /obj/item/projectile/bullet/test name = "testing bullet" damage = 0 + +// Tracer rounds! For vehicles. + +/obj/item/projectile/bullet/c9mm/improvised/tracer + name = "9mm improvised tracer bullet" + + light_range = 3 + light_power = 0.7 + light_color = "#FF7F01" + +/obj/item/projectile/bullet/c9mm/tracer + name = "9mm tracer bullet" + + light_range = 2 + light_power = 0.5 + light_color = "#FF7F01" \ No newline at end of file diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 78019078e2c..5d0c5657edb 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -15,7 +15,7 @@ wound_bonus = BULLET_WOUND_SHOTGUN_PELLET bare_wound_bonus = BULLET_WOUND_SHOTGUN_PELLET_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_SHOTGUN_PELLET damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -33,7 +33,7 @@ wound_bonus = BULLET_WOUND_SHOTGUN_PELLET bare_wound_bonus = BULLET_WOUND_SHOTGUN_PELLET_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_SHOTGUN_PELLET damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -56,10 +56,10 @@ wound_bonus = RUBBERY_WOUND_SHOTGUN_PELLET bare_wound_bonus = BULLET_WOUND_SHOTGUN_PELLET_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_SHOTGUN_PELLET damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT - + zone_accuracy_type = ZONE_WEIGHT_SHOTGUN sharpness = SHARP_NONE embedding = null @@ -80,7 +80,7 @@ wound_bonus = BULLET_WOUND_SHOTGUN_PELLET bare_wound_bonus = BULLET_WOUND_SHOTGUN_PELLET_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_SHOTGUN_PELLET damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -117,7 +117,7 @@ wound_bonus = BULLET_WOUND_SHOTGUN_SLUG bare_wound_bonus = BULLET_WOUND_SHOTGUN_SLUG_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_SHOTGUN_SLUG damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -164,7 +164,7 @@ wound_bonus = RUBBERY_WOUND_SHOTGUN_SLUG bare_wound_bonus = BULLET_WOUND_SHOTGUN_SLUG_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_SHOTGUN_SLUG damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -187,7 +187,7 @@ wound_bonus = BULLET_WOUND_SHOTGUN_TRAIN bare_wound_bonus = BULLET_WOUND_SHOTGUN_TRAIN_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_SHOTGUN_TRAIN damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -218,7 +218,7 @@ wound_bonus = BULLET_WOUND_SHOTGUN_SLUG * BULLET_WOUND_FIRE bare_wound_bonus = BULLET_WOUND_SHOTGUN_SLUG_NAKED_MULT * BULLET_NAKED_WOUND_FIRE wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_SHOTGUN_SLUG damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -242,7 +242,7 @@ wound_bonus = BULLET_WOUND_SHOTGUN_PELLET * BULLET_WOUND_FIRE bare_wound_bonus = BULLET_WOUND_SHOTGUN_PELLET_NAKED_MULT * BULLET_NAKED_WOUND_FIRE wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_SHOTGUN_PELLET damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -271,7 +271,7 @@ wound_bonus = BULLET_WOUND_SHOTGUN_PELLET * BULLET_WOUND_FIRE bare_wound_bonus = BULLET_WOUND_SHOTGUN_PELLET_NAKED_MULT * BULLET_NAKED_WOUND_FIRE wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_SHOTGUN_PELLET damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -302,7 +302,7 @@ wound_bonus = RUBBERY_WOUND_SHOTGUN_SLUG bare_wound_bonus = BULLET_WOUND_SHOTGUN_SLUG_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_SHOTGUN_SLUG damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -349,7 +349,7 @@ wound_bonus = BULLET_WOUND_SHOTGUN_SLUG bare_wound_bonus = BULLET_WOUND_SHOTGUN_SLUG_NAKED_MULT wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_SHOTGUN_SLUG damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -387,7 +387,7 @@ wound_bonus = BULLET_WOUND_SHOTGUN_SLUG * BULLET_WOUND_EXPLOSIVE bare_wound_bonus = BULLET_WOUND_SHOTGUN_SLUG_NAKED_MULT * BULLET_NAKED_WOUND_EXPLOSIVE wound_falloff_tile = BULLET_WOUND_FALLOFF_PISTOL_LIGHT - + pixels_per_second = BULLET_SPEED_SHOTGUN_SLUG damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -429,3 +429,19 @@ /obj/item/projectile/bullet/pellet/shotgun_buckshot/test name = "buckshot pellet" damage = 0 + +// Tracer ammo! For vehicles. + +/obj/item/projectile/bullet/pellet/shotgun_buckshot/tracer + name = "tracer pellet" + + light_range = 1.5 + light_power = 0.3 + light_color = "#FF7F01" + +/obj/item/projectile/bullet/pellet/shotgun_trainshot/tracer + name = "trainshot tracer pellet" + + light_range = 1.5 + light_power = 0.3 + light_color = "#FF7F01" \ No newline at end of file diff --git a/hailmary.dme b/hailmary.dme index 07f341b6b5e..1ed2c646093 100644 --- a/hailmary.dme +++ b/hailmary.dme @@ -14,7 +14,6 @@ // END_PREFERENCES // BEGIN_INCLUDE -#include "code\__DEFINES\mecha_defines.dm" #include "_maps\_basemap.dm" #include "code\_byond_version_compat.dm" #include "code\_compile_options.dm" @@ -78,6 +77,7 @@ #include "code\__DEFINES\materials.dm" #include "code\__DEFINES\maths.dm" #include "code\__DEFINES\MC.dm" +#include "code\__DEFINES\mecha_defines.dm" #include "code\__DEFINES\medal.dm" #include "code\__DEFINES\melee.dm" #include "code\__DEFINES\menu.dm" @@ -1005,8 +1005,12 @@ #include "code\game\mecha\equipment\tools\other_tools.dm" #include "code\game\mecha\equipment\tools\vision_tools.dm" #include "code\game\mecha\equipment\tools\work_tools.dm" +#include "code\game\mecha\equipment\tools\fallout\vision_modules.dm" #include "code\game\mecha\equipment\weapons\mecha_ammo.dm" #include "code\game\mecha\equipment\weapons\weapons.dm" +#include "code\game\mecha\equipment\weapons\fallout\ballistics.dm" +#include "code\game\mecha\equipment\weapons\fallout\lasers.dm" +#include "code\game\mecha\equipment\weapons\fallout\launchers.dm" #include "code\game\mecha\fallout\armoured.dm" #include "code\game\mecha\fallout\birds.dm" #include "code\game\mecha\fallout\buggies.dm" diff --git a/icons/mecha/armoured_jeep.dmi b/icons/mecha/armoured_jeep.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ec6d5a29be7b748edae71256f0bba0b864a796f0 GIT binary patch literal 4697 zcmX9?c{CJI7k^`7hRGU6_Nj=dA^R4_60&8;QpVOoQjC2cG7(vlkgSmwd-gIJyM#fJ zEu9mmHq^LWE)f!tQ5W|n22Z3rnaYA zi({p$q*R(~q?9Bs$SBq7JWNoKsD3R_6qBG(CMB=J*RI@N;GptGN?SuIS>J4%xuI4{ zreUX%K!Siu(+k|Owe`jTaBCXt>skk8FJ~vFPe}0)uf8itd_3I$yXm0%?jBbB6ykJF zPPWMTMGwRg1|M_x!h_`G6?3e1AKgfT-h}N7v|pZ(^pyF6GNaGo--SyBH1^`3SFl8e z)iYAcZEyEF zMtW4AyC)P)tMvrWCACAV+Qa8Ad5L)MsSzr%<&y9pN@RXry=4J$BkaU@=o{vRT`{bI za}*vBMifD76GFU&(V7bVz_G$sE)_FS4>5upPki|`Q=!PU$( z%Bc&KA_&be)`{#|Sn&!|iih6|;;hXXTL06VRJ~oab!5t)oeSX44fqfi z2>L7xWw0j16zcx-#Kir1FWO$6Oyeq_A6jm$Va|*YA}blyuSoWA*4^pV1AC(Te1Hp~ z8ArteWke2yeBxTfPS|&-FQ-nQ=0cRkRhX1XfWYecxmbB{T;U6~R>e37_)++E-fcpP zOPI(@$;z9d5Sfd#W$qtrL^QhdXf5(M=ro;H+N{w5OQN~<#R&=V<@KxSaz3zY+V@p& zObi$-v{7x|&x|wNDY~}oEI!fIfty%)JGnx7xjJHQ{5W=O?@fpK1Is5UHjyz*{s|dXEQ?OM`$dBw(Q|QebOwmfGi!v`s zH%k^QOSfEib<0OS5dz0I=mvTwJI9Wx6=W5%6X3JAlxlq&;$Wr6W{y4QO;5uffkF)~ zJ{9K>Z!edBnZ_8a4KtXm&aIYQoWT>D&KM}xNIT>|OMAhsd3QrAsk0dEx#j84b4(4Y z6U`O%foVFXginyuri~E;mQFaTG;Dbu4ZgEZGh7XRDJw|qZ)tft!bd}MCTv}Nq*kG* z3@!WjWwOi=GV~5Gy%$_6JTT*pvHi%4#icWGMX#J(iw`jVl=4&vB8mHbKP_!~Q0*AU zxk^6A>p))T2_U-pVk%5*yO-yGu!Fg3&#-S$IhShR%2ta8 zu{f)k*NNOPBt#zuo2#E7ZZ3(?|oCFdpy zH1|b1ef!b1J$4>oiDMSWf#e5vuPn36fUZ_+8x+s;QFA{) zon?DJbcrmI7Na( zI84xlD2^xSI!h?Ta0SVloY956UR{Gh^q0?jh`UWCi!ESwi$#mt+4$~;lA|?fyt)y* z8gLz9Vwvk{y&c3Q(4wbdwiI_04s2|SC3e3QMwabGNE$T1f z=;afjqq*S#ZK}#XwSN+{>W7~$f)fJMMlUTDaxwu0?0i3e{eUX&Ze|pyv*Gd9mnK)6 zqfUPewwH}bw-b&A!f)+6-Cdb_|29nX5uRN^z?oNby@552Q@GU*wVATb4dhNs!cx-t zT#-xA$Wnh3HiB<`Vw5Yap$J?T&0JV+F74uSRw_QLv!*{Jd4y1mlG~%n6v;}=tRzyC z*}%6)rYJ5oPMF;AjN8eyp0np{X%P7n60|=<;H$2wj9JvGwCos2NiZ~KCR=EXl98Hy z5%OfFKmkI@bkn>11V7ON*af5zTjjj#$&qd#^I|{XqDT2o6!S$7MOx~BY!1-Hqx+lT9o|_)z9g};aG)?iD_oSZLAZ6$X7ZdtRfE%+; z+r3&3-un)@L0|WybGQgs*kJi|r%ix}tQ+OpGJV!MIqVJ=S?PbCz%1VE>s^stAo4+~ zknK0#l%BszfNQ%*pmvWxdvR*&R0Wd}hqww56!KJJxt7SnzB#cmaVK2C`V>aCDUH|* zte}9Cck4hi*E+PaKuoQKX|=?${K0yC~|i~Vz2 z%F{oVMaI=P@6%sj8w*&Y-)q`bxiPi!NF<&3Hl=h#_z2=Ep?@wgWsxb9e)RX6SuD_~enOB#! ze##sL)h7<&UoCzrTgXf?Td-vs#jeRS_2*=9hcMrF6aZ=Wx*$8cYuX=?> zJlBN!{G4=ei6}?#j`SJ-hVU<0q8?FtH9LA}e?4>uqtW|{f%)e#_AcKF#60P_nAVMsE1o1Q@+Aq-iA$n`?p2~0i$C+8E4=I?5P(S!w^L>eUGoieX)|Z5f6Piz=M%m+{#5^UWrq<@Z z8^EHHlFD#W3;Bv%IXi;j?bx;-{cb=ZvbA-xL-uIHwdmS^OoUw&oX}WWh@1rj_7bK$ zt?mIU;o5gxY)2ZO^a!aw4{Vorn9&5V)U;u?N%5Pcfg%>{Z3*|U8iQl^s@aa*s(K%h zu){;Hxkd#ymp@*D5>~?d9t&%||7fb*hI!1PvB^lYVpl_6Ft{Wd^H6Nw;Y;?3E#<#3kQsJg`LbUXRaSE!+PJndv`cVKytp z@O+8Px?_x&$&of(?W_(d7}GdRZcK5NaS`$iC`M*oX9`G|uCZ6KLo50Wys^4fh|C(2 zCZ*V%zw|P!D;H<pe|B(8^R{2?+EUl32Ff3==`;C3tZcXbGA9KSD0 z;!68Ch)B{Rr99YuDf;oeP~KNWRr&n$4b1C1ht)bvF&WO@u^2+kX*;5eRyGgpNS6Ee zH!$weBsc5-Usb~|n^&^ztCB2d@*ka{1eGD*^65cC3It}=NL<_WG@Mix4t@gvG<1+r zHH4^gj$=l+sx*W2)^*8o8Zq0|h=GxD)GS1vh&+sYLvSIIt!0te-Bt78habVM4>~hy zN#bhefK61%y;Zb>JA(z50;a736-yX*>gH!w64$T;jab=#1Y6~=?4RYio?Z) zuczarPBD{jofQ1R=52`n<)ngav1GkhfsBV=StPm+2+}PUi17mQmYlynL4=oxt{dz{ zCTLzkfDbG|wr+2qW?+6DbU;+AE~<_oyg+IP0cm|(_>*bY9sOBNo{J1jn7;*@*OQR! z{Tey@c6{9N=X~dxH@=6p8{jMLm{rLZ%fRrYP8T89e_%3p@j@$!E+osL3hu*B-wKt3 zbh45xp_M1=FMl$!KwEEB%B(Ojo0(yT==L4{VT8?H-{F#yJjNWge3Au!I1F$D!yyIK zCv)bnHZY|PA2djo7t35*u-|IX^@A4>A_T`4>>$GB8z0HiqHL&P`|10R4!^?OvB5ec zKd-p0=<-3tW%xtf>yis<1Bm4}HhxC~?=BX-N+guwUL*Y|BgFcNy@-L)+@Bm?g74er z2kK;Ybyd!+Z?nJ17nxd3TG=-{D31Jc;LDb?(OkY**>CnZ&Gl_+B%k+%4xH9|g}@_z zX%k;F-)_k==a01(!#1B>sB!%lH$CFE+m-s>WYY1A_p!Qd{`=F;&s|x_{;S8{@5YK= zgrgcNLgrkYM7IziOpkWq%XuL5fT+Alz2(DZ`)K-L3D2TKk=x;GOL40e8_Z1RbI{$p z`(oG{SOouFff$Xj0F~J9f7ES-2Rv+A2-D=gKTF8%a(xc3=MotWI~swoJ;O~=aNJPz z*SWd)wY>7bW|~vKJX}?JSPCB)_{LH>Mrx~UlOb@AK(2&BHV`PSMA&r5z^m20dPLCz zjVnq7zhyN7ZXD>Z2hCd6Wi`rnotdN2j*WejVz3f20m~mq<@b+4SCgSLk)b^G#?`_g z)b2!Q&nJPnYm+^(Wll{BZ)ARpJ7=x9+BmM15>^Zv{ z>lPm%uc?EMnT%y4oJsi2MwZ=`PvY!y(#(6 zUhc6gnuMnPF{M1Z2*JSsEc`Qi?j%3HX{8F_Kj4Js$M+!0kl9dzlLq4i-0X4W+3(Eo zjrDKKGMgZ4fW4m|`g%^;FOoT5WwVovL32z4`0bp)6;FbI3=npXh!k-W=o0_=t~`)a zXX>OsD+c#hZPk&`S6&fp&C{&7(CsyH|2fmWiiNb#=D50waOjxRB9V>UUupww_YdDR z;iF?qkXDUmA)12GXSBX4Es0Auvh$RB^$3x;E)*}!ch))N6@r}3ge8>!2IfTlr%!w| z)dFU?L3-4uqT>b3QbEZ#ojX>go-yaMqu7q478i*jc%cxR%cnhC7m21Xqm7fOhwI}< z0V_nXf~;hw3t5UV+qoO>Wc_=AsE&W0=+FUJC`h)BP_43<8*JpCRS?xeq~Ozu0sY|h zFjQ!B2410|$>GM{@xw6&(~z!z*hWRjlZ_kughC2@8v9hT(P@!}=(N~h%0HD+$w!m2x{aZY{S0pXzfvLO<3RVCCWsYgWwHzpEeK}{FE$>-xhXcs+O z+v&e>Du)P~xwkgL3M8M}lp3qQ{I7a+O_M?$*v5$I;h(EekmEN+K6^#XhM|_B(z~Ah z$fXPx# literal 0 HcmV?d00001 diff --git a/icons/mecha/mecha_ammo.dmi b/icons/mecha/mecha_ammo.dmi index 63bc38cfa71c706cde5466b2058661ff7ec54582..27b117c5b6d24abe8dc8aca03bb00d8fb80c5119 100644 GIT binary patch delta 836 zcmV-K1H1g{27w2VN`C+VX8-^HL58&dnKM5>KYsuK|7rmL*Z}YEe8c9CtJ24J00001 zbW%=J06^y0W&i*HuXoQBYp+&n`{fR^MNJ0Lv49K6nj|2LJ#9HAzH4RA_R0cT)6{ZYkQ4wn9E z4yHahbc1eiqruk8bn`}AepEcqzp2P0$_(EVni&@UBSG-Ges&=G{5m##R&E_keQ=08 z)8FlO#DVgtJ53XDxXplOW}d;I~+WRd4uZnemBEq5*Q!lUB(Wokbv9Op%&HN0rFWH4H- zo>TA~UvjwL{yBa zJRH2ue}5&|@%-8ztd{t!+&b|11dCsa z2gawX+;gM;7zZ>COYsBYgMgjtqzJ{3Vv5hln?kq;Iko)rmyqg~{j zAU&(dPy`Xrmf46UvX?2>7t2(OC+B<7D9!m_G@835zP}&z_k%U~*TyeI$VYs?v#3V^ O0000!Y~ko&&gAS_AdTiy+}*x z!M=i|$+lTYQpv80Z*Q>R(RiB=J_crLb#A+UP|c;64@iVdRDUOR+-#+IqGgxiu$RIC z&W=|g)(kmT5N`acq_CJM^G=E>=>Ti~T0YE02cv;#QKxcUKqB;T9n;^cgQ7}CGw1nk z;i5ZvO>We&Jj?hy<F1DL}S{< zq%^l_|NmQy5q}p6q%qj$AuT&?GLtoXVhId6o&JO-LC57QR!0$}{KE)hz9kI608|2c zPt)!TZT(TP-+yBju84Q|?v>qP^gp}`pU)2jluzGP=7;2*Am&?w^GW{sd`1N9L+(7! zh)@T>mC@P)Vy(c(mC@P)Vy)T$Fy0bUHwYm3bLvI{aDTIu0W9OSk^#}r0sJ~(N<{O^ z64Cq!;PWk^Y_d-6W}B>2yHk@_9u@nisr;yzs9!9!%r6$22PkQ&hZ5}bV+}7C_{aBf zgdZ+od=jwP_f2B`=?EXL=;`<04~B+@hK624z4wE7?D+Izb}a83_b2&ZUh;VQo*%5% z{E(az=zsX@^@}L_xqi6qX0Z+8=z!B^fv)4;b{|4eo-RqH3=Itp{WJA`-p6Cdw|^J2V>$hJ6+2dSzB2y3+;d&Nau>7` zQ2r8NFai6JPYHE^R2e(oEU)1c0N~0vJJzZV;KnaX-5>ynhnv_62>AlQc)~`2Yq9Z7 z;7bGrYAz9KGJHq5$)P}PO(xUGwOF2}G`|)gF0}0YUo5oR5=oDO%Jcs^0JQo1UkTWL r{w7}q>^}e35cZw_*9m?1gV)wC59B;o?7uDa00000NkvXXu0mjf^cj$` From 1b521106a9d0693ab54d691e2d8dc6aca5001aa1 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Thu, 26 Sep 2024 05:27:09 +1200 Subject: [PATCH 07/68] V4 --- code/__DEFINES/mech_wires.dm | 108 --------- code/__DEFINES/mecha_defines.dm | 14 -- .../crafting/recipes/vehicle_parts.dm | 1 - code/datums/wires/mech_wires.dm | 108 --------- .../mecha/equipment/weapons/mecha_ammo.dm | 2 +- code/game/mecha/fallout/armoured.dm | 33 ++- code/game/mecha/mecha.dm | 34 +-- code/game/mecha/mecha_actions.dm | 4 - code/game/mecha/mecha_defense.dm | 209 +++--------------- code/game/mecha/mecha_topic.dm | 12 - hailmary.dme | 2 - 11 files changed, 64 insertions(+), 463 deletions(-) delete mode 100644 code/__DEFINES/mech_wires.dm delete mode 100644 code/__DEFINES/mecha_defines.dm delete mode 100644 code/datums/wires/mech_wires.dm diff --git a/code/__DEFINES/mech_wires.dm b/code/__DEFINES/mech_wires.dm deleted file mode 100644 index d4d5a82b919..00000000000 --- a/code/__DEFINES/mech_wires.dm +++ /dev/null @@ -1,108 +0,0 @@ - -/datum/wires/mech - holder_type = /obj/mecha -// wire_count = 12 // 8 actual, 4 duds - proper_name = "Mecha" - -/datum/wires/mech/New(atom/_holder) - wires = list(WIRE_MECH_DIRECTION, WIRE_MECH_DNA, WIRE_MECH_POWER , WIRE_MECH_SELECT_MODULE, WIRE_MECH_USE_MODULE, WIRE_MECH_WALK, WIRE_MECH_RADIO , WIRE_MECH_VISUALDATA) - return ..() - -/datum/wires/mech/interactable(mob/user) - var/obj/mecha/A = holder - if(A.state == MECHA_OPEN_HATCH || A.maintenance_panel_status == MECHA_PANEL_6) - return TRUE - return FALSE - -/datum/wires/mech/get_status() - . = ..() - . += "The high-voltage power indicator blinks [is_cut(WIRE_MECH_POWER) ? "red" : "green"]" - . += "The module selection data-bus indicator is [is_cut(WIRE_MECH_SELECT_MODULE) ? "off" : "on"]" - . += "The module data-transfer data-bus light is [is_cut(WIRE_MECH_USE_MODULE) ? "not blinking" : "blinking"]" - . += "The internal radio wire is [is_cut(WIRE_MECH_RADIO) ? "cut" : "intact"]" - . += "The internal gyroscope-direction assembly wire is [is_cut(WIRE_MECH_DIRECTION) ? "cut" : "intact"]" - . += "The wire leading to the mech actuators is [is_cut(WIRE_MECH_WALK) ? "cut" : "intact"]" - . += "The wire leading to the internal display screens is [is_cut(WIRE_MECH_VISUALDATA) ? "cut" : "intact"]" - . += "The DNA lock light is [is_cut(WIRE_MECH_DNA) ? "blinking red" : "showing green"]" - -/datum/wires/mech/on_cut(wire, mend) - var/obj/mecha/A = holder - switch(wire) - if(WIRE_MECH_DIRECTION) - return - if(WIRE_MECH_POWER) - return - if(WIRE_MECH_SELECT_MODULE) - return - if(WIRE_MECH_USE_MODULE) - return - if(WIRE_MECH_WALK) - return - if(WIRE_MECH_RADIO) - if(mend) - A.radio.broadcasting = TRUE - A.radio.listening = FALSE - else - A.radio.broadcasting = FALSE - A.radio.listening = FALSE - return - if(WIRE_MECH_VISUALDATA) - if(mend) - A.grant_vision() - else - A.remove_vision() - return - - . = ..() - -/datum/wires/mech/on_pulse(wire) - var/obj/mecha/A = holder - switch(wire) - if(WIRE_MECH_DIRECTION) - A.mechturn(pick(NORTH, SOUTH , EAST, WEST, SOUTHEAST , SOUTHWEST, NORTHEAST, NORTHWEST)) - return - if(WIRE_MECH_DNA) - A.dna = null - return - if(WIRE_MECH_POWER) - return - if(WIRE_MECH_SELECT_MODULE) - if(length(A.equipment)) - var/obj/item/mecha_parts/mecha_equipment/thing = pick(A.equipment) - if(!thing.selectable) - thing = null - A.selected = thing - return - if(WIRE_MECH_USE_MODULE) - if(!A.selected) - return - var/list/targets = list() - var/turf/real_target - var/x = A.dir & NORTH - A.dir & SOUTH - var/y = A.dir & EAST - A.dir & WEST - if(A.selected.range & MECHA_RANGED) - real_target = locate(A.x + round(rand(1,5)*x), A.y + round(rand(1,5)*y), A.z) - // why shoot map edge.. - if(!real_target) - return - targets = block(real_target.x-1, real_target.y-1, A.z, real_target.x+1, real_target.y+1, A.z) - while(targets.Find(null)) - targets.Remove(null) - else - real_target = locate(A.x + x, A.y + y, A.z) - if(!real_target) - return - targets = list(real_target) - A.selected.action(pick(targets)) - return - if(WIRE_MECH_WALK) - A.domove(A.dir) - return - if(WIRE_MECH_RADIO) - A.radio.broadcasting = !A.radio.broadcasting - A.radio.listening = !A.radio.listening - return - if(WIRE_MECH_VISUALDATA) - return - - . = ..() diff --git a/code/__DEFINES/mecha_defines.dm b/code/__DEFINES/mecha_defines.dm deleted file mode 100644 index 26e738a3ab6..00000000000 --- a/code/__DEFINES/mecha_defines.dm +++ /dev/null @@ -1,14 +0,0 @@ -/// Defines for mecha panel dismantling states -#define MECHA_PANEL_0 "untarnished" -#define MECHA_PANEL_1 "welded1" // welder -#define MECHA_PANEL_2 "crowbared1" // crowbar -#define MECHA_PANEL_3 "welded2" // welder -#define MECHA_PANEL_4 "crowbared2" // crowbar -#define MECHA_PANEL_5 "wirecutter" // wirecutter -#define MECHA_PANEL_6 "opened" - -#define MECHA_MAINT_OFF 0 -#define MECHA_MAINT_ON 1 -#define MECHA_BOLTS_UP 2 -#define MECHA_OPEN_HATCH 3 -#define MECHA_BATTERY_UNSCREW 4 \ No newline at end of file diff --git a/code/datums/components/crafting/recipes/vehicle_parts.dm b/code/datums/components/crafting/recipes/vehicle_parts.dm index 4abe3eff0ce..bc0a675e4cc 100644 --- a/code/datums/components/crafting/recipes/vehicle_parts.dm +++ b/code/datums/components/crafting/recipes/vehicle_parts.dm @@ -334,4 +334,3 @@ time = 180 subcategory = CAT_VEHICLES category = CAT_VEHICLEPARTS - diff --git a/code/datums/wires/mech_wires.dm b/code/datums/wires/mech_wires.dm deleted file mode 100644 index 98512cc7844..00000000000 --- a/code/datums/wires/mech_wires.dm +++ /dev/null @@ -1,108 +0,0 @@ - -/datum/wires/mech - holder_type = /obj/mecha -// wire_count = 12 // 8 actual, 4 duds - proper_name = "Mecha" - -/datum/wires/mech/New(atom/_holder) - wires = list(WIRE_MECH_DIRECTION, WIRE_MECH_DNA, WIRE_MECH_POWER , WIRE_MECH_SELECT_MODULE, WIRE_MECH_USE_MODULE, WIRE_MECH_WALK, WIRE_MECH_RADIO , WIRE_MECH_VISUALDATA) - return ..() - -/datum/wires/mech/interactable(mob/user) - var/obj/mecha/A = holder - if(A.state == MECHA_OPEN_HATCH || A.maintenance_panel_status == MECHA_PANEL_6) - return TRUE - return FALSE - -/datum/wires/mech/get_status() - . = ..() - . += "The high-voltage power indicator blinks [is_cut(WIRE_MECH_POWER) ? "red" : "green"]" - . += "The module selection data-bus indicator is [is_cut(WIRE_MECH_SELECT_MODULE) ? "off" : "on"]" - . += "The module data-transfer data-bus light is [is_cut(WIRE_MECH_USE_MODULE) ? "not blinking" : "blinking"]" - . += "The internal radio wire is [is_cut(WIRE_MECH_RADIO) ? "cut" : "intact"]" - . += "The internal gyroscope-direction assembly wire is [is_cut(WIRE_MECH_DIRECTION) ? "cut" : "intact"]" - . += "The wire leading to the mech actuators is [is_cut(WIRE_MECH_WALK) ? "cut" : "intact"]" - . += "The wire leading to the internal display screens is [is_cut(WIRE_MECH_VISUALDATA) ? "cut" : "intact"]" - . += "The DNA lock light is [is_cut(WIRE_MECH_DNA) ? "blinking red" : "showing green"]" - -/datum/wires/mech/on_cut(wire, mend) - var/obj/mecha/A = holder - switch(wire) - if(WIRE_MECH_DIRECTION) - return - if(WIRE_MECH_POWER) - return - if(WIRE_MECH_SELECT_MODULE) - return - if(WIRE_MECH_USE_MODULE) - return - if(WIRE_MECH_WALK) - return - if(WIRE_MECH_RADIO) - if(mend) - A.radio.broadcasting = TRUE - A.radio.listening = FALSE - else - A.radio.broadcasting = FALSE - A.radio.listening = FALSE - return - if(WIRE_MECH_VISUALDATA) - if(mend) - A.grant_vision() - else - A.remove_vision() - return - - . = ..() - -/datum/wires/mech/on_pulse(wire) - var/obj/mecha/A = holder - switch(wire) - if(WIRE_MECH_DIRECTION) - A.mechturn(pick(NORTH, SOUTH , EAST, WEST, SOUTHEAST , SOUTHWEST, NORTHEAST, NORTHWEST)) - return - if(WIRE_MECH_DNA) - A.dna_lock = null - return - if(WIRE_MECH_POWER) - return - if(WIRE_MECH_SELECT_MODULE) - if(length(A.equipment)) - var/obj/item/mecha_parts/mecha_equipment/thing = pick(A.equipment) - if(!thing.selectable) - thing = null - A.selected = thing - return - if(WIRE_MECH_USE_MODULE) - if(!A.selected) - return - var/list/targets = list() - var/turf/real_target - var/x = A.dir & NORTH - A.dir & SOUTH - var/y = A.dir & EAST - A.dir & WEST - if(A.selected.range != 1) - real_target = locate(A.x + round(rand(1,5)*x), A.y + round(rand(1,5)*y), A.z) - // why shoot map edge.. - if(!real_target) - return - targets = block(real_target.x-1, real_target.y-1, A.z, real_target.x+1, real_target.y+1, A.z) - while(targets.Find(null)) - targets.Remove(null) - else - real_target = locate(A.x + x, A.y + y, A.z) - if(!real_target) - return - targets = list(real_target) - A.selected.action(pick(targets)) - return - if(WIRE_MECH_WALK) - A.domove(A.dir) - return - if(WIRE_MECH_RADIO) - A.radio.broadcasting = !A.radio.broadcasting - A.radio.listening = !A.radio.listening - return - if(WIRE_MECH_VISUALDATA) - return - - . = ..() diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/game/mecha/equipment/weapons/mecha_ammo.dm index c16f20f4419..47dddf0a7eb 100644 --- a/code/game/mecha/equipment/weapons/mecha_ammo.dm +++ b/code/game/mecha/equipment/weapons/mecha_ammo.dm @@ -101,7 +101,7 @@ /obj/item/mecha_ammo/fragmentation name = "launchable flashbang clusters" - desc = "A box of clustered flashbangs, for use with a specialized exosuit cluster launcher. Cannot be primed by hand." + desc = "A box of clustered fragmentation grenades, for use with a vehicle's launcher. Cannot be primed by hand." icon_state = "fragmentation" rounds = 8 round_term = "frag grenade" diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index 5e4e89c7d85..872ce5e3838 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -1,18 +1,41 @@ -/obj/mecha/combat/phazon/armored_jeep +/obj/mecha/combat/phazon/armoured_jeep name = "\improper uparmored M38" desc = "A apparently original M38 jeep, modified with a almost fully armored chassis." - icon = 'icons/mecha/armored_jeep.dmi' - icon_state = "armored_jeep" + icon = 'icons/mecha/armoured_jeep.dmi' + icon_state = "armoured_jeep" + stepsound = 'sound/f13machines/buggy_loop.ogg' + turnsound = 'sound/f13machines/buggy_loop.ogg' + pixel_x = -7 + pixel_y = -5 max_integrity = 500 step_energy_drain = 1.5 step_in = 1.5 armor = ARMOR_VALUE_SALVAGE - wreckage = /obj/structure/mecha_wreckage/buggy + wreckage = /obj/structure/mecha_wreckage/armoured_jeep max_utility_equip = 2 max_weapons_equip = 1 max_misc_equip = 1 -/obj/mecha/combat/phazon/armored_jeep/loaded/Initialize() +/obj/mecha/combat/phazon/buggy/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + +/obj/mecha/combat/phazon/buggy/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + +/obj/structure/mecha_wreckage/armoured_jeep + name = "\improper M38 wreckage" + desc = "Wreckage of a M38 jeep, it's completely destroyed." + icon_state = "armoured_jeep-broken" + +/obj/mecha/combat/phazon/armoured_jeep/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 2cdbbd823ff..438e09cbf4b 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -106,9 +106,6 @@ /// a list of all vision traits to give to the occupant. var/list/vision_modes = list() - /// The current status of the mech maintenance panel , theres 5 states of progression (welder ,crowbar, welder ,crowbar , wirecutter) to forcing it open. - /// Having maintenance permitted cuts this down to the normal wrench + crowbar - var/maintenance_panel_status = MECHA_PANEL_0 var/stepsound = 'sound/mecha/mechstep.ogg' var/turnsound = 'sound/mecha/mechturn.ogg' @@ -196,13 +193,10 @@ diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() - internal_wiring = new(src) /obj/mecha/proc/grant_vision() if(!occupant) return - if(internal_wiring.is_cut(WIRE_MECH_VISUALDATA)) - return for(var/mode in vision_modes) ADD_TRAIT(occupant, mode, TRAIT_GENERIC) occupant.update_sight() @@ -427,8 +421,6 @@ if(occupant) if(fuel_holder) var/fuelamount = fuel_holder.reagents.total_volume/fuel_holder.volume - if(internal_wiring.is_cut(WIRE_MECH_POWER)) - fuelamount = 0 switch(fuelamount) if(0.75 to INFINITY) occupant.clear_alert("charge") @@ -481,8 +473,6 @@ /obj/mecha/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) . = ..() - if(internal_wiring.is_cut(WIRE_MECH_RADIO)) - return if(speaker == occupant) if(radio.broadcasting) radio.talk_into(speaker, text, , spans, message_language) @@ -512,9 +502,6 @@ return if(user.incapacitated()) return - if(internal_wiring.is_cut(WIRE_MECH_USE_MODULE)) - occupant_message("Error transmitting command to module") - return if(state) occupant_message("Maintenance protocols in effect.") return @@ -593,9 +580,6 @@ /obj/mecha/relaymove(mob/user,direction) if(completely_disabled) return - if(internal_wiring.is_cut(WIRE_MECH_WALK)) - to_chat(user , "Error transmitting command to actuators.") - return if(!direction) return if(user != occupant) //While not "realistic", this piece is player friendly. @@ -631,11 +615,6 @@ set_glide_size(DELAY_TO_GLIDE_SIZE(step_in)) move_result = mechsteprand() else if(dir != direction && (!strafe || occupant.client.keys_held["Alt"])) - if(internal_wiring.is_cut(WIRE_MECH_DIRECTION)) - if(world.time - last_message > 2 SECONDS) - to_chat(occupant, "Error transmitting direction-switch command to actuators.") - last_message = world.time - return move_result = mechturn(direction) else set_glide_size(DELAY_TO_GLIDE_SIZE(step_in)) @@ -850,9 +829,6 @@ if(AI.stat || !AI.client) to_chat(user, "[AI.name] is currently unresponsive, and cannot be uploaded.") return - if(occupant || (dna_lock && !internal_wiring.is_cut(WIRE_MECH_DNA))) //Normal AIs cannot steal mechs! - to_chat(user, "Access denied. [name] is [occupant ? "currently occupied" : "secured with a DNA lock"].") - return AI.control_disabled = 0 AI.radio_enabled = 1 to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") @@ -948,7 +924,7 @@ to_chat(usr, "The [name] is already occupied!") log_append_to_last("Permission denied.") return - if(dna_lock && !internal_wiring.is_cut(WIRE_MECH_DNA)) + if(dna_lock) var/passed = FALSE if(user.has_dna()) var/mob/living/carbon/C = user @@ -1016,7 +992,7 @@ else if(occupant) to_chat(user, "Occupant detected!") return FALSE - else if(dna_lock && !internal_wiring.is_cut(WIRE_MECH_DNA) && (!mmi_as_oc.brainmob.stored_dna || (dna_lock != mmi_as_oc.brainmob.stored_dna.unique_enzymes))) + else if(dna_lock && (!mmi_as_oc.brainmob.stored_dna || (dna_lock != mmi_as_oc.brainmob.stored_dna.unique_enzymes))) to_chat(user, "Access denied. [name] is secured with a DNA lock.") return FALSE @@ -1172,8 +1148,6 @@ return (get_charge()>=amount) /obj/mecha/proc/get_charge() - if(internal_wiring.is_cut(WIRE_MECH_POWER)) - return 0 for(var/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/R in equipment) var/relay_charge = R.get_charge() if(relay_charge) @@ -1182,16 +1156,12 @@ return max(0, fuel_holder.reagents.total_volume) /obj/mecha/proc/use_power(amount) - if(internal_wiring.is_cut(WIRE_MECH_POWER)) - return FALSE amount = amount*0.5 //cut it in half since gasoline is expensive if(get_charge() && fuel_holder.reagents.remove_reagent(/datum/reagent/fuel, amount)) return 1 return 0 /obj/mecha/proc/give_power(amount) - if(internal_wiring.is_cut(WIRE_MECH_POWER)) - return FALSE if(!isnull(get_charge())) fuel_holder.reagents.add_reagent(/datum/reagent/fuel, amount) return 1 diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index 3791219622f..0bdbfaf4c5a 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -77,10 +77,6 @@ if(!owner || !chassis || chassis.occupant != owner) return - if(chassis.internal_wiring.is_cut(WIRE_MECH_SELECT_MODULE)) - chassis.occupant_message("Error, no response from module.") - return - var/list/available_equipment = list() for(var/obj/item/mecha_parts/mecha_equipment/M in chassis.equipment) if(M.selectable) diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 1e46b196551..de11715c313 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -197,14 +197,44 @@ to_chat(user, span_warning("Invalid ID: Access denied.")) else to_chat(user, span_warning("Maintenance protocols disabled by operator.")) -/* else if(istype(W, /obj/item/wrench)) + else if(istype(W, /obj/item/wrench)) if(state==1) state = 2 to_chat(user, span_notice("You undo the securing bolts.")) else if(state==2) state = 1 to_chat(user, span_notice("You tighten the securing bolts.")) - return*/ + return + else if(istype(W, /obj/item/crowbar)) + if(state==2) + state = 3 + to_chat(user, span_notice("You open the hatch to the power unit.")) + else if(state==3) + state=2 + to_chat(user, span_notice("You close the hatch to the power unit.")) + return + else if(istype(W, /obj/item/stack/cable_coil)) + if(state == 3 && (internal_damage & MECHA_INT_SHORT_CIRCUIT)) + if(W.use_tool(src, user, 0, 2)) + clearInternalDamage(MECHA_INT_SHORT_CIRCUIT) + to_chat(user, span_notice("You replace the fused wires.")) + else + to_chat(user, span_warning("You need two lengths of cable to fix this mech!")) + return + else if(istype(W, /obj/item/screwdriver) && user.a_intent != INTENT_HARM) + if(internal_damage & MECHA_INT_TEMP_CONTROL) + clearInternalDamage(MECHA_INT_TEMP_CONTROL) + to_chat(user, span_notice("You repair the damaged temperature controller.")) + else if(state==3 && fuel_holder) + fuel_holder.forceMove(loc) + fuel_holder = null + state = 4 + to_chat(user, span_notice("You unsecure the fuel tank.")) + mecha_log_message("Fuel tank removed") + else if(state==4 && fuel_holder) + state=3 + to_chat(user, span_notice("You secure the fuel_tank in place.")) + return else if(istype(W, /obj/item/reagent_containers/fuel_tank)) if(state==4) @@ -243,179 +273,6 @@ else return ..() -/obj/mecha/crowbar_act(mob/user, obj/item/I) - if(user.a_intent != INTENT_HELP) - switch(maintenance_panel_status) - if(MECHA_PANEL_1) - to_chat(user, "You begin bending the hatches on \the [src] out of place") - if(I.use_tool(src, user, 12 SECONDS, volume = 50)) - to_chat(user, "You bend the hatches on \the [src], you can now heat up the security screws.") - maintenance_panel_status = MECHA_PANEL_2 - return TRUE - if(MECHA_PANEL_2) - to_chat(user, "You begin repairing the hatches on \the [src]") - if(I.use_tool(src, user, 12 SECONDS, volume = 50)) - to_chat(user, "You repair the hatches on \the [src].") - maintenance_panel_status = MECHA_PANEL_0 - return TRUE - if(MECHA_PANEL_3) - to_chat(user, "You begin removing the security pins on [src]'s hatch") - if(I.use_tool(src, user, 12 SECONDS, volume = 50)) - to_chat(user, "You remove the security pins on \the [src].") - maintenance_panel_status = MECHA_PANEL_5 - return TRUE - if(MECHA_PANEL_4) - to_chat(user, "You begin replacing the security pins on [src]'s hatch") - if(I.use_tool(src, user, 12 SECONDS, volume = 50)) - to_chat(user, "You replace the security pins on \the [src]'s hatch.") - maintenance_panel_status = MECHA_PANEL_2 - return TRUE - if(MECHA_PANEL_6) - if(state != MECHA_OPEN_HATCH && state != MECHA_BATTERY_UNSCREW) - to_chat(user, "You begin opening [src]'s hatch") - if(I.use_tool(src, user, 3 SECONDS, volume = 50)) - to_chat(user, "You open [src]'s hatch.") - state = MECHA_OPEN_HATCH - return TRUE - else if(state == MECHA_OPEN_HATCH) - to_chat(user, "You begin closing [src]'s hatch") - if(I.use_tool(src, user, 3 SECONDS, volume = 50)) - to_chat(user, "You close [src]'s hatch.") - state = MECHA_MAINT_OFF - return TRUE - - if(state != MECHA_BOLTS_UP && state != MECHA_OPEN_HATCH && !(state == MECHA_BATTERY_UNSCREW && occupant)) - return - . = TRUE - if(!I.use_tool(src, user, 0, volume = 50)) - return - if(state == MECHA_BOLTS_UP) - state = MECHA_OPEN_HATCH - to_chat(user, "You open the hatch to the power unit") - else if(state == MECHA_OPEN_HATCH) - state = MECHA_BOLTS_UP - to_chat(user, "You close the hatch to the power unit") - else if(ishuman(occupant)) - user.visible_message("[user] begins levering out the driver from the [src].", "You begin to lever out the driver from the [src].") - to_chat(occupant, "[user] is prying you out of the exosuit!") - if(I.use_tool(src, user, 8 SECONDS, volume = 50)) - user.visible_message("[user] pries the driver out of the [src]!", "You finish removing the driver from the [src]!") - go_out() -/* - else - // Since having maint protocols available is controllable by the MMI, I see this as a consensual way to remove an MMI without destroying the mech - user.visible_message("[user] begins levering out the MMI from [src].", "You begin to lever out the MMI from [src].") - to_chat(occupant, "[user] is prying you out of the exosuit!") - if(I.use_tool(src, user, 8 SECONDS, volume = 50) && occupant == mmi_as_oc) - user.visible_message("[user] pries the MMI out of [src]!", "You finish removing the MMI from [src]!") - go_out() */ - -/obj/mecha/screwdriver_act(mob/user, obj/item/I) - if(user.a_intent == INTENT_HARM) - return - if(!(state == MECHA_OPEN_HATCH && fuel_holder) && !(state == MECHA_BATTERY_UNSCREW && fuel_holder)) - return - . = TRUE - if(!I.use_tool(src, user, 0, volume = 50)) - return - if(internal_damage & MECHA_INT_TEMP_CONTROL) - clearInternalDamage(MECHA_INT_TEMP_CONTROL) - to_chat(user, "You repair the damaged temperature controller.") - else if(state == MECHA_OPEN_HATCH && fuel_holder) - fuel_holder.forceMove(loc) - fuel_holder = null - state = MECHA_BATTERY_UNSCREW - to_chat(user, "You unscrew and pry out the fuel holder.") - log_message("Fuel cell removed") - else if(state == MECHA_BATTERY_UNSCREW && fuel_holder) - state = MECHA_OPEN_HATCH - to_chat(user, "You screw the fuel holder in place.") -/obj/mecha/wrench_act(mob/user, obj/item/I) - if(state != MECHA_MAINT_ON && state != MECHA_BOLTS_UP) - return - . = TRUE - if(!I.use_tool(src, user, 0, volume = 50)) - return - if(state == MECHA_MAINT_ON) - state = MECHA_BOLTS_UP - to_chat(user, "You undo the securing bolts.") - else - state = MECHA_MAINT_ON - to_chat(user, "You tighten the securing bolts.") -/obj/mecha/welder_act(mob/user, obj/item/I) - if(user.a_intent == INTENT_HARM) - return - if(user.a_intent != INTENT_HELP) - switch(maintenance_panel_status) - if(MECHA_PANEL_0) - to_chat(user, "You begin heating up the hatches on \the [src]") - if(I.use_tool(src, user, 12 SECONDS, volume = 50)) - to_chat(user, "You heat up the hatches on \the [src], they can now be pried out of place.") - maintenance_panel_status = MECHA_PANEL_1 - return TRUE - if(MECHA_PANEL_2) - to_chat(user, "You begin softening the security pins on \the [src]") - if(I.use_tool(src, user, 12 SECONDS, volume = 50)) - to_chat(user, "You soften the security pins on \the [src], they can now be pried out") - maintenance_panel_status = MECHA_PANEL_3 - return TRUE - . = TRUE - if(!I.tool_use_check(user, 0)) - return - if((obj_integrity >= max_integrity) && !internal_damage) - to_chat(user, "[src] is at full integrity!") - return - if(repairing) - to_chat(user, "[src] is currently being repaired!") - return - if(state == MECHA_MAINT_OFF) // If maint protocols are not active, the state is zero - to_chat(user, "[src] can not be repaired without maintenance protocols active!") - return - WELDER_ATTEMPT_REPAIR_MESSAGE - repairing = TRUE - if(I.use_tool(src, user, 15, volume = 50)) - if(internal_damage & MECHA_INT_TANK_BREACH) - clearInternalDamage(MECHA_INT_TANK_BREACH) - user.visible_message("[user] repairs the damaged gas tank.", "You repair the damaged gas tank.") - else if(obj_integrity < max_integrity) - user.visible_message("[user] repairs some damage to [name].", "You repair some damage to [name].") - obj_integrity += min(10, max_integrity - obj_integrity) - else - to_chat(user, "[src] is at full integrity!") - repairing = FALSE - -/obj/mecha/wirecutter_act(mob/living/user, obj/item/I) - if(user.a_intent != INTENT_HELP) - switch(maintenance_panel_status) - if(MECHA_PANEL_5) - to_chat(user, "You begin cutting the [src]'s locking mechanism.") - if(I.use_tool(src, user, 12 SECONDS, volume = 50)) - to_chat(user, "You cut \the [src]'s locking mechanism apart. The maintenance hatch can be opened by prying it!") - maintenance_panel_status = MECHA_PANEL_6 - return TRUE - if(MECHA_PANEL_6) - to_chat(user, "You begin repairing the [src]'s locking mechanism.") - if(I.use_tool(src, user, 12 SECONDS, volume = 50)) - to_chat(user, "You repair \the [src]'s locking mechanism . The maintenance hatch is no longer openable by prying.") - maintenance_panel_status = MECHA_PANEL_4 - return TRUE - - if(state != MECHA_OPEN_HATCH && maintenance_panel_status != MECHA_PANEL_6) - return -// internal_wiring.attempt_wire_interaction(user) - return TRUE - -/obj/mecha/multitool_act(mob/living/user, obj/item/I) - if(state != MECHA_OPEN_HATCH && maintenance_panel_status != MECHA_PANEL_6) - return -// internal_wiring.attempt_wire_interaction(user) - return TRUE - -/obj/mecha/_try_interact(mob/user) - if(state == MECHA_OPEN_HATCH && maintenance_panel_status != MECHA_PANEL_6) - return TRUE - return ..() - /obj/mecha/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) mecha_log_message("Attacked by [I]. Attacker - [user]") return ..() @@ -475,4 +332,4 @@ visual_effect_icon = ATTACK_EFFECT_MECHFIRE else if(damtype == TOX) visual_effect_icon = ATTACK_EFFECT_MECHTOXIN - ..() + ..() \ No newline at end of file diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 2122b175c10..9d7e4f73c49 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -272,9 +272,6 @@ if(href_list["select_equip"]) var/obj/item/mecha_parts/mecha_equipment/equip = locate(href_list["select_equip"]) in src - if(internal_wiring.is_cut(WIRE_MECH_SELECT_MODULE)) - to_chat(occupant, "Error communicating with installed equipment!") - return if(equip && equip.selectable) selected = equip occupant_message("You switch to [equip]") @@ -282,17 +279,14 @@ send_byjax(usr, "exosuit.browser","eq_list", get_equipment_list()) if(href_list["rmictoggle"]) - if(internal_wiring.is_cut(WIRE_MECH_RADIO)) return radio.broadcasting = !radio.broadcasting send_byjax(usr,"exosuit.browser","rmicstate",(radio.broadcasting?"Engaged":"Disengaged")) if(href_list["rspktoggle"]) - if(internal_wiring.is_cut(WIRE_MECH_RADIO)) return radio.listening = !radio.listening send_byjax(usr,"exosuit.browser","rspkstate",(radio.listening?"Engaged":"Disengaged")) if(href_list["rfreq"]) - if(internal_wiring.is_cut(WIRE_MECH_RADIO)) return var/new_frequency = (radio.frequency + text2num(href_list["rfreq"])) if (!radio.freerange || (radio.frequency < MIN_FREE_FREQ || radio.frequency > MAX_FREE_FREQ)) new_frequency = sanitize_frequency(new_frequency) @@ -346,9 +340,6 @@ if(!istype(C) || !C.dna) to_chat(C, span_danger(" You do not have any DNA!")) return - if(internal_wiring.is_cut(WIRE_MECH_DNA)) - to_chat(occupant, "Error communicating with DNA machinery!") - return if(can_be_locked) dna_lock = C.dna.unique_enzymes occupant_message("You feel a prick as the needle takes your DNA sample.") @@ -357,9 +348,6 @@ return if(href_list["reset_dna"]) - if(internal_wiring.is_cut(WIRE_MECH_DNA)) - to_chat(occupant, "Error communicating with DNA machinery!") - return dna_lock = null if(href_list["repair_int_control_lost"]) diff --git a/hailmary.dme b/hailmary.dme index 1ed2c646093..30762acdb6b 100644 --- a/hailmary.dme +++ b/hailmary.dme @@ -77,7 +77,6 @@ #include "code\__DEFINES\materials.dm" #include "code\__DEFINES\maths.dm" #include "code\__DEFINES\MC.dm" -#include "code\__DEFINES\mecha_defines.dm" #include "code\__DEFINES\medal.dm" #include "code\__DEFINES\melee.dm" #include "code\__DEFINES\menu.dm" @@ -760,7 +759,6 @@ #include "code\datums\wires\autolathe.dm" #include "code\datums\wires\emitter.dm" #include "code\datums\wires\explosive.dm" -#include "code\datums\wires\mech_wires.dm" #include "code\datums\wires\microwave.dm" #include "code\datums\wires\mulebot.dm" #include "code\datums\wires\particle_accelerator.dm" From 091a1247b5f22a4bfb746bd2eaf47f34d6a77213 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Thu, 26 Sep 2024 05:34:34 +1200 Subject: [PATCH 08/68] Update mecha.dm --- code/game/mecha/mecha.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 438e09cbf4b..4a917d72319 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -829,6 +829,9 @@ if(AI.stat || !AI.client) to_chat(user, "[AI.name] is currently unresponsive, and cannot be uploaded.") return + if(occupant || dna_lock) //Normal AIs cannot steal mechs! + to_chat(user, "Access denied. [name] is [occupant ? "currently occupied" : "secured with a DNA lock"].") + return AI.control_disabled = 0 AI.radio_enabled = 1 to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") From df2627a6c4e2754e65d96ff755bcc0f0806dc480 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Thu, 26 Sep 2024 05:38:11 +1200 Subject: [PATCH 09/68] nope --- code/__DEFINES/wires.dm | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/code/__DEFINES/wires.dm b/code/__DEFINES/wires.dm index 2459351af9f..fdcd6306cef 100644 --- a/code/__DEFINES/wires.dm +++ b/code/__DEFINES/wires.dm @@ -52,20 +52,3 @@ #define WIRE_RECORD "Record" #define WIRE_STOP "Stop" #define WIRE_PLAY "Play" - -/// The power supply! -#define WIRE_MECH_POWER "Mech power supply" -/// Walks foward -#define WIRE_MECH_WALK "Mech walk" -/// DNA wire -#define WIRE_MECH_DNA "Wire DNA" -/// Random direction -#define WIRE_MECH_DIRECTION "Mech direction" -/// Random since you aren't the internal computer telling it how to do stuff -#define WIRE_MECH_SELECT_MODULE "Mech module selection" -/// Random turfs infront of the mech (a ton or few depending on the range) -#define WIRE_MECH_USE_MODULE "Mech use module" -/// Radio transmission -#define WIRE_MECH_RADIO "Mech radio" -/// Visual modifiers -#define WIRE_MECH_VISUALDATA "Mech visuals" From 341116b26a523878bb814e7329b1567585d4f05b Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Thu, 26 Sep 2024 05:46:20 +1200 Subject: [PATCH 10/68] new line rule --- code/datums/mutable_appearance.dm | 2 +- code/game/mecha/equipment/mecha_equipment.dm | 2 +- code/game/mecha/equipment/tools/fallout/vision_modules.dm | 2 +- code/game/mecha/equipment/tools/vision_tools.dm | 0 code/game/mecha/fallout/armoured.dm | 2 +- code/game/mecha/fallout/birds.dm | 2 +- code/game/mecha/fallout/carriages.dm | 2 +- code/game/mecha/fallout/cars.dm | 2 +- code/game/mecha/fallout/pickuptrucks.dm | 2 +- code/game/mecha/mecha_defense.dm | 2 +- code/modules/projectiles/projectile/bullets/pistol.dm | 2 +- code/modules/projectiles/projectile/bullets/shotgun.dm | 2 +- 12 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 code/game/mecha/equipment/tools/vision_tools.dm diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index eb8802b94cc..b79d2e32011 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -23,4 +23,4 @@ MA.layer = layer MA.plane = plane MA.color = color - return MA \ No newline at end of file + return MA diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index d3d004ec20a..637445483f7 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -198,4 +198,4 @@ return 0 /obj/item/mecha_parts/mecha_equipment/proc/needs_rearm() - return 0 \ No newline at end of file + return 0 diff --git a/code/game/mecha/equipment/tools/fallout/vision_modules.dm b/code/game/mecha/equipment/tools/fallout/vision_modules.dm index f29213b3a88..2ee356acd3b 100644 --- a/code/game/mecha/equipment/tools/fallout/vision_modules.dm +++ b/code/game/mecha/equipment/tools/fallout/vision_modules.dm @@ -29,4 +29,4 @@ desc = "An exosuit module that integrates a thermal scanner." icon_state = "mecha_thermal" energy_drain = 100 - vision_traits = list(TRAIT_THERMAL_VISION, TRAIT_NIGHT_VISION) \ No newline at end of file + vision_traits = list(TRAIT_THERMAL_VISION, TRAIT_NIGHT_VISION) diff --git a/code/game/mecha/equipment/tools/vision_tools.dm b/code/game/mecha/equipment/tools/vision_tools.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index 872ce5e3838..147b327a20d 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -44,4 +44,4 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid ME.attach(src) - max_ammo() \ No newline at end of file + max_ammo() diff --git a/code/game/mecha/fallout/birds.dm b/code/game/mecha/fallout/birds.dm index 5bdf4de87b0..709658d8fe6 100644 --- a/code/game/mecha/fallout/birds.dm +++ b/code/game/mecha/fallout/birds.dm @@ -300,4 +300,4 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat \ No newline at end of file + ME = new /obj/item/mecha_parts/mecha_equipment/seat diff --git a/code/game/mecha/fallout/carriages.dm b/code/game/mecha/fallout/carriages.dm index 82ff2251434..04c19530fa1 100644 --- a/code/game/mecha/fallout/carriages.dm +++ b/code/game/mecha/fallout/carriages.dm @@ -98,4 +98,4 @@ . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) \ No newline at end of file + ME.attach(src) diff --git a/code/game/mecha/fallout/cars.dm b/code/game/mecha/fallout/cars.dm index 67eef535aec..b9edce31c02 100644 --- a/code/game/mecha/fallout/cars.dm +++ b/code/game/mecha/fallout/cars.dm @@ -96,4 +96,4 @@ ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) \ No newline at end of file + ME.attach(src) diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index a8ca1888e6e..489782a6d8d 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -219,7 +219,7 @@ name = "\improper pickup truck" desc = "A old military vehicule, runing on fuel., and recolored" icon = 'icons/mecha/jeepenclave.dmi' - icon_state = "jeepenclave" + icon_state = "jeepenclave.dmi" ///jeep BOS diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index de11715c313..c7f31906c0d 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -332,4 +332,4 @@ visual_effect_icon = ATTACK_EFFECT_MECHFIRE else if(damtype == TOX) visual_effect_icon = ATTACK_EFFECT_MECHTOXIN - ..() \ No newline at end of file + ..() diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm index 1ef1e263687..b7f9e610188 100644 --- a/code/modules/projectiles/projectile/bullets/pistol.dm +++ b/code/modules/projectiles/projectile/bullets/pistol.dm @@ -1269,4 +1269,4 @@ SOPORIFIC ROUND CODE light_range = 2 light_power = 0.5 - light_color = "#FF7F01" \ No newline at end of file + light_color = "#FF7F01" diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 5d0c5657edb..1bf682f1893 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -444,4 +444,4 @@ light_range = 1.5 light_power = 0.3 - light_color = "#FF7F01" \ No newline at end of file + light_color = "#FF7F01" From f7dfc2c5b43aaefa64363548ead4f25d5445568d Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Thu, 26 Sep 2024 05:47:17 +1200 Subject: [PATCH 11/68] yes --- code/game/mecha/fallout/pickuptrucks.dm | 2 +- hailmary.dme | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index 489782a6d8d..a8ca1888e6e 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -219,7 +219,7 @@ name = "\improper pickup truck" desc = "A old military vehicule, runing on fuel., and recolored" icon = 'icons/mecha/jeepenclave.dmi' - icon_state = "jeepenclave.dmi" + icon_state = "jeepenclave" ///jeep BOS diff --git a/hailmary.dme b/hailmary.dme index 30762acdb6b..97aa9e39944 100644 --- a/hailmary.dme +++ b/hailmary.dme @@ -1001,7 +1001,6 @@ #include "code\game\mecha\equipment\tools\medical_tools.dm" #include "code\game\mecha\equipment\tools\mining_tools.dm" #include "code\game\mecha\equipment\tools\other_tools.dm" -#include "code\game\mecha\equipment\tools\vision_tools.dm" #include "code\game\mecha\equipment\tools\work_tools.dm" #include "code\game\mecha\equipment\tools\fallout\vision_modules.dm" #include "code\game\mecha\equipment\weapons\mecha_ammo.dm" From 2a9ffc104fb69cd21c1ef6c131ae9693b7cf7829 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Thu, 26 Sep 2024 06:15:20 +1200 Subject: [PATCH 12/68] Update mecha_topic.dm --- code/game/mecha/mecha_topic.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 9d7e4f73c49..3f5537ad7e0 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -134,10 +134,10 @@ for(var/obj/item/mecha_parts/mecha_equipment/W in misc_equipment) output += "Miscellaneous Module: [W.name] Detach
" output += {"Available weapon slots: [max_weapons_equip-weapon_equipment.len]
- Available utility slots: [max_utility_equip-utility_equipment.len]
- Available miscellaneous slots: [max_misc_equip-misc_equipment.len]
- - "} + Available utility slots: [max_utility_equip-utility_equipment.len]
+ Available miscellaneous slots: [max_misc_equip-misc_equipment.len]
+ + "} return output /obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html From a8acbd4a065de0b78c5520314c702a5cd5615a8f Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Thu, 26 Sep 2024 10:58:44 +1200 Subject: [PATCH 13/68] Yes --- .../crafting/recipes/vehicle_parts.dm | 83 +++++++++++++++--- .../equipment/tools/fallout/vision_modules.dm | 8 +- .../equipment/weapons/fallout/ballistics.dm | 23 ++--- .../equipment/weapons/fallout/launchers.dm | 6 +- .../mecha/equipment/weapons/mecha_ammo.dm | 2 +- code/game/mecha/mecha.dm | 2 - icons/mecha/mecha_equipment.dmi | Bin 20493 -> 21745 bytes 7 files changed, 89 insertions(+), 35 deletions(-) diff --git a/code/datums/components/crafting/recipes/vehicle_parts.dm b/code/datums/components/crafting/recipes/vehicle_parts.dm index bc0a675e4cc..805bdb8da37 100644 --- a/code/datums/components/crafting/recipes/vehicle_parts.dm +++ b/code/datums/components/crafting/recipes/vehicle_parts.dm @@ -51,7 +51,7 @@ /obj/item/stack/sheet/mineral/titanium = 5, /obj/item/stack/rods = 2) tools = list(TOOL_WORKBENCH) - time = 1 + time = 180 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS @@ -64,7 +64,7 @@ /obj/item/stack/sheet/mineral/titanium = 6, /obj/item/stack/rods = 2) tools = list(TOOL_AWORKBENCH) - time = 1 + time = 180 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS @@ -77,7 +77,7 @@ /obj/item/stack/sheet/mineral/titanium = 8, /obj/item/stack/rods = 2) tools = list(TOOL_AWORKBENCH) - time = 1 + time = 180 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS @@ -109,9 +109,9 @@ /obj/item/advanced_crafting_components/receiver = 1, /obj/item/advanced_crafting_components/alloys = 1) tools = list(TOOL_WORKBENCH) - time = 1 // test test!! - category = CAT_WEAPONRY - subcategory = CAT_WEAPON + time = 180 // test test!! + category = CAT_VEHICLES + subcategory = CAT_VEHICLEPARTS /datum/crafting_recipe/mech_ammo/minigun_ammo name = "Vehicular Minigun ammunition" @@ -121,9 +121,9 @@ /obj/item/stack/sheet/mineral/titanium = 5, /obj/item/stack/ore/blackpowder = 5) tools = list(TOOL_WORKBENCH) - time = 1 - category = CAT_WEAPONRY - subcategory = CAT_AMMO + time = 5 + category = CAT_VEHICLES + subcategory = CAT_VEHICLEPARTS /datum/crafting_recipe/box/lotsofgoodstuff @@ -182,7 +182,7 @@ /obj/item/advanced_crafting_components/assembly = 1, /obj/item/advanced_crafting_components/receiver = 1) tools = list(TOOL_WORKBENCH) - time = 1 + time = 180 category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -197,7 +197,7 @@ /obj/item/stack/sheet/mineral/titanium = 5, /obj/item/stack/rods = 2) tools = list(TOOL_WORKBENCH) - time = 1 + time = 180 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS @@ -210,12 +210,12 @@ /obj/item/stack/sheet/mineral/titanium = 6, /obj/item/stack/rods = 2) tools = list(TOOL_WORKBENCH) - time = 1 + time = 180 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS /datum/crafting_recipe/gun/vehicle/shotgun_upgraded - name = "Upgraded vehicular shotgun" + name = "Rapid-fire vehicular shotgun" result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/rapid reqs = list(/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot = 1, /obj/item/stack/crafting/metalparts = 5, @@ -223,7 +223,7 @@ /obj/item/stack/sheet/mineral/titanium = 8, /obj/item/stack/rods = 2) tools = list(TOOL_AWORKBENCH) - time = 1 + time = 180 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS @@ -240,6 +240,34 @@ category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS +// Frag launcher! + +/datum/crafting_recipe/gun/vehicle/fragmentation_launcher + name = "Vehicular grenade launcher" + result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/fragmentation + reqs = list(/obj/item/stack/crafting/goodparts = 10, + /obj/item/stack/crafting/metalparts = 5, + /obj/item/stack/sheet/prewar = 5, + /obj/item/stack/sheet/mineral/titanium = 8, + /obj/item/stack/rods = 10) + tools = list(TOOL_AWORKBENCH) + time = 180 + category = CAT_VEHICLES + subcategory = CAT_VEHICLEPARTS + +/datum/crafting_recipe/frag_ammo + name = "Fragmentation grenade ammunition" + result = /obj/item/mecha_ammo/fragmentation + reqs = list(/obj/item/stack/crafting/metalparts = 2, + /obj/item/stack/sheet/prewar = 2, + /obj/item/stack/ore/blackpowder = 5, + /obj/item/stack/sheet/mineral/titanium = 2, + ) + tools = list(TOOL_AWORKBENCH) + time = 5 + category = CAT_VEHICLES + subcategory = CAT_VEHICLEPARTS + //laser weaponery /datum/crafting_recipe/gun/laserlight @@ -334,3 +362,30 @@ time = 180 subcategory = CAT_VEHICLES category = CAT_VEHICLEPARTS + +/datum/crafting_recipe/vehicle_sensors_thermals + name = "vehicular thermal imager" + result = /obj/item/mecha_parts/mecha_equipment/vision/thermal_scanner + reqs = list(/obj/item/stack/sheet/mineral/gold=4, + /obj/item/stack/sheet/mineral/silver=4, + /obj/item/stack/sheet/mineral/uranium=2, + /obj/item/stack/crafting/metalparts = 4, + /obj/item/advanced_crafting_components/alloys = 2, + /obj/item/stack/crafting/goodparts = 4) + tools = list(TOOL_AWORKBENCH) + time = 180 + subcategory = CAT_VEHICLES + category = CAT_VEHICLEPARTS + +/datum/crafting_recipe/vehicle_sensors_mesons + name = "vehicular mesonic scanning system" + result = /obj/item/mecha_parts/mecha_equipment/vision/meson_scanner + reqs = list(/obj/item/stack/sheet/mineral/gold=2, + /obj/item/stack/sheet/mineral/silver=2, + /obj/item/stack/crafting/metalparts = 4, + /obj/item/advanced_crafting_components/alloys = 2, + /obj/item/stack/crafting/goodparts = 4) + tools = list(TOOL_AWORKBENCH) + time = 180 + subcategory = CAT_VEHICLES + category = CAT_VEHICLEPARTS diff --git a/code/game/mecha/equipment/tools/fallout/vision_modules.dm b/code/game/mecha/equipment/tools/fallout/vision_modules.dm index 2ee356acd3b..0eda22eb3c2 100644 --- a/code/game/mecha/equipment/tools/fallout/vision_modules.dm +++ b/code/game/mecha/equipment/tools/fallout/vision_modules.dm @@ -18,15 +18,15 @@ chassis.grant_vision() /obj/item/mecha_parts/mecha_equipment/vision/meson_scanner - name = "exosuit meson scanner" - desc = "An exosuit module that integrates a meson scanner." + name = "vehicle meson scanner" + desc = "A vehicle module that integrates a meson scanner." icon_state = "mecha_meson" energy_drain = 100 vision_traits = list(TRAIT_MESON_VISION, TRAIT_NIGHT_VISION) /obj/item/mecha_parts/mecha_equipment/vision/thermal_scanner - name = "exosuit thermal scanner" - desc = "An exosuit module that integrates a thermal scanner." + name = "vehicle thermal scanner" + desc = "A vehicle module that integrates a thermal scanner." icon_state = "mecha_thermal" energy_drain = 100 vision_traits = list(TRAIT_THERMAL_VISION, TRAIT_NIGHT_VISION) diff --git a/code/game/mecha/equipment/weapons/fallout/ballistics.dm b/code/game/mecha/equipment/weapons/fallout/ballistics.dm index 54f2e2c7e9d..8da0ed3008f 100644 --- a/code/game/mecha/equipment/weapons/fallout/ballistics.dm +++ b/code/game/mecha/equipment/weapons/fallout/ballistics.dm @@ -1,7 +1,7 @@ // Shotguns! /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot - name = "\improper heavy vehicular shotgun" + name = "\improper Heavy vehicular shotgun" desc = "A shotgun that's modified to be mounted on a vehicle, fires a volley of heavy pellets." icon_state = "mecha_scatter" fire_sound = 'sound/weapons/sound_weapons_mech_shotgun.ogg' @@ -16,7 +16,7 @@ ammo_type = "scattershot" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/improvised - name = "\improper improvised vehicular shotgun" + name = "\improper Improvised vehicular shotgun" desc = "A shotgun built from scrap metal, fits to a combat vehicle, fires a volley of pellets." icon_state = "mecha_scatter" fire_sound = 'sound/f13weapons/auto5.ogg' @@ -31,7 +31,7 @@ ammo_type = "scattershot" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/rapid - name = "\improper rapid-fire vehicular shotgun" + name = "\improper Rapid-fire vehicular shotgun" desc = "A rapid-fire shotgun fitted for mounting on a combat vehicle, fires fewer heavy pellets, but faster." icon_state = "mecha_scatter" fire_sound = 'sound/weapons/sound_weapons_mech_mortar.ogg' @@ -49,16 +49,16 @@ // LMG! /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg - name = "\improper Ultra AC 2" - desc = "A machinegun chambered in 9mm to be mounted on combat vehicles. Fires a three-round burst." + name = "\improper Vehicular LMG" + desc = "A machinegun chambered in 9mm to be mounted on combat vehicles. Fires a two-round burst." icon_state = "mecha_uac2" fire_sound = 'sound/weapons/sound_weapons_mech_autocannon.ogg' - equip_cooldown = 10 + equip_cooldown = 8 projectile = /obj/item/projectile/bullet/c9mm/tracer projectiles = 300 projectiles_cache = 300 projectiles_cache_max = 1200 - projectiles_per_shot = 3 + projectiles_per_shot = 2 is_automatic = TRUE variance = 6 randomspread = 1 @@ -67,11 +67,12 @@ ammo_type = "lmg" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid - name = "\improper AC AUTO" + name = "\improper Rapid-fire vehicular LMG" desc = "A machinegun that's a real machinegun. Can be fired in full-auto by holding down the trigger, for combat vehicles." icon_state = "mecha_uac2" fire_sound = 'sound/f13weapons/bozar_fire.ogg' equip_cooldown = 1 + projectile_delay = 1 projectile = /obj/item/projectile/bullet/c9mm/tracer projectiles = 50 projectiles_cache = 50 @@ -83,7 +84,7 @@ ammo_type = "lmg" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/improvised - name = "\improper Improvised LMG" + name = "\improper Improvised vehicular LMG" desc = "A improvised machinegun chambered in 9mm, fitted for combat vehicles." icon_state = "mecha_uac2" fire_sound = 'sound/f13weapons/boltfire.ogg' @@ -102,7 +103,7 @@ // Minigun! /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun - name = "\improper Minigun" + name = "\improper Vehicular minigun" desc = "A minigun, capable of firing in full-auto but builds up heat rapidly. fitted for combat vehicles." icon_state = "mecha_uac2" fire_sound = 'sound/f13weapons/antimaterielfire.ogg' @@ -118,7 +119,7 @@ harmful = TRUE ammo_type = "minigun" var/overheat = 0 - var/overheat_max = 200 + var/overheat_max = 160 var/heat_diffusion = 2.5 //How much heat is lost per tick var/damage = 25 diff --git a/code/game/mecha/equipment/weapons/fallout/launchers.dm b/code/game/mecha/equipment/weapons/fallout/launchers.dm index 113a2b89ed8..dc890409a82 100644 --- a/code/game/mecha/equipment/weapons/fallout/launchers.dm +++ b/code/game/mecha/equipment/weapons/fallout/launchers.dm @@ -85,9 +85,9 @@ // Frag-grenade launcher! -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/fragmentation - name = "\improper SOB-3 grenade launcher" - desc = "A weapon for combat exosuits. Launches primed fragmentation grenades." +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/fragmentation + name = "\improper SHRP-8 grenade launcher" + desc = "A weapon for combat vehicles. Launches primed fragmentation grenades." fire_sound = 'sound/weapons/grenadelaunch.ogg' projectiles = 8 projectiles_cache = 8 diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/game/mecha/equipment/weapons/mecha_ammo.dm index 47dddf0a7eb..6e243efdada 100644 --- a/code/game/mecha/equipment/weapons/mecha_ammo.dm +++ b/code/game/mecha/equipment/weapons/mecha_ammo.dm @@ -100,7 +100,7 @@ ammo_type = "clusterbang" /obj/item/mecha_ammo/fragmentation - name = "launchable flashbang clusters" + name = "launchable fragmentation clusters" desc = "A box of clustered fragmentation grenades, for use with a vehicle's launcher. Cannot be primed by hand." icon_state = "fragmentation" rounds = 8 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 4a917d72319..110ff8c3406 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -48,7 +48,6 @@ armor = ARMOR_VALUE_HEAVY var/list/facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.5) //var/obj/item/stock_parts/cell/cell - var/datum/wires/mech/internal_wiring var/obj/item/reagent_containers/fuel_tank/fuel_holder var/state = 0 var/list/log = new @@ -88,7 +87,6 @@ var/list/internals_req_access = list()//REQUIRED ACCESS LEVEL TO OPEN CELL COMPARTMENT var/wreckage - var/repairing = FALSE var/canZmove = TRUE diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi index 90929fff46c4edca95c3ae85659d061a9044d519..6fc4b32031b963a9ae7099fe11e25aafc74019d7 100644 GIT binary patch delta 20309 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 delta 19143 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 Hu0mjfPRO5+ From 843d0ec60fed3c098b06123c025c9023637dfc11 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Thu, 26 Sep 2024 23:21:48 +1200 Subject: [PATCH 14/68] Yes --- .../crafting/recipes/vehicle_parts.dm | 69 ++++-------------- .../equipment/weapons/fallout/ballistics.dm | 14 ++-- .../mecha/equipment/weapons/mecha_ammo.dm | 2 +- code/game/objects/items/storage/boxes.dm | 33 +++++++++ icons/mecha/mecha_ammo.dmi | Bin 897 -> 1031 bytes icons/mecha/mecha_equipment.dmi | Bin 21745 -> 23798 bytes 6 files changed, 54 insertions(+), 64 deletions(-) diff --git a/code/datums/components/crafting/recipes/vehicle_parts.dm b/code/datums/components/crafting/recipes/vehicle_parts.dm index 805bdb8da37..8787039e4f3 100644 --- a/code/datums/components/crafting/recipes/vehicle_parts.dm +++ b/code/datums/components/crafting/recipes/vehicle_parts.dm @@ -73,9 +73,10 @@ result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid reqs = list(/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg = 1, /obj/item/stack/crafting/metalparts = 5, - /obj/item/stack/sheet/prewar = 8, + /obj/item/stack/crafting/goodparts = 5, + /obj/item/stack/sheet/prewar = 5, /obj/item/stack/sheet/mineral/titanium = 8, - /obj/item/stack/rods = 2) + /obj/item/stack/rods = 10) tools = list(TOOL_AWORKBENCH) time = 180 category = CAT_VEHICLES @@ -104,12 +105,10 @@ /obj/item/stack/crafting/electronicparts = 5, /obj/item/stack/sheet/metal = 10, /obj/item/stack/sheet/mineral/titanium = 20, - /obj/item/stack/rods = 6, - /obj/item/advanced_crafting_components/assembly = 1, - /obj/item/advanced_crafting_components/receiver = 1, - /obj/item/advanced_crafting_components/alloys = 1) - tools = list(TOOL_WORKBENCH) - time = 180 // test test!! + /obj/item/stack/rods = 10, + /obj/item/gun/ballistic/automatic/smg/mini_uzi = 3) + tools = list(TOOL_AWORKBENCH) + time = 180 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS @@ -120,54 +119,11 @@ /obj/item/stack/sheet/metal = 5, /obj/item/stack/sheet/mineral/titanium = 5, /obj/item/stack/ore/blackpowder = 5) - tools = list(TOOL_WORKBENCH) + tools = list(TOOL_AWORKBENCH) time = 5 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS - -/datum/crafting_recipe/box/lotsofgoodstuff - name = "testing box o truth and goodies" - result = /obj/item/box/allsortsofgoodstuff - reqs = list(/obj/item/stack/rods = 1) - tools = list(TOOL_WORKBENCH) - time = 1 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/obj/item/box/allsortsofgoodstuff #warn // remove this - name = "good box" - -/obj/item/storage/box/allsortsofgoodstuff/PopulateContents() //less uranium because radioactive - var/static/items_inside = list( - /obj/item/stack/sheet/metal/fifty=1,\ - /obj/item/stack/sheet/glass/fifty=1,\ - /obj/item/stack/sheet/rglass=50,\ - /obj/item/stack/sheet/plasmaglass=50,\ - /obj/item/stack/sheet/titaniumglass=50,\ - /obj/item/stack/sheet/plastitaniumglass=50,\ - /obj/item/stack/sheet/plasteel=50,\ - /obj/item/stack/sheet/mineral/plastitanium=50,\ - /obj/item/stack/sheet/mineral/titanium=50,\ - /obj/item/stack/sheet/mineral/gold=50,\ - /obj/item/stack/sheet/mineral/silver=50,\ - /obj/item/stack/sheet/mineral/plasma=50,\ - /obj/item/stack/sheet/mineral/uranium=50,\ - /obj/item/stack/sheet/mineral/diamond=50,\ - /obj/item/stack/sheet/mineral/wood=50,\ - /obj/item/stack/sheet/plastic/fifty=1,\ - /obj/item/stack/sheet/runed_metal/fifty=1, - /obj/item/stack/sheet/prewar = 50, - /obj/item/stack/crafting/metalparts = 50, - /obj/item/stack/sheet/prewar = 50, - /obj/item/stack/crafting/goodparts = 50, - /obj/item/stack/crafting/electronicparts = 50, - /obj/item/stack/rods = 50, - /obj/item/stack/ore/blackpowder = 50, - /obj/item/advanced_crafting_components/alloys = 1 - ) - generate_items_inside(items_inside, src) - // Pneumatic launcher /datum/crafting_recipe/gun/PheumonicLauncherVehicle @@ -214,14 +170,15 @@ category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS -/datum/crafting_recipe/gun/vehicle/shotgun_upgraded +/datum/crafting_recipe/gun/vehicle/shotgun_rapid name = "Rapid-fire vehicular shotgun" result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/rapid reqs = list(/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot = 1, /obj/item/stack/crafting/metalparts = 5, - /obj/item/stack/sheet/prewar = 8, - /obj/item/stack/sheet/mineral/titanium = 8, - /obj/item/stack/rods = 2) + /obj/item/stack/crafting/goodparts = 5, + /obj/item/stack/sheet/prewar = 10, + /obj/item/stack/sheet/mineral/titanium = 10, + /obj/item/stack/rods = 10) tools = list(TOOL_AWORKBENCH) time = 180 category = CAT_VEHICLES diff --git a/code/game/mecha/equipment/weapons/fallout/ballistics.dm b/code/game/mecha/equipment/weapons/fallout/ballistics.dm index 8da0ed3008f..5a51aefd273 100644 --- a/code/game/mecha/equipment/weapons/fallout/ballistics.dm +++ b/code/game/mecha/equipment/weapons/fallout/ballistics.dm @@ -3,7 +3,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot name = "\improper Heavy vehicular shotgun" desc = "A shotgun that's modified to be mounted on a vehicle, fires a volley of heavy pellets." - icon_state = "mecha_scatter" + icon_state = "vehicle_scatter" fire_sound = 'sound/weapons/sound_weapons_mech_shotgun.ogg' equip_cooldown = 15 projectile = /obj/item/projectile/bullet/pellet/shotgun_trainshot/tracer @@ -18,7 +18,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/improvised name = "\improper Improvised vehicular shotgun" desc = "A shotgun built from scrap metal, fits to a combat vehicle, fires a volley of pellets." - icon_state = "mecha_scatter" + icon_state = "vehicle_scatter_makeshift" fire_sound = 'sound/f13weapons/auto5.ogg' equip_cooldown = 20 projectile = /obj/item/projectile/bullet/pellet/shotgun_buckshot/tracer @@ -33,7 +33,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/rapid name = "\improper Rapid-fire vehicular shotgun" desc = "A rapid-fire shotgun fitted for mounting on a combat vehicle, fires fewer heavy pellets, but faster." - icon_state = "mecha_scatter" + icon_state = "vehicle_scatter_rapid" fire_sound = 'sound/weapons/sound_weapons_mech_mortar.ogg' equip_cooldown = 8 projectile = /obj/item/projectile/bullet/pellet/shotgun_trainshot/tracer @@ -51,7 +51,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg name = "\improper Vehicular LMG" desc = "A machinegun chambered in 9mm to be mounted on combat vehicles. Fires a two-round burst." - icon_state = "mecha_uac2" + icon_state = "vehicle_lmg" fire_sound = 'sound/weapons/sound_weapons_mech_autocannon.ogg' equip_cooldown = 8 projectile = /obj/item/projectile/bullet/c9mm/tracer @@ -69,7 +69,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid name = "\improper Rapid-fire vehicular LMG" desc = "A machinegun that's a real machinegun. Can be fired in full-auto by holding down the trigger, for combat vehicles." - icon_state = "mecha_uac2" + icon_state = "vehicle_lmg_rapid" fire_sound = 'sound/f13weapons/bozar_fire.ogg' equip_cooldown = 1 projectile_delay = 1 @@ -86,7 +86,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/improvised name = "\improper Improvised vehicular LMG" desc = "A improvised machinegun chambered in 9mm, fitted for combat vehicles." - icon_state = "mecha_uac2" + icon_state = "vehicle_lmg_makeshift" fire_sound = 'sound/f13weapons/boltfire.ogg' equip_cooldown = 10 projectile = /obj/item/projectile/bullet/c9mm/improvised/tracer @@ -105,7 +105,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun name = "\improper Vehicular minigun" desc = "A minigun, capable of firing in full-auto but builds up heat rapidly. fitted for combat vehicles." - icon_state = "mecha_uac2" + icon_state = "vehicle_lmg_minigun" fire_sound = 'sound/f13weapons/antimaterielfire.ogg' equip_cooldown = 1 projectile = /obj/item/projectile/bullet/c9mm/improvised/tracer diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/game/mecha/equipment/weapons/mecha_ammo.dm index 6e243efdada..c544794e8c8 100644 --- a/code/game/mecha/equipment/weapons/mecha_ammo.dm +++ b/code/game/mecha/equipment/weapons/mecha_ammo.dm @@ -110,6 +110,6 @@ /obj/item/mecha_ammo/minigun name = "Minigun ammo pack" desc = "A box of high caliber ammo, ready to be consumed in nano seconds. Cannot be primed by hand." - icon_state = "lmg" + icon_state = "minigun" rounds = 600 ammo_type = "minigun" diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 9e06e764063..d097035e529 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1378,6 +1378,39 @@ obj/item/storage/box/stingbangs ) generate_items_inside(items_inside, src) +/obj/item/box/debugmaterials + name = "good box" + +/obj/item/storage/box/debugmaterials/PopulateContents() //less uranium because radioactive + var/static/items_inside = list( + /obj/item/stack/sheet/metal/fifty=1,\ + /obj/item/stack/sheet/glass/fifty=1,\ + /obj/item/stack/sheet/rglass=50,\ + /obj/item/stack/sheet/plasmaglass=50,\ + /obj/item/stack/sheet/titaniumglass=50,\ + /obj/item/stack/sheet/plastitaniumglass=50,\ + /obj/item/stack/sheet/plasteel=50,\ + /obj/item/stack/sheet/mineral/plastitanium=50,\ + /obj/item/stack/sheet/mineral/titanium=50,\ + /obj/item/stack/sheet/mineral/gold=50,\ + /obj/item/stack/sheet/mineral/silver=50,\ + /obj/item/stack/sheet/mineral/plasma=50,\ + /obj/item/stack/sheet/mineral/uranium=50,\ + /obj/item/stack/sheet/mineral/diamond=50,\ + /obj/item/stack/sheet/mineral/wood=50,\ + /obj/item/stack/sheet/plastic/fifty=1,\ + /obj/item/stack/sheet/runed_metal/fifty=1, + /obj/item/stack/sheet/prewar = 50, + /obj/item/stack/crafting/metalparts = 50, + /obj/item/stack/sheet/prewar = 50, + /obj/item/stack/crafting/goodparts = 50, + /obj/item/stack/crafting/electronicparts = 50, + /obj/item/stack/rods = 50, + /obj/item/stack/ore/blackpowder = 50, + /obj/item/advanced_crafting_components/alloys = 50 + ) + generate_items_inside(items_inside, src) + /obj/item/storage/box/beakers/variety name = "beaker variety box" diff --git a/icons/mecha/mecha_ammo.dmi b/icons/mecha/mecha_ammo.dmi index 27b117c5b6d24abe8dc8aca03bb00d8fb80c5119..89789960f55827916279f9b14843021e2f7ef1a2 100644 GIT binary patch delta 1010 zcmV76nF0004WQchC znW^I6J6Lch>F%E4aN#ngIbW`IW2#%NpO6TrXinz1*=qH|p1r_fuayUMo);jt3=#_n z4}KR~^_WO_r`3>bfF=K|F}SRQv4hy7P5HWjL^#5|O{-N8S(Q4=Ec5-uS$7yM`PRn# ztZtl1T35Mpa{;2Df4pGDw1{s0>y_rxRNtR|0M4X})5a*3c>n+cvq?ljRA_c`$?S%x*fl-Q0t$c&mno2bI@B(02KztE~v6{LKi& zd{3YN3h++=_Pz~w--v$Rir4oayTW%+g`SeC3X%VuB>Bgrf5z|UBLT}VkEZf5xgucs z3 zt;O#E;QF2*cS8YyzRlfG06@Mc$lZ_uOh+AnaQ(^10OSh*FV+K?4nQwI5Hw3r=C?~w z<~K|5>Iqmre*yIKJwe-q6TNDh3<&5|;{yS{%KndA@%p!+ycHixzuAZ?zuAZ?zuAZq zfRVOJEaAF7tX{NXj&!pAps{Ne(u`Kd{|{$UFr-m#~@|K|afN~Kb%RQqf1&jajZ z^ZW7WI`exv@sT9?pGlJcl_dGX;K1_BW9|E7myTUOe*W z{g~@QL?+-qjss4=i{{Q^$`Cj<_fd%t#&-cQE%W;65Z;X}ad!Ktc$I+&IbUO~f=lk&V zzn<@@^6=>1R1dEg0|-~PL8cn7Q<@8prl|(&XaHb-7a*L+8ms~kThQ8ezNaOi8Z5j7 ztOW%)YOr(@-aFr84Hmx*@1F1bzdtYzFgo9l1Au1F_X`2cpYMkOhUfbw2*&37 gae{q65BzU^16x;4DP{h0l>h($07*qoM6N<$f)Y*c_W%F@ delta 876 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 RaGp6xQBF;^M%p6$zW@M-Gywnr literal 21745 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 From 1b2475567cf1453d92b585b31d00a80acda84bd9 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Fri, 27 Sep 2024 00:10:32 +1200 Subject: [PATCH 15/68] Yes (2) --- code/datums/components/crafting/recipes/vehicle_parts.dm | 2 ++ code/game/mecha/equipment/weapons/fallout/launchers.dm | 1 - code/game/objects/items/storage/boxes.dm | 5 +++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/datums/components/crafting/recipes/vehicle_parts.dm b/code/datums/components/crafting/recipes/vehicle_parts.dm index 8787039e4f3..6f4ca6e933f 100644 --- a/code/datums/components/crafting/recipes/vehicle_parts.dm +++ b/code/datums/components/crafting/recipes/vehicle_parts.dm @@ -320,6 +320,8 @@ subcategory = CAT_VEHICLES category = CAT_VEHICLEPARTS +// Vision modules! Grants NVGs plus either thermals or mesons. + /datum/crafting_recipe/vehicle_sensors_thermals name = "vehicular thermal imager" result = /obj/item/mecha_parts/mecha_equipment/vision/thermal_scanner diff --git a/code/game/mecha/equipment/weapons/fallout/launchers.dm b/code/game/mecha/equipment/weapons/fallout/launchers.dm index dc890409a82..91bdbd0ffae 100644 --- a/code/game/mecha/equipment/weapons/fallout/launchers.dm +++ b/code/game/mecha/equipment/weapons/fallout/launchers.dm @@ -94,7 +94,6 @@ projectiles_cache_max = 8 missile_speed = 1.5 equip_cooldown = 10 - disabledreload = TRUE projectile = /obj/item/grenade/f13/frag equip_cooldown = 90 ammo_type = "fragmentation" diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index d097035e529..eda5f9e3e09 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1378,10 +1378,11 @@ obj/item/storage/box/stingbangs ) generate_items_inside(items_inside, src) -/obj/item/box/debugmaterials +/obj/item/storage/box/materials_debug name = "good box" + icon_state = "syndiebox" -/obj/item/storage/box/debugmaterials/PopulateContents() //less uranium because radioactive +/obj/item/storage/box/debugmaterials/PopulateContents() var/static/items_inside = list( /obj/item/stack/sheet/metal/fifty=1,\ /obj/item/stack/sheet/glass/fifty=1,\ From 536442f22ed21f99426a8fa66dbaaf0c55df4f14 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Fri, 27 Sep 2024 00:44:59 +1200 Subject: [PATCH 16/68] fixes --- code/game/mecha/combat/phazon.dm | 12 +++++++++++- .../equipment/tools/fallout/vision_modules.dm | 1 + code/game/mecha/fallout/buggies.dm | 4 ++++ code/game/mecha/fallout/carriages.dm | 8 ++++++++ code/game/mecha/mecha_wreckage.dm | 2 ++ icons/fallout/vehicles/medium_vehicles.dmi | Bin 136952 -> 138981 bytes icons/mecha/buggy.dmi | Bin 36327 -> 13985 bytes 7 files changed, 26 insertions(+), 1 deletion(-) diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index a14037ecb03..e5647e0503e 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -10,12 +10,22 @@ armor = ARMOR_VALUE_HEAVY max_temperature = 25000 infra_luminosity = 3 - wreckage = /obj/structure/mecha_wreckage/phazon + wreckage = /obj/structure/mecha_wreckage/fallout add_req_access = 1 internal_damage_threshold = 25 force = 15 phase_state = "phazon-phase" + max_utility_equip = 3 + max_weapons_equip = 1 + max_misc_equip = 1 + +/obj/structure/mecha_wreckage/fallout + name = "\improper vehicle wreckage" + desc = "A destroyed vehicle." + icon = 'icons/fallout/vehicles/medium_vehicles.dmi' + icon_state = "derelict" + /obj/mecha/combat/phazon/GrantActions(mob/living/user, human_occupant = 0) ..() switch_damtype_action.Grant(user, src) diff --git a/code/game/mecha/equipment/tools/fallout/vision_modules.dm b/code/game/mecha/equipment/tools/fallout/vision_modules.dm index 0eda22eb3c2..4e5fc13f0b2 100644 --- a/code/game/mecha/equipment/tools/fallout/vision_modules.dm +++ b/code/game/mecha/equipment/tools/fallout/vision_modules.dm @@ -4,6 +4,7 @@ desc = "you shouldn't be seeing this." selectable = FALSE var/list/vision_traits + equip_type = EQUIP_MISC /obj/item/mecha_parts/mecha_equipment/vision/attach(obj/mecha/M) . = ..() diff --git a/code/game/mecha/fallout/buggies.dm b/code/game/mecha/fallout/buggies.dm index 5b3a928a094..6771e3eaf46 100644 --- a/code/game/mecha/fallout/buggies.dm +++ b/code/game/mecha/fallout/buggies.dm @@ -14,6 +14,10 @@ turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy + max_utility_equip = 2 + max_weapons_equip = 1 + max_misc_equip = 1 + /obj/structure/mecha_wreckage/buggy name = "\improper Buggy wreckage" desc = "Its a buggy ! Won't bug you anymore." diff --git a/code/game/mecha/fallout/carriages.dm b/code/game/mecha/fallout/carriages.dm index 04c19530fa1..00742461255 100644 --- a/code/game/mecha/fallout/carriages.dm +++ b/code/game/mecha/fallout/carriages.dm @@ -15,6 +15,10 @@ turnsound = 'sound/effects/footstep/gallop1.ogg' wreckage = /obj/structure/mecha_wreckage/buggy + max_utility_equip = 3 + max_weapons_equip = 1 + max_misc_equip = 1 + /obj/mecha/combat/phazon/buggy/legion/go_out() ..() update_icon() @@ -94,6 +98,10 @@ step_energy_drain = 0.8 armor = ARMOR_VALUE_HEAVY + max_utility_equip = 4 + max_weapons_equip = 1 + max_misc_equip = 1 + /obj/mecha/combat/phazon/truckcaravan/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 4a9bef32632..2260b5135df 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -10,6 +10,8 @@ density = TRUE anchored = FALSE opacity = 0 + max_integrity = 1000 + armor = ARMOR_VALUE_SALVAGE var/list/welder_salvage = list(/obj/item/stack/sheet/plasteel, /obj/item/stack/sheet/metal, /obj/item/stack/rods) var/list/wirecutters_salvage = list(/obj/item/stack/cable_coil) var/list/crowbar_salvage = list() diff --git a/icons/fallout/vehicles/medium_vehicles.dmi b/icons/fallout/vehicles/medium_vehicles.dmi index 8f4f9c12a256838b0de1841877ae98ee3a0d47f3..0b1f3d34865f4977f770e9e0c0458f3870892e3a 100644 GIT binary patch delta 25237 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 QMhl!ee%7Sa2p9c-0C2_XCjbBd literal 36327 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 eWB`PyFaHNRS%m^Byb^~10000 Date: Fri, 27 Sep 2024 00:53:02 +1200 Subject: [PATCH 17/68] Update armoured.dm --- code/game/mecha/fallout/armoured.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index 147b327a20d..3cfacf87063 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -34,6 +34,7 @@ name = "\improper M38 wreckage" desc = "Wreckage of a M38 jeep, it's completely destroyed." icon_state = "armoured_jeep-broken" + icon = "icons/mecha/armoured_jeep.dmi" /obj/mecha/combat/phazon/armoured_jeep/loaded/Initialize() . = ..() From c9e5883858822f8e01d7e5cadb0d47b4ecd450fd Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Fri, 27 Sep 2024 00:54:05 +1200 Subject: [PATCH 18/68] Update armoured.dm --- code/game/mecha/fallout/armoured.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index 3cfacf87063..1faba403e2e 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -33,8 +33,8 @@ /obj/structure/mecha_wreckage/armoured_jeep name = "\improper M38 wreckage" desc = "Wreckage of a M38 jeep, it's completely destroyed." - icon_state = "armoured_jeep-broken" icon = "icons/mecha/armoured_jeep.dmi" + icon_state = "armoured_jeep-broken" /obj/mecha/combat/phazon/armoured_jeep/loaded/Initialize() . = ..() From b89d1d0896032a180b5c12a235c3a850af52af52 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Fri, 27 Sep 2024 00:55:58 +1200 Subject: [PATCH 19/68] Update armoured.dm --- code/game/mecha/fallout/armoured.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index 1faba403e2e..804208dc192 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -33,7 +33,7 @@ /obj/structure/mecha_wreckage/armoured_jeep name = "\improper M38 wreckage" desc = "Wreckage of a M38 jeep, it's completely destroyed." - icon = "icons/mecha/armoured_jeep.dmi" + icon = 'icons/mecha/armoured_jeep.dmi' icon_state = "armoured_jeep-broken" /obj/mecha/combat/phazon/armoured_jeep/loaded/Initialize() From 501ff7c311e9b5aca3ee3c0919bfadcc819890d5 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Fri, 27 Sep 2024 01:12:32 +1200 Subject: [PATCH 20/68] Mutable --- code/datums/mutable_appearance.dm | 14 ++++---------- .../equipment/tools/fallout/vision_modules.dm | 4 ++-- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index b79d2e32011..cf67dff74ed 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -4,16 +4,10 @@ // Mutable appearances are children of images, just so you know. -#if DM_BUILD > 1642 -/mutable_appearance/proc/New(mutable_appearance/to_copy) - if(!to_copy) - plane = FLOAT_PLANE -#else -/mutable_appearance/New(mutable_appearance/to_copy) +/mutable_appearance/New() ..() - if(!to_copy) - plane = FLOAT_PLANE -#endif // Fix for broken proc on latest version of BYOND. + plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE + // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var // Helper similar to image() /proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, color = "#FFFFFF") @@ -23,4 +17,4 @@ MA.layer = layer MA.plane = plane MA.color = color - return MA + return MA \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/fallout/vision_modules.dm b/code/game/mecha/equipment/tools/fallout/vision_modules.dm index 4e5fc13f0b2..59b6c079a57 100644 --- a/code/game/mecha/equipment/tools/fallout/vision_modules.dm +++ b/code/game/mecha/equipment/tools/fallout/vision_modules.dm @@ -20,14 +20,14 @@ /obj/item/mecha_parts/mecha_equipment/vision/meson_scanner name = "vehicle meson scanner" - desc = "A vehicle module that integrates a meson scanner." + desc = "A vehicle-mounted viewport that integrates night vision and a mesonic scanner." icon_state = "mecha_meson" energy_drain = 100 vision_traits = list(TRAIT_MESON_VISION, TRAIT_NIGHT_VISION) /obj/item/mecha_parts/mecha_equipment/vision/thermal_scanner name = "vehicle thermal scanner" - desc = "A vehicle module that integrates a thermal scanner." + desc = "A vehicle-mounted viewport that integrates night vision and a thermal camera." icon_state = "mecha_thermal" energy_drain = 100 vision_traits = list(TRAIT_THERMAL_VISION, TRAIT_NIGHT_VISION) From 8028248a3527683aefee7b114e1f921c45106673 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Fri, 27 Sep 2024 01:13:56 +1200 Subject: [PATCH 21/68] Update mutable_appearance.dm --- code/datums/mutable_appearance.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index cf67dff74ed..31023b3fc7f 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -17,4 +17,4 @@ MA.layer = layer MA.plane = plane MA.color = color - return MA \ No newline at end of file + return MA From 15abe85e68b06069b4a0c5d48e2aeaa56d989e89 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Fri, 27 Sep 2024 09:44:13 +1200 Subject: [PATCH 22/68] Balance --- .../crafting/recipes/vehicle_parts.dm | 38 +++---------------- code/game/mecha/combat/phazon.dm | 2 + .../equipment/weapons/fallout/launchers.dm | 15 -------- code/game/mecha/fallout/armoured.dm | 2 + code/game/mecha/fallout/birds.dm | 2 + code/game/mecha/fallout/buggies.dm | 2 + code/game/mecha/fallout/cars.dm | 3 +- code/game/mecha/fallout/pickuptrucks.dm | 8 ++-- code/game/mecha/fallout/trucks.dm | 12 ++++-- 9 files changed, 27 insertions(+), 57 deletions(-) diff --git a/code/datums/components/crafting/recipes/vehicle_parts.dm b/code/datums/components/crafting/recipes/vehicle_parts.dm index 6f4ca6e933f..2e3db6fd309 100644 --- a/code/datums/components/crafting/recipes/vehicle_parts.dm +++ b/code/datums/components/crafting/recipes/vehicle_parts.dm @@ -197,34 +197,6 @@ category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS -// Frag launcher! - -/datum/crafting_recipe/gun/vehicle/fragmentation_launcher - name = "Vehicular grenade launcher" - result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/fragmentation - reqs = list(/obj/item/stack/crafting/goodparts = 10, - /obj/item/stack/crafting/metalparts = 5, - /obj/item/stack/sheet/prewar = 5, - /obj/item/stack/sheet/mineral/titanium = 8, - /obj/item/stack/rods = 10) - tools = list(TOOL_AWORKBENCH) - time = 180 - category = CAT_VEHICLES - subcategory = CAT_VEHICLEPARTS - -/datum/crafting_recipe/frag_ammo - name = "Fragmentation grenade ammunition" - result = /obj/item/mecha_ammo/fragmentation - reqs = list(/obj/item/stack/crafting/metalparts = 2, - /obj/item/stack/sheet/prewar = 2, - /obj/item/stack/ore/blackpowder = 5, - /obj/item/stack/sheet/mineral/titanium = 2, - ) - tools = list(TOOL_AWORKBENCH) - time = 5 - category = CAT_VEHICLES - subcategory = CAT_VEHICLEPARTS - //laser weaponery /datum/crafting_recipe/gun/laserlight @@ -325,12 +297,12 @@ /datum/crafting_recipe/vehicle_sensors_thermals name = "vehicular thermal imager" result = /obj/item/mecha_parts/mecha_equipment/vision/thermal_scanner - reqs = list(/obj/item/stack/sheet/mineral/gold=4, - /obj/item/stack/sheet/mineral/silver=4, - /obj/item/stack/sheet/mineral/uranium=2, - /obj/item/stack/crafting/metalparts = 4, + reqs = list(/obj/item/stack/sheet/mineral/gold=5, + /obj/item/stack/sheet/mineral/silver=5, + /obj/item/stack/sheet/mineral/uranium=5, + /obj/item/stack/crafting/metalparts = 5, /obj/item/advanced_crafting_components/alloys = 2, - /obj/item/stack/crafting/goodparts = 4) + /obj/item/stack/crafting/goodparts = 5) tools = list(TOOL_AWORKBENCH) time = 180 subcategory = CAT_VEHICLES diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index e5647e0503e..ed98c39927a 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -16,6 +16,8 @@ force = 15 phase_state = "phazon-phase" + facing_modifiers = list(FRONT_ARMOUR = 0.85, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.15) // experimental: weaker at the front because that's where the engine is.. + max_utility_equip = 3 max_weapons_equip = 1 max_misc_equip = 1 diff --git a/code/game/mecha/equipment/weapons/fallout/launchers.dm b/code/game/mecha/equipment/weapons/fallout/launchers.dm index 91bdbd0ffae..1cda950734b 100644 --- a/code/game/mecha/equipment/weapons/fallout/launchers.dm +++ b/code/game/mecha/equipment/weapons/fallout/launchers.dm @@ -82,18 +82,3 @@ to_chat(user, "You empty the [src]!.") return . = ..() - -// Frag-grenade launcher! - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/fragmentation - name = "\improper SHRP-8 grenade launcher" - desc = "A weapon for combat vehicles. Launches primed fragmentation grenades." - fire_sound = 'sound/weapons/grenadelaunch.ogg' - projectiles = 8 - projectiles_cache = 8 - projectiles_cache_max = 8 - missile_speed = 1.5 - equip_cooldown = 10 - projectile = /obj/item/grenade/f13/frag - equip_cooldown = 90 - ammo_type = "fragmentation" diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index 804208dc192..cb8d1c22164 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -16,6 +16,8 @@ max_weapons_equip = 1 max_misc_equip = 1 + facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.85) + /obj/mecha/combat/phazon/buggy/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) diff --git a/code/game/mecha/fallout/birds.dm b/code/game/mecha/fallout/birds.dm index 709658d8fe6..ca772cfe465 100644 --- a/code/game/mecha/fallout/birds.dm +++ b/code/game/mecha/fallout/birds.dm @@ -24,6 +24,8 @@ stepsound = 'sound/f13machines/vertibird_loop.ogg' turnsound = 'sound/f13machines/vertibird_loop.ogg' + facing_modifiers = list(FRONT_ARMOUR = 1, SIDE_ARMOUR = 1, BACK_ARMOUR = 1) + /obj/structure/mecha_wreckage/vertibird name = "\improper Vertibird Wreck" desc = "Mayday, Mayday, Vertibird going down... IN STYLE." diff --git a/code/game/mecha/fallout/buggies.dm b/code/game/mecha/fallout/buggies.dm index 6771e3eaf46..9a8edc31cdb 100644 --- a/code/game/mecha/fallout/buggies.dm +++ b/code/game/mecha/fallout/buggies.dm @@ -14,6 +14,8 @@ turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy + facing_modifiers = list(FRONT_ARMOUR = 1.15, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.85) // Engine's on the back, IG + max_utility_equip = 2 max_weapons_equip = 1 max_misc_equip = 1 diff --git a/code/game/mecha/fallout/cars.dm b/code/game/mecha/fallout/cars.dm index b9edce31c02..f34d32fa76f 100644 --- a/code/game/mecha/fallout/cars.dm +++ b/code/game/mecha/fallout/cars.dm @@ -8,7 +8,7 @@ pixel_x = -16 pixel_y = -5 max_integrity = 250 - step_energy_drain = 1 + step_energy_drain = 0.5 step_in = 0.7 armor = ARMOR_VALUE_MEDIUM stepsound = 'sound/f13machines/buggy_loop.ogg' @@ -70,7 +70,6 @@ icon = 'icons/mecha/corvega-police.dmi' icon_state = "corvega" max_integrity = 280 - step_energy_drain = 1.3 armor = ARMOR_VALUE_MEDIUM wreckage = /obj/structure/mecha_wreckage/buggy diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index a8ca1888e6e..884d93a0db3 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -8,8 +8,8 @@ pixel_x = -17 pixel_y = -3 max_integrity = 300 - step_in = 1.4 - step_energy_drain = 1.5 + step_in = 1.2 + step_energy_drain = 0.5 armor = ARMOR_VALUE_MEDIUM stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' @@ -119,7 +119,7 @@ desc = "A old vehicule, with a crane runing on fuel." icon = 'icons/mecha/pickuptruck-mechanics.dmi' icon_state = "pickuptruckmechanic" - step_in = 1.4 + step_in = 1.2 step_energy_drain = 0.6 max_integrity = 150 armor = ARMOR_VALUE_HEAVY @@ -169,7 +169,7 @@ icon_state = "jeep" pixel_x = -15 pixel_y = 0 - step_in = 1.35 + step_in = 1.2 step_energy_drain = 0.6 max_integrity = 200 armor = ARMOR_VALUE_HEAVY diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index d0c7cebe11e..440f92fe155 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -8,7 +8,7 @@ pixel_x = -22 pixel_y = -5 max_integrity = 600 - step_in = 1 + step_in = 1.2 armor = ARMOR_VALUE_MEDIUM step_energy_drain = 0.6 stepsound = 'sound/f13machines/buggy_loop.ogg' @@ -83,10 +83,15 @@ icon = 'icons/mecha/ncrtruck-mp.dmi' icon_state = "ncrtruck" max_integrity = 600 - step_in = 0.8 + step_in = 1 + step_energy_drain = 0.6 armor = ARMOR_VALUE_MEDIUM wreckage = /obj/structure/mecha_wreckage/ncrtruck + max_weapons_equip = 1 + max_utility_equip = 3 + max_misc_equip = 1 + /obj/mecha/combat/phazon/ncrtruck/mp/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) @@ -120,8 +125,9 @@ desc = "A Modified vehicule made to carry people in need to a hospital." icon = 'icons/mecha/ambulance.dmi' icon_state = "ambulance" - step_in = 1.15 + step_in = 1 max_integrity = 300 + step_energy_drain = 0.5 max_weapons_equip = 1 max_utility_equip = 5 From 0f78dccbaa05d3bf075b8be8d79098f46c432767 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Fri, 27 Sep 2024 10:33:52 +1200 Subject: [PATCH 23/68] Update phazon.dm --- code/game/mecha/combat/phazon.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index ed98c39927a..52a1843b299 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -16,7 +16,7 @@ force = 15 phase_state = "phazon-phase" - facing_modifiers = list(FRONT_ARMOUR = 0.85, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.15) // experimental: weaker at the front because that's where the engine is.. + facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.15) // experimental: weaker at the front because that's where the engine is.. max_utility_equip = 3 max_weapons_equip = 1 From 23e44678fd21804c62a17c463130e8146fbdf1a8 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Fri, 27 Sep 2024 10:50:56 +1200 Subject: [PATCH 24/68] fuel --- code/game/mecha/fallout/pickuptrucks.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index 884d93a0db3..d3b047c2e54 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -120,7 +120,7 @@ icon = 'icons/mecha/pickuptruck-mechanics.dmi' icon_state = "pickuptruckmechanic" step_in = 1.2 - step_energy_drain = 0.6 + step_energy_drain = 0.5 max_integrity = 150 armor = ARMOR_VALUE_HEAVY @@ -170,7 +170,7 @@ pixel_x = -15 pixel_y = 0 step_in = 1.2 - step_energy_drain = 0.6 + step_energy_drain = 0.4 max_integrity = 200 armor = ARMOR_VALUE_HEAVY stepsound = 'sound/f13machines/buggy_loop.ogg' From 8b73c24c3e43938d0862e2304261408d15c7dfef Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Fri, 27 Sep 2024 13:16:27 +1200 Subject: [PATCH 25/68] fuel efficiency --- code/game/mecha/fallout/carriages.dm | 6 +++--- code/game/mecha/fallout/pickuptrucks.dm | 9 ++++----- code/game/mecha/fallout/trucks.dm | 1 + 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/game/mecha/fallout/carriages.dm b/code/game/mecha/fallout/carriages.dm index 00742461255..c12d41460c7 100644 --- a/code/game/mecha/fallout/carriages.dm +++ b/code/game/mecha/fallout/carriages.dm @@ -8,7 +8,7 @@ pixel_x = -18 pixel_y = 0 max_integrity = 250 - step_energy_drain = 0.8 + step_energy_drain = 0.6 step_in = 1.2 armor = ARMOR_VALUE_HEAVY stepsound = 'sound/effects/footstep/gallop2.ogg' @@ -55,7 +55,7 @@ icon = 'icons/mecha/buggy-legiongun.dmi' icon_state = "legiongun" max_integrity = 250 - step_energy_drain = 0.8 + step_energy_drain = 0.6 step_in = 1.2 armor = ARMOR_VALUE_HEAVY @@ -95,7 +95,7 @@ pixel_y = 0 max_integrity = 250 step_in = 1.6 - step_energy_drain = 0.8 + step_energy_drain = 0.6 armor = ARMOR_VALUE_HEAVY max_utility_equip = 4 diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index d3b047c2e54..ce68d3c9408 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -9,7 +9,7 @@ pixel_y = -3 max_integrity = 300 step_in = 1.2 - step_energy_drain = 0.5 + step_energy_drain = 0.4 armor = ARMOR_VALUE_MEDIUM stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' @@ -120,9 +120,8 @@ icon = 'icons/mecha/pickuptruck-mechanics.dmi' icon_state = "pickuptruckmechanic" step_in = 1.2 - step_energy_drain = 0.5 - max_integrity = 150 - armor = ARMOR_VALUE_HEAVY + step_energy_drain = 0.6 + armor = ARMOR_VALUE_MEDIUM max_weapons_equip = 1 max_utility_equip = 4 @@ -172,7 +171,7 @@ step_in = 1.2 step_energy_drain = 0.4 max_integrity = 200 - armor = ARMOR_VALUE_HEAVY + armor = ARMOR_VALUE_MEDIUM stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index 440f92fe155..250e0299fb3 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -126,6 +126,7 @@ icon = 'icons/mecha/ambulance.dmi' icon_state = "ambulance" step_in = 1 + armor = ARMOR_VALUE_MEDIUM max_integrity = 300 step_energy_drain = 0.5 From 06507ca30b1e150fc7eed0a53062ac35c2f83ae9 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Tue, 1 Oct 2024 10:05:16 +1300 Subject: [PATCH 26/68] Uzi - hipower --- code/datums/components/crafting/recipes/vehicle_parts.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/crafting/recipes/vehicle_parts.dm b/code/datums/components/crafting/recipes/vehicle_parts.dm index 2e3db6fd309..4624c86e190 100644 --- a/code/datums/components/crafting/recipes/vehicle_parts.dm +++ b/code/datums/components/crafting/recipes/vehicle_parts.dm @@ -106,7 +106,7 @@ /obj/item/stack/sheet/metal = 10, /obj/item/stack/sheet/mineral/titanium = 20, /obj/item/stack/rods = 10, - /obj/item/gun/ballistic/automatic/smg/mini_uzi = 3) + /obj/item/gun/ballistic/automatic/pistol/ninemil = 4) tools = list(TOOL_AWORKBENCH) time = 180 category = CAT_VEHICLES From de9d7dfdeebb734e8ebf1a0e063d38a3d7fe13d4 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Tue, 1 Oct 2024 10:06:24 +1300 Subject: [PATCH 27/68] armor utility --- .../components/storage/concrete/trunk.dm | 43 ++++ .../mecha/equipment/tools/fallout/jukebox.dm | 214 ++++++++++++++++ .../tools/fallout/utility_modules.dm | 240 ++++++++++++++++++ .../game/mecha/equipment/tools/other_tools.dm | 4 +- mecha_equipment.dmi | Bin 0 -> 24630 bytes 5 files changed, 499 insertions(+), 2 deletions(-) create mode 100644 code/datums/components/storage/concrete/trunk.dm create mode 100644 code/game/mecha/equipment/tools/fallout/jukebox.dm create mode 100644 code/game/mecha/equipment/tools/fallout/utility_modules.dm create mode 100644 mecha_equipment.dmi diff --git a/code/datums/components/storage/concrete/trunk.dm b/code/datums/components/storage/concrete/trunk.dm new file mode 100644 index 00000000000..babc0ea4553 --- /dev/null +++ b/code/datums/components/storage/concrete/trunk.dm @@ -0,0 +1,43 @@ +/datum/component/storage/concrete/trunk + var/dumping_sound = 'sound/mecha/neostep1.ogg' + + +/datum/component/storage/concrete/trunk/mousedrop_onto() + var/obj/item/mecha_parts/mecha_equipment/trunk/P = parent + if(!P.chassis) + P.visible_message("The [P] is not installed!.", "someone tried to open you!.") + return + . = ..() + +/datum/component/storage/concrete/trunk/dump_content_at(atom/dest_object, mob/M) + var/obj/item/mecha_parts/mecha_equipment/trunk/P = parent + var/obj/mecha/A = P.chassis + if(!A) + P.visible_message("The [P] is not installed!.", "someone tried to open you!.") + return + var/atom/dump_destination = dest_object.get_dumping_location() + if(A.Adjacent(M) && dump_destination && M.Adjacent(dump_destination)) + if(check_locked(null, M, TRUE)) + return FALSE + if(dump_destination.storage_contents_dump_act(src, M)) + playsound(A, "rustle", 50, 1, -5) + A.do_squish(0.8, 1.2) + return TRUE + return FALSE + +/datum/component/storage/concrete/trunk/signal_take_type(datum/source, type, atom/destination, amount = INFINITY, check_adjacent = FALSE, force = FALSE, mob/user, list/inserted) + if(!force) + if(check_adjacent) + if(!user || !user.can_reach(destination) || !user.can_reach(parent)) + return FALSE + var/list/taking = typecache_filter_list(contents(), typecacheof(type)) + if(taking.len > amount) + taking.len = amount + if(inserted) //duplicated code for performance, don't bother checking retval/checking for list every item. + for(var/i in taking) + if(remove_from_storage(i, destination)) + inserted |= i + else + for(var/i in taking) + remove_from_storage(i, destination) + return TRUE \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/fallout/jukebox.dm b/code/game/mecha/equipment/tools/fallout/jukebox.dm new file mode 100644 index 00000000000..04e213db6e0 --- /dev/null +++ b/code/game/mecha/equipment/tools/fallout/jukebox.dm @@ -0,0 +1,214 @@ +/obj/item/mecha_parts/mecha_equipment/stereo + name = "exosuit Stereo System" + desc = "a stereo system hooked up a jukebox, modified for easy transport." + icon_state = "mecha_stereo" + range = MELEE + var/active = FALSE + var/list/rangers = list() + var/stop = 0 + var/volume = 70 + var/datum/track/selection = null + var/open_tray = TRUE + var/list/obj/item/record_disk/record_disks = list() + var/obj/item/record_disk/selected_disk = null + +/obj/item/mecha_parts/mecha_equipment/stereo/attach(obj/mecha/M) + . = ..() + bypass_interactions = TRUE + +/obj/item/mecha_parts/mecha_equipment/stereo/detach(obj/mecha/M) + . = ..() + bypass_interactions = FALSE + +/obj/item/mecha_parts/mecha_equipment/stereo/attackby(obj/item/O, mob/user, params) + . = ..() + if(!active) + if(istype(O, /obj/item/record_disk)) //this one checks for a record disk and if the jukebox is open, it adds it to the machine + if(open_tray == FALSE) + to_chat(usr, "The Disk Tray is not open!") + return + var/obj/item/record_disk/I = O + if(!I.R.song_associated_id) + to_chat(user, span_warning("This record is empty!")) + return + for(var/datum/track/RT in SSjukeboxes.songs) + if(I.R.song_associated_id == RT.song_associated_id) + to_chat(user, span_warning("this track is already added to the jukebox!")) + return + record_disks += I + O.forceMove(src) + playsound(src, 'sound/effects/plastic_click.ogg', 100, 0) + if(I.R.song_path) + SSjukeboxes.add_song(I.R) + return + +/obj/item/mecha_parts/mecha_equipment/stereo/proc/eject_record(obj/item/record_disk/M) //BIG IRON EDIT -start- ejects a record as defined and removes it's song from the list + if(!M) + visible_message("no disk to eject") + return + playsound(src, 'sound/effects/disk_tray.ogg', 100, 0) + src.visible_message(" ejected the [selected_disk] from the [src]!") + M.forceMove(get_turf(src)) + SSjukeboxes.remove_song(M.R) + record_disks -= M + selected_disk = null + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_status(mob/user) + if(!SSjukeboxes.songs.len && !isobserver(user)) + to_chat(user,"Error: No music tracks have been authorized for your station. Petition Central Command to resolve this issue.") + playsound(src, 'sound/misc/compiler-failure.ogg', 25, TRUE) + return UI_CLOSE + return ..() + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Jukebox", name) + ui.open() + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_data(mob/user) + var/list/data = list() + data["active"] = active + data["songs"] = list() + for(var/datum/track/S in SSjukeboxes.songs) + var/list/track_data = list( + name = S.song_name + ) + data["songs"] += list(track_data) + data["track_selected"] = null + data["track_length"] = null + data["track_beat"] = null + data["disks"] = list() + for(var/obj/item/record_disk/RD in record_disks) + var/list/tracks_data = list( + name = RD.name + ) + data["disks"] += list(tracks_data) + data["disk_selected"] = null //BIG IRON EDIT- start more tracks data + data["disk_selected_lenght"] = null + data["disk_beat"] = null //BIG IRON EDIT -end + if(selection) + data["track_selected"] = selection.song_name + data["track_length"] = DisplayTimeText(selection.song_length) + data["track_beat"] = selection.song_beat + if(selected_disk) + data["disk_selected"] = selected_disk + data["disk_selected_length"] = DisplayTimeText(selected_disk.R.song_length) + data["disk_selected_beat"] = selected_disk.R.song_beat + data["volume"] = volume + return data + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_act(action, list/params) + . = ..() + if(.) + return + + switch(action) + if("toggle") + if(QDELETED(src)) + return + if(!active) + if(stop > world.time) + to_chat(usr, "Error: The device is still resetting from the last activation, it will be ready again in [DisplayTimeText(stop-world.time)].") + playsound(src, 'sound/misc/compiler-failure.ogg', 50, TRUE) + return + activate_music() + START_PROCESSING(SSobj, src) + return TRUE + else + stop = 0 + return TRUE + if("select_track") + if(active) + to_chat(usr, "Error: You cannot change the song until the current one is over.") + return + var/list/available = list() + for(var/datum/track/S in SSjukeboxes.songs) + available[S.song_name] = S + var/selected = params["track"] + if(QDELETED(src) || !selected || !istype(available[selected], /datum/track)) + return + selection = available[selected] + return TRUE + if("select_record") + if(!record_disks.len) + to_chat(usr, "Error: no tracks on the bin!.") + return + var/list/obj/item/record_disk/availabledisks = list() + for(var/obj/item/record_disk/RR in record_disks) + availabledisks[RR.name] = RR + var/selecteddisk = params["record"] + if(QDELETED(src) || !selecteddisk) + return + selected_disk = availabledisks[selecteddisk] + updateUsrDialog() + if("eject_disk") // sanity check for the disk ejection + if(!record_disks.len) + to_chat(usr, "Error: no disks in trays.") + return + if(!selected_disk) + to_chat(usr,"Error: no disk chosen." ) + return + if(selection == selected_disk.R) + selection = null + eject_record(selected_disk) + return TRUE + if("set_volume") + var/new_volume = params["volume"] + if(new_volume == "reset") + volume = initial(volume) + return TRUE + else if(new_volume == "min") + volume = 0 + return TRUE + else if(new_volume == "max") + volume = 100 + return TRUE + else if(text2num(new_volume) != null) + volume = text2num(new_volume) + return TRUE + +/obj/item/mecha_parts/mecha_equipment/stereo/proc/activate_music() + if(!selection) + visible_message("Track is no longer avaible") + return + var/jukeboxslottotake = SSjukeboxes.addjukebox(src, selection, 2) + if(jukeboxslottotake) + active = TRUE + update_icon() + START_PROCESSING(SSobj, src) + stop = world.time + selection.song_length + return TRUE + else + return FALSE + +/obj/item/mecha_parts/mecha_equipment/stereo/get_equip_info() + var/output = ..() + if(output) + var/temp = "" + temp = "Dashboard" + return "[output] [temp]" + return + +/obj/item/mecha_parts/mecha_equipment/stereo/Topic(href,href_list) + ..() + if(href_list["dashboard"]) + var/mob/user = chassis.occupant + ui_interact(user) + return + +/obj/item/mecha_parts/mecha_equipment/stereo/process() + if(active && world.time >= stop) + active = FALSE + dance_over() + playsound(src,'sound/machines/terminal_off.ogg',50,1) + update_icon() + stop = world.time + 100 + +/obj/item/mecha_parts/mecha_equipment/stereo/proc/dance_over() + var/position = SSjukeboxes.findjukeboxindex(src) + if(!position) + return + SSjukeboxes.removejukebox(position) + STOP_PROCESSING(SSobj, src) + rangers = list() diff --git a/code/game/mecha/equipment/tools/fallout/utility_modules.dm b/code/game/mecha/equipment/tools/fallout/utility_modules.dm new file mode 100644 index 00000000000..b039b0dffea --- /dev/null +++ b/code/game/mecha/equipment/tools/fallout/utility_modules.dm @@ -0,0 +1,240 @@ +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13 + name = "crane hook" + desc = "The hooking system of a vehicle-mounted crane, capable of hoisting multiple heavy items with ease." + icon_state = "vehicle_crane" + equip_cooldown = 15 + energy_drain = 10 + tool_behaviour = null + attack_sentence = "You hear hydraulics." + attack_verbs = "lashes" + detachable = FALSE + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/can_attach(obj/mecha/M as obj) + if(..()) + if (!M.cargo_capacity) + return 0 + return 1 + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/vehicle_straps + name = "tray securing kit" + desc = "An assortment of cables and straps to secure heavy items on the back of a ute's tray." + icon_state = "vehicle_straps" + equip_cooldown = 30 + energy_drain = 0 + tool_behaviour = null + dam_force = 0 + +/obj/item/mecha_parts/mecha_equipment/trunk + name = "Modular Trunk" + desc = "Equipment made to hold and transport big ammounts of cargo." + icon_state = "car_trunk" + equip_cooldown = 15 + energy_drain = 0 + harmful = FALSE + mech_flags = EXOSUIT_MODULE_PHAZON + var/component_type = /datum/component/storage/concrete/trunk + var/in_use = FALSE + w_class = WEIGHT_CLASS_GIGANTIC + resistance_flags = NONE + max_integrity = 1000 + var/datum/component/storage/concrete/trunk/storagespace + +/obj/item/mecha_parts/mecha_equipment/trunk/get_dumping_location(/obj/item/mecha_parts/mecha_equipment/trunk/source,mob/user) + return src + +/obj/item/mecha_parts/mecha_equipment/trunk/Initialize() + . = ..() + PopulateContents() + +/obj/item/mecha_parts/mecha_equipment/trunk/Destroy() + for(var/atom/movable/A in contents) + A.forceMove(drop_location()) + step_rand(A) + return ..() + +/obj/item/mecha_parts/mecha_equipment/trunk/ComponentInitialize() + AddComponent(component_type) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + //STR.storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT + STR.max_combined_w_class = 2100 + STR.max_w_class = WEIGHT_CLASS_GIGANTIC + STR.max_items = 2100 + storagespace = STR + + +/obj/item/mecha_parts/mecha_equipment/trunk/AllowDrop() + return !QDELETED(src) + +/obj/item/mecha_parts/mecha_equipment/trunk/contents_explosion(severity, target) + var/in_storage = istype(loc, /obj/item/storage)? (max(0, severity - 1)) : (severity) + for(var/atom/A in contents) + A.ex_act(in_storage, target) + CHECK_TICK + +//Cyberboss says: "USE THIS TO FILL IT, NOT INITIALIZE OR NEW" + +/obj/item/mecha_parts/mecha_equipment/trunk/proc/PopulateContents() + +/obj/item/mecha_parts/mecha_equipment/trunk/attach() + . = ..() + chassis.mouse_drag_pointer = MOUSE_ACTIVE_POINTER + storagespace.RegisterSignal(chassis, COMSIG_MOUSEDROP_ONTO, /datum/component/storage/concrete/trunk.proc/mousedrop_onto) + storagespace.RegisterSignal(chassis, COMSIG_CONTAINS_STORAGE, /datum/component/storage/concrete/trunk.proc/on_check) + storagespace.RegisterSignal(chassis, COMSIG_IS_STORAGE_LOCKED, /datum/component/storage/concrete/trunk.proc/check_locked) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_SHOW, /datum/component/storage/concrete/trunk.proc/signal_show_attempt) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_INSERT, /datum/component/storage/concrete/trunk.proc/signal_insertion_attempt) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_CAN_INSERT, /datum/component/storage/concrete/trunk.proc/signal_can_insert) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_TAKE_TYPE, /datum/component/storage/concrete/trunk.proc/signal_take_type) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_FILL_TYPE, /datum/component/storage/concrete/trunk.proc/signal_fill_type) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_SET_LOCKSTATE, /datum/component/storage/concrete/trunk.proc/set_locked) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_TAKE, /datum/component/storage/concrete/trunk.proc/signal_take_obj) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_QUICK_EMPTY, /datum/component/storage/concrete/trunk.proc/signal_quick_empty) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_HIDE_FROM, /datum/component/storage/concrete/trunk.proc/signal_hide_attempt) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_HIDE_ALL, /datum/component/storage/concrete/trunk.proc/close_all) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_RETURN_INVENTORY, /datum/component/storage/concrete/trunk.proc/signal_return_inv) + storagespace.RegisterSignal(chassis, COMSIG_PARENT_ATTACKBY, /datum/component/storage/concrete/trunk.proc/attackby) + storagespace.RegisterSignal(chassis, COMSIG_ATOM_EMP_ACT, /datum/component/storage/concrete/trunk.proc/emp_act) + storagespace.RegisterSignal(chassis, COMSIG_ATOM_ATTACK_GHOST, /datum/component/storage/concrete/trunk.proc/show_to_ghost) + storagespace.RegisterSignal(chassis, COMSIG_ATOM_ENTERED, /datum/component/storage/concrete/trunk.proc/refresh_mob_views) + storagespace.RegisterSignal(chassis, COMSIG_ATOM_EXITED, /datum/component/storage/concrete/trunk.proc/_remove_and_refresh) + storagespace.RegisterSignal(chassis, COMSIG_ITEM_PRE_ATTACK, /datum/component/storage/concrete/trunk.proc/preattack_intercept) + storagespace.RegisterSignal(chassis, COMSIG_ITEM_ATTACK_SELF, /datum/component/storage/concrete/trunk.proc/attack_self) + storagespace.RegisterSignal(chassis, COMSIG_ITEM_PICKUP, /datum/component/storage/concrete/trunk.proc/signal_on_pickup) + storagespace.RegisterSignal(chassis, COMSIG_MOVABLE_POST_THROW, /datum/component/storage/concrete/trunk.proc/close_all) + storagespace.RegisterSignal(chassis, COMSIG_MOVABLE_MOVED, /datum/component/storage/concrete/trunk.proc/check_views) + storagespace.RegisterSignal(chassis, COMSIG_CLICK_ALT, /datum/component/storage/concrete/trunk.proc/on_alt_click) + storagespace.RegisterSignal(chassis, COMSIG_MOUSEDROPPED_ONTO, /datum/component/storage/concrete/trunk.proc/mousedrop_receive) + +/obj/item/mecha_parts/mecha_equipment/trunk/detach() + storagespace.UnregisterSignal(chassis, COMSIG_MOUSEDROP_ONTO) + storagespace.UnregisterSignal(chassis, COMSIG_CONTAINS_STORAGE) + storagespace.UnregisterSignal(chassis, COMSIG_IS_STORAGE_LOCKED) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_SHOW) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_INSERT) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_CAN_INSERT) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_TAKE_TYPE) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_FILL_TYPE) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_SET_LOCKSTATE) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_TAKE) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_QUICK_EMPTY) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_HIDE_FROM) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_HIDE_ALL) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_RETURN_INVENTORY) + storagespace.UnregisterSignal(chassis, COMSIG_PARENT_ATTACKBY) + storagespace.UnregisterSignal(chassis, COMSIG_ATOM_EMP_ACT) + storagespace.UnregisterSignal(chassis, COMSIG_ATOM_ATTACK_GHOST) + storagespace.UnregisterSignal(chassis, COMSIG_ATOM_ENTERED) + storagespace.UnregisterSignal(chassis, COMSIG_ATOM_EXITED) + storagespace.UnregisterSignal(chassis, COMSIG_ITEM_PRE_ATTACK) + storagespace.UnregisterSignal(chassis, COMSIG_ITEM_ATTACK_SELF) + storagespace.UnregisterSignal(chassis, COMSIG_ITEM_PICKUP) + storagespace.UnregisterSignal(chassis, COMSIG_MOVABLE_POST_THROW) + storagespace.UnregisterSignal(chassis, COMSIG_MOVABLE_MOVED) + storagespace.UnregisterSignal(chassis, COMSIG_CLICK_ALT) + storagespace.UnregisterSignal(chassis, COMSIG_MOUSEDROPPED_ONTO) + chassis.mouse_drag_pointer = MOUSE_INACTIVE_POINTER + . = ..() + +//////Passenger seat + +/obj/item/mecha_parts/mecha_equipment/seat + name = "Mounted seat" + desc = "A seat. Yup, looks hi-tec eh ? Well, its just a seat" + icon = 'icons/obj/bus.dmi' + icon_state = "backseat" + energy_drain = 5 + range = MELEE + equip_cooldown = 5 + var/mob/living/carbon/patient = null + salvageable = 0 + mech_flags = EXOSUIT_MODULE_COMBAT + +/obj/item/mecha_parts/mecha_equipment/seat/Destroy() + for(var/atom/movable/AM in src) + AM.forceMove(get_turf(src)) + return ..() + +/obj/item/mecha_parts/mecha_equipment/seat/Exit(atom/movable/O) + return 0 + +/obj/item/mecha_parts/mecha_equipment/seat/action(mob/living/carbon/target) + if(!action_checks(target)) + return + if(!istype(target)) + return + if(!patient_insertion_check(target)) + return + occupant_message(span_notice("You start putting [target] into [src]...")) + chassis.visible_message(span_warning("[chassis] starts putting [target] into \the [src].")) + if(do_after_cooldown(target)) + if(!patient_insertion_check(target)) + return + target.forceMove(src) + patient = target + START_PROCESSING(SSobj, src) + update_equip_info() + occupant_message(span_notice("[target] successfully loaded into [src]. Life support functions engaged... I mean, the seatbelt.")) + chassis.visible_message(span_warning("[chassis] loads [target] into [src].")) + mecha_log_message("[target] loaded. Seatbelt engaged.") + +/obj/item/mecha_parts/mecha_equipment/seat/proc/patient_insertion_check(mob/living/carbon/target) + if(target.buckled) + occupant_message(span_warning("[target] will not fit into the seat because [target.p_theyre()] buckled to [target.buckled]!")) + return + if(target.has_buckled_mobs()) + occupant_message(span_warning("[target] will not fit into the seat because of the creatures attached to it!")) + return + if(patient) + occupant_message(span_warning("The seat is already occupied!")) + return + return 1 + +/obj/item/mecha_parts/mecha_equipment/seat/proc/go_out() + if(!patient) + return + patient.forceMove(get_turf(src)) + occupant_message("[patient] is out, removing the seatbelt.") + mecha_log_message("[patient] ejected. Seatbelt disabled.") + STOP_PROCESSING(SSobj, src) + patient = null + update_equip_info() + +/obj/item/mecha_parts/mecha_equipment/seat/detach() + if(patient) + occupant_message(span_warning("Unable to detach [src] - equipment occupied!")) + return + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/mecha_parts/mecha_equipment/seat/get_equip_info() + var/output = ..() + if(output) + var/temp = "" + if(patient) + temp = "
\[Occupant: [patient] ([patient.stat > 1 ? "*DECEASED*" : "Health: [patient.health]%"])\]
View stats|Eject" + return "[output] [temp]" + return + +/obj/item/mecha_parts/mecha_equipment/seat/Topic(href,href_list) + ..() + if(href_list["eject"]) + go_out() + return + +/obj/item/mecha_parts/mecha_equipment/seat/container_resist(mob/living/user) + go_out() + +/obj/item/mecha_parts/mecha_equipment/seat/process() + if(..()) + return + if(!chassis.has_charge(energy_drain)) + set_ready_state(1) + mecha_log_message("Deactivated.") + occupant_message("[src] deactivated - no power.") + STOP_PROCESSING(SSobj, src) + return + var/mob/living/carbon/M = patient + if(!M) + return + chassis.use_power(energy_drain) + update_equip_info() diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 63d38d0aab6..4a7426cb35f 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -256,7 +256,7 @@ // var/deflect_coeff = 1.15 var/damage_coeff = 0.7 selectable = 0 - equip_type = EQUIP_MISC + equip_type = EQUIP_UTILITY /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/proc/attack_react() @@ -276,7 +276,7 @@ // var/deflect_coeff = 1.15 var/damage_coeff = 0.75 selectable = 0 - equip_type = EQUIP_MISC + equip_type = EQUIP_UTILITY /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/proc/projectile_react() if(action_checks(src)) diff --git a/mecha_equipment.dmi b/mecha_equipment.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5b3426f33c08cc92859887a57791749442941390 GIT binary patch literal 24630 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

L?t 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 K>2gWqp#K7ccfs}m literal 0 HcmV?d00001 From 880b7a0781db83ca567dd2bceeaf1a554b0fb0f0 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Tue, 1 Oct 2024 10:07:31 +1300 Subject: [PATCH 28/68] Test - dnm --- code/_onclick/adjacent.dm | 2 +- .../crafting/recipes/vehicle_parts.dm | 24 ++ code/game/mecha/combat/phazon.dm | 1 + code/game/mecha/equipment/mecha_equipment.dm | 3 + .../game/mecha/equipment/tools/other_tools.dm | 111 --------- code/game/mecha/equipment/tools/work_tools.dm | 227 +----------------- code/game/mecha/fallout/pickuptrucks.dm | 38 ++- code/game/mecha/fallout/trucks.dm | 7 +- code/game/mecha/mecha.dm | 42 +++- code/game/mecha/mecha_defense.dm | 6 + code/game/mecha/mecha_topic.dm | 38 ++- code/game/mecha/working/ripley.dm | 55 ----- hailmary.dme | 3 + icons/mecha/mecha_equipment.dmi | Bin 23798 -> 24679 bytes 14 files changed, 149 insertions(+), 408 deletions(-) diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index 6d19e10d109..c8f50752f8a 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -79,7 +79,7 @@ /obj/item/Adjacent(atom/neighbor, atom/target, atom/movable/mover, recurse = 1) if(neighbor == loc) return 1 - if(isitem(loc)) + if(isitem(loc) || istype(loc, /obj/mecha)) if(recurse > 0) for(var/obj/item/item_loc as anything in get_locs()) if(item_loc.Adjacent(neighbor, target, mover, recurse - 1)) diff --git a/code/datums/components/crafting/recipes/vehicle_parts.dm b/code/datums/components/crafting/recipes/vehicle_parts.dm index 4624c86e190..96cd90c9c18 100644 --- a/code/datums/components/crafting/recipes/vehicle_parts.dm +++ b/code/datums/components/crafting/recipes/vehicle_parts.dm @@ -320,3 +320,27 @@ time = 180 subcategory = CAT_VEHICLES category = CAT_VEHICLEPARTS + +/datum/crafting_recipe/carpart/trunk + name = "Modular Trunk" + result = /obj/item/mecha_parts/mecha_equipment/trunk + reqs = list(/obj/item/stack/sheet/metal = 5, + /obj/item/stack/crafting/metalparts = 10, + /obj/item/stack/sheet/plastic = 5, + /obj/item/stack/rods = 2) + tools = list(TOOL_WORKBENCH) + time = 90 + subcategory = CAT_VEHICLES + category = CAT_VEHICLEPARTS + +/datum/crafting_recipe/carpart/seat + name = "Mounted Seat" + result = /obj/item/mecha_parts/mecha_equipment/seat + reqs = list(/obj/item/stack/sheet/metal = 5, + /obj/item/stack/crafting/metalparts = 10, + /obj/item/stack/sheet/leather = 5, + /obj/item/stack/rods = 5) + tools = list(TOOL_WORKBENCH) + time = 90 + subcategory = CAT_VEHICLES + category = CAT_VEHICLEPARTS diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 52a1843b299..cc9cd39c3fa 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -15,6 +15,7 @@ internal_damage_threshold = 25 force = 15 phase_state = "phazon-phase" + can_be_locked = TRUE facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.15) // experimental: weaker at the front because that's where the engine is.. diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 637445483f7..ae970337458 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -25,6 +25,7 @@ var/harmful = FALSE //Controls if equipment can be used to attack by a pacifist. //var/destroy_sound = 'sound/mecha/critdestr.ogg' var/equip_type = EQUIP_UTILITY + var/detachable = TRUE /obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page() if(chassis) @@ -153,6 +154,8 @@ /obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto=null) if(!chassis) return + if(!detachable) + return moveto = moveto || get_turf(chassis) forceMove(moveto) chassis.equipment -= src diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 4a7426cb35f..3e31bc67efd 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -132,117 +132,6 @@ send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) return - -//////Passenger seat - -/obj/item/mecha_parts/mecha_equipment/seat - name = "Mounted seat" - desc = "A seat. Yup, looks hi-tec eh ? Well, its just a seat" - icon = 'icons/obj/bus.dmi' - icon_state = "backseat" - energy_drain = 5 - range = MELEE - equip_cooldown = 5 - var/mob/living/carbon/patient = null - salvageable = 0 - mech_flags = EXOSUIT_MODULE_COMBAT - -/obj/item/mecha_parts/mecha_equipment/seat/Destroy() - for(var/atom/movable/AM in src) - AM.forceMove(get_turf(src)) - return ..() - -/obj/item/mecha_parts/mecha_equipment/seat/Exit(atom/movable/O) - return 0 - -/obj/item/mecha_parts/mecha_equipment/seat/action(mob/living/carbon/target) - if(!action_checks(target)) - return - if(!istype(target)) - return - if(!patient_insertion_check(target)) - return - occupant_message(span_notice("You start putting [target] into [src]...")) - chassis.visible_message(span_warning("[chassis] starts putting [target] into \the [src].")) - if(do_after_cooldown(target)) - if(!patient_insertion_check(target)) - return - target.forceMove(src) - patient = target - START_PROCESSING(SSobj, src) - update_equip_info() - occupant_message(span_notice("[target] successfully loaded into [src]. Life support functions engaged... I mean, the seatbelt.")) - chassis.visible_message(span_warning("[chassis] loads [target] into [src].")) - mecha_log_message("[target] loaded. Seatbelt engaged.") - -/obj/item/mecha_parts/mecha_equipment/seat/proc/patient_insertion_check(mob/living/carbon/target) - if(target.buckled) - occupant_message(span_warning("[target] will not fit into the seat because [target.p_theyre()] buckled to [target.buckled]!")) - return - if(target.has_buckled_mobs()) - occupant_message(span_warning("[target] will not fit into the seat because of the creatures attached to it!")) - return - if(patient) - occupant_message(span_warning("The seat is already occupied!")) - return - return 1 - -/obj/item/mecha_parts/mecha_equipment/seat/proc/go_out() - if(!patient) - return - patient.forceMove(get_turf(src)) - occupant_message("[patient] is out, removing the seatbelt.") - mecha_log_message("[patient] ejected. Seatbelt disabled.") - STOP_PROCESSING(SSobj, src) - patient = null - update_equip_info() - -/obj/item/mecha_parts/mecha_equipment/seat/detach() - if(patient) - occupant_message(span_warning("Unable to detach [src] - equipment occupied!")) - return - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/mecha_parts/mecha_equipment/seat/get_equip_info() - var/output = ..() - if(output) - var/temp = "" - if(patient) - temp = "
\[Occupant: [patient] ([patient.stat > 1 ? "*DECEASED*" : "Health: [patient.health]%"])\]
View stats|Eject" - return "[output] [temp]" - return - -/obj/item/mecha_parts/mecha_equipment/seat/Topic(href,href_list) - ..() - if(href_list["eject"]) - go_out() - return - -/obj/item/mecha_parts/mecha_equipment/seat/container_resist(mob/living/user) - go_out() - -/obj/item/mecha_parts/mecha_equipment/seat/process() - if(..()) - return - if(!chassis.has_charge(energy_drain)) - set_ready_state(1) - mecha_log_message("Deactivated.") - occupant_message("[src] deactivated - no power.") - STOP_PROCESSING(SSobj, src) - return - var/mob/living/carbon/M = patient - if(!M) - return - if(M.health > 0) - M.adjustOxyLoss(-1) - M.AdjustAllImmobility(-80) - M.AdjustUnconscious(-80) - if(M.reagents.get_reagent_amount(/datum/reagent/medicine/epinephrine) < 5) - M.reagents.add_reagent(/datum/reagent/medicine/epinephrine, 5) - chassis.use_power(energy_drain) - update_equip_info() - //////////////////////////// ARMOR BOOSTER MODULES ////////////////////////////////////////////////////////// diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 61855c73e71..00a897c379e 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -14,6 +14,8 @@ var/obj/mecha/working/ripley/cargo_holder harmful = TRUE mech_flags = EXOSUIT_MODULE_RIPLEY + var/attack_sentence = "You hear something crack." + var/attack_verbs = "squeezes" /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/mecha/working/ripley/M as obj) if(..()) @@ -71,15 +73,17 @@ var/mob/living/M = target if(M.stat == DEAD) return + if(!dam_force) + return if(chassis.occupant.a_intent == INTENT_HARM) M.take_overall_damage(dam_force) if(!M) return M.adjustOxyLoss(round(dam_force/2)) M.updatehealth() - target.visible_message(span_danger("[chassis] squeezes [target]."), \ - span_userdanger("[chassis] squeezes [target]."),\ - span_italic("You hear something crack.")) + target.visible_message(span_danger("[chassis] [attack_verb] [target]."), \ + span_userdanger("[chassis] [attack_verb] [target]."),\ + span_italic("[attack_sentence]")) log_combat(chassis.occupant, M, "attacked", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") else step_away(M,chassis) @@ -466,220 +470,3 @@ //NC.mergeConnectedNetworksOnTurf() last_piece = NC return 1 - - -/obj/item/mecha_parts/mecha_equipment/stereo - name = "exosuit Stereo System" - desc = "a stereo system hooked up a jukebox, modified for easy transport." - icon_state = "mecha_stereo" - range = MELEE - var/active = FALSE - var/list/rangers = list() - var/stop = 0 - var/volume = 70 - var/datum/track/selection = null - var/open_tray = TRUE - var/list/obj/item/record_disk/record_disks = list() - var/obj/item/record_disk/selected_disk = null - -/obj/item/mecha_parts/mecha_equipment/stereo/attach(obj/mecha/M) - . = ..() - bypass_interactions = TRUE - -/obj/item/mecha_parts/mecha_equipment/stereo/detach(obj/mecha/M) - . = ..() - bypass_interactions = FALSE - -/obj/item/mecha_parts/mecha_equipment/stereo/attackby(obj/item/O, mob/user, params) - . = ..() - if(!active) - if(istype(O, /obj/item/record_disk)) //this one checks for a record disk and if the jukebox is open, it adds it to the machine - if(open_tray == FALSE) - to_chat(usr, "The Disk Tray is not open!") - return - var/obj/item/record_disk/I = O - if(!I.R.song_associated_id) - to_chat(user, span_warning("This record is empty!")) - return - for(var/datum/track/RT in SSjukeboxes.songs) - if(I.R.song_associated_id == RT.song_associated_id) - to_chat(user, span_warning("this track is already added to the jukebox!")) - return - record_disks += I - O.forceMove(src) - playsound(src, 'sound/effects/plastic_click.ogg', 100, 0) - if(I.R.song_path) - SSjukeboxes.add_song(I.R) - return - -/obj/item/mecha_parts/mecha_equipment/stereo/proc/eject_record(obj/item/record_disk/M) //BIG IRON EDIT -start- ejects a record as defined and removes it's song from the list - if(!M) - visible_message("no disk to eject") - return - playsound(src, 'sound/effects/disk_tray.ogg', 100, 0) - src.visible_message(" ejected the [selected_disk] from the [src]!") - M.forceMove(get_turf(src)) - SSjukeboxes.remove_song(M.R) - record_disks -= M - selected_disk = null - -/obj/item/mecha_parts/mecha_equipment/stereo/ui_status(mob/user) - if(!SSjukeboxes.songs.len && !isobserver(user)) - to_chat(user,"Error: No music tracks have been authorized for your station. Petition Central Command to resolve this issue.") - playsound(src, 'sound/misc/compiler-failure.ogg', 25, TRUE) - return UI_CLOSE - return ..() - -/obj/item/mecha_parts/mecha_equipment/stereo/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Jukebox", name) - ui.open() - -/obj/item/mecha_parts/mecha_equipment/stereo/ui_data(mob/user) - var/list/data = list() - data["active"] = active - data["songs"] = list() - for(var/datum/track/S in SSjukeboxes.songs) - var/list/track_data = list( - name = S.song_name - ) - data["songs"] += list(track_data) - data["track_selected"] = null - data["track_length"] = null - data["track_beat"] = null - data["disks"] = list() - for(var/obj/item/record_disk/RD in record_disks) - var/list/tracks_data = list( - name = RD.name - ) - data["disks"] += list(tracks_data) - data["disk_selected"] = null //BIG IRON EDIT- start more tracks data - data["disk_selected_lenght"] = null - data["disk_beat"] = null //BIG IRON EDIT -end - if(selection) - data["track_selected"] = selection.song_name - data["track_length"] = DisplayTimeText(selection.song_length) - data["track_beat"] = selection.song_beat - if(selected_disk) - data["disk_selected"] = selected_disk - data["disk_selected_length"] = DisplayTimeText(selected_disk.R.song_length) - data["disk_selected_beat"] = selected_disk.R.song_beat - data["volume"] = volume - return data - -/obj/item/mecha_parts/mecha_equipment/stereo/ui_act(action, list/params) - . = ..() - if(.) - return - - switch(action) - if("toggle") - if(QDELETED(src)) - return - if(!active) - if(stop > world.time) - to_chat(usr, "Error: The device is still resetting from the last activation, it will be ready again in [DisplayTimeText(stop-world.time)].") - playsound(src, 'sound/misc/compiler-failure.ogg', 50, TRUE) - return - activate_music() - START_PROCESSING(SSobj, src) - return TRUE - else - stop = 0 - return TRUE - if("select_track") - if(active) - to_chat(usr, "Error: You cannot change the song until the current one is over.") - return - var/list/available = list() - for(var/datum/track/S in SSjukeboxes.songs) - available[S.song_name] = S - var/selected = params["track"] - if(QDELETED(src) || !selected || !istype(available[selected], /datum/track)) - return - selection = available[selected] - return TRUE - if("select_record") - if(!record_disks.len) - to_chat(usr, "Error: no tracks on the bin!.") - return - var/list/obj/item/record_disk/availabledisks = list() - for(var/obj/item/record_disk/RR in record_disks) - availabledisks[RR.name] = RR - var/selecteddisk = params["record"] - if(QDELETED(src) || !selecteddisk) - return - selected_disk = availabledisks[selecteddisk] - updateUsrDialog() - if("eject_disk") // sanity check for the disk ejection - if(!record_disks.len) - to_chat(usr, "Error: no disks in trays.") - return - if(!selected_disk) - to_chat(usr,"Error: no disk chosen." ) - return - if(selection == selected_disk.R) - selection = null - eject_record(selected_disk) - return TRUE - if("set_volume") - var/new_volume = params["volume"] - if(new_volume == "reset") - volume = initial(volume) - return TRUE - else if(new_volume == "min") - volume = 0 - return TRUE - else if(new_volume == "max") - volume = 100 - return TRUE - else if(text2num(new_volume) != null) - volume = text2num(new_volume) - return TRUE - -/obj/item/mecha_parts/mecha_equipment/stereo/proc/activate_music() - if(!selection) - visible_message("Track is no longer avaible") - return - var/jukeboxslottotake = SSjukeboxes.addjukebox(src, selection, 2) - if(jukeboxslottotake) - active = TRUE - update_icon() - START_PROCESSING(SSobj, src) - stop = world.time + selection.song_length - return TRUE - else - return FALSE - -/obj/item/mecha_parts/mecha_equipment/stereo/get_equip_info() - var/output = ..() - if(output) - var/temp = "" - temp = "Dashboard" - return "[output] [temp]" - return - -/obj/item/mecha_parts/mecha_equipment/stereo/Topic(href,href_list) - ..() - if(href_list["dashboard"]) - var/mob/user = chassis.occupant - ui_interact(user) - return - -/obj/item/mecha_parts/mecha_equipment/stereo/process() - if(active && world.time >= stop) - active = FALSE - dance_over() - playsound(src,'sound/machines/terminal_off.ogg',50,1) - update_icon() - stop = world.time + 100 - -/obj/item/mecha_parts/mecha_equipment/stereo/proc/dance_over() - var/position = SSjukeboxes.findjukeboxindex(src) - if(!position) - return - SSjukeboxes.removejukebox(position) - STOP_PROCESSING(SSobj, src) - rangers = list() - diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index ce68d3c9408..65b7eb5e082 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -14,11 +14,19 @@ stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy + cargo_capacity = 2 max_weapons_equip = 1 - max_utility_equip = 3 + max_utility_equip = 5 max_misc_equip = 1 + facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.25) + +/obj/mecha/combat/phazon/pickuptruck/Initialize(mapload) + . = ..() + var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/vehicle_straps/ME = new(src) + ME.attach(src) + /obj/mecha/combat/phazon/pickuptruck/go_out() ..() update_icon() @@ -51,7 +59,7 @@ ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) -//pickuptruck blue + //pickuptruck blue /obj/mecha/combat/phazon/pickuptruck/blue name = "\improper pickup truck" @@ -101,6 +109,9 @@ max_integrity = 300 armor = ARMOR_VALUE_MEDIUM wreckage = /obj/structure/mecha_wreckage/buggy + cargo_capacity = 1 + + facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.5) // There's whole ass paladin in the way.. /obj/mecha/combat/phazon/pickuptruck/bos/armed/loaded/Initialize() . = ..() @@ -114,19 +125,32 @@ //pickuptruck mechanic -/obj/mecha/combat/phazon/pickuptruck/mechanic +/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck name = "\improper mechanic pickup truck" desc = "A old vehicule, with a crane runing on fuel." icon = 'icons/mecha/pickuptruck-mechanics.dmi' icon_state = "pickuptruckmechanic" + stepsound = 'sound/f13machines/buggy_loop.ogg' + turnsound = 'sound/f13machines/buggy_loop.ogg' + wreckage = /obj/structure/mecha_wreckage/buggy step_in = 1.2 step_energy_drain = 0.6 armor = ARMOR_VALUE_MEDIUM + cargo_capacity = 5 max_weapons_equip = 1 - max_utility_equip = 4 + max_utility_equip = 5 max_misc_equip = 1 +/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/Initialize() + . = ..() + for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) + E.detach() + qdel(E) + equipment.Cut() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13 + ME.attach(src) + /obj/mecha/combat/phazon/pickuptruck/mechanic/go_out() ..() update_icon() @@ -161,7 +185,7 @@ //jeep -/obj/mecha/combat/phazon/jeep +/obj/mecha/combat/phazon/pickuptruck/jeep name = "\improper pickup truck" desc = "A old vehicule, runing on fuel." icon = 'icons/mecha/jeep.dmi' @@ -175,9 +199,10 @@ stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy + cargo_capacity = 1 max_weapons_equip = 1 - max_utility_equip = 3 + max_utility_equip = 4 max_misc_equip = 1 /obj/mecha/combat/phazon/jeep/go_out() @@ -212,6 +237,7 @@ ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) + //jeep Enclave /obj/mecha/combat/phazon/jeep/enclave diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index 250e0299fb3..9c1fa7139eb 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -7,21 +7,22 @@ icon_state = "ncrtruck" pixel_x = -22 pixel_y = -5 - max_integrity = 600 + max_integrity = 6000 // TEST step_in = 1.2 armor = ARMOR_VALUE_MEDIUM step_energy_drain = 0.6 stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/ncrtruck - var/list/cargo = new - var/cargo_capacity = 30 var/hides = 0 max_weapons_equip = 1 max_utility_equip = 8 max_misc_equip = 1 + deflect_chance = 0 + internal_damage_threshold = 99 // test + /obj/structure/mecha_wreckage/ncrtruck name = "\improper NCR Truck wreckage" desc = "Its a truck ! BROKEN TRUCK." diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 110ff8c3406..b71d073c090 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -102,6 +102,9 @@ var/list/utility_equipment = new var/list/misc_equipment = new + var/list/cargo = new + var/cargo_capacity = 0 // for now, copy attributes from ripley so don't have to remap // lazy + /// a list of all vision traits to give to the occupant. var/list/vision_modes = list() @@ -234,7 +237,7 @@ else M.forceMove(loc) if(wreckage) - if(prob(85)) + if(prob(1)) explosion(get_turf(src), 0, 1, 2, 3) var/obj/structure/mecha_wreckage/WR = new wreckage(loc, AI) for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) @@ -252,6 +255,7 @@ if(internal_tank) WR.crowbar_salvage += internal_tank internal_tank.forceMove(WR) + else for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) E.detach(loc) @@ -262,6 +266,12 @@ qdel(internal_tank) if(AI) AI.gib() //No wreck, no AI to recover + + for(var/atom/movable/A in cargo) + A.forceMove(drop_location()) + step_rand(A) + cargo.Cut() + STOP_PROCESSING(SSobj, src) GLOB.poi_list.Remove(src) equipment.Cut() @@ -1222,3 +1232,33 @@ else to_chat(user, "None of the equipment on this exosuit can use this ammo!") return FALSE + +/obj/mecha/Exit(atom/movable/O) + if(O in cargo) + return 0 + return ..() + +/obj/mecha/relay_container_resist(mob/living/user, obj/O) + to_chat(user, span_notice("You lean on the back of [O] and start pushing so it falls out of [src].")) + if(do_after(user, 300, target = O)) + if(!user || user.stat != CONSCIOUS || user.loc != src || O.loc != src ) + return + to_chat(user, span_notice("You successfully pushed [O] out of [src]!")) + O.forceMove(drop_location()) + cargo -= O + else + if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. + to_chat(user, span_warning("You fail to push [O] out of [src]!")) +/* +/obj/mecha/Topic(href, href_list) + ..() + if(href_list["drop_from_cargo"]) + var/obj/cargoobj = locate(href_list["drop_from_cargo"]) in cargo + if(cargoobj) + to_chat(occupants, "[icon2html(src, occupants)]You unload [cargoobj].") + cargoobj.forceMove(drop_location()) + LAZYREMOVE(cargo, cargoobj) + if(cargoobj == box) + box = null + log_message("Unloaded [cargoobj]. Cargo compartment capacity: [cargo_capacity - LAZYLEN(cargo)]", LOG_MECHA) +*/ \ No newline at end of file diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index c7f31906c0d..29184803494 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -127,6 +127,12 @@ for(var/Y in trackers) var/obj/item/mecha_parts/mecha_tracking/MT = Y MT.ex_act(severity, target) + for(var/Z in cargo) + var/obj/O = Z + if(prob(30/severity)) + cargo -= O + O.forceMove(drop_location()) + . = ..() if(occupant) occupant.ex_act(severity,target) diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 3f5537ad7e0..11492832549 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -91,6 +91,14 @@ [phasing_action.owner ? "Phase Modulator: [phasing ? "Enabled" : "Disabled"]
" : ""] "} + if(cargo_capacity) + . += "Cargo Compartment Contents:

" + if(cargo.len) + for(var/obj/O in cargo) + . += "Unload : [O]
" + else + . += "Nothing" + . += "
" /obj/mecha/proc/get_commands() . = {"
@@ -122,32 +130,31 @@ /obj/mecha/proc/get_equipment_menu() //outputs mecha html equipment menu - var/output + . = "" if(equipment.len) - output += {"
+ . += {"
Equipment
"} - return output + return . /obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html if(!equipment.len) return - var/output = "Equipment:
" + . = "Equipment:
" for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) - output += "
[MT.get_equip_info()]
" - output += "
" - return output + . += "
[MT.get_equip_info()]
" + . += "
" @@ -315,6 +322,15 @@ maint_access = !maint_access send_byjax(usr,"exosuit.browser","t_maint_access","[maint_access?"Forbid":"Permit"] maintenance protocols") + if(href_list["drop_from_cargo"]) + var/obj/O = locate(href_list["drop_from_cargo"]) + if(O && (O in cargo)) + occupant_message(span_notice("You unload [O].")) + O.forceMove(drop_location()) + cargo -= O + mecha_log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]") + return + /*if (href_list["toggle_port_connection"]) if(internal_tank.connected_port) if(internal_tank.disconnect()) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 1531a06d28e..55256ad40ed 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -10,8 +10,6 @@ max_weapons_equip = 2 max_misc_equip = 2 wreckage = /obj/structure/mecha_wreckage/ripley - var/list/cargo = new - var/cargo_capacity = 15 var/hides = 0 /obj/mecha/working/ripley/go_out() @@ -26,12 +24,6 @@ . = ..() AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list("melee" = 10, "bullet" = 5, "laser" = 5)) */ -/obj/mecha/working/ripley/Destroy() - for(var/atom/movable/A in cargo) - A.forceMove(drop_location()) - step_rand(A) - cargo.Cut() - return ..() /obj/mecha/working/ripley/firefighter desc = "Autonomous Power Loader Unit. This model is refitted with additional thermal protection." @@ -150,50 +142,3 @@ var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new scanner.attach(src) - -/obj/mecha/working/ripley/Exit(atom/movable/O) - if(O in cargo) - return 0 - return ..() - -/obj/mecha/working/ripley/Topic(href, href_list) - ..() - if(href_list["drop_from_cargo"]) - var/obj/O = locate(href_list["drop_from_cargo"]) - if(O && (O in cargo)) - occupant_message(span_notice("You unload [O].")) - O.forceMove(drop_location()) - cargo -= O - mecha_log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]") - return - -/obj/mecha/working/ripley/contents_explosion(severity, target) - for(var/X in cargo) - var/obj/O = X - if(prob(30/severity)) - cargo -= O - O.forceMove(drop_location()) - . = ..() - -/obj/mecha/working/ripley/get_stats_part() - var/output = ..() - output += "Cargo Compartment Contents:
" - if(cargo.len) - for(var/obj/O in cargo) - output += "Unload : [O]
" - else - output += "Nothing" - output += "
" - return output - -/obj/mecha/working/ripley/relay_container_resist(mob/living/user, obj/O) - to_chat(user, span_notice("You lean on the back of [O] and start pushing so it falls out of [src].")) - if(do_after(user, 300, target = O)) - if(!user || user.stat != CONSCIOUS || user.loc != src || O.loc != src ) - return - to_chat(user, span_notice("You successfully pushed [O] out of [src]!")) - O.forceMove(drop_location()) - cargo -= O - else - if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. - to_chat(user, span_warning("You fail to push [O] out of [src]!")) diff --git a/hailmary.dme b/hailmary.dme index 97aa9e39944..d1a589ff41d 100644 --- a/hailmary.dme +++ b/hailmary.dme @@ -583,6 +583,7 @@ #include "code\datums\components\storage\concrete\rped.dm" #include "code\datums\components\storage\concrete\special.dm" #include "code\datums\components\storage\concrete\stack.dm" +#include "code\datums\components\storage\concrete\trunk.dm" #include "code\datums\diseases\_disease.dm" #include "code\datums\diseases\_MobProcs.dm" #include "code\datums\diseases\anxiety.dm" @@ -1002,6 +1003,8 @@ #include "code\game\mecha\equipment\tools\mining_tools.dm" #include "code\game\mecha\equipment\tools\other_tools.dm" #include "code\game\mecha\equipment\tools\work_tools.dm" +#include "code\game\mecha\equipment\tools\fallout\jukebox.dm" +#include "code\game\mecha\equipment\tools\fallout\utility_modules.dm" #include "code\game\mecha\equipment\tools\fallout\vision_modules.dm" #include "code\game\mecha\equipment\weapons\mecha_ammo.dm" #include "code\game\mecha\equipment\weapons\weapons.dm" diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi index 3d246cb2cc1efe7a6b849348c0d13d81173d7fe6..3ec0225ef0ae31432a63ff136814df7d017c1ba8 100644 GIT binary patch delta 5393 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 From bd551e78f6ababb5c783e0177e26b96b489b4f3d Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Tue, 1 Oct 2024 10:07:38 +1300 Subject: [PATCH 29/68] Revert "armor utility" This reverts commit de9d7dfdeebb734e8ebf1a0e063d38a3d7fe13d4. --- .../components/storage/concrete/trunk.dm | 43 ---- .../mecha/equipment/tools/fallout/jukebox.dm | 214 ---------------- .../tools/fallout/utility_modules.dm | 240 ------------------ .../game/mecha/equipment/tools/other_tools.dm | 4 +- mecha_equipment.dmi | Bin 24630 -> 0 bytes 5 files changed, 2 insertions(+), 499 deletions(-) delete mode 100644 code/datums/components/storage/concrete/trunk.dm delete mode 100644 code/game/mecha/equipment/tools/fallout/jukebox.dm delete mode 100644 code/game/mecha/equipment/tools/fallout/utility_modules.dm delete mode 100644 mecha_equipment.dmi diff --git a/code/datums/components/storage/concrete/trunk.dm b/code/datums/components/storage/concrete/trunk.dm deleted file mode 100644 index babc0ea4553..00000000000 --- a/code/datums/components/storage/concrete/trunk.dm +++ /dev/null @@ -1,43 +0,0 @@ -/datum/component/storage/concrete/trunk - var/dumping_sound = 'sound/mecha/neostep1.ogg' - - -/datum/component/storage/concrete/trunk/mousedrop_onto() - var/obj/item/mecha_parts/mecha_equipment/trunk/P = parent - if(!P.chassis) - P.visible_message("The [P] is not installed!.", "someone tried to open you!.") - return - . = ..() - -/datum/component/storage/concrete/trunk/dump_content_at(atom/dest_object, mob/M) - var/obj/item/mecha_parts/mecha_equipment/trunk/P = parent - var/obj/mecha/A = P.chassis - if(!A) - P.visible_message("The [P] is not installed!.", "someone tried to open you!.") - return - var/atom/dump_destination = dest_object.get_dumping_location() - if(A.Adjacent(M) && dump_destination && M.Adjacent(dump_destination)) - if(check_locked(null, M, TRUE)) - return FALSE - if(dump_destination.storage_contents_dump_act(src, M)) - playsound(A, "rustle", 50, 1, -5) - A.do_squish(0.8, 1.2) - return TRUE - return FALSE - -/datum/component/storage/concrete/trunk/signal_take_type(datum/source, type, atom/destination, amount = INFINITY, check_adjacent = FALSE, force = FALSE, mob/user, list/inserted) - if(!force) - if(check_adjacent) - if(!user || !user.can_reach(destination) || !user.can_reach(parent)) - return FALSE - var/list/taking = typecache_filter_list(contents(), typecacheof(type)) - if(taking.len > amount) - taking.len = amount - if(inserted) //duplicated code for performance, don't bother checking retval/checking for list every item. - for(var/i in taking) - if(remove_from_storage(i, destination)) - inserted |= i - else - for(var/i in taking) - remove_from_storage(i, destination) - return TRUE \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/fallout/jukebox.dm b/code/game/mecha/equipment/tools/fallout/jukebox.dm deleted file mode 100644 index 04e213db6e0..00000000000 --- a/code/game/mecha/equipment/tools/fallout/jukebox.dm +++ /dev/null @@ -1,214 +0,0 @@ -/obj/item/mecha_parts/mecha_equipment/stereo - name = "exosuit Stereo System" - desc = "a stereo system hooked up a jukebox, modified for easy transport." - icon_state = "mecha_stereo" - range = MELEE - var/active = FALSE - var/list/rangers = list() - var/stop = 0 - var/volume = 70 - var/datum/track/selection = null - var/open_tray = TRUE - var/list/obj/item/record_disk/record_disks = list() - var/obj/item/record_disk/selected_disk = null - -/obj/item/mecha_parts/mecha_equipment/stereo/attach(obj/mecha/M) - . = ..() - bypass_interactions = TRUE - -/obj/item/mecha_parts/mecha_equipment/stereo/detach(obj/mecha/M) - . = ..() - bypass_interactions = FALSE - -/obj/item/mecha_parts/mecha_equipment/stereo/attackby(obj/item/O, mob/user, params) - . = ..() - if(!active) - if(istype(O, /obj/item/record_disk)) //this one checks for a record disk and if the jukebox is open, it adds it to the machine - if(open_tray == FALSE) - to_chat(usr, "The Disk Tray is not open!") - return - var/obj/item/record_disk/I = O - if(!I.R.song_associated_id) - to_chat(user, span_warning("This record is empty!")) - return - for(var/datum/track/RT in SSjukeboxes.songs) - if(I.R.song_associated_id == RT.song_associated_id) - to_chat(user, span_warning("this track is already added to the jukebox!")) - return - record_disks += I - O.forceMove(src) - playsound(src, 'sound/effects/plastic_click.ogg', 100, 0) - if(I.R.song_path) - SSjukeboxes.add_song(I.R) - return - -/obj/item/mecha_parts/mecha_equipment/stereo/proc/eject_record(obj/item/record_disk/M) //BIG IRON EDIT -start- ejects a record as defined and removes it's song from the list - if(!M) - visible_message("no disk to eject") - return - playsound(src, 'sound/effects/disk_tray.ogg', 100, 0) - src.visible_message(" ejected the [selected_disk] from the [src]!") - M.forceMove(get_turf(src)) - SSjukeboxes.remove_song(M.R) - record_disks -= M - selected_disk = null - -/obj/item/mecha_parts/mecha_equipment/stereo/ui_status(mob/user) - if(!SSjukeboxes.songs.len && !isobserver(user)) - to_chat(user,"Error: No music tracks have been authorized for your station. Petition Central Command to resolve this issue.") - playsound(src, 'sound/misc/compiler-failure.ogg', 25, TRUE) - return UI_CLOSE - return ..() - -/obj/item/mecha_parts/mecha_equipment/stereo/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Jukebox", name) - ui.open() - -/obj/item/mecha_parts/mecha_equipment/stereo/ui_data(mob/user) - var/list/data = list() - data["active"] = active - data["songs"] = list() - for(var/datum/track/S in SSjukeboxes.songs) - var/list/track_data = list( - name = S.song_name - ) - data["songs"] += list(track_data) - data["track_selected"] = null - data["track_length"] = null - data["track_beat"] = null - data["disks"] = list() - for(var/obj/item/record_disk/RD in record_disks) - var/list/tracks_data = list( - name = RD.name - ) - data["disks"] += list(tracks_data) - data["disk_selected"] = null //BIG IRON EDIT- start more tracks data - data["disk_selected_lenght"] = null - data["disk_beat"] = null //BIG IRON EDIT -end - if(selection) - data["track_selected"] = selection.song_name - data["track_length"] = DisplayTimeText(selection.song_length) - data["track_beat"] = selection.song_beat - if(selected_disk) - data["disk_selected"] = selected_disk - data["disk_selected_length"] = DisplayTimeText(selected_disk.R.song_length) - data["disk_selected_beat"] = selected_disk.R.song_beat - data["volume"] = volume - return data - -/obj/item/mecha_parts/mecha_equipment/stereo/ui_act(action, list/params) - . = ..() - if(.) - return - - switch(action) - if("toggle") - if(QDELETED(src)) - return - if(!active) - if(stop > world.time) - to_chat(usr, "Error: The device is still resetting from the last activation, it will be ready again in [DisplayTimeText(stop-world.time)].") - playsound(src, 'sound/misc/compiler-failure.ogg', 50, TRUE) - return - activate_music() - START_PROCESSING(SSobj, src) - return TRUE - else - stop = 0 - return TRUE - if("select_track") - if(active) - to_chat(usr, "Error: You cannot change the song until the current one is over.") - return - var/list/available = list() - for(var/datum/track/S in SSjukeboxes.songs) - available[S.song_name] = S - var/selected = params["track"] - if(QDELETED(src) || !selected || !istype(available[selected], /datum/track)) - return - selection = available[selected] - return TRUE - if("select_record") - if(!record_disks.len) - to_chat(usr, "Error: no tracks on the bin!.") - return - var/list/obj/item/record_disk/availabledisks = list() - for(var/obj/item/record_disk/RR in record_disks) - availabledisks[RR.name] = RR - var/selecteddisk = params["record"] - if(QDELETED(src) || !selecteddisk) - return - selected_disk = availabledisks[selecteddisk] - updateUsrDialog() - if("eject_disk") // sanity check for the disk ejection - if(!record_disks.len) - to_chat(usr, "Error: no disks in trays.") - return - if(!selected_disk) - to_chat(usr,"Error: no disk chosen." ) - return - if(selection == selected_disk.R) - selection = null - eject_record(selected_disk) - return TRUE - if("set_volume") - var/new_volume = params["volume"] - if(new_volume == "reset") - volume = initial(volume) - return TRUE - else if(new_volume == "min") - volume = 0 - return TRUE - else if(new_volume == "max") - volume = 100 - return TRUE - else if(text2num(new_volume) != null) - volume = text2num(new_volume) - return TRUE - -/obj/item/mecha_parts/mecha_equipment/stereo/proc/activate_music() - if(!selection) - visible_message("Track is no longer avaible") - return - var/jukeboxslottotake = SSjukeboxes.addjukebox(src, selection, 2) - if(jukeboxslottotake) - active = TRUE - update_icon() - START_PROCESSING(SSobj, src) - stop = world.time + selection.song_length - return TRUE - else - return FALSE - -/obj/item/mecha_parts/mecha_equipment/stereo/get_equip_info() - var/output = ..() - if(output) - var/temp = "" - temp = "Dashboard" - return "[output] [temp]" - return - -/obj/item/mecha_parts/mecha_equipment/stereo/Topic(href,href_list) - ..() - if(href_list["dashboard"]) - var/mob/user = chassis.occupant - ui_interact(user) - return - -/obj/item/mecha_parts/mecha_equipment/stereo/process() - if(active && world.time >= stop) - active = FALSE - dance_over() - playsound(src,'sound/machines/terminal_off.ogg',50,1) - update_icon() - stop = world.time + 100 - -/obj/item/mecha_parts/mecha_equipment/stereo/proc/dance_over() - var/position = SSjukeboxes.findjukeboxindex(src) - if(!position) - return - SSjukeboxes.removejukebox(position) - STOP_PROCESSING(SSobj, src) - rangers = list() diff --git a/code/game/mecha/equipment/tools/fallout/utility_modules.dm b/code/game/mecha/equipment/tools/fallout/utility_modules.dm deleted file mode 100644 index b039b0dffea..00000000000 --- a/code/game/mecha/equipment/tools/fallout/utility_modules.dm +++ /dev/null @@ -1,240 +0,0 @@ -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13 - name = "crane hook" - desc = "The hooking system of a vehicle-mounted crane, capable of hoisting multiple heavy items with ease." - icon_state = "vehicle_crane" - equip_cooldown = 15 - energy_drain = 10 - tool_behaviour = null - attack_sentence = "You hear hydraulics." - attack_verbs = "lashes" - detachable = FALSE - -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/can_attach(obj/mecha/M as obj) - if(..()) - if (!M.cargo_capacity) - return 0 - return 1 - -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/vehicle_straps - name = "tray securing kit" - desc = "An assortment of cables and straps to secure heavy items on the back of a ute's tray." - icon_state = "vehicle_straps" - equip_cooldown = 30 - energy_drain = 0 - tool_behaviour = null - dam_force = 0 - -/obj/item/mecha_parts/mecha_equipment/trunk - name = "Modular Trunk" - desc = "Equipment made to hold and transport big ammounts of cargo." - icon_state = "car_trunk" - equip_cooldown = 15 - energy_drain = 0 - harmful = FALSE - mech_flags = EXOSUIT_MODULE_PHAZON - var/component_type = /datum/component/storage/concrete/trunk - var/in_use = FALSE - w_class = WEIGHT_CLASS_GIGANTIC - resistance_flags = NONE - max_integrity = 1000 - var/datum/component/storage/concrete/trunk/storagespace - -/obj/item/mecha_parts/mecha_equipment/trunk/get_dumping_location(/obj/item/mecha_parts/mecha_equipment/trunk/source,mob/user) - return src - -/obj/item/mecha_parts/mecha_equipment/trunk/Initialize() - . = ..() - PopulateContents() - -/obj/item/mecha_parts/mecha_equipment/trunk/Destroy() - for(var/atom/movable/A in contents) - A.forceMove(drop_location()) - step_rand(A) - return ..() - -/obj/item/mecha_parts/mecha_equipment/trunk/ComponentInitialize() - AddComponent(component_type) - var/datum/component/storage/STR = GetComponent(/datum/component/storage) - //STR.storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT - STR.max_combined_w_class = 2100 - STR.max_w_class = WEIGHT_CLASS_GIGANTIC - STR.max_items = 2100 - storagespace = STR - - -/obj/item/mecha_parts/mecha_equipment/trunk/AllowDrop() - return !QDELETED(src) - -/obj/item/mecha_parts/mecha_equipment/trunk/contents_explosion(severity, target) - var/in_storage = istype(loc, /obj/item/storage)? (max(0, severity - 1)) : (severity) - for(var/atom/A in contents) - A.ex_act(in_storage, target) - CHECK_TICK - -//Cyberboss says: "USE THIS TO FILL IT, NOT INITIALIZE OR NEW" - -/obj/item/mecha_parts/mecha_equipment/trunk/proc/PopulateContents() - -/obj/item/mecha_parts/mecha_equipment/trunk/attach() - . = ..() - chassis.mouse_drag_pointer = MOUSE_ACTIVE_POINTER - storagespace.RegisterSignal(chassis, COMSIG_MOUSEDROP_ONTO, /datum/component/storage/concrete/trunk.proc/mousedrop_onto) - storagespace.RegisterSignal(chassis, COMSIG_CONTAINS_STORAGE, /datum/component/storage/concrete/trunk.proc/on_check) - storagespace.RegisterSignal(chassis, COMSIG_IS_STORAGE_LOCKED, /datum/component/storage/concrete/trunk.proc/check_locked) - storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_SHOW, /datum/component/storage/concrete/trunk.proc/signal_show_attempt) - storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_INSERT, /datum/component/storage/concrete/trunk.proc/signal_insertion_attempt) - storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_CAN_INSERT, /datum/component/storage/concrete/trunk.proc/signal_can_insert) - storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_TAKE_TYPE, /datum/component/storage/concrete/trunk.proc/signal_take_type) - storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_FILL_TYPE, /datum/component/storage/concrete/trunk.proc/signal_fill_type) - storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_SET_LOCKSTATE, /datum/component/storage/concrete/trunk.proc/set_locked) - storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_TAKE, /datum/component/storage/concrete/trunk.proc/signal_take_obj) - storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_QUICK_EMPTY, /datum/component/storage/concrete/trunk.proc/signal_quick_empty) - storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_HIDE_FROM, /datum/component/storage/concrete/trunk.proc/signal_hide_attempt) - storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_HIDE_ALL, /datum/component/storage/concrete/trunk.proc/close_all) - storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_RETURN_INVENTORY, /datum/component/storage/concrete/trunk.proc/signal_return_inv) - storagespace.RegisterSignal(chassis, COMSIG_PARENT_ATTACKBY, /datum/component/storage/concrete/trunk.proc/attackby) - storagespace.RegisterSignal(chassis, COMSIG_ATOM_EMP_ACT, /datum/component/storage/concrete/trunk.proc/emp_act) - storagespace.RegisterSignal(chassis, COMSIG_ATOM_ATTACK_GHOST, /datum/component/storage/concrete/trunk.proc/show_to_ghost) - storagespace.RegisterSignal(chassis, COMSIG_ATOM_ENTERED, /datum/component/storage/concrete/trunk.proc/refresh_mob_views) - storagespace.RegisterSignal(chassis, COMSIG_ATOM_EXITED, /datum/component/storage/concrete/trunk.proc/_remove_and_refresh) - storagespace.RegisterSignal(chassis, COMSIG_ITEM_PRE_ATTACK, /datum/component/storage/concrete/trunk.proc/preattack_intercept) - storagespace.RegisterSignal(chassis, COMSIG_ITEM_ATTACK_SELF, /datum/component/storage/concrete/trunk.proc/attack_self) - storagespace.RegisterSignal(chassis, COMSIG_ITEM_PICKUP, /datum/component/storage/concrete/trunk.proc/signal_on_pickup) - storagespace.RegisterSignal(chassis, COMSIG_MOVABLE_POST_THROW, /datum/component/storage/concrete/trunk.proc/close_all) - storagespace.RegisterSignal(chassis, COMSIG_MOVABLE_MOVED, /datum/component/storage/concrete/trunk.proc/check_views) - storagespace.RegisterSignal(chassis, COMSIG_CLICK_ALT, /datum/component/storage/concrete/trunk.proc/on_alt_click) - storagespace.RegisterSignal(chassis, COMSIG_MOUSEDROPPED_ONTO, /datum/component/storage/concrete/trunk.proc/mousedrop_receive) - -/obj/item/mecha_parts/mecha_equipment/trunk/detach() - storagespace.UnregisterSignal(chassis, COMSIG_MOUSEDROP_ONTO) - storagespace.UnregisterSignal(chassis, COMSIG_CONTAINS_STORAGE) - storagespace.UnregisterSignal(chassis, COMSIG_IS_STORAGE_LOCKED) - storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_SHOW) - storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_INSERT) - storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_CAN_INSERT) - storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_TAKE_TYPE) - storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_FILL_TYPE) - storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_SET_LOCKSTATE) - storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_TAKE) - storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_QUICK_EMPTY) - storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_HIDE_FROM) - storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_HIDE_ALL) - storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_RETURN_INVENTORY) - storagespace.UnregisterSignal(chassis, COMSIG_PARENT_ATTACKBY) - storagespace.UnregisterSignal(chassis, COMSIG_ATOM_EMP_ACT) - storagespace.UnregisterSignal(chassis, COMSIG_ATOM_ATTACK_GHOST) - storagespace.UnregisterSignal(chassis, COMSIG_ATOM_ENTERED) - storagespace.UnregisterSignal(chassis, COMSIG_ATOM_EXITED) - storagespace.UnregisterSignal(chassis, COMSIG_ITEM_PRE_ATTACK) - storagespace.UnregisterSignal(chassis, COMSIG_ITEM_ATTACK_SELF) - storagespace.UnregisterSignal(chassis, COMSIG_ITEM_PICKUP) - storagespace.UnregisterSignal(chassis, COMSIG_MOVABLE_POST_THROW) - storagespace.UnregisterSignal(chassis, COMSIG_MOVABLE_MOVED) - storagespace.UnregisterSignal(chassis, COMSIG_CLICK_ALT) - storagespace.UnregisterSignal(chassis, COMSIG_MOUSEDROPPED_ONTO) - chassis.mouse_drag_pointer = MOUSE_INACTIVE_POINTER - . = ..() - -//////Passenger seat - -/obj/item/mecha_parts/mecha_equipment/seat - name = "Mounted seat" - desc = "A seat. Yup, looks hi-tec eh ? Well, its just a seat" - icon = 'icons/obj/bus.dmi' - icon_state = "backseat" - energy_drain = 5 - range = MELEE - equip_cooldown = 5 - var/mob/living/carbon/patient = null - salvageable = 0 - mech_flags = EXOSUIT_MODULE_COMBAT - -/obj/item/mecha_parts/mecha_equipment/seat/Destroy() - for(var/atom/movable/AM in src) - AM.forceMove(get_turf(src)) - return ..() - -/obj/item/mecha_parts/mecha_equipment/seat/Exit(atom/movable/O) - return 0 - -/obj/item/mecha_parts/mecha_equipment/seat/action(mob/living/carbon/target) - if(!action_checks(target)) - return - if(!istype(target)) - return - if(!patient_insertion_check(target)) - return - occupant_message(span_notice("You start putting [target] into [src]...")) - chassis.visible_message(span_warning("[chassis] starts putting [target] into \the [src].")) - if(do_after_cooldown(target)) - if(!patient_insertion_check(target)) - return - target.forceMove(src) - patient = target - START_PROCESSING(SSobj, src) - update_equip_info() - occupant_message(span_notice("[target] successfully loaded into [src]. Life support functions engaged... I mean, the seatbelt.")) - chassis.visible_message(span_warning("[chassis] loads [target] into [src].")) - mecha_log_message("[target] loaded. Seatbelt engaged.") - -/obj/item/mecha_parts/mecha_equipment/seat/proc/patient_insertion_check(mob/living/carbon/target) - if(target.buckled) - occupant_message(span_warning("[target] will not fit into the seat because [target.p_theyre()] buckled to [target.buckled]!")) - return - if(target.has_buckled_mobs()) - occupant_message(span_warning("[target] will not fit into the seat because of the creatures attached to it!")) - return - if(patient) - occupant_message(span_warning("The seat is already occupied!")) - return - return 1 - -/obj/item/mecha_parts/mecha_equipment/seat/proc/go_out() - if(!patient) - return - patient.forceMove(get_turf(src)) - occupant_message("[patient] is out, removing the seatbelt.") - mecha_log_message("[patient] ejected. Seatbelt disabled.") - STOP_PROCESSING(SSobj, src) - patient = null - update_equip_info() - -/obj/item/mecha_parts/mecha_equipment/seat/detach() - if(patient) - occupant_message(span_warning("Unable to detach [src] - equipment occupied!")) - return - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/mecha_parts/mecha_equipment/seat/get_equip_info() - var/output = ..() - if(output) - var/temp = "" - if(patient) - temp = "
\[Occupant: [patient] ([patient.stat > 1 ? "*DECEASED*" : "Health: [patient.health]%"])\]
View stats|Eject" - return "[output] [temp]" - return - -/obj/item/mecha_parts/mecha_equipment/seat/Topic(href,href_list) - ..() - if(href_list["eject"]) - go_out() - return - -/obj/item/mecha_parts/mecha_equipment/seat/container_resist(mob/living/user) - go_out() - -/obj/item/mecha_parts/mecha_equipment/seat/process() - if(..()) - return - if(!chassis.has_charge(energy_drain)) - set_ready_state(1) - mecha_log_message("Deactivated.") - occupant_message("[src] deactivated - no power.") - STOP_PROCESSING(SSobj, src) - return - var/mob/living/carbon/M = patient - if(!M) - return - chassis.use_power(energy_drain) - update_equip_info() diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 3e31bc67efd..cd32856127a 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -145,7 +145,7 @@ // var/deflect_coeff = 1.15 var/damage_coeff = 0.7 selectable = 0 - equip_type = EQUIP_UTILITY + equip_type = EQUIP_MISC /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/proc/attack_react() @@ -165,7 +165,7 @@ // var/deflect_coeff = 1.15 var/damage_coeff = 0.75 selectable = 0 - equip_type = EQUIP_UTILITY + equip_type = EQUIP_MISC /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/proc/projectile_react() if(action_checks(src)) diff --git a/mecha_equipment.dmi b/mecha_equipment.dmi deleted file mode 100644 index 5b3426f33c08cc92859887a57791749442941390..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24630 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

L?t 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 K>2gWqp#K7ccfs}m From 2cf7874b6681896332bd874c6a5325981393c26b Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Tue, 1 Oct 2024 10:07:53 +1300 Subject: [PATCH 30/68] Revert "Test - dnm" This reverts commit 880b7a0781db83ca567dd2bceeaf1a554b0fb0f0. --- code/_onclick/adjacent.dm | 2 +- .../crafting/recipes/vehicle_parts.dm | 24 -- code/game/mecha/combat/phazon.dm | 1 - code/game/mecha/equipment/mecha_equipment.dm | 3 - .../game/mecha/equipment/tools/other_tools.dm | 111 +++++++++ code/game/mecha/equipment/tools/work_tools.dm | 227 +++++++++++++++++- code/game/mecha/fallout/pickuptrucks.dm | 38 +-- code/game/mecha/fallout/trucks.dm | 7 +- code/game/mecha/mecha.dm | 42 +--- code/game/mecha/mecha_defense.dm | 6 - code/game/mecha/mecha_topic.dm | 38 +-- code/game/mecha/working/ripley.dm | 55 +++++ hailmary.dme | 3 - icons/mecha/mecha_equipment.dmi | Bin 24679 -> 23798 bytes 14 files changed, 408 insertions(+), 149 deletions(-) diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index c8f50752f8a..6d19e10d109 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -79,7 +79,7 @@ /obj/item/Adjacent(atom/neighbor, atom/target, atom/movable/mover, recurse = 1) if(neighbor == loc) return 1 - if(isitem(loc) || istype(loc, /obj/mecha)) + if(isitem(loc)) if(recurse > 0) for(var/obj/item/item_loc as anything in get_locs()) if(item_loc.Adjacent(neighbor, target, mover, recurse - 1)) diff --git a/code/datums/components/crafting/recipes/vehicle_parts.dm b/code/datums/components/crafting/recipes/vehicle_parts.dm index 96cd90c9c18..4624c86e190 100644 --- a/code/datums/components/crafting/recipes/vehicle_parts.dm +++ b/code/datums/components/crafting/recipes/vehicle_parts.dm @@ -320,27 +320,3 @@ time = 180 subcategory = CAT_VEHICLES category = CAT_VEHICLEPARTS - -/datum/crafting_recipe/carpart/trunk - name = "Modular Trunk" - result = /obj/item/mecha_parts/mecha_equipment/trunk - reqs = list(/obj/item/stack/sheet/metal = 5, - /obj/item/stack/crafting/metalparts = 10, - /obj/item/stack/sheet/plastic = 5, - /obj/item/stack/rods = 2) - tools = list(TOOL_WORKBENCH) - time = 90 - subcategory = CAT_VEHICLES - category = CAT_VEHICLEPARTS - -/datum/crafting_recipe/carpart/seat - name = "Mounted Seat" - result = /obj/item/mecha_parts/mecha_equipment/seat - reqs = list(/obj/item/stack/sheet/metal = 5, - /obj/item/stack/crafting/metalparts = 10, - /obj/item/stack/sheet/leather = 5, - /obj/item/stack/rods = 5) - tools = list(TOOL_WORKBENCH) - time = 90 - subcategory = CAT_VEHICLES - category = CAT_VEHICLEPARTS diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index cc9cd39c3fa..52a1843b299 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -15,7 +15,6 @@ internal_damage_threshold = 25 force = 15 phase_state = "phazon-phase" - can_be_locked = TRUE facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.15) // experimental: weaker at the front because that's where the engine is.. diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index ae970337458..637445483f7 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -25,7 +25,6 @@ var/harmful = FALSE //Controls if equipment can be used to attack by a pacifist. //var/destroy_sound = 'sound/mecha/critdestr.ogg' var/equip_type = EQUIP_UTILITY - var/detachable = TRUE /obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page() if(chassis) @@ -154,8 +153,6 @@ /obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto=null) if(!chassis) return - if(!detachable) - return moveto = moveto || get_turf(chassis) forceMove(moveto) chassis.equipment -= src diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index cd32856127a..63d38d0aab6 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -132,6 +132,117 @@ send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) return + +//////Passenger seat + +/obj/item/mecha_parts/mecha_equipment/seat + name = "Mounted seat" + desc = "A seat. Yup, looks hi-tec eh ? Well, its just a seat" + icon = 'icons/obj/bus.dmi' + icon_state = "backseat" + energy_drain = 5 + range = MELEE + equip_cooldown = 5 + var/mob/living/carbon/patient = null + salvageable = 0 + mech_flags = EXOSUIT_MODULE_COMBAT + +/obj/item/mecha_parts/mecha_equipment/seat/Destroy() + for(var/atom/movable/AM in src) + AM.forceMove(get_turf(src)) + return ..() + +/obj/item/mecha_parts/mecha_equipment/seat/Exit(atom/movable/O) + return 0 + +/obj/item/mecha_parts/mecha_equipment/seat/action(mob/living/carbon/target) + if(!action_checks(target)) + return + if(!istype(target)) + return + if(!patient_insertion_check(target)) + return + occupant_message(span_notice("You start putting [target] into [src]...")) + chassis.visible_message(span_warning("[chassis] starts putting [target] into \the [src].")) + if(do_after_cooldown(target)) + if(!patient_insertion_check(target)) + return + target.forceMove(src) + patient = target + START_PROCESSING(SSobj, src) + update_equip_info() + occupant_message(span_notice("[target] successfully loaded into [src]. Life support functions engaged... I mean, the seatbelt.")) + chassis.visible_message(span_warning("[chassis] loads [target] into [src].")) + mecha_log_message("[target] loaded. Seatbelt engaged.") + +/obj/item/mecha_parts/mecha_equipment/seat/proc/patient_insertion_check(mob/living/carbon/target) + if(target.buckled) + occupant_message(span_warning("[target] will not fit into the seat because [target.p_theyre()] buckled to [target.buckled]!")) + return + if(target.has_buckled_mobs()) + occupant_message(span_warning("[target] will not fit into the seat because of the creatures attached to it!")) + return + if(patient) + occupant_message(span_warning("The seat is already occupied!")) + return + return 1 + +/obj/item/mecha_parts/mecha_equipment/seat/proc/go_out() + if(!patient) + return + patient.forceMove(get_turf(src)) + occupant_message("[patient] is out, removing the seatbelt.") + mecha_log_message("[patient] ejected. Seatbelt disabled.") + STOP_PROCESSING(SSobj, src) + patient = null + update_equip_info() + +/obj/item/mecha_parts/mecha_equipment/seat/detach() + if(patient) + occupant_message(span_warning("Unable to detach [src] - equipment occupied!")) + return + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/mecha_parts/mecha_equipment/seat/get_equip_info() + var/output = ..() + if(output) + var/temp = "" + if(patient) + temp = "
\[Occupant: [patient] ([patient.stat > 1 ? "*DECEASED*" : "Health: [patient.health]%"])\]
View stats|Eject" + return "[output] [temp]" + return + +/obj/item/mecha_parts/mecha_equipment/seat/Topic(href,href_list) + ..() + if(href_list["eject"]) + go_out() + return + +/obj/item/mecha_parts/mecha_equipment/seat/container_resist(mob/living/user) + go_out() + +/obj/item/mecha_parts/mecha_equipment/seat/process() + if(..()) + return + if(!chassis.has_charge(energy_drain)) + set_ready_state(1) + mecha_log_message("Deactivated.") + occupant_message("[src] deactivated - no power.") + STOP_PROCESSING(SSobj, src) + return + var/mob/living/carbon/M = patient + if(!M) + return + if(M.health > 0) + M.adjustOxyLoss(-1) + M.AdjustAllImmobility(-80) + M.AdjustUnconscious(-80) + if(M.reagents.get_reagent_amount(/datum/reagent/medicine/epinephrine) < 5) + M.reagents.add_reagent(/datum/reagent/medicine/epinephrine, 5) + chassis.use_power(energy_drain) + update_equip_info() + //////////////////////////// ARMOR BOOSTER MODULES ////////////////////////////////////////////////////////// diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 00a897c379e..61855c73e71 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -14,8 +14,6 @@ var/obj/mecha/working/ripley/cargo_holder harmful = TRUE mech_flags = EXOSUIT_MODULE_RIPLEY - var/attack_sentence = "You hear something crack." - var/attack_verbs = "squeezes" /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/mecha/working/ripley/M as obj) if(..()) @@ -73,17 +71,15 @@ var/mob/living/M = target if(M.stat == DEAD) return - if(!dam_force) - return if(chassis.occupant.a_intent == INTENT_HARM) M.take_overall_damage(dam_force) if(!M) return M.adjustOxyLoss(round(dam_force/2)) M.updatehealth() - target.visible_message(span_danger("[chassis] [attack_verb] [target]."), \ - span_userdanger("[chassis] [attack_verb] [target]."),\ - span_italic("[attack_sentence]")) + target.visible_message(span_danger("[chassis] squeezes [target]."), \ + span_userdanger("[chassis] squeezes [target]."),\ + span_italic("You hear something crack.")) log_combat(chassis.occupant, M, "attacked", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") else step_away(M,chassis) @@ -470,3 +466,220 @@ //NC.mergeConnectedNetworksOnTurf() last_piece = NC return 1 + + +/obj/item/mecha_parts/mecha_equipment/stereo + name = "exosuit Stereo System" + desc = "a stereo system hooked up a jukebox, modified for easy transport." + icon_state = "mecha_stereo" + range = MELEE + var/active = FALSE + var/list/rangers = list() + var/stop = 0 + var/volume = 70 + var/datum/track/selection = null + var/open_tray = TRUE + var/list/obj/item/record_disk/record_disks = list() + var/obj/item/record_disk/selected_disk = null + +/obj/item/mecha_parts/mecha_equipment/stereo/attach(obj/mecha/M) + . = ..() + bypass_interactions = TRUE + +/obj/item/mecha_parts/mecha_equipment/stereo/detach(obj/mecha/M) + . = ..() + bypass_interactions = FALSE + +/obj/item/mecha_parts/mecha_equipment/stereo/attackby(obj/item/O, mob/user, params) + . = ..() + if(!active) + if(istype(O, /obj/item/record_disk)) //this one checks for a record disk and if the jukebox is open, it adds it to the machine + if(open_tray == FALSE) + to_chat(usr, "The Disk Tray is not open!") + return + var/obj/item/record_disk/I = O + if(!I.R.song_associated_id) + to_chat(user, span_warning("This record is empty!")) + return + for(var/datum/track/RT in SSjukeboxes.songs) + if(I.R.song_associated_id == RT.song_associated_id) + to_chat(user, span_warning("this track is already added to the jukebox!")) + return + record_disks += I + O.forceMove(src) + playsound(src, 'sound/effects/plastic_click.ogg', 100, 0) + if(I.R.song_path) + SSjukeboxes.add_song(I.R) + return + +/obj/item/mecha_parts/mecha_equipment/stereo/proc/eject_record(obj/item/record_disk/M) //BIG IRON EDIT -start- ejects a record as defined and removes it's song from the list + if(!M) + visible_message("no disk to eject") + return + playsound(src, 'sound/effects/disk_tray.ogg', 100, 0) + src.visible_message(" ejected the [selected_disk] from the [src]!") + M.forceMove(get_turf(src)) + SSjukeboxes.remove_song(M.R) + record_disks -= M + selected_disk = null + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_status(mob/user) + if(!SSjukeboxes.songs.len && !isobserver(user)) + to_chat(user,"Error: No music tracks have been authorized for your station. Petition Central Command to resolve this issue.") + playsound(src, 'sound/misc/compiler-failure.ogg', 25, TRUE) + return UI_CLOSE + return ..() + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Jukebox", name) + ui.open() + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_data(mob/user) + var/list/data = list() + data["active"] = active + data["songs"] = list() + for(var/datum/track/S in SSjukeboxes.songs) + var/list/track_data = list( + name = S.song_name + ) + data["songs"] += list(track_data) + data["track_selected"] = null + data["track_length"] = null + data["track_beat"] = null + data["disks"] = list() + for(var/obj/item/record_disk/RD in record_disks) + var/list/tracks_data = list( + name = RD.name + ) + data["disks"] += list(tracks_data) + data["disk_selected"] = null //BIG IRON EDIT- start more tracks data + data["disk_selected_lenght"] = null + data["disk_beat"] = null //BIG IRON EDIT -end + if(selection) + data["track_selected"] = selection.song_name + data["track_length"] = DisplayTimeText(selection.song_length) + data["track_beat"] = selection.song_beat + if(selected_disk) + data["disk_selected"] = selected_disk + data["disk_selected_length"] = DisplayTimeText(selected_disk.R.song_length) + data["disk_selected_beat"] = selected_disk.R.song_beat + data["volume"] = volume + return data + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_act(action, list/params) + . = ..() + if(.) + return + + switch(action) + if("toggle") + if(QDELETED(src)) + return + if(!active) + if(stop > world.time) + to_chat(usr, "Error: The device is still resetting from the last activation, it will be ready again in [DisplayTimeText(stop-world.time)].") + playsound(src, 'sound/misc/compiler-failure.ogg', 50, TRUE) + return + activate_music() + START_PROCESSING(SSobj, src) + return TRUE + else + stop = 0 + return TRUE + if("select_track") + if(active) + to_chat(usr, "Error: You cannot change the song until the current one is over.") + return + var/list/available = list() + for(var/datum/track/S in SSjukeboxes.songs) + available[S.song_name] = S + var/selected = params["track"] + if(QDELETED(src) || !selected || !istype(available[selected], /datum/track)) + return + selection = available[selected] + return TRUE + if("select_record") + if(!record_disks.len) + to_chat(usr, "Error: no tracks on the bin!.") + return + var/list/obj/item/record_disk/availabledisks = list() + for(var/obj/item/record_disk/RR in record_disks) + availabledisks[RR.name] = RR + var/selecteddisk = params["record"] + if(QDELETED(src) || !selecteddisk) + return + selected_disk = availabledisks[selecteddisk] + updateUsrDialog() + if("eject_disk") // sanity check for the disk ejection + if(!record_disks.len) + to_chat(usr, "Error: no disks in trays.") + return + if(!selected_disk) + to_chat(usr,"Error: no disk chosen." ) + return + if(selection == selected_disk.R) + selection = null + eject_record(selected_disk) + return TRUE + if("set_volume") + var/new_volume = params["volume"] + if(new_volume == "reset") + volume = initial(volume) + return TRUE + else if(new_volume == "min") + volume = 0 + return TRUE + else if(new_volume == "max") + volume = 100 + return TRUE + else if(text2num(new_volume) != null) + volume = text2num(new_volume) + return TRUE + +/obj/item/mecha_parts/mecha_equipment/stereo/proc/activate_music() + if(!selection) + visible_message("Track is no longer avaible") + return + var/jukeboxslottotake = SSjukeboxes.addjukebox(src, selection, 2) + if(jukeboxslottotake) + active = TRUE + update_icon() + START_PROCESSING(SSobj, src) + stop = world.time + selection.song_length + return TRUE + else + return FALSE + +/obj/item/mecha_parts/mecha_equipment/stereo/get_equip_info() + var/output = ..() + if(output) + var/temp = "" + temp = "Dashboard" + return "[output] [temp]" + return + +/obj/item/mecha_parts/mecha_equipment/stereo/Topic(href,href_list) + ..() + if(href_list["dashboard"]) + var/mob/user = chassis.occupant + ui_interact(user) + return + +/obj/item/mecha_parts/mecha_equipment/stereo/process() + if(active && world.time >= stop) + active = FALSE + dance_over() + playsound(src,'sound/machines/terminal_off.ogg',50,1) + update_icon() + stop = world.time + 100 + +/obj/item/mecha_parts/mecha_equipment/stereo/proc/dance_over() + var/position = SSjukeboxes.findjukeboxindex(src) + if(!position) + return + SSjukeboxes.removejukebox(position) + STOP_PROCESSING(SSobj, src) + rangers = list() + diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index 65b7eb5e082..ce68d3c9408 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -14,19 +14,11 @@ stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy - cargo_capacity = 2 max_weapons_equip = 1 - max_utility_equip = 5 + max_utility_equip = 3 max_misc_equip = 1 - facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.25) - -/obj/mecha/combat/phazon/pickuptruck/Initialize(mapload) - . = ..() - var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/vehicle_straps/ME = new(src) - ME.attach(src) - /obj/mecha/combat/phazon/pickuptruck/go_out() ..() update_icon() @@ -59,7 +51,7 @@ ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) - //pickuptruck blue +//pickuptruck blue /obj/mecha/combat/phazon/pickuptruck/blue name = "\improper pickup truck" @@ -109,9 +101,6 @@ max_integrity = 300 armor = ARMOR_VALUE_MEDIUM wreckage = /obj/structure/mecha_wreckage/buggy - cargo_capacity = 1 - - facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.5) // There's whole ass paladin in the way.. /obj/mecha/combat/phazon/pickuptruck/bos/armed/loaded/Initialize() . = ..() @@ -125,32 +114,19 @@ //pickuptruck mechanic -/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck +/obj/mecha/combat/phazon/pickuptruck/mechanic name = "\improper mechanic pickup truck" desc = "A old vehicule, with a crane runing on fuel." icon = 'icons/mecha/pickuptruck-mechanics.dmi' icon_state = "pickuptruckmechanic" - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy step_in = 1.2 step_energy_drain = 0.6 armor = ARMOR_VALUE_MEDIUM - cargo_capacity = 5 max_weapons_equip = 1 - max_utility_equip = 5 + max_utility_equip = 4 max_misc_equip = 1 -/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/Initialize() - . = ..() - for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) - E.detach() - qdel(E) - equipment.Cut() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13 - ME.attach(src) - /obj/mecha/combat/phazon/pickuptruck/mechanic/go_out() ..() update_icon() @@ -185,7 +161,7 @@ //jeep -/obj/mecha/combat/phazon/pickuptruck/jeep +/obj/mecha/combat/phazon/jeep name = "\improper pickup truck" desc = "A old vehicule, runing on fuel." icon = 'icons/mecha/jeep.dmi' @@ -199,10 +175,9 @@ stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy - cargo_capacity = 1 max_weapons_equip = 1 - max_utility_equip = 4 + max_utility_equip = 3 max_misc_equip = 1 /obj/mecha/combat/phazon/jeep/go_out() @@ -237,7 +212,6 @@ ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) - //jeep Enclave /obj/mecha/combat/phazon/jeep/enclave diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index 9c1fa7139eb..250e0299fb3 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -7,22 +7,21 @@ icon_state = "ncrtruck" pixel_x = -22 pixel_y = -5 - max_integrity = 6000 // TEST + max_integrity = 600 step_in = 1.2 armor = ARMOR_VALUE_MEDIUM step_energy_drain = 0.6 stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/ncrtruck + var/list/cargo = new + var/cargo_capacity = 30 var/hides = 0 max_weapons_equip = 1 max_utility_equip = 8 max_misc_equip = 1 - deflect_chance = 0 - internal_damage_threshold = 99 // test - /obj/structure/mecha_wreckage/ncrtruck name = "\improper NCR Truck wreckage" desc = "Its a truck ! BROKEN TRUCK." diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index b71d073c090..110ff8c3406 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -102,9 +102,6 @@ var/list/utility_equipment = new var/list/misc_equipment = new - var/list/cargo = new - var/cargo_capacity = 0 // for now, copy attributes from ripley so don't have to remap // lazy - /// a list of all vision traits to give to the occupant. var/list/vision_modes = list() @@ -237,7 +234,7 @@ else M.forceMove(loc) if(wreckage) - if(prob(1)) + if(prob(85)) explosion(get_turf(src), 0, 1, 2, 3) var/obj/structure/mecha_wreckage/WR = new wreckage(loc, AI) for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) @@ -255,7 +252,6 @@ if(internal_tank) WR.crowbar_salvage += internal_tank internal_tank.forceMove(WR) - else for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) E.detach(loc) @@ -266,12 +262,6 @@ qdel(internal_tank) if(AI) AI.gib() //No wreck, no AI to recover - - for(var/atom/movable/A in cargo) - A.forceMove(drop_location()) - step_rand(A) - cargo.Cut() - STOP_PROCESSING(SSobj, src) GLOB.poi_list.Remove(src) equipment.Cut() @@ -1232,33 +1222,3 @@ else to_chat(user, "None of the equipment on this exosuit can use this ammo!") return FALSE - -/obj/mecha/Exit(atom/movable/O) - if(O in cargo) - return 0 - return ..() - -/obj/mecha/relay_container_resist(mob/living/user, obj/O) - to_chat(user, span_notice("You lean on the back of [O] and start pushing so it falls out of [src].")) - if(do_after(user, 300, target = O)) - if(!user || user.stat != CONSCIOUS || user.loc != src || O.loc != src ) - return - to_chat(user, span_notice("You successfully pushed [O] out of [src]!")) - O.forceMove(drop_location()) - cargo -= O - else - if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. - to_chat(user, span_warning("You fail to push [O] out of [src]!")) -/* -/obj/mecha/Topic(href, href_list) - ..() - if(href_list["drop_from_cargo"]) - var/obj/cargoobj = locate(href_list["drop_from_cargo"]) in cargo - if(cargoobj) - to_chat(occupants, "[icon2html(src, occupants)]You unload [cargoobj].") - cargoobj.forceMove(drop_location()) - LAZYREMOVE(cargo, cargoobj) - if(cargoobj == box) - box = null - log_message("Unloaded [cargoobj]. Cargo compartment capacity: [cargo_capacity - LAZYLEN(cargo)]", LOG_MECHA) -*/ \ No newline at end of file diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 29184803494..c7f31906c0d 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -127,12 +127,6 @@ for(var/Y in trackers) var/obj/item/mecha_parts/mecha_tracking/MT = Y MT.ex_act(severity, target) - for(var/Z in cargo) - var/obj/O = Z - if(prob(30/severity)) - cargo -= O - O.forceMove(drop_location()) - . = ..() if(occupant) occupant.ex_act(severity,target) diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 11492832549..3f5537ad7e0 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -91,14 +91,6 @@ [phasing_action.owner ? "Phase Modulator: [phasing ? "Enabled" : "Disabled"]
" : ""] "} - if(cargo_capacity) - . += "Cargo Compartment Contents:

" - if(cargo.len) - for(var/obj/O in cargo) - . += "Unload : [O]
" - else - . += "Nothing" - . += "
" /obj/mecha/proc/get_commands() . = {"
@@ -130,31 +122,32 @@ /obj/mecha/proc/get_equipment_menu() //outputs mecha html equipment menu - . = "" + var/output if(equipment.len) - . += {"
+ output += {"
Equipment
"} - return . + return output /obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html if(!equipment.len) return - . = "Equipment:
" + var/output = "Equipment:
" for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) - . += "
[MT.get_equip_info()]
" - . += "
" + output += "
[MT.get_equip_info()]
" + output += "
" + return output @@ -322,15 +315,6 @@ maint_access = !maint_access send_byjax(usr,"exosuit.browser","t_maint_access","[maint_access?"Forbid":"Permit"] maintenance protocols") - if(href_list["drop_from_cargo"]) - var/obj/O = locate(href_list["drop_from_cargo"]) - if(O && (O in cargo)) - occupant_message(span_notice("You unload [O].")) - O.forceMove(drop_location()) - cargo -= O - mecha_log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]") - return - /*if (href_list["toggle_port_connection"]) if(internal_tank.connected_port) if(internal_tank.disconnect()) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 55256ad40ed..1531a06d28e 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -10,6 +10,8 @@ max_weapons_equip = 2 max_misc_equip = 2 wreckage = /obj/structure/mecha_wreckage/ripley + var/list/cargo = new + var/cargo_capacity = 15 var/hides = 0 /obj/mecha/working/ripley/go_out() @@ -24,6 +26,12 @@ . = ..() AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list("melee" = 10, "bullet" = 5, "laser" = 5)) */ +/obj/mecha/working/ripley/Destroy() + for(var/atom/movable/A in cargo) + A.forceMove(drop_location()) + step_rand(A) + cargo.Cut() + return ..() /obj/mecha/working/ripley/firefighter desc = "Autonomous Power Loader Unit. This model is refitted with additional thermal protection." @@ -142,3 +150,50 @@ var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new scanner.attach(src) + +/obj/mecha/working/ripley/Exit(atom/movable/O) + if(O in cargo) + return 0 + return ..() + +/obj/mecha/working/ripley/Topic(href, href_list) + ..() + if(href_list["drop_from_cargo"]) + var/obj/O = locate(href_list["drop_from_cargo"]) + if(O && (O in cargo)) + occupant_message(span_notice("You unload [O].")) + O.forceMove(drop_location()) + cargo -= O + mecha_log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]") + return + +/obj/mecha/working/ripley/contents_explosion(severity, target) + for(var/X in cargo) + var/obj/O = X + if(prob(30/severity)) + cargo -= O + O.forceMove(drop_location()) + . = ..() + +/obj/mecha/working/ripley/get_stats_part() + var/output = ..() + output += "Cargo Compartment Contents:
" + if(cargo.len) + for(var/obj/O in cargo) + output += "Unload : [O]
" + else + output += "Nothing" + output += "
" + return output + +/obj/mecha/working/ripley/relay_container_resist(mob/living/user, obj/O) + to_chat(user, span_notice("You lean on the back of [O] and start pushing so it falls out of [src].")) + if(do_after(user, 300, target = O)) + if(!user || user.stat != CONSCIOUS || user.loc != src || O.loc != src ) + return + to_chat(user, span_notice("You successfully pushed [O] out of [src]!")) + O.forceMove(drop_location()) + cargo -= O + else + if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. + to_chat(user, span_warning("You fail to push [O] out of [src]!")) diff --git a/hailmary.dme b/hailmary.dme index d1a589ff41d..97aa9e39944 100644 --- a/hailmary.dme +++ b/hailmary.dme @@ -583,7 +583,6 @@ #include "code\datums\components\storage\concrete\rped.dm" #include "code\datums\components\storage\concrete\special.dm" #include "code\datums\components\storage\concrete\stack.dm" -#include "code\datums\components\storage\concrete\trunk.dm" #include "code\datums\diseases\_disease.dm" #include "code\datums\diseases\_MobProcs.dm" #include "code\datums\diseases\anxiety.dm" @@ -1003,8 +1002,6 @@ #include "code\game\mecha\equipment\tools\mining_tools.dm" #include "code\game\mecha\equipment\tools\other_tools.dm" #include "code\game\mecha\equipment\tools\work_tools.dm" -#include "code\game\mecha\equipment\tools\fallout\jukebox.dm" -#include "code\game\mecha\equipment\tools\fallout\utility_modules.dm" #include "code\game\mecha\equipment\tools\fallout\vision_modules.dm" #include "code\game\mecha\equipment\weapons\mecha_ammo.dm" #include "code\game\mecha\equipment\weapons\weapons.dm" diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi index 3ec0225ef0ae31432a63ff136814df7d017c1ba8..3d246cb2cc1efe7a6b849348c0d13d81173d7fe6 100644 GIT binary patch delta 4510 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 delta 5393 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 Date: Tue, 1 Oct 2024 10:13:12 +1300 Subject: [PATCH 31/68] Armor change --- code/game/mecha/equipment/tools/other_tools.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 63d38d0aab6..cca5cd4004b 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -256,7 +256,7 @@ // var/deflect_coeff = 1.15 var/damage_coeff = 0.7 selectable = 0 - equip_type = EQUIP_MISC + equip_type = EQUIP_UTILIY /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/proc/attack_react() @@ -276,7 +276,7 @@ // var/deflect_coeff = 1.15 var/damage_coeff = 0.75 selectable = 0 - equip_type = EQUIP_MISC + equip_type = EQUIP_UTILIY /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/proc/projectile_react() if(action_checks(src)) From 0fd6891880dcc43eb2c73ec3134245347f26438d Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Tue, 1 Oct 2024 10:17:04 +1300 Subject: [PATCH 32/68] typo --- code/game/mecha/equipment/tools/other_tools.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index cca5cd4004b..4a7426cb35f 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -256,7 +256,7 @@ // var/deflect_coeff = 1.15 var/damage_coeff = 0.7 selectable = 0 - equip_type = EQUIP_UTILIY + equip_type = EQUIP_UTILITY /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/proc/attack_react() @@ -276,7 +276,7 @@ // var/deflect_coeff = 1.15 var/damage_coeff = 0.75 selectable = 0 - equip_type = EQUIP_UTILIY + equip_type = EQUIP_UTILITY /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/proc/projectile_react() if(action_checks(src)) From 563f7656d678964a20548366cc49ca2001c86caa Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Tue, 1 Oct 2024 22:16:16 +1300 Subject: [PATCH 33/68] V10 - More bombshell mech changes :D lots of stuff --- code/_onclick/adjacent.dm | 2 +- .../crafting/recipes/vehicle_parts.dm | 28 +- .../components/storage/concrete/trunk.dm | 43 +++ code/game/mecha/combat/marauder.dm | 6 +- code/game/mecha/combat/phazon.dm | 1 + code/game/mecha/equipment/mecha_equipment.dm | 4 + .../mecha/equipment/tools/fallout/jukebox.dm | 214 +++++++++++++++ .../tools/fallout/utility_modules.dm | 244 ++++++++++++++++++ .../game/mecha/equipment/tools/other_tools.dm | 171 +++--------- code/game/mecha/equipment/tools/work_tools.dm | 227 +--------------- code/game/mecha/fallout/buggies.dm | 1 + code/game/mecha/fallout/carriages.dm | 2 +- code/game/mecha/fallout/cars.dm | 2 +- code/game/mecha/fallout/pickuptrucks.dm | 40 ++- code/game/mecha/fallout/trucks.dm | 7 +- code/game/mecha/mecha.dm | 35 ++- code/game/mecha/mecha_defense.dm | 34 +-- code/game/mecha/mecha_topic.dm | 65 +++-- code/game/mecha/working/ripley.dm | 55 ---- code/modules/jobs/job_types/ncr.dm | 2 +- .../modules/research/designs/mecha_designs.dm | 4 +- hailmary.dme | 3 + icons/mecha/mecha_equipment.dmi | Bin 23798 -> 24679 bytes mecha_equipment.dmi | Bin 0 -> 24630 bytes 24 files changed, 700 insertions(+), 490 deletions(-) create mode 100644 code/datums/components/storage/concrete/trunk.dm create mode 100644 code/game/mecha/equipment/tools/fallout/jukebox.dm create mode 100644 code/game/mecha/equipment/tools/fallout/utility_modules.dm create mode 100644 mecha_equipment.dmi diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index 6d19e10d109..c8f50752f8a 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -79,7 +79,7 @@ /obj/item/Adjacent(atom/neighbor, atom/target, atom/movable/mover, recurse = 1) if(neighbor == loc) return 1 - if(isitem(loc)) + if(isitem(loc) || istype(loc, /obj/mecha)) if(recurse > 0) for(var/obj/item/item_loc as anything in get_locs()) if(item_loc.Adjacent(neighbor, target, mover, recurse - 1)) diff --git a/code/datums/components/crafting/recipes/vehicle_parts.dm b/code/datums/components/crafting/recipes/vehicle_parts.dm index 4624c86e190..28a16a978c6 100644 --- a/code/datums/components/crafting/recipes/vehicle_parts.dm +++ b/code/datums/components/crafting/recipes/vehicle_parts.dm @@ -270,7 +270,7 @@ /datum/crafting_recipe/vehiculearmor name = "Armor booster module (Close Combat Weaponry)" - result = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster + result = /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster reqs = list(/obj/item/stack/sheet/prewar = 10, /obj/item/stack/crafting/metalparts = 10, /obj/item/advanced_crafting_components/alloys = 2, @@ -282,7 +282,7 @@ /datum/crafting_recipe/vehiculearmor/distance name = "Armor booster module (Ranged Weaponry)" - result = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster + result = /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster reqs = list(/obj/item/stack/sheet/prewar = 10, /obj/item/stack/crafting/metalparts = 10, /obj/item/advanced_crafting_components/alloys = 2, @@ -320,3 +320,27 @@ time = 180 subcategory = CAT_VEHICLES category = CAT_VEHICLEPARTS + +/datum/crafting_recipe/carpart/trunk + name = "Modular Trunk" + result = /obj/item/mecha_parts/mecha_equipment/trunk + reqs = list(/obj/item/stack/sheet/metal = 5, + /obj/item/stack/crafting/metalparts = 10, + /obj/item/stack/sheet/plastic = 5, + /obj/item/stack/rods = 2) + tools = list(TOOL_WORKBENCH) + time = 90 + subcategory = CAT_VEHICLES + category = CAT_VEHICLEPARTS + +/datum/crafting_recipe/carpart/seat + name = "Mounted Seat" + result = /obj/item/mecha_parts/mecha_equipment/seat + reqs = list(/obj/item/stack/sheet/metal = 5, + /obj/item/stack/crafting/metalparts = 10, + /obj/item/stack/sheet/leather = 5, + /obj/item/stack/rods = 5) + tools = list(TOOL_WORKBENCH) + time = 90 + subcategory = CAT_VEHICLES + category = CAT_VEHICLEPARTS diff --git a/code/datums/components/storage/concrete/trunk.dm b/code/datums/components/storage/concrete/trunk.dm new file mode 100644 index 00000000000..babc0ea4553 --- /dev/null +++ b/code/datums/components/storage/concrete/trunk.dm @@ -0,0 +1,43 @@ +/datum/component/storage/concrete/trunk + var/dumping_sound = 'sound/mecha/neostep1.ogg' + + +/datum/component/storage/concrete/trunk/mousedrop_onto() + var/obj/item/mecha_parts/mecha_equipment/trunk/P = parent + if(!P.chassis) + P.visible_message("The [P] is not installed!.", "someone tried to open you!.") + return + . = ..() + +/datum/component/storage/concrete/trunk/dump_content_at(atom/dest_object, mob/M) + var/obj/item/mecha_parts/mecha_equipment/trunk/P = parent + var/obj/mecha/A = P.chassis + if(!A) + P.visible_message("The [P] is not installed!.", "someone tried to open you!.") + return + var/atom/dump_destination = dest_object.get_dumping_location() + if(A.Adjacent(M) && dump_destination && M.Adjacent(dump_destination)) + if(check_locked(null, M, TRUE)) + return FALSE + if(dump_destination.storage_contents_dump_act(src, M)) + playsound(A, "rustle", 50, 1, -5) + A.do_squish(0.8, 1.2) + return TRUE + return FALSE + +/datum/component/storage/concrete/trunk/signal_take_type(datum/source, type, atom/destination, amount = INFINITY, check_adjacent = FALSE, force = FALSE, mob/user, list/inserted) + if(!force) + if(check_adjacent) + if(!user || !user.can_reach(destination) || !user.can_reach(parent)) + return FALSE + var/list/taking = typecache_filter_list(contents(), typecacheof(type)) + if(taking.len > amount) + taking.len = amount + if(inserted) //duplicated code for performance, don't bother checking retval/checking for list every item. + for(var/i in taking) + if(remove_from_storage(i, destination)) + inserted |= i + else + for(var/i in taking) + remove_from_storage(i, destination) + return TRUE \ No newline at end of file diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index d88ec6ffb00..0ec6bd394c3 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -37,7 +37,7 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) + ME = new /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster(src) ME.attach(src) max_ammo() @@ -68,7 +68,7 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) + ME = new /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster(src) ME.attach(src) max_ammo() @@ -93,7 +93,7 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) + ME = new /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster(src) ME.attach(src) max_ammo() diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 52a1843b299..cc9cd39c3fa 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -15,6 +15,7 @@ internal_damage_threshold = 25 force = 15 phase_state = "phazon-phase" + can_be_locked = TRUE facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.15) // experimental: weaker at the front because that's where the engine is.. diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 637445483f7..c61a96d5878 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -25,6 +25,8 @@ var/harmful = FALSE //Controls if equipment can be used to attack by a pacifist. //var/destroy_sound = 'sound/mecha/critdestr.ogg' var/equip_type = EQUIP_UTILITY + var/detachable = TRUE + var/passive_power_drain = 0 /obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page() if(chassis) @@ -153,6 +155,8 @@ /obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto=null) if(!chassis) return + if(!detachable) + return moveto = moveto || get_turf(chassis) forceMove(moveto) chassis.equipment -= src diff --git a/code/game/mecha/equipment/tools/fallout/jukebox.dm b/code/game/mecha/equipment/tools/fallout/jukebox.dm new file mode 100644 index 00000000000..04e213db6e0 --- /dev/null +++ b/code/game/mecha/equipment/tools/fallout/jukebox.dm @@ -0,0 +1,214 @@ +/obj/item/mecha_parts/mecha_equipment/stereo + name = "exosuit Stereo System" + desc = "a stereo system hooked up a jukebox, modified for easy transport." + icon_state = "mecha_stereo" + range = MELEE + var/active = FALSE + var/list/rangers = list() + var/stop = 0 + var/volume = 70 + var/datum/track/selection = null + var/open_tray = TRUE + var/list/obj/item/record_disk/record_disks = list() + var/obj/item/record_disk/selected_disk = null + +/obj/item/mecha_parts/mecha_equipment/stereo/attach(obj/mecha/M) + . = ..() + bypass_interactions = TRUE + +/obj/item/mecha_parts/mecha_equipment/stereo/detach(obj/mecha/M) + . = ..() + bypass_interactions = FALSE + +/obj/item/mecha_parts/mecha_equipment/stereo/attackby(obj/item/O, mob/user, params) + . = ..() + if(!active) + if(istype(O, /obj/item/record_disk)) //this one checks for a record disk and if the jukebox is open, it adds it to the machine + if(open_tray == FALSE) + to_chat(usr, "The Disk Tray is not open!") + return + var/obj/item/record_disk/I = O + if(!I.R.song_associated_id) + to_chat(user, span_warning("This record is empty!")) + return + for(var/datum/track/RT in SSjukeboxes.songs) + if(I.R.song_associated_id == RT.song_associated_id) + to_chat(user, span_warning("this track is already added to the jukebox!")) + return + record_disks += I + O.forceMove(src) + playsound(src, 'sound/effects/plastic_click.ogg', 100, 0) + if(I.R.song_path) + SSjukeboxes.add_song(I.R) + return + +/obj/item/mecha_parts/mecha_equipment/stereo/proc/eject_record(obj/item/record_disk/M) //BIG IRON EDIT -start- ejects a record as defined and removes it's song from the list + if(!M) + visible_message("no disk to eject") + return + playsound(src, 'sound/effects/disk_tray.ogg', 100, 0) + src.visible_message(" ejected the [selected_disk] from the [src]!") + M.forceMove(get_turf(src)) + SSjukeboxes.remove_song(M.R) + record_disks -= M + selected_disk = null + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_status(mob/user) + if(!SSjukeboxes.songs.len && !isobserver(user)) + to_chat(user,"Error: No music tracks have been authorized for your station. Petition Central Command to resolve this issue.") + playsound(src, 'sound/misc/compiler-failure.ogg', 25, TRUE) + return UI_CLOSE + return ..() + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Jukebox", name) + ui.open() + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_data(mob/user) + var/list/data = list() + data["active"] = active + data["songs"] = list() + for(var/datum/track/S in SSjukeboxes.songs) + var/list/track_data = list( + name = S.song_name + ) + data["songs"] += list(track_data) + data["track_selected"] = null + data["track_length"] = null + data["track_beat"] = null + data["disks"] = list() + for(var/obj/item/record_disk/RD in record_disks) + var/list/tracks_data = list( + name = RD.name + ) + data["disks"] += list(tracks_data) + data["disk_selected"] = null //BIG IRON EDIT- start more tracks data + data["disk_selected_lenght"] = null + data["disk_beat"] = null //BIG IRON EDIT -end + if(selection) + data["track_selected"] = selection.song_name + data["track_length"] = DisplayTimeText(selection.song_length) + data["track_beat"] = selection.song_beat + if(selected_disk) + data["disk_selected"] = selected_disk + data["disk_selected_length"] = DisplayTimeText(selected_disk.R.song_length) + data["disk_selected_beat"] = selected_disk.R.song_beat + data["volume"] = volume + return data + +/obj/item/mecha_parts/mecha_equipment/stereo/ui_act(action, list/params) + . = ..() + if(.) + return + + switch(action) + if("toggle") + if(QDELETED(src)) + return + if(!active) + if(stop > world.time) + to_chat(usr, "Error: The device is still resetting from the last activation, it will be ready again in [DisplayTimeText(stop-world.time)].") + playsound(src, 'sound/misc/compiler-failure.ogg', 50, TRUE) + return + activate_music() + START_PROCESSING(SSobj, src) + return TRUE + else + stop = 0 + return TRUE + if("select_track") + if(active) + to_chat(usr, "Error: You cannot change the song until the current one is over.") + return + var/list/available = list() + for(var/datum/track/S in SSjukeboxes.songs) + available[S.song_name] = S + var/selected = params["track"] + if(QDELETED(src) || !selected || !istype(available[selected], /datum/track)) + return + selection = available[selected] + return TRUE + if("select_record") + if(!record_disks.len) + to_chat(usr, "Error: no tracks on the bin!.") + return + var/list/obj/item/record_disk/availabledisks = list() + for(var/obj/item/record_disk/RR in record_disks) + availabledisks[RR.name] = RR + var/selecteddisk = params["record"] + if(QDELETED(src) || !selecteddisk) + return + selected_disk = availabledisks[selecteddisk] + updateUsrDialog() + if("eject_disk") // sanity check for the disk ejection + if(!record_disks.len) + to_chat(usr, "Error: no disks in trays.") + return + if(!selected_disk) + to_chat(usr,"Error: no disk chosen." ) + return + if(selection == selected_disk.R) + selection = null + eject_record(selected_disk) + return TRUE + if("set_volume") + var/new_volume = params["volume"] + if(new_volume == "reset") + volume = initial(volume) + return TRUE + else if(new_volume == "min") + volume = 0 + return TRUE + else if(new_volume == "max") + volume = 100 + return TRUE + else if(text2num(new_volume) != null) + volume = text2num(new_volume) + return TRUE + +/obj/item/mecha_parts/mecha_equipment/stereo/proc/activate_music() + if(!selection) + visible_message("Track is no longer avaible") + return + var/jukeboxslottotake = SSjukeboxes.addjukebox(src, selection, 2) + if(jukeboxslottotake) + active = TRUE + update_icon() + START_PROCESSING(SSobj, src) + stop = world.time + selection.song_length + return TRUE + else + return FALSE + +/obj/item/mecha_parts/mecha_equipment/stereo/get_equip_info() + var/output = ..() + if(output) + var/temp = "" + temp = "Dashboard" + return "[output] [temp]" + return + +/obj/item/mecha_parts/mecha_equipment/stereo/Topic(href,href_list) + ..() + if(href_list["dashboard"]) + var/mob/user = chassis.occupant + ui_interact(user) + return + +/obj/item/mecha_parts/mecha_equipment/stereo/process() + if(active && world.time >= stop) + active = FALSE + dance_over() + playsound(src,'sound/machines/terminal_off.ogg',50,1) + update_icon() + stop = world.time + 100 + +/obj/item/mecha_parts/mecha_equipment/stereo/proc/dance_over() + var/position = SSjukeboxes.findjukeboxindex(src) + if(!position) + return + SSjukeboxes.removejukebox(position) + STOP_PROCESSING(SSobj, src) + rangers = list() diff --git a/code/game/mecha/equipment/tools/fallout/utility_modules.dm b/code/game/mecha/equipment/tools/fallout/utility_modules.dm new file mode 100644 index 00000000000..c43f02882db --- /dev/null +++ b/code/game/mecha/equipment/tools/fallout/utility_modules.dm @@ -0,0 +1,244 @@ +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13 + name = "crane hook" + desc = "The hooking system of a vehicle-mounted crane, capable of hoisting multiple heavy items with ease." + icon_state = "vehicle_crane" + equip_cooldown = 15 + energy_drain = 10 + tool_behaviour = null + attack_sentence = "You hear hydraulics." + attack_verbs = "lashes" + detachable = FALSE + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/can_attach(obj/mecha/M as obj) + if(..()) + if (!M.cargo_capacity) + return 0 + return 1 + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/vehicle_straps + name = "tray securing kit" + desc = "An assortment of cables and straps to secure heavy items on the back of a ute's tray." + icon_state = "vehicle_straps" + equip_cooldown = 30 + energy_drain = 0 + tool_behaviour = null + dam_force = 0 + +/obj/item/mecha_parts/mecha_equipment/trunk + name = "Modular Trunk" + desc = "Equipment made to hold and transport big ammounts of cargo." + icon_state = "car_trunk" + equip_cooldown = 15 + energy_drain = 0 + harmful = FALSE + mech_flags = EXOSUIT_MODULE_PHAZON + var/component_type = /datum/component/storage/concrete/trunk + var/in_use = FALSE + w_class = WEIGHT_CLASS_GIGANTIC + resistance_flags = NONE + max_integrity = 1000 + var/datum/component/storage/concrete/trunk/storagespace + +/obj/item/kinetic_crusher/Initialize() + . = ..() + RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) + RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) + +/obj/item/mecha_parts/mecha_equipment/trunk/get_dumping_location(/obj/item/mecha_parts/mecha_equipment/trunk/source,mob/user) + return src + +/obj/item/mecha_parts/mecha_equipment/trunk/Initialize() + . = ..() + PopulateContents() + +/obj/item/mecha_parts/mecha_equipment/trunk/Destroy() + for(var/atom/movable/A in contents) + A.forceMove(drop_location()) + return ..() + +/obj/item/mecha_parts/mecha_equipment/trunk/ComponentInitialize() + AddComponent(component_type) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + //STR.storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT + STR.max_combined_w_class = 100 + STR.max_w_class = WEIGHT_CLASS_HUGE + STR.max_items = 50 + storagespace = STR + + +/obj/item/mecha_parts/mecha_equipment/trunk/AllowDrop() + return !QDELETED(src) + +/obj/item/mecha_parts/mecha_equipment/trunk/contents_explosion(severity, target) + var/in_storage = istype(loc, /obj/item/storage)? (max(0, severity - 1)) : (severity) + for(var/atom/A in contents) + A.ex_act(in_storage, target) + CHECK_TICK + +//Cyberboss says: "USE THIS TO FILL IT, NOT INITIALIZE OR NEW" + +/obj/item/mecha_parts/mecha_equipment/trunk/proc/PopulateContents() + +/obj/item/mecha_parts/mecha_equipment/trunk/attach() + . = ..() + chassis.mouse_drag_pointer = MOUSE_ACTIVE_POINTER + storagespace.RegisterSignal(chassis, COMSIG_MOUSEDROP_ONTO, /datum/component/storage/concrete/trunk.proc/mousedrop_onto) + storagespace.RegisterSignal(chassis, COMSIG_CONTAINS_STORAGE, /datum/component/storage/concrete/trunk.proc/on_check) + storagespace.RegisterSignal(chassis, COMSIG_IS_STORAGE_LOCKED, /datum/component/storage/concrete/trunk.proc/check_locked) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_SHOW, /datum/component/storage/concrete/trunk.proc/signal_show_attempt) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_INSERT, /datum/component/storage/concrete/trunk.proc/signal_insertion_attempt) +// storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_CAN_INSERT, /datum/component/storage/concrete/trunk.proc/signal_can_insert) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_TAKE_TYPE, /datum/component/storage/concrete/trunk.proc/signal_take_type) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_FILL_TYPE, /datum/component/storage/concrete/trunk.proc/signal_fill_type) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_SET_LOCKSTATE, /datum/component/storage/concrete/trunk.proc/set_locked) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_TAKE, /datum/component/storage/concrete/trunk.proc/signal_take_obj) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_QUICK_EMPTY, /datum/component/storage/concrete/trunk.proc/signal_quick_empty) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_HIDE_FROM, /datum/component/storage/concrete/trunk.proc/signal_hide_attempt) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_HIDE_ALL, /datum/component/storage/concrete/trunk.proc/close_all) + storagespace.RegisterSignal(chassis, COMSIG_TRY_STORAGE_RETURN_INVENTORY, /datum/component/storage/concrete/trunk.proc/signal_return_inv) +// storagespace.RegisterSignal(chassis, COMSIG_PARENT_ATTACKBY, /datum/component/storage/concrete/trunk.proc/attackby) + storagespace.RegisterSignal(chassis, COMSIG_ATOM_EMP_ACT, /datum/component/storage/concrete/trunk.proc/emp_act) + storagespace.RegisterSignal(chassis, COMSIG_ATOM_ATTACK_GHOST, /datum/component/storage/concrete/trunk.proc/show_to_ghost) + storagespace.RegisterSignal(chassis, COMSIG_ATOM_ENTERED, /datum/component/storage/concrete/trunk.proc/refresh_mob_views) + storagespace.RegisterSignal(chassis, COMSIG_ATOM_EXITED, /datum/component/storage/concrete/trunk.proc/_remove_and_refresh) + storagespace.RegisterSignal(chassis, COMSIG_ITEM_PRE_ATTACK, /datum/component/storage/concrete/trunk.proc/preattack_intercept) + storagespace.RegisterSignal(chassis, COMSIG_ITEM_ATTACK_SELF, /datum/component/storage/concrete/trunk.proc/attack_self) + storagespace.RegisterSignal(chassis, COMSIG_ITEM_PICKUP, /datum/component/storage/concrete/trunk.proc/signal_on_pickup) + storagespace.RegisterSignal(chassis, COMSIG_MOVABLE_POST_THROW, /datum/component/storage/concrete/trunk.proc/close_all) + storagespace.RegisterSignal(chassis, COMSIG_MOVABLE_MOVED, /datum/component/storage/concrete/trunk.proc/check_views) + storagespace.RegisterSignal(chassis, COMSIG_CLICK_ALT, /datum/component/storage/concrete/trunk.proc/on_alt_click) + storagespace.RegisterSignal(chassis, COMSIG_MOUSEDROPPED_ONTO, /datum/component/storage/concrete/trunk.proc/mousedrop_receive) + +/obj/item/mecha_parts/mecha_equipment/trunk/detach() + storagespace.UnregisterSignal(chassis, COMSIG_MOUSEDROP_ONTO) + storagespace.UnregisterSignal(chassis, COMSIG_CONTAINS_STORAGE) + storagespace.UnregisterSignal(chassis, COMSIG_IS_STORAGE_LOCKED) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_SHOW) +// storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_INSERT) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_CAN_INSERT) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_TAKE_TYPE) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_FILL_TYPE) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_SET_LOCKSTATE) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_TAKE) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_QUICK_EMPTY) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_HIDE_FROM) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_HIDE_ALL) + storagespace.UnregisterSignal(chassis, COMSIG_TRY_STORAGE_RETURN_INVENTORY) +// storagespace.UnregisterSignal(chassis, COMSIG_PARENT_ATTACKBY) + storagespace.UnregisterSignal(chassis, COMSIG_ATOM_EMP_ACT) + storagespace.UnregisterSignal(chassis, COMSIG_ATOM_ATTACK_GHOST) + storagespace.UnregisterSignal(chassis, COMSIG_ATOM_ENTERED) + storagespace.UnregisterSignal(chassis, COMSIG_ATOM_EXITED) + storagespace.UnregisterSignal(chassis, COMSIG_ITEM_PRE_ATTACK) + storagespace.UnregisterSignal(chassis, COMSIG_ITEM_ATTACK_SELF) + storagespace.UnregisterSignal(chassis, COMSIG_ITEM_PICKUP) + storagespace.UnregisterSignal(chassis, COMSIG_MOVABLE_POST_THROW) + storagespace.UnregisterSignal(chassis, COMSIG_MOVABLE_MOVED) + storagespace.UnregisterSignal(chassis, COMSIG_CLICK_ALT) + storagespace.UnregisterSignal(chassis, COMSIG_MOUSEDROPPED_ONTO) + chassis.mouse_drag_pointer = MOUSE_INACTIVE_POINTER + . = ..() + +//////Passenger seat + +/obj/item/mecha_parts/mecha_equipment/seat + name = "Mounted seat" + desc = "A seat. Yup, looks hi-tec eh ? Well, its just a seat" + icon = 'icons/obj/bus.dmi' + icon_state = "backseat" + energy_drain = 5 + range = MELEE + equip_cooldown = 5 + var/mob/living/carbon/patient = null + salvageable = 0 + mech_flags = EXOSUIT_MODULE_COMBAT + +/obj/item/mecha_parts/mecha_equipment/seat/Destroy() + for(var/atom/movable/AM in src) + AM.forceMove(get_turf(src)) + return ..() + +/obj/item/mecha_parts/mecha_equipment/seat/Exit(atom/movable/O) + return 0 + +/obj/item/mecha_parts/mecha_equipment/seat/action(mob/living/carbon/target) + if(!action_checks(target)) + return + if(!istype(target)) + return + if(!patient_insertion_check(target)) + return + occupant_message(span_notice("You start putting [target] into [src]...")) + chassis.visible_message(span_warning("[chassis] starts putting [target] into \the [src].")) + if(do_after_cooldown(target)) + if(!patient_insertion_check(target)) + return + target.forceMove(src) + patient = target + START_PROCESSING(SSobj, src) + update_equip_info() + occupant_message(span_notice("[target] successfully loaded into [src]. Life support functions engaged... I mean, the seatbelt.")) + chassis.visible_message(span_warning("[chassis] loads [target] into [src].")) + mecha_log_message("[target] loaded. Seatbelt engaged.") + +/obj/item/mecha_parts/mecha_equipment/seat/proc/patient_insertion_check(mob/living/carbon/target) + if(target.buckled) + occupant_message(span_warning("[target] will not fit into the seat because [target.p_theyre()] buckled to [target.buckled]!")) + return + if(target.has_buckled_mobs()) + occupant_message(span_warning("[target] will not fit into the seat because of the creatures attached to it!")) + return + if(patient) + occupant_message(span_warning("The seat is already occupied!")) + return + return 1 + +/obj/item/mecha_parts/mecha_equipment/seat/proc/go_out() + if(!patient) + return + patient.forceMove(get_turf(src)) + occupant_message("[patient] is out, removing the seatbelt.") + mecha_log_message("[patient] ejected. Seatbelt disabled.") + STOP_PROCESSING(SSobj, src) + patient = null + update_equip_info() + +/obj/item/mecha_parts/mecha_equipment/seat/detach() + if(patient) + occupant_message(span_warning("Unable to detach [src] - equipment occupied!")) + return + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/mecha_parts/mecha_equipment/seat/get_equip_info() + var/output = ..() + if(output) + var/temp = "" + if(patient) + temp = "
\[Occupant: [patient] ([patient.stat > 1 ? "*DECEASED*" : "Health: [patient.health]%"])\]
View stats|Eject" + return "[output] [temp]" + return + +/obj/item/mecha_parts/mecha_equipment/seat/Topic(href,href_list) + ..() + if(href_list["eject"]) + go_out() + return + +/obj/item/mecha_parts/mecha_equipment/seat/container_resist(mob/living/user) + go_out() + +/obj/item/mecha_parts/mecha_equipment/seat/process() + if(..()) + return + if(!chassis.has_charge(energy_drain)) + set_ready_state(1) + mecha_log_message("Deactivated.") + occupant_message("[src] deactivated - no power.") + STOP_PROCESSING(SSobj, src) + return + var/mob/living/carbon/M = patient + if(!M) + return + chassis.use_power(energy_drain) + update_equip_info() diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 4a7426cb35f..8d6dd60256e 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -132,156 +132,45 @@ send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) return +//////////////////////////// ARMOR BOOSTER MODULES ////////////////////////////////////////////////////////// -//////Passenger seat - -/obj/item/mecha_parts/mecha_equipment/seat - name = "Mounted seat" - desc = "A seat. Yup, looks hi-tec eh ? Well, its just a seat" - icon = 'icons/obj/bus.dmi' - icon_state = "backseat" - energy_drain = 5 - range = MELEE - equip_cooldown = 5 - var/mob/living/carbon/patient = null - salvageable = 0 - mech_flags = EXOSUIT_MODULE_COMBAT - -/obj/item/mecha_parts/mecha_equipment/seat/Destroy() - for(var/atom/movable/AM in src) - AM.forceMove(get_turf(src)) - return ..() - -/obj/item/mecha_parts/mecha_equipment/seat/Exit(atom/movable/O) - return 0 - -/obj/item/mecha_parts/mecha_equipment/seat/action(mob/living/carbon/target) - if(!action_checks(target)) - return - if(!istype(target)) - return - if(!patient_insertion_check(target)) - return - occupant_message(span_notice("You start putting [target] into [src]...")) - chassis.visible_message(span_warning("[chassis] starts putting [target] into \the [src].")) - if(do_after_cooldown(target)) - if(!patient_insertion_check(target)) - return - target.forceMove(src) - patient = target - START_PROCESSING(SSobj, src) - update_equip_info() - occupant_message(span_notice("[target] successfully loaded into [src]. Life support functions engaged... I mean, the seatbelt.")) - chassis.visible_message(span_warning("[chassis] loads [target] into [src].")) - mecha_log_message("[target] loaded. Seatbelt engaged.") - -/obj/item/mecha_parts/mecha_equipment/seat/proc/patient_insertion_check(mob/living/carbon/target) - if(target.buckled) - occupant_message(span_warning("[target] will not fit into the seat because [target.p_theyre()] buckled to [target.buckled]!")) - return - if(target.has_buckled_mobs()) - occupant_message(span_warning("[target] will not fit into the seat because of the creatures attached to it!")) - return - if(patient) - occupant_message(span_warning("The seat is already occupied!")) - return - return 1 +/obj/item/mecha_parts/mecha_equipment/armor + name = "armor booster module (Bad Code)" + desc = "Boosts exosuit armor against manatee. Make a bug report if you see this." + range = NONE + selectable = FALSE + equip_ready = TRUE + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) -/obj/item/mecha_parts/mecha_equipment/seat/proc/go_out() - if(!patient) - return - patient.forceMove(get_turf(src)) - occupant_message("[patient] is out, removing the seatbelt.") - mecha_log_message("[patient] ejected. Seatbelt disabled.") - STOP_PROCESSING(SSobj, src) - patient = null - update_equip_info() +/obj/item/mecha_parts/mecha_equipment/armor/attach(obj/mecha/new_chassis) + . = ..() + new_chassis.armor.attachArmor(armor) -/obj/item/mecha_parts/mecha_equipment/seat/detach() - if(patient) - occupant_message(span_warning("Unable to detach [src] - equipment occupied!")) - return - STOP_PROCESSING(SSobj, src) +/obj/item/mecha_parts/mecha_equipment/armor/detach(atom/moveto) + chassis.armor.detachArmor(armor) return ..() - -/obj/item/mecha_parts/mecha_equipment/seat/get_equip_info() - var/output = ..() - if(output) - var/temp = "" - if(patient) - temp = "
\[Occupant: [patient] ([patient.stat > 1 ? "*DECEASED*" : "Health: [patient.health]%"])\]
View stats|Eject" - return "[output] [temp]" - return - -/obj/item/mecha_parts/mecha_equipment/seat/Topic(href,href_list) - ..() - if(href_list["eject"]) - go_out() - return - -/obj/item/mecha_parts/mecha_equipment/seat/container_resist(mob/living/user) - go_out() - -/obj/item/mecha_parts/mecha_equipment/seat/process() - if(..()) - return - if(!chassis.has_charge(energy_drain)) - set_ready_state(1) - mecha_log_message("Deactivated.") - occupant_message("[src] deactivated - no power.") - STOP_PROCESSING(SSobj, src) - return - var/mob/living/carbon/M = patient - if(!M) - return - if(M.health > 0) - M.adjustOxyLoss(-1) - M.AdjustAllImmobility(-80) - M.AdjustUnconscious(-80) - if(M.reagents.get_reagent_amount(/datum/reagent/medicine/epinephrine) < 5) - M.reagents.add_reagent(/datum/reagent/medicine/epinephrine, 5) - chassis.use_power(energy_drain) - update_equip_info() - -//////////////////////////// ARMOR BOOSTER MODULES ////////////////////////////////////////////////////////// - - -/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. +/* +/obj/item/mecha_parts/mecha_equipment/armor/set_ready_state(state) + if(equip_ready != state) + if(state) + chassis.armor.attachArmor(armor) + else + chassis.armor.detachArmor(armor) + return ..() +*/ +/obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. name = "armor booster module (Close Combat Weaponry)" - desc = "Boosts exosuit armor against armed melee attacks. Requires energy to operate." + desc = "Boosts vehicle armor against armed melee attacks. Requires energy to operate." icon_state = "mecha_abooster_ccw" - equip_cooldown = 0 - energy_drain = 65 - range = 0 -// var/deflect_coeff = 1.15 - var/damage_coeff = 0.7 - selectable = 0 - equip_type = EQUIP_UTILITY - - -/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/proc/attack_react() - if(action_checks(src)) - start_cooldown() - return 1 + passive_power_drain = 100 + armor = list("melee" = 15, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - - -/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster +/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster name = "armor booster module (Ranged Weaponry)" - desc = "Boosts exosuit armor against ranged attacks. Completely blocks taser shots. Requires energy to operate." + desc = "Boosts vehicle armor against ranged attacks. Requires energy to operate." icon_state = "mecha_abooster_proj" - equip_cooldown = 0 - energy_drain = 65 - range = 0 -// var/deflect_coeff = 1.15 - var/damage_coeff = 0.75 - selectable = 0 - equip_type = EQUIP_UTILITY - -/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/proc/projectile_react() - if(action_checks(src)) - start_cooldown() - return 1 + passive_power_drain = 100 + armor = list("melee" = 0, "bullet" = 15, "laser" = 10, "energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) ////////////////////////////////// REPAIR DROID ////////////////////////////////////////////////// diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 61855c73e71..00a897c379e 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -14,6 +14,8 @@ var/obj/mecha/working/ripley/cargo_holder harmful = TRUE mech_flags = EXOSUIT_MODULE_RIPLEY + var/attack_sentence = "You hear something crack." + var/attack_verbs = "squeezes" /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/mecha/working/ripley/M as obj) if(..()) @@ -71,15 +73,17 @@ var/mob/living/M = target if(M.stat == DEAD) return + if(!dam_force) + return if(chassis.occupant.a_intent == INTENT_HARM) M.take_overall_damage(dam_force) if(!M) return M.adjustOxyLoss(round(dam_force/2)) M.updatehealth() - target.visible_message(span_danger("[chassis] squeezes [target]."), \ - span_userdanger("[chassis] squeezes [target]."),\ - span_italic("You hear something crack.")) + target.visible_message(span_danger("[chassis] [attack_verb] [target]."), \ + span_userdanger("[chassis] [attack_verb] [target]."),\ + span_italic("[attack_sentence]")) log_combat(chassis.occupant, M, "attacked", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") else step_away(M,chassis) @@ -466,220 +470,3 @@ //NC.mergeConnectedNetworksOnTurf() last_piece = NC return 1 - - -/obj/item/mecha_parts/mecha_equipment/stereo - name = "exosuit Stereo System" - desc = "a stereo system hooked up a jukebox, modified for easy transport." - icon_state = "mecha_stereo" - range = MELEE - var/active = FALSE - var/list/rangers = list() - var/stop = 0 - var/volume = 70 - var/datum/track/selection = null - var/open_tray = TRUE - var/list/obj/item/record_disk/record_disks = list() - var/obj/item/record_disk/selected_disk = null - -/obj/item/mecha_parts/mecha_equipment/stereo/attach(obj/mecha/M) - . = ..() - bypass_interactions = TRUE - -/obj/item/mecha_parts/mecha_equipment/stereo/detach(obj/mecha/M) - . = ..() - bypass_interactions = FALSE - -/obj/item/mecha_parts/mecha_equipment/stereo/attackby(obj/item/O, mob/user, params) - . = ..() - if(!active) - if(istype(O, /obj/item/record_disk)) //this one checks for a record disk and if the jukebox is open, it adds it to the machine - if(open_tray == FALSE) - to_chat(usr, "The Disk Tray is not open!") - return - var/obj/item/record_disk/I = O - if(!I.R.song_associated_id) - to_chat(user, span_warning("This record is empty!")) - return - for(var/datum/track/RT in SSjukeboxes.songs) - if(I.R.song_associated_id == RT.song_associated_id) - to_chat(user, span_warning("this track is already added to the jukebox!")) - return - record_disks += I - O.forceMove(src) - playsound(src, 'sound/effects/plastic_click.ogg', 100, 0) - if(I.R.song_path) - SSjukeboxes.add_song(I.R) - return - -/obj/item/mecha_parts/mecha_equipment/stereo/proc/eject_record(obj/item/record_disk/M) //BIG IRON EDIT -start- ejects a record as defined and removes it's song from the list - if(!M) - visible_message("no disk to eject") - return - playsound(src, 'sound/effects/disk_tray.ogg', 100, 0) - src.visible_message(" ejected the [selected_disk] from the [src]!") - M.forceMove(get_turf(src)) - SSjukeboxes.remove_song(M.R) - record_disks -= M - selected_disk = null - -/obj/item/mecha_parts/mecha_equipment/stereo/ui_status(mob/user) - if(!SSjukeboxes.songs.len && !isobserver(user)) - to_chat(user,"Error: No music tracks have been authorized for your station. Petition Central Command to resolve this issue.") - playsound(src, 'sound/misc/compiler-failure.ogg', 25, TRUE) - return UI_CLOSE - return ..() - -/obj/item/mecha_parts/mecha_equipment/stereo/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Jukebox", name) - ui.open() - -/obj/item/mecha_parts/mecha_equipment/stereo/ui_data(mob/user) - var/list/data = list() - data["active"] = active - data["songs"] = list() - for(var/datum/track/S in SSjukeboxes.songs) - var/list/track_data = list( - name = S.song_name - ) - data["songs"] += list(track_data) - data["track_selected"] = null - data["track_length"] = null - data["track_beat"] = null - data["disks"] = list() - for(var/obj/item/record_disk/RD in record_disks) - var/list/tracks_data = list( - name = RD.name - ) - data["disks"] += list(tracks_data) - data["disk_selected"] = null //BIG IRON EDIT- start more tracks data - data["disk_selected_lenght"] = null - data["disk_beat"] = null //BIG IRON EDIT -end - if(selection) - data["track_selected"] = selection.song_name - data["track_length"] = DisplayTimeText(selection.song_length) - data["track_beat"] = selection.song_beat - if(selected_disk) - data["disk_selected"] = selected_disk - data["disk_selected_length"] = DisplayTimeText(selected_disk.R.song_length) - data["disk_selected_beat"] = selected_disk.R.song_beat - data["volume"] = volume - return data - -/obj/item/mecha_parts/mecha_equipment/stereo/ui_act(action, list/params) - . = ..() - if(.) - return - - switch(action) - if("toggle") - if(QDELETED(src)) - return - if(!active) - if(stop > world.time) - to_chat(usr, "Error: The device is still resetting from the last activation, it will be ready again in [DisplayTimeText(stop-world.time)].") - playsound(src, 'sound/misc/compiler-failure.ogg', 50, TRUE) - return - activate_music() - START_PROCESSING(SSobj, src) - return TRUE - else - stop = 0 - return TRUE - if("select_track") - if(active) - to_chat(usr, "Error: You cannot change the song until the current one is over.") - return - var/list/available = list() - for(var/datum/track/S in SSjukeboxes.songs) - available[S.song_name] = S - var/selected = params["track"] - if(QDELETED(src) || !selected || !istype(available[selected], /datum/track)) - return - selection = available[selected] - return TRUE - if("select_record") - if(!record_disks.len) - to_chat(usr, "Error: no tracks on the bin!.") - return - var/list/obj/item/record_disk/availabledisks = list() - for(var/obj/item/record_disk/RR in record_disks) - availabledisks[RR.name] = RR - var/selecteddisk = params["record"] - if(QDELETED(src) || !selecteddisk) - return - selected_disk = availabledisks[selecteddisk] - updateUsrDialog() - if("eject_disk") // sanity check for the disk ejection - if(!record_disks.len) - to_chat(usr, "Error: no disks in trays.") - return - if(!selected_disk) - to_chat(usr,"Error: no disk chosen." ) - return - if(selection == selected_disk.R) - selection = null - eject_record(selected_disk) - return TRUE - if("set_volume") - var/new_volume = params["volume"] - if(new_volume == "reset") - volume = initial(volume) - return TRUE - else if(new_volume == "min") - volume = 0 - return TRUE - else if(new_volume == "max") - volume = 100 - return TRUE - else if(text2num(new_volume) != null) - volume = text2num(new_volume) - return TRUE - -/obj/item/mecha_parts/mecha_equipment/stereo/proc/activate_music() - if(!selection) - visible_message("Track is no longer avaible") - return - var/jukeboxslottotake = SSjukeboxes.addjukebox(src, selection, 2) - if(jukeboxslottotake) - active = TRUE - update_icon() - START_PROCESSING(SSobj, src) - stop = world.time + selection.song_length - return TRUE - else - return FALSE - -/obj/item/mecha_parts/mecha_equipment/stereo/get_equip_info() - var/output = ..() - if(output) - var/temp = "" - temp = "Dashboard" - return "[output] [temp]" - return - -/obj/item/mecha_parts/mecha_equipment/stereo/Topic(href,href_list) - ..() - if(href_list["dashboard"]) - var/mob/user = chassis.occupant - ui_interact(user) - return - -/obj/item/mecha_parts/mecha_equipment/stereo/process() - if(active && world.time >= stop) - active = FALSE - dance_over() - playsound(src,'sound/machines/terminal_off.ogg',50,1) - update_icon() - stop = world.time + 100 - -/obj/item/mecha_parts/mecha_equipment/stereo/proc/dance_over() - var/position = SSjukeboxes.findjukeboxindex(src) - if(!position) - return - SSjukeboxes.removejukebox(position) - STOP_PROCESSING(SSobj, src) - rangers = list() - diff --git a/code/game/mecha/fallout/buggies.dm b/code/game/mecha/fallout/buggies.dm index 9a8edc31cdb..a026fd30d06 100644 --- a/code/game/mecha/fallout/buggies.dm +++ b/code/game/mecha/fallout/buggies.dm @@ -23,6 +23,7 @@ /obj/structure/mecha_wreckage/buggy name = "\improper Buggy wreckage" desc = "Its a buggy ! Won't bug you anymore." + icon = 'icons/fallout/vehicles/medium_vehicles.dmi' icon_state = "buggy-broken" /obj/mecha/combat/phazon/buggy/go_out() diff --git a/code/game/mecha/fallout/carriages.dm b/code/game/mecha/fallout/carriages.dm index c12d41460c7..bb70b0f52f1 100644 --- a/code/game/mecha/fallout/carriages.dm +++ b/code/game/mecha/fallout/carriages.dm @@ -13,7 +13,7 @@ armor = ARMOR_VALUE_HEAVY stepsound = 'sound/effects/footstep/gallop2.ogg' turnsound = 'sound/effects/footstep/gallop1.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy + wreckage = /obj/structure/mecha_wreckage/fallout max_utility_equip = 3 max_weapons_equip = 1 diff --git a/code/game/mecha/fallout/cars.dm b/code/game/mecha/fallout/cars.dm index f34d32fa76f..5b9c3203ccb 100644 --- a/code/game/mecha/fallout/cars.dm +++ b/code/game/mecha/fallout/cars.dm @@ -13,7 +13,7 @@ armor = ARMOR_VALUE_MEDIUM stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy + wreckage = /obj/structure/mecha_wreckage/fallout /obj/mecha/combat/phazon/highwayman/go_out() ..() diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index ce68d3c9408..8611846dac1 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -13,12 +13,20 @@ armor = ARMOR_VALUE_MEDIUM stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy + wreckage = /obj/structure/mecha_wreckage/fallout + cargo_capacity = 2 max_weapons_equip = 1 - max_utility_equip = 3 + max_utility_equip = 5 max_misc_equip = 1 + facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.25) + +/obj/mecha/combat/phazon/pickuptruck/Initialize(mapload) + . = ..() + var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/vehicle_straps/ME = new(src) + ME.attach(src) + /obj/mecha/combat/phazon/pickuptruck/go_out() ..() update_icon() @@ -51,7 +59,7 @@ ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) -//pickuptruck blue + //pickuptruck blue /obj/mecha/combat/phazon/pickuptruck/blue name = "\improper pickup truck" @@ -101,6 +109,9 @@ max_integrity = 300 armor = ARMOR_VALUE_MEDIUM wreckage = /obj/structure/mecha_wreckage/buggy + cargo_capacity = 1 + + facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.5) // There's whole ass paladin in the way.. /obj/mecha/combat/phazon/pickuptruck/bos/armed/loaded/Initialize() . = ..() @@ -114,19 +125,32 @@ //pickuptruck mechanic -/obj/mecha/combat/phazon/pickuptruck/mechanic +/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck name = "\improper mechanic pickup truck" desc = "A old vehicule, with a crane runing on fuel." icon = 'icons/mecha/pickuptruck-mechanics.dmi' icon_state = "pickuptruckmechanic" + stepsound = 'sound/f13machines/buggy_loop.ogg' + turnsound = 'sound/f13machines/buggy_loop.ogg' + wreckage = /obj/structure/mecha_wreckage/buggy step_in = 1.2 step_energy_drain = 0.6 armor = ARMOR_VALUE_MEDIUM + cargo_capacity = 5 max_weapons_equip = 1 - max_utility_equip = 4 + max_utility_equip = 5 max_misc_equip = 1 +/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/Initialize() + . = ..() + for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) + E.detach() + qdel(E) + equipment.Cut() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13 + ME.attach(src) + /obj/mecha/combat/phazon/pickuptruck/mechanic/go_out() ..() update_icon() @@ -161,7 +185,7 @@ //jeep -/obj/mecha/combat/phazon/jeep +/obj/mecha/combat/phazon/pickuptruck/jeep name = "\improper pickup truck" desc = "A old vehicule, runing on fuel." icon = 'icons/mecha/jeep.dmi' @@ -175,9 +199,10 @@ stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy + cargo_capacity = 1 max_weapons_equip = 1 - max_utility_equip = 3 + max_utility_equip = 4 max_misc_equip = 1 /obj/mecha/combat/phazon/jeep/go_out() @@ -212,6 +237,7 @@ ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) + //jeep Enclave /obj/mecha/combat/phazon/jeep/enclave diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index 250e0299fb3..9c1fa7139eb 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -7,21 +7,22 @@ icon_state = "ncrtruck" pixel_x = -22 pixel_y = -5 - max_integrity = 600 + max_integrity = 6000 // TEST step_in = 1.2 armor = ARMOR_VALUE_MEDIUM step_energy_drain = 0.6 stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/ncrtruck - var/list/cargo = new - var/cargo_capacity = 30 var/hides = 0 max_weapons_equip = 1 max_utility_equip = 8 max_misc_equip = 1 + deflect_chance = 0 + internal_damage_threshold = 99 // test + /obj/structure/mecha_wreckage/ncrtruck name = "\improper NCR Truck wreckage" desc = "Its a truck ! BROKEN TRUCK." diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 110ff8c3406..583db4251ae 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -102,6 +102,9 @@ var/list/utility_equipment = new var/list/misc_equipment = new + var/list/cargo = new + var/cargo_capacity = 0 // for now, copy attributes from ripley so don't have to remap // lazy + /// a list of all vision traits to give to the occupant. var/list/vision_modes = list() @@ -234,11 +237,11 @@ else M.forceMove(loc) if(wreckage) - if(prob(85)) + if(prob(1)) explosion(get_turf(src), 0, 1, 2, 3) var/obj/structure/mecha_wreckage/WR = new wreckage(loc, AI) for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) - if(E.salvageable && prob(30)) + if(E.salvageable) WR.crowbar_salvage += E E.detach(WR) //detaches from src into WR E.equip_ready = 1 @@ -252,6 +255,7 @@ if(internal_tank) WR.crowbar_salvage += internal_tank internal_tank.forceMove(WR) + else for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) E.detach(loc) @@ -262,6 +266,12 @@ qdel(internal_tank) if(AI) AI.gib() //No wreck, no AI to recover + + for(var/atom/movable/A in cargo) + A.forceMove(drop_location()) + step_rand(A) + cargo.Cut() + STOP_PROCESSING(SSobj, src) GLOB.poi_list.Remove(src) equipment.Cut() @@ -461,6 +471,10 @@ var/lights_energy_drain = 2 use_power(lights_energy_drain) + var/obj/item/mecha_parts/mecha_equipment/MEP + if(istype(MEP, /obj/item/mecha_parts/mecha_equipment)) + use_power(MEP.passive_power_drain) + //Diagnostic HUD updates diag_hud_set_mechhealth() diag_hud_set_mechcell() @@ -1222,3 +1236,20 @@ else to_chat(user, "None of the equipment on this exosuit can use this ammo!") return FALSE + +/obj/mecha/Exit(atom/movable/O) + if(O in cargo) + return 0 + return ..() + +/obj/mecha/relay_container_resist(mob/living/user, obj/O) + to_chat(user, span_notice("You lean on the back of [O] and start pushing so it falls out of [src].")) + if(do_after(user, 300, target = O)) + if(!user || user.stat != CONSCIOUS || user.loc != src || O.loc != src ) + return + to_chat(user, span_notice("You successfully pushed [O] out of [src]!")) + O.forceMove(drop_location()) + cargo -= O + else + if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. + to_chat(user, span_warning("You fail to push [O] out of [src]!")) diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index c7f31906c0d..e396a73b87f 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -29,34 +29,6 @@ . = ..() if(!damage_amount) return 0 - var/booster_deflection_modifier = 1 - var/booster_damage_modifier = 1 - if(damage_flag == "bullet" || damage_flag == "laser" || damage_flag == "energy") - for(var/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/B in equipment) - if(B.projectile_react()) -// booster_deflection_modifier = B.deflect_coeff - booster_damage_modifier = B.damage_coeff - break - else if(damage_flag == "melee") - for(var/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/B in equipment) - if(B.attack_react()) -// booster_deflection_modifier *= B.deflect_coeff - booster_damage_modifier *= B.damage_coeff - break - - if(attack_dir) - var/facing_modifier = get_armour_facing(abs(dir2angle(dir) - dir2angle(attack_dir))) - booster_damage_modifier /= facing_modifier - booster_deflection_modifier *= facing_modifier - if(prob(deflect_chance * booster_deflection_modifier) && damage_flag != "bomb") - visible_message(span_danger("[src]'s armour deflects the attack!")) - log_append_to_last("Armor saved.") - return 0 - /*if(damage_flag == "bomb") - . *= (booster_damage_modifier*1.25)*/ - if(.) - . *= booster_damage_modifier - /obj/mecha/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags) user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) @@ -127,6 +99,12 @@ for(var/Y in trackers) var/obj/item/mecha_parts/mecha_tracking/MT = Y MT.ex_act(severity, target) + for(var/Z in cargo) + var/obj/O = Z + if(prob(30/severity)) + cargo -= O + O.forceMove(drop_location()) + . = ..() if(occupant) occupant.ex_act(severity,target) diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 3f5537ad7e0..487eff1a2b9 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -91,6 +91,15 @@ [phasing_action.owner ? "Phase Modulator: [phasing ? "Enabled" : "Disabled"]
" : ""] "} + if(cargo_capacity) + . += "Cargo Compartment Contents:
" + if(cargo.len) + for(var/obj/O in cargo) + . += "Unload : [O]
" + else + . += "Nothing" + . += "
" + return /obj/mecha/proc/get_commands() . = {"
@@ -122,32 +131,31 @@ /obj/mecha/proc/get_equipment_menu() //outputs mecha html equipment menu - var/output + . = "" if(equipment.len) - output += {"
+ . += {"
Equipment
"} - return output + return . /obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html if(!equipment.len) return - var/output = "Equipment:
" + . = "Equipment:
" for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment) - output += "
[MT.get_equip_info()]
" - output += "
" - return output + . += "
[MT.get_equip_info()]
" + . += "
" @@ -333,6 +341,20 @@ return send_byjax(occupant,"exosuit.browser","t_port_connection","[internal_tank.connected_port?"Disconnect from":"Connect to"] gas port") */ + + if(href_list["repair_int_control_lost"]) + occupant_message("Recalibrating coordination system...") + mecha_log_message("Recalibration of coordination system started.") + var/T = loc + spawn(100) + if(T == loc) + clearInternalDamage(MECHA_INT_CONTROL_LOST) + occupant_message(span_notice("Recalibration successful.")) + mecha_log_message("Recalibration of coordination system finished with 0 errors.") + else + occupant_message(span_warning("Recalibration failed!")) + mecha_log_message("Recalibration of coordination system failed with 1 error.", color="red") + if(href_list["dna_lock"]) if(!occupant) return @@ -350,15 +372,12 @@ if(href_list["reset_dna"]) dna_lock = null - if(href_list["repair_int_control_lost"]) - occupant_message("Recalibrating coordination system...") - mecha_log_message("Recalibration of coordination system started.") - var/T = loc - spawn(100) - if(T == loc) - clearInternalDamage(MECHA_INT_CONTROL_LOST) - occupant_message(span_notice("Recalibration successful.")) - mecha_log_message("Recalibration of coordination system finished with 0 errors.") - else - occupant_message(span_warning("Recalibration failed!")) - mecha_log_message("Recalibration of coordination system failed with 1 error.", color="red") + + if(href_list["drop_from_cargo"]) + var/obj/O = locate(href_list["drop_from_cargo"]) + if(O && (O in cargo)) + occupant_message(span_notice("You unload [O].")) + O.forceMove(drop_location()) + cargo -= O + mecha_log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]") + return diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 1531a06d28e..55256ad40ed 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -10,8 +10,6 @@ max_weapons_equip = 2 max_misc_equip = 2 wreckage = /obj/structure/mecha_wreckage/ripley - var/list/cargo = new - var/cargo_capacity = 15 var/hides = 0 /obj/mecha/working/ripley/go_out() @@ -26,12 +24,6 @@ . = ..() AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list("melee" = 10, "bullet" = 5, "laser" = 5)) */ -/obj/mecha/working/ripley/Destroy() - for(var/atom/movable/A in cargo) - A.forceMove(drop_location()) - step_rand(A) - cargo.Cut() - return ..() /obj/mecha/working/ripley/firefighter desc = "Autonomous Power Loader Unit. This model is refitted with additional thermal protection." @@ -150,50 +142,3 @@ var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new scanner.attach(src) - -/obj/mecha/working/ripley/Exit(atom/movable/O) - if(O in cargo) - return 0 - return ..() - -/obj/mecha/working/ripley/Topic(href, href_list) - ..() - if(href_list["drop_from_cargo"]) - var/obj/O = locate(href_list["drop_from_cargo"]) - if(O && (O in cargo)) - occupant_message(span_notice("You unload [O].")) - O.forceMove(drop_location()) - cargo -= O - mecha_log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]") - return - -/obj/mecha/working/ripley/contents_explosion(severity, target) - for(var/X in cargo) - var/obj/O = X - if(prob(30/severity)) - cargo -= O - O.forceMove(drop_location()) - . = ..() - -/obj/mecha/working/ripley/get_stats_part() - var/output = ..() - output += "Cargo Compartment Contents:
" - if(cargo.len) - for(var/obj/O in cargo) - output += "Unload : [O]
" - else - output += "Nothing" - output += "
" - return output - -/obj/mecha/working/ripley/relay_container_resist(mob/living/user, obj/O) - to_chat(user, span_notice("You lean on the back of [O] and start pushing so it falls out of [src].")) - if(do_after(user, 300, target = O)) - if(!user || user.stat != CONSCIOUS || user.loc != src || O.loc != src ) - return - to_chat(user, span_notice("You successfully pushed [O] out of [src]!")) - O.forceMove(drop_location()) - cargo -= O - else - if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. - to_chat(user, span_warning("You fail to push [O] out of [src]!")) diff --git a/code/modules/jobs/job_types/ncr.dm b/code/modules/jobs/job_types/ncr.dm index 398d40f5c9b..9046b237448 100644 --- a/code/modules/jobs/job_types/ncr.dm +++ b/code/modules/jobs/job_types/ncr.dm @@ -1041,7 +1041,7 @@ Weapons Service Rifle, Grease Gun, 9mm pistol, all good. /datum/outfit/loadout/combatengineerbuilder name = "Combat Engineer" head = /obj/item/clothing/head/hardhat/ncr - belt = /obj/item/storage/belt/army/assault/ncr/engineer + belt = /obj/item/storage/belt/utility/full glasses = /obj/item/clothing/glasses/welding suit = /obj/item/clothing/suit/armor/ncrarmor/reinforced/engineer suit_store = /obj/item/gun/ballistic/automatic/service diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index 26d2351ac2b..53e47847247 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -404,7 +404,7 @@ desc = "Exosuit-mounted armor booster." id = "mech_ccw_armor" build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster + build_path = /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster materials = list(/datum/material/iron=20000,/datum/material/silver=5000) construction_time = 100 category = list("Exosuit Equipment") @@ -414,7 +414,7 @@ desc = "Exosuit-mounted armor booster." id = "mech_proj_armor" build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster + build_path = /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster materials = list(/datum/material/iron=20000,/datum/material/gold=5000) construction_time = 100 category = list("Exosuit Equipment") diff --git a/hailmary.dme b/hailmary.dme index 97aa9e39944..d1a589ff41d 100644 --- a/hailmary.dme +++ b/hailmary.dme @@ -583,6 +583,7 @@ #include "code\datums\components\storage\concrete\rped.dm" #include "code\datums\components\storage\concrete\special.dm" #include "code\datums\components\storage\concrete\stack.dm" +#include "code\datums\components\storage\concrete\trunk.dm" #include "code\datums\diseases\_disease.dm" #include "code\datums\diseases\_MobProcs.dm" #include "code\datums\diseases\anxiety.dm" @@ -1002,6 +1003,8 @@ #include "code\game\mecha\equipment\tools\mining_tools.dm" #include "code\game\mecha\equipment\tools\other_tools.dm" #include "code\game\mecha\equipment\tools\work_tools.dm" +#include "code\game\mecha\equipment\tools\fallout\jukebox.dm" +#include "code\game\mecha\equipment\tools\fallout\utility_modules.dm" #include "code\game\mecha\equipment\tools\fallout\vision_modules.dm" #include "code\game\mecha\equipment\weapons\mecha_ammo.dm" #include "code\game\mecha\equipment\weapons\weapons.dm" diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi index 3d246cb2cc1efe7a6b849348c0d13d81173d7fe6..3ec0225ef0ae31432a63ff136814df7d017c1ba8 100644 GIT binary patch delta 5393 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 diff --git a/mecha_equipment.dmi b/mecha_equipment.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5b3426f33c08cc92859887a57791749442941390 GIT binary patch literal 24630 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

L?t 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 K>2gWqp#K7ccfs}m literal 0 HcmV?d00001 From ea8950614746507515acb5536a82de8f65cbfd7e Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Wed, 2 Oct 2024 06:47:38 +1300 Subject: [PATCH 34/68] Armor Changes (Test) --- code/__DEFINES/armor.dm | 130 ++++++++++++++++++ .../game/mecha/equipment/tools/other_tools.dm | 55 ++++---- code/game/mecha/fallout/armoured.dm | 2 +- code/game/mecha/fallout/birds.dm | 4 +- code/game/mecha/fallout/buggies.dm | 57 +------- code/game/mecha/fallout/carriages.dm | 6 +- code/game/mecha/fallout/cars.dm | 6 +- code/game/mecha/fallout/pickuptrucks.dm | 16 +-- code/game/mecha/fallout/trucks.dm | 6 +- code/game/mecha/mecha.dm | 9 +- code/game/mecha/mecha_defense.dm | 5 + 11 files changed, 193 insertions(+), 103 deletions(-) diff --git a/code/__DEFINES/armor.dm b/code/__DEFINES/armor.dm index 790d19d3988..49ac082282d 100644 --- a/code/__DEFINES/armor.dm +++ b/code/__DEFINES/armor.dm @@ -1055,3 +1055,133 @@ GLOBAL_LIST_INIT(all_armor_types, list( "acid" = 0, \ "wound" = 0, \ "damage_threshold" = 10) + + +/// VEHICLE ARMOR /// + + +/* Very light vehicle - small car or canopy covered bike + * Basically no armor + * Weak to everything + * ~0.5mm+ metal/plastic or canopy skin + * * * * * * * * * * * */ + +#define ARMOR_VALUE_VEHICLE_VLIGHT list(\ + "melee" = 20, \ + "bullet" = 5, \ + "laser" = 0, \ + "energy" = 0, \ + "bomb" = 0, \ + "bio" = 100, \ + "rad" = 25, \ + "fire" = 0, \ + "acid" = 0, \ + "wound" = 0, \ + "damage_threshold" = 0) + +/* Basic car, unarmored but the metal skin protects a little + * ~1mm mild steel skin + * * * * * * * * * * * */ + +#define ARMOR_VALUE_VEHICLE_LIGHT list(\ + "melee" = 30, \ + "bullet" = 10, \ + "laser" = 5, \ + "energy" = 0, \ + "bomb" = 10, \ + "bio" = 100, \ + "rad" = 25, \ + "fire" = 0, \ + "acid" = 0, \ + "wound" = 0, \ + "damage_threshold" = 0) + +/* Ruggedized old car - pickuptruck or small truck + * Made to be durable, so more thicker construction, especially for Fallout vintage cars + * 1-3mm mild steel + * * * * * * * * * * * */ + +#define ARMOR_VALUE_VEHICLE_MED_LIGHT list(\ + "melee" = 40, \ + "bullet" = 20, \ + "laser" = 15, \ + "energy" = 0, \ + "bomb" = 10, \ + "bio" = 100, \ + "rad" = 25, \ + "fire" = 0, \ + "acid" = 0, \ + "wound" = 0, \ + "damage_threshold" = 0) + +/* A heavy pickuptruck, or regular truck + * Thick construction, and probably has some aftermarked armor modded on + * 2-5mm RHA (mil-LARPer moment alert.) + * * * * * * * * * * * */ + +#define ARMOR_VALUE_VEHICLE_MEDIUM list(\ + "melee" = 45, \ + "bullet" = 30, \ + "laser" = 20, \ + "energy" = 5, \ + "bomb" = 10, \ + "bio" = 100, \ + "rad" = 25, \ + "fire" = 0, \ + "acid" = 0, \ + "wound" = 0, \ + "damage_threshold" = 0) + +/* Heavy vehicle, has been designed, or modded to have beefed-up armor + * 10mm+ RHA (the LARP continues.) + * * * * * * * * * * * */ + +#define ARMOR_VALUE_VEHICLE_HEAVY list(\ + "melee" = 60, \ + "bullet" = 40, \ + "laser" = 40, \ + "energy" = 15, \ + "bomb" = 25, \ + "bio" = 100, \ + "rad" = 50, \ + "fire" = 0, \ + "acid" = 0, \ + "wound" = 0, \ + "damage_threshold" = 0) + +/* Vehicle that's purpose built to be armoured, or has excessive modded armor + * Could be - armored car, armored tractor/bulldozer or light tank + * 15mm+ RHA + * * * * * * * * * * * */ + +#define ARMOR_VALUE_VEHICLE_ARMOURED list(\ + "melee" = 75, \ + "bullet" = 50, \ + "laser" = 50, \ + "energy" = 25, \ + "bomb" = 35, \ + "bio" = 100, \ + "rad" = 50, \ + "fire" = 0, \ + "acid" = 0, \ + "wound" = 0, \ + "damage_threshold" = 0) + +/* Heavy, armoured vehicle that's built to withstand a lot of direct punishment + * Could be - medium tanks, large combat walker, or over-armoured utility vehicle + * A RHA rating would be silly here, as it doesn't replicate what happens in-game + * 25mm+ RHA + * * * * * * * * * * * */ + +#define ARMOR_VALUE_VEHICLE_ARMOURED_HEAVY list(\ + "melee" = 85, \ + "bullet" = 65, \ + "laser" = 65, \ + "energy" = 40, \ + "bomb" = 50, \ + "bio" = 100, \ + "rad" = 100, \ + "fire" = 0, \ + "acid" = 0, \ + "wound" = 0, \ + "damage_threshold" = 0) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 8d6dd60256e..1866f10bbb5 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -132,46 +132,51 @@ send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) return + //////////////////////////// ARMOR BOOSTER MODULES ////////////////////////////////////////////////////////// /obj/item/mecha_parts/mecha_equipment/armor - name = "armor booster module (Bad Code)" - desc = "Boosts exosuit armor against manatee. Make a bug report if you see this." - range = NONE - selectable = FALSE - equip_ready = TRUE - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - -/obj/item/mecha_parts/mecha_equipment/armor/attach(obj/mecha/new_chassis) + name = "Armor" + desc = "Boosts exosuit armor against attacks." + icon_state = "mecha_abooster_ccw" + equip_cooldown = 0 + energy_drain = 0 + range = 0 + selectable = 0 + passive_power_drain = 5 + var/list/armor_mod = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "fire" = 0, "acid" = 0) + +/obj/item/mecha_parts/mecha_equipment/armor/attach(obj/mecha) . = ..() - new_chassis.armor.attachArmor(armor) + chassis.armor = chassis.armor.modifyRating(arglist(armor_mod)) + /obj/item/mecha_parts/mecha_equipment/armor/detach(atom/moveto) - chassis.armor.detachArmor(armor) + var/list/removed_armor = armor_mod.Copy() + for(var/armor_type in removed_armor) + removed_armor[armor_type] = -removed_armor[armor_type] + chassis.armor = chassis.armor.modifyRating(arglist(removed_armor)) return ..() -/* -/obj/item/mecha_parts/mecha_equipment/armor/set_ready_state(state) - if(equip_ready != state) - if(state) - chassis.armor.attachArmor(armor) - else - chassis.armor.detachArmor(armor) + +/obj/item/mecha_parts/mecha_equipment/armor/Destroy() + var/list/removed_armor = armor_mod.Copy() + for(var/armor_type in removed_armor) + removed_armor[armor_type] = -removed_armor[armor_type] + chassis.armor = chassis.armor.modifyRating(arglist(removed_armor)) return ..() -*/ + /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. name = "armor booster module (Close Combat Weaponry)" - desc = "Boosts vehicle armor against armed melee attacks. Requires energy to operate." + desc = "Boosts vehicle armor against armed melee attacks." icon_state = "mecha_abooster_ccw" - passive_power_drain = 100 - armor = list("melee" = 15, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor_mod = list("melee" = 15, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "fire" = 0, "acid" = 0) + /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster name = "armor booster module (Ranged Weaponry)" - desc = "Boosts vehicle armor against ranged attacks. Requires energy to operate." + desc = "Boosts vehicle armor against ranged attacks." icon_state = "mecha_abooster_proj" - passive_power_drain = 100 - armor = list("melee" = 0, "bullet" = 15, "laser" = 10, "energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - + armor_mod = list("melee" = 0, "bullet" = 15, "laser" = 10, "energy" = 5, "bomb" = 0, "bio" = 0, "fire" = 0, "acid" = 0) ////////////////////////////////// REPAIR DROID ////////////////////////////////////////////////// diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index cb8d1c22164..fc696b93db9 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -10,7 +10,7 @@ max_integrity = 500 step_energy_drain = 1.5 step_in = 1.5 - armor = ARMOR_VALUE_SALVAGE + armor = ARMOR_VALUE_VEHICLE_ARMOURED wreckage = /obj/structure/mecha_wreckage/armoured_jeep max_utility_equip = 2 max_weapons_equip = 1 diff --git a/code/game/mecha/fallout/birds.dm b/code/game/mecha/fallout/birds.dm index ca772cfe465..6f14e590f2a 100644 --- a/code/game/mecha/fallout/birds.dm +++ b/code/game/mecha/fallout/birds.dm @@ -12,7 +12,7 @@ dir_in = 2 step_energy_drain = 0.75 max_integrity = 150 - armor = ARMOR_VALUE_HEAVY + armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/vertibird add_req_access = 1 internal_damage_threshold = 25 @@ -259,7 +259,7 @@ step_in = 4 step_energy_drain = 0.2 max_integrity = 100 - armor = ARMOR_VALUE_SALVAGE + armor = ARMOR_VALUE_VEHICLE_HEAVY max_utility_equip = 6 max_weapons_equip = 1 max_misc_equip = 1 diff --git a/code/game/mecha/fallout/buggies.dm b/code/game/mecha/fallout/buggies.dm index a026fd30d06..dc99676c6c2 100644 --- a/code/game/mecha/fallout/buggies.dm +++ b/code/game/mecha/fallout/buggies.dm @@ -9,7 +9,7 @@ pixel_y = -5 max_integrity = 200 step_in = 0.8 - armor = ARMOR_VALUE_LIGHT + armor = ARMOR_VALUE_VEHICLE_LIGHT stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy @@ -61,15 +61,6 @@ desc = "A light vehicle, not very powerfull or solid, running on a powercell." icon = 'icons/mecha/buggy.dmi' icon_state = "buggydune" - max_integrity = 200 - armor = ARMOR_VALUE_LIGHT - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/buggy/dune/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) //Buggyred @@ -78,15 +69,6 @@ desc = "A light vehicle, not very powerfull or solid, running on a powercell." icon = 'icons/mecha/buggy.dmi' icon_state = "buggyred" - max_integrity = 200 - armor = ARMOR_VALUE_LIGHT - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/buggy/red/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) //Buggyflame @@ -95,15 +77,6 @@ desc = "A light vehicle, not very powerfull or solid, running on a powercell." icon = 'icons/mecha/buggy.dmi' icon_state = "buggyflame" - max_integrity = 200 - armor = ARMOR_VALUE_LIGHT - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/buggy/flamme/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) //Buggy Ranger @@ -112,15 +85,7 @@ desc = "A light vehicle, not very powerfull or solid, running on a powercell. This one as been recolored by the Rangers." icon = 'icons/mecha/hanlonbuggy.dmi' icon_state = "hanlonbuggy" - max_integrity = 200 - armor = ARMOR_VALUE_LIGHT - wreckage = /obj/structure/mecha_wreckage/buggy - -/obj/mecha/combat/phazon/buggy/ranger/loaded/Initialize() - . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) + armor = ARMOR_VALUE_VEHICLE_MED_LIGHT //Buggy Ranger AND RICO @@ -129,9 +94,7 @@ desc = "A light vehicle, not very powerfull or solid, running on a powercell. This one as been recolored by the Rangers... And Ranger Rico ''Gunner'' Davberger is gonna shoot with his shotgun." icon = 'icons/mecha/buggyrangergun.dmi' icon_state = "rangergun" - max_integrity = 200 - armor = ARMOR_VALUE_LIGHT - wreckage = /obj/structure/mecha_wreckage/buggy + armor = ARMOR_VALUE_VEHICLE_MED_LIGHT /obj/mecha/combat/phazon/buggy/rangerarmed/go_out() ..() @@ -173,20 +136,6 @@ desc = "A light vehicle, not very powerful or solid, running on fuel." icon = 'icons/mecha/buggy.dmi' icon_state = "buggyblue" - pixel_x = -15 - pixel_y = 0 - can_be_locked = TRUE - dna_lock - step_in = 0.8 - opacity = 0 - dir_in = 8 - step_energy_drain = 1 - max_temperature = 20000 - max_integrity = 200 - armor = ARMOR_VALUE_LIGHT - stepsound = 'sound/f13machines/buggy_loop.ogg' - turnsound = 'sound/f13machines/buggy_loop.ogg' - wreckage = /obj/structure/mecha_wreckage/buggy /obj/mecha/combat/phazon/buggy/blue/go_out() ..() diff --git a/code/game/mecha/fallout/carriages.dm b/code/game/mecha/fallout/carriages.dm index bb70b0f52f1..75900aa4fa7 100644 --- a/code/game/mecha/fallout/carriages.dm +++ b/code/game/mecha/fallout/carriages.dm @@ -10,7 +10,7 @@ max_integrity = 250 step_energy_drain = 0.6 step_in = 1.2 - armor = ARMOR_VALUE_HEAVY + armor = ARMOR_VALUE_VEHICLE_MED_LIGHT stepsound = 'sound/effects/footstep/gallop2.ogg' turnsound = 'sound/effects/footstep/gallop1.ogg' wreckage = /obj/structure/mecha_wreckage/fallout @@ -57,7 +57,7 @@ max_integrity = 250 step_energy_drain = 0.6 step_in = 1.2 - armor = ARMOR_VALUE_HEAVY + armor = ARMOR_VALUE_VEHICLE_MED_LIGHT /obj/mecha/combat/phazon/buggy/legionarmed/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) @@ -96,7 +96,7 @@ max_integrity = 250 step_in = 1.6 step_energy_drain = 0.6 - armor = ARMOR_VALUE_HEAVY + armor = ARMOR_VALUE_VEHICLE_HEAVY max_utility_equip = 4 max_weapons_equip = 1 diff --git a/code/game/mecha/fallout/cars.dm b/code/game/mecha/fallout/cars.dm index 5b9c3203ccb..5386a5e17fa 100644 --- a/code/game/mecha/fallout/cars.dm +++ b/code/game/mecha/fallout/cars.dm @@ -10,7 +10,7 @@ max_integrity = 250 step_energy_drain = 0.5 step_in = 0.7 - armor = ARMOR_VALUE_MEDIUM + armor = ARMOR_VALUE_VEHICLE_LIGHT stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/fallout @@ -51,7 +51,7 @@ icon = 'icons/mecha/corvega.dmi' icon_state = "corvega" max_integrity = 280 - armor = ARMOR_VALUE_MEDIUM + armor = ARMOR_VALUE_VEHICLE_MED_LIGHT wreckage = /obj/structure/mecha_wreckage/buggy /obj/mecha/combat/phazon/corvega/loaded/Initialize() @@ -70,7 +70,7 @@ icon = 'icons/mecha/corvega-police.dmi' icon_state = "corvega" max_integrity = 280 - armor = ARMOR_VALUE_MEDIUM + armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/buggy /obj/mecha/combat/phazon/corvega/police/GrantActions(mob/living/user, human_occupant = 0) diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index 8611846dac1..7da59ff08cf 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -10,7 +10,7 @@ max_integrity = 300 step_in = 1.2 step_energy_drain = 0.4 - armor = ARMOR_VALUE_MEDIUM + armor = ARMOR_VALUE_VEHICLE_MEDIUM stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/fallout @@ -67,7 +67,7 @@ icon = 'icons/mecha/pickuptruck-blue.dmi' icon_state = "pickuptruck" max_integrity = 300 - armor = ARMOR_VALUE_MEDIUM + armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/buggy /obj/mecha/combat/phazon/pickuptruck/blue/loaded/Initialize() @@ -88,7 +88,7 @@ icon = 'icons/mecha/pickuptruck-bos.dmi' icon_state = "pickuptruck" max_integrity = 300 - armor = ARMOR_VALUE_MEDIUM + armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/buggy /obj/mecha/combat/phazon/pickuptruck/bos/loaded/Initialize() @@ -107,11 +107,11 @@ icon = 'icons/mecha/pickuptruck-gunbos.dmi' icon_state = "pickuptruck" max_integrity = 300 - armor = ARMOR_VALUE_MEDIUM + armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/buggy cargo_capacity = 1 - facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.5) // There's whole ass paladin in the way.. + facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 2) // There's whole ass paladin in the way.. /obj/mecha/combat/phazon/pickuptruck/bos/armed/loaded/Initialize() . = ..() @@ -135,11 +135,11 @@ wreckage = /obj/structure/mecha_wreckage/buggy step_in = 1.2 step_energy_drain = 0.6 - armor = ARMOR_VALUE_MEDIUM + armor = ARMOR_VALUE_VEHICLE_MED_LIGHT // Less armor, more tools cargo_capacity = 5 max_weapons_equip = 1 - max_utility_equip = 5 + max_utility_equip = 6 max_misc_equip = 1 /obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/Initialize() @@ -195,7 +195,7 @@ step_in = 1.2 step_energy_drain = 0.4 max_integrity = 200 - armor = ARMOR_VALUE_MEDIUM + armor = ARMOR_VALUE_VEHICLE_MED_LIGHT stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index 9c1fa7139eb..2f0b8cde175 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -9,7 +9,7 @@ pixel_y = -5 max_integrity = 6000 // TEST step_in = 1.2 - armor = ARMOR_VALUE_MEDIUM + armor = ARMOR_VALUE_VEHICLE_MED step_energy_drain = 0.6 stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' @@ -86,7 +86,7 @@ max_integrity = 600 step_in = 1 step_energy_drain = 0.6 - armor = ARMOR_VALUE_MEDIUM + armor = ARMOR_VALUE_VEHICLE_MED wreckage = /obj/structure/mecha_wreckage/ncrtruck max_weapons_equip = 1 @@ -127,7 +127,7 @@ icon = 'icons/mecha/ambulance.dmi' icon_state = "ambulance" step_in = 1 - armor = ARMOR_VALUE_MEDIUM + armor = ARMOR_VALUE_VEHICLE_MED max_integrity = 300 step_energy_drain = 0.5 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 583db4251ae..bff44cb7746 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -45,7 +45,7 @@ move_resist = MOVE_FORCE_EXTREMELY_STRONG light_range = 9 var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. - armor = ARMOR_VALUE_HEAVY + armor = ARMOR_VALUE_VEHICLE_MED var/list/facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.5) //var/obj/item/stock_parts/cell/cell var/obj/item/reagent_containers/fuel_tank/fuel_holder @@ -88,6 +88,8 @@ var/wreckage + var/passive_power_drain = 0 + var/canZmove = TRUE var/list/equipment = new @@ -471,9 +473,8 @@ var/lights_energy_drain = 2 use_power(lights_energy_drain) - var/obj/item/mecha_parts/mecha_equipment/MEP - if(istype(MEP, /obj/item/mecha_parts/mecha_equipment)) - use_power(MEP.passive_power_drain) + if(src.passive_power_drain) + use_power(passive_power_drain) //Diagnostic HUD updates diag_hud_set_mechhealth() diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index e396a73b87f..15ae4422953 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -30,6 +30,11 @@ if(!damage_amount) return 0 + if(attack_dir) + var/facing_modifier = get_armour_facing(abs(dir2angle(dir) - dir2angle(attack_dir))) + if(.) + . *= facing_modifier + /obj/mecha/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags) user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) playsound(loc, 'sound/weapons/tap.ogg', 40, 1, -1) From 2f243edf6635f6f189a4dc71fe635d07308bc9ef Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Wed, 2 Oct 2024 06:58:21 +1300 Subject: [PATCH 35/68] Oops --- code/game/mecha/equipment/tools/other_tools.dm | 3 +++ code/game/mecha/fallout/trucks.dm | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 1866f10bbb5..3e3bb313cca 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -149,6 +149,7 @@ /obj/item/mecha_parts/mecha_equipment/armor/attach(obj/mecha) . = ..() chassis.armor = chassis.armor.modifyRating(arglist(armor_mod)) + chassis.passive_power_drain += src.passive_power_drain /obj/item/mecha_parts/mecha_equipment/armor/detach(atom/moveto) @@ -156,6 +157,7 @@ for(var/armor_type in removed_armor) removed_armor[armor_type] = -removed_armor[armor_type] chassis.armor = chassis.armor.modifyRating(arglist(removed_armor)) + chassis.passive_power_drain -= src.passive_power_drain return ..() /obj/item/mecha_parts/mecha_equipment/armor/Destroy() @@ -163,6 +165,7 @@ for(var/armor_type in removed_armor) removed_armor[armor_type] = -removed_armor[armor_type] chassis.armor = chassis.armor.modifyRating(arglist(removed_armor)) + chassis.passive_power_drain -= src.passive_power_drain return ..() /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index 2f0b8cde175..a7ebff06852 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -9,7 +9,7 @@ pixel_y = -5 max_integrity = 6000 // TEST step_in = 1.2 - armor = ARMOR_VALUE_VEHICLE_MED + armor = ARMOR_VALUE_VEHICLE_MEDIUM step_energy_drain = 0.6 stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' @@ -86,7 +86,7 @@ max_integrity = 600 step_in = 1 step_energy_drain = 0.6 - armor = ARMOR_VALUE_VEHICLE_MED + armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/ncrtruck max_weapons_equip = 1 @@ -127,7 +127,7 @@ icon = 'icons/mecha/ambulance.dmi' icon_state = "ambulance" step_in = 1 - armor = ARMOR_VALUE_VEHICLE_MED + armor = ARMOR_VALUE_VEHICLE_MEDIUM max_integrity = 300 step_energy_drain = 0.5 From 5e75eded2ae65d61b03a13a887ea9bc70be50ae9 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Wed, 2 Oct 2024 07:01:51 +1300 Subject: [PATCH 36/68] New Line Rule --- code/datums/components/storage/concrete/trunk.dm | 2 +- code/game/mecha/mecha.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/components/storage/concrete/trunk.dm b/code/datums/components/storage/concrete/trunk.dm index babc0ea4553..00ed6b31e53 100644 --- a/code/datums/components/storage/concrete/trunk.dm +++ b/code/datums/components/storage/concrete/trunk.dm @@ -40,4 +40,4 @@ else for(var/i in taking) remove_from_storage(i, destination) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index bff44cb7746..932217af315 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -45,7 +45,7 @@ move_resist = MOVE_FORCE_EXTREMELY_STRONG light_range = 9 var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. - armor = ARMOR_VALUE_VEHICLE_MED + armor = ARMOR_VALUE_VEHICLE_MEDIUM var/list/facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.5) //var/obj/item/stock_parts/cell/cell var/obj/item/reagent_containers/fuel_tank/fuel_holder From 5cc6db09c238c49532a538e1a081f80b0147cf6b Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Wed, 2 Oct 2024 07:06:27 +1300 Subject: [PATCH 37/68] Update buggies.dm --- code/game/mecha/fallout/buggies.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/mecha/fallout/buggies.dm b/code/game/mecha/fallout/buggies.dm index dc99676c6c2..03440ca4a7e 100644 --- a/code/game/mecha/fallout/buggies.dm +++ b/code/game/mecha/fallout/buggies.dm @@ -78,6 +78,12 @@ icon = 'icons/mecha/buggy.dmi' icon_state = "buggyflame" +/obj/mecha/combat/phazon/buggy/flamme/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + //Buggy Ranger /obj/mecha/combat/phazon/buggy/ranger From 2e3934313ff3a3cf81f0a1d518aa28ad047d4a96 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Wed, 2 Oct 2024 07:07:29 +1300 Subject: [PATCH 38/68] Update buggies.dm --- code/game/mecha/fallout/buggies.dm | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/code/game/mecha/fallout/buggies.dm b/code/game/mecha/fallout/buggies.dm index 03440ca4a7e..8f138bcb2c5 100644 --- a/code/game/mecha/fallout/buggies.dm +++ b/code/game/mecha/fallout/buggies.dm @@ -62,6 +62,12 @@ icon = 'icons/mecha/buggy.dmi' icon_state = "buggydune" +/obj/mecha/combat/phazon/buggy/dune/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + //Buggyred /obj/mecha/combat/phazon/buggy/red @@ -70,6 +76,12 @@ icon = 'icons/mecha/buggy.dmi' icon_state = "buggyred" +/obj/mecha/combat/phazon/buggy/red/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + //Buggyflame /obj/mecha/combat/phazon/buggy/flamme @@ -93,6 +105,12 @@ icon_state = "hanlonbuggy" armor = ARMOR_VALUE_VEHICLE_MED_LIGHT +/obj/mecha/combat/phazon/buggy/ranger/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + //Buggy Ranger AND RICO /obj/mecha/combat/phazon/buggy/rangerarmed From 496d979ff48680a4ddb67a6bf120bd47d3495080 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Wed, 2 Oct 2024 07:13:45 +1300 Subject: [PATCH 39/68] lol --- code/game/mecha/fallout/trucks.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index a7ebff06852..997e999de2e 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -7,7 +7,7 @@ icon_state = "ncrtruck" pixel_x = -22 pixel_y = -5 - max_integrity = 6000 // TEST + max_integrity = 600 step_in = 1.2 armor = ARMOR_VALUE_VEHICLE_MEDIUM step_energy_drain = 0.6 @@ -20,8 +20,7 @@ max_utility_equip = 8 max_misc_equip = 1 - deflect_chance = 0 - internal_damage_threshold = 99 // test + internal_damage_threshold = 25 /obj/structure/mecha_wreckage/ncrtruck name = "\improper NCR Truck wreckage" From 8e5492901ce1c8074ca17a4da1ca68d53e572794 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Wed, 2 Oct 2024 10:26:20 +1300 Subject: [PATCH 40/68] Finally --- code/game/mecha/equipment/mecha_equipment.dm | 5 ++++- .../mecha/equipment/tools/fallout/utility_modules.dm | 5 +---- .../mecha/equipment/tools/fallout/vision_modules.dm | 4 ++-- code/game/mecha/equipment/tools/other_tools.dm | 11 ++++------- code/game/mecha/equipment/tools/work_tools.dm | 8 +++----- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index c61a96d5878..956b1e0ae07 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -26,7 +26,7 @@ //var/destroy_sound = 'sound/mecha/critdestr.ogg' var/equip_type = EQUIP_UTILITY var/detachable = TRUE - var/passive_power_drain = 0 + var/move_power_drain = 0 /obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page() if(chassis) @@ -44,6 +44,7 @@ /obj/item/mecha_parts/mecha_equipment/Destroy() if(chassis) chassis.equipment -= src + chassis.move_power_drain -= src.move_power_drain if(chassis.selected == src) chassis.selected = null src.update_chassis_page() @@ -146,6 +147,7 @@ M.utility_equipment += src has_equipped = 1 M.equipment += src + chassis.move_power_drain += src.move_power_drain chassis = M forceMove(M) M.mecha_log_message("[src] initialized.") @@ -160,6 +162,7 @@ moveto = moveto || get_turf(chassis) forceMove(moveto) chassis.equipment -= src + chassis.move_power_drain -= src.move_power_drain if(equip_type) switch(equip_type) if(EQUIP_MISC) diff --git a/code/game/mecha/equipment/tools/fallout/utility_modules.dm b/code/game/mecha/equipment/tools/fallout/utility_modules.dm index c43f02882db..d22b6a62a1e 100644 --- a/code/game/mecha/equipment/tools/fallout/utility_modules.dm +++ b/code/game/mecha/equipment/tools/fallout/utility_modules.dm @@ -5,8 +5,6 @@ equip_cooldown = 15 energy_drain = 10 tool_behaviour = null - attack_sentence = "You hear hydraulics." - attack_verbs = "lashes" detachable = FALSE /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/can_attach(obj/mecha/M as obj) @@ -16,9 +14,8 @@ return 1 /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/vehicle_straps - name = "tray securing kit" + name = "cargo securing kit" desc = "An assortment of cables and straps to secure heavy items on the back of a ute's tray." - icon_state = "vehicle_straps" equip_cooldown = 30 energy_drain = 0 tool_behaviour = null diff --git a/code/game/mecha/equipment/tools/fallout/vision_modules.dm b/code/game/mecha/equipment/tools/fallout/vision_modules.dm index 59b6c079a57..e9723938c5f 100644 --- a/code/game/mecha/equipment/tools/fallout/vision_modules.dm +++ b/code/game/mecha/equipment/tools/fallout/vision_modules.dm @@ -22,12 +22,12 @@ name = "vehicle meson scanner" desc = "A vehicle-mounted viewport that integrates night vision and a mesonic scanner." icon_state = "mecha_meson" - energy_drain = 100 vision_traits = list(TRAIT_MESON_VISION, TRAIT_NIGHT_VISION) + move_power_drain = 0.5 /obj/item/mecha_parts/mecha_equipment/vision/thermal_scanner name = "vehicle thermal scanner" desc = "A vehicle-mounted viewport that integrates night vision and a thermal camera." icon_state = "mecha_thermal" - energy_drain = 100 vision_traits = list(TRAIT_THERMAL_VISION, TRAIT_NIGHT_VISION) + move_power_drain = 1 diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 3e3bb313cca..942270b424a 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -143,13 +143,12 @@ energy_drain = 0 range = 0 selectable = 0 - passive_power_drain = 5 + move_power_drain = 1.5 var/list/armor_mod = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "fire" = 0, "acid" = 0) /obj/item/mecha_parts/mecha_equipment/armor/attach(obj/mecha) . = ..() chassis.armor = chassis.armor.modifyRating(arglist(armor_mod)) - chassis.passive_power_drain += src.passive_power_drain /obj/item/mecha_parts/mecha_equipment/armor/detach(atom/moveto) @@ -157,7 +156,6 @@ for(var/armor_type in removed_armor) removed_armor[armor_type] = -removed_armor[armor_type] chassis.armor = chassis.armor.modifyRating(arglist(removed_armor)) - chassis.passive_power_drain -= src.passive_power_drain return ..() /obj/item/mecha_parts/mecha_equipment/armor/Destroy() @@ -165,19 +163,18 @@ for(var/armor_type in removed_armor) removed_armor[armor_type] = -removed_armor[armor_type] chassis.armor = chassis.armor.modifyRating(arglist(removed_armor)) - chassis.passive_power_drain -= src.passive_power_drain return ..() /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. name = "armor booster module (Close Combat Weaponry)" - desc = "Boosts vehicle armor against armed melee attacks." + desc = "A large plate of hardened steel, can be attached to a vehicle to boost its defense at the cost of miles per gallon. The shape makes it only useful against melee attacks." icon_state = "mecha_abooster_ccw" armor_mod = list("melee" = 15, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "fire" = 0, "acid" = 0) - + move_power_drain = 1 /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster name = "armor booster module (Ranged Weaponry)" - desc = "Boosts vehicle armor against ranged attacks." + desc = "A large plate of hardened steel, can be attached to a vehicle to boost its defense at the cost of miles per gallon. The shape makes it only useful against ranged attacks." icon_state = "mecha_abooster_proj" armor_mod = list("melee" = 0, "bullet" = 15, "laser" = 10, "energy" = 5, "bomb" = 0, "bio" = 0, "fire" = 0, "acid" = 0) diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 00a897c379e..19ba1438c09 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -14,8 +14,6 @@ var/obj/mecha/working/ripley/cargo_holder harmful = TRUE mech_flags = EXOSUIT_MODULE_RIPLEY - var/attack_sentence = "You hear something crack." - var/attack_verbs = "squeezes" /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/mecha/working/ripley/M as obj) if(..()) @@ -81,9 +79,9 @@ return M.adjustOxyLoss(round(dam_force/2)) M.updatehealth() - target.visible_message(span_danger("[chassis] [attack_verb] [target]."), \ - span_userdanger("[chassis] [attack_verb] [target]."),\ - span_italic("[attack_sentence]")) + target.visible_message(span_danger("[chassis] slams [target]."), \ + span_userdanger("[chassis] slams [target]."),\ + span_italic("You hear hydraulics.")) log_combat(chassis.occupant, M, "attacked", "[name]", "(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") else step_away(M,chassis) From 324c6cd87f6a293731bba147baf0161a30b331d0 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Wed, 2 Oct 2024 17:41:33 +1300 Subject: [PATCH 41/68] Update mecha.dm --- code/game/mecha/mecha.dm | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 932217af315..12dca1a8958 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -88,7 +88,7 @@ var/wreckage - var/passive_power_drain = 0 + var/move_power_drain = 0 var/canZmove = TRUE @@ -473,9 +473,6 @@ var/lights_energy_drain = 2 use_power(lights_energy_drain) - if(src.passive_power_drain) - use_power(passive_power_drain) - //Diagnostic HUD updates diag_hud_set_mechhealth() diag_hud_set_mechcell() @@ -633,7 +630,7 @@ set_glide_size(DELAY_TO_GLIDE_SIZE(step_in)) move_result = mechstep(direction) if(move_result || loc != oldloc)// halfway done diagonal move still returns false - use_power(step_energy_drain) + use_power(step_energy_drain + move_power_drain) can_move = world.time + step_in return 1 return 0 @@ -741,7 +738,7 @@ if(prob(5)) if(ignore_threshold || obj_integrity*100/max_integrity < internal_damage_threshold) var/obj/item/mecha_parts/mecha_equipment/ME = safepick(equipment) - if(ME) + if(ME && ME.detachable) qdel(ME) return From 9d5fa3a7727986f5cc8a84268daf5f3a41bc7f74 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Thu, 3 Oct 2024 07:18:00 +1300 Subject: [PATCH 42/68] fix? --- code/game/mecha/equipment/mecha_equipment.dm | 4 ---- code/game/mecha/equipment/tools/fallout/vision_modules.dm | 2 -- code/game/mecha/equipment/tools/other_tools.dm | 6 +++++- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 956b1e0ae07..ae970337458 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -26,7 +26,6 @@ //var/destroy_sound = 'sound/mecha/critdestr.ogg' var/equip_type = EQUIP_UTILITY var/detachable = TRUE - var/move_power_drain = 0 /obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page() if(chassis) @@ -44,7 +43,6 @@ /obj/item/mecha_parts/mecha_equipment/Destroy() if(chassis) chassis.equipment -= src - chassis.move_power_drain -= src.move_power_drain if(chassis.selected == src) chassis.selected = null src.update_chassis_page() @@ -147,7 +145,6 @@ M.utility_equipment += src has_equipped = 1 M.equipment += src - chassis.move_power_drain += src.move_power_drain chassis = M forceMove(M) M.mecha_log_message("[src] initialized.") @@ -162,7 +159,6 @@ moveto = moveto || get_turf(chassis) forceMove(moveto) chassis.equipment -= src - chassis.move_power_drain -= src.move_power_drain if(equip_type) switch(equip_type) if(EQUIP_MISC) diff --git a/code/game/mecha/equipment/tools/fallout/vision_modules.dm b/code/game/mecha/equipment/tools/fallout/vision_modules.dm index e9723938c5f..8c7266c52e5 100644 --- a/code/game/mecha/equipment/tools/fallout/vision_modules.dm +++ b/code/game/mecha/equipment/tools/fallout/vision_modules.dm @@ -23,11 +23,9 @@ desc = "A vehicle-mounted viewport that integrates night vision and a mesonic scanner." icon_state = "mecha_meson" vision_traits = list(TRAIT_MESON_VISION, TRAIT_NIGHT_VISION) - move_power_drain = 0.5 /obj/item/mecha_parts/mecha_equipment/vision/thermal_scanner name = "vehicle thermal scanner" desc = "A vehicle-mounted viewport that integrates night vision and a thermal camera." icon_state = "mecha_thermal" vision_traits = list(TRAIT_THERMAL_VISION, TRAIT_NIGHT_VISION) - move_power_drain = 1 diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 942270b424a..0d479298fc9 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -143,12 +143,13 @@ energy_drain = 0 range = 0 selectable = 0 - move_power_drain = 1.5 var/list/armor_mod = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "fire" = 0, "acid" = 0) + var/move_power_drain = 1 /obj/item/mecha_parts/mecha_equipment/armor/attach(obj/mecha) . = ..() chassis.armor = chassis.armor.modifyRating(arglist(armor_mod)) + chassis.move_power_drain += src.move_power_drain /obj/item/mecha_parts/mecha_equipment/armor/detach(atom/moveto) @@ -156,6 +157,7 @@ for(var/armor_type in removed_armor) removed_armor[armor_type] = -removed_armor[armor_type] chassis.armor = chassis.armor.modifyRating(arglist(removed_armor)) + chassis.move_power_drain -= src.move_power_drain return ..() /obj/item/mecha_parts/mecha_equipment/armor/Destroy() @@ -163,6 +165,7 @@ for(var/armor_type in removed_armor) removed_armor[armor_type] = -removed_armor[armor_type] chassis.armor = chassis.armor.modifyRating(arglist(removed_armor)) + chassis.move_power_drain -= src.move_power_drain return ..() /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. @@ -177,6 +180,7 @@ desc = "A large plate of hardened steel, can be attached to a vehicle to boost its defense at the cost of miles per gallon. The shape makes it only useful against ranged attacks." icon_state = "mecha_abooster_proj" armor_mod = list("melee" = 0, "bullet" = 15, "laser" = 10, "energy" = 5, "bomb" = 0, "bio" = 0, "fire" = 0, "acid" = 0) + move_power_drain = 1.5 ////////////////////////////////// REPAIR DROID ////////////////////////////////////////////////// From 7dc466ba46540bdb840621edfd45d52c832f25e5 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Fri, 4 Oct 2024 12:20:46 +1300 Subject: [PATCH 43/68] Test, DNM --- .../crafting/recipes/vehicle_parts.dm | 42 ++++++++++++ code/game/mecha/fallout/armoured.dm | 60 ++++++++++++++++-- code/game/mecha/mecha.dm | 9 +++ icons/mecha/sherman.dmi | Bin 0 -> 2605 bytes 4 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 icons/mecha/sherman.dmi diff --git a/code/datums/components/crafting/recipes/vehicle_parts.dm b/code/datums/components/crafting/recipes/vehicle_parts.dm index 28a16a978c6..bce4be6eb56 100644 --- a/code/datums/components/crafting/recipes/vehicle_parts.dm +++ b/code/datums/components/crafting/recipes/vehicle_parts.dm @@ -40,6 +40,48 @@ category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS +// Le classic sherman tank + +/datum/crafting_recipe/sherman + name = "Sherman M4-CEM(X)" + result = /obj/mecha/combat/phazon/m4sherman_cemx + reqs = list(/obj/item/stack/sheet/metal = 75, + /obj/item/stack/sheet/plasteel = 50, + /obj/item/stack/sheet/mineral/titanium = 25, + /obj/item/stack/sheet/mineral/uranium = 15, + /obj/item/stack/sheet/mineral/diamond = 5, + /obj/item/stack/sheet/plastic = 15, + /obj/item/stack/crafting/metalparts = 15, + /obj/item/stack/crafting/goodparts = 10, + /obj/item/stack/crafting/electronicparts = 15, + /obj/item/advanced_crafting_components/alloys = 2 + ) + tools = list(TOOL_AWORKBENCH, TOOL_WELDER, TOOL_WRENCH) + time = 180 + category = CAT_VEHICLES + subcategory = CAT_VEHICLEPARTS + +// Jeep + +/datum/crafting_recipe/armoured_jeep + name = "armoured M8 jeep" + result = /obj/mecha/combat/phazon/armoured_jeep + reqs = list(/obj/item/stack/sheet/metal = 100, + /obj/item/stack/sheet/plasteel = 25, + /obj/item/stack/sheet/mineral/titanium = 15, + /obj/item/stack/sheet/mineral/uranium = 10, + /obj/item/stack/sheet/mineral/diamond = 3, + /obj/item/stack/sheet/plastic = 15, + /obj/item/stack/crafting/metalparts = 15, + /obj/item/stack/crafting/goodparts = 10, + /obj/item/stack/crafting/electronicparts = 5, + /obj/item/advanced_crafting_components/alloys = 2 + ) + tools = list(TOOL_AWORKBENCH, TOOL_WELDER, TOOL_WRENCH) + time = 180 + category = CAT_VEHICLES + subcategory = CAT_VEHICLEPARTS + //LMG /datum/crafting_recipe/gun/vehicle/lmg_improvised diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index fc696b93db9..14c8f3e3ed7 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -1,6 +1,6 @@ /obj/mecha/combat/phazon/armoured_jeep name = "\improper uparmored M38" - desc = "A apparently original M38 jeep, modified with a almost fully armored chassis." + desc = "A apparently original M38 jeep, modified with a almost fully armored chassis. Much of the interior space is occupied by advanced electronics designed to allow a single occupant to command, gun and drive at the same time." icon = 'icons/mecha/armoured_jeep.dmi' icon_state = "armoured_jeep" stepsound = 'sound/f13machines/buggy_loop.ogg' @@ -8,15 +8,15 @@ pixel_x = -7 pixel_y = -5 max_integrity = 500 - step_energy_drain = 1.5 + step_energy_drain = 1.25 step_in = 1.5 armor = ARMOR_VALUE_VEHICLE_ARMOURED wreckage = /obj/structure/mecha_wreckage/armoured_jeep - max_utility_equip = 2 + max_utility_equip = 3 max_weapons_equip = 1 max_misc_equip = 1 - - facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.85) + facing_modifiers = list(FRONT_ARMOUR = 1.25, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.85) + cramped_cabin = TRUE /obj/mecha/combat/phazon/buggy/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) @@ -48,3 +48,53 @@ ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid ME.attach(src) max_ammo() + +/obj/mecha/combat/phazon/m4sherman_cemx + name = "\improper Sherman M4-CEMX" + desc = "A authentic Sherman, this prototype model is part of the Compact Enhanced Mobility lineage and has been fitted with a quadruped propulsion system, the main 75mm cannon has been replaced with twin light sponsons, and much of the orignal armour has been removed. Much of the interior space is occupied by advanced electronics designed to allow a single occupant to command, gun and drive at the same time. The Sherman CEM(x) program was discontinued shortly after the creation of only a few prototypes for unknown reasons." + icon = 'icons/mecha/sherman.dmi' + icon_state = "sherman" + max_integrity = 700 // its a tank! + step_in = 3 // its a tank.. + step_energy_drain = 1.5 + armor = ARMOR_VALUE_VEHICLE_ARMOURED_HEAVY + wreckage = /obj/structure/mecha_wreckage/sherman + max_utility_equip = 2 + max_weapons_equip = 2 + max_misc_equip = 1 + facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.7) + cramped_cabin = TRUE + +/obj/mecha/combat/phazon/m4sherman_cemx/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + zoom_action.Grant(user, src) + +/obj/mecha/combat/phazon/m4sherman_cemx/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + zoom_action.Remove(user, src) + +/obj/mecha/combat/phazon/m4sherman_cemx/loaded/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/seat + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/rapid + max_ammo() + +/obj/structure/mecha_wreckage/sherman + name = "\improper sherman wreckage" + desc = "Wreckage of a sherman tank, it's completely destroyed." + icon = 'icons/mecha/sherman.dmi' + icon_state = "sherman-broken" diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 12dca1a8958..f5a9194c2ab 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -106,6 +106,7 @@ var/list/cargo = new var/cargo_capacity = 0 // for now, copy attributes from ripley so don't have to remap // lazy + var/cramped_cabin = FALSE /// a list of all vision traits to give to the occupant. var/list/vision_modes = list() @@ -958,6 +959,9 @@ if(user.has_buckled_mobs()) //mob attached to us to_chat(user, "You can't enter the exosuit with other creatures attached to you!") return + if(cramped_cabin && check_clothing()) + to_chat(user, "This vehicle's cabin is too cramped when you have a helmet or outer suit on!") + return visible_message("[user] starts to climb into [name].") @@ -1050,6 +1054,11 @@ grant_vision() return TRUE +/obj/mecha/proc/check_clothing(mob/living/carbon/human/user) + if(user.wear_suit && (user.wear_suit != src)) + return FALSE + return TRUE + /obj/mecha/container_resist(mob/living/user) if(occupant) occupant.SetSleeping(destruction_sleep_duration*2) diff --git a/icons/mecha/sherman.dmi b/icons/mecha/sherman.dmi new file mode 100644 index 0000000000000000000000000000000000000000..03b7cae749d40d66b1b846371938da112784c4ad GIT binary patch literal 2605 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 P00000NkvXXu0mjfg=EjS literal 0 HcmV?d00001 From 3c9fa28e928c34c4e7e5a95575058e6d5a19970a Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sat, 5 Oct 2024 06:17:56 +1300 Subject: [PATCH 44/68] Update mecha.dm --- code/game/mecha/mecha.dm | 9 --------- 1 file changed, 9 deletions(-) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f5a9194c2ab..12dca1a8958 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -106,7 +106,6 @@ var/list/cargo = new var/cargo_capacity = 0 // for now, copy attributes from ripley so don't have to remap // lazy - var/cramped_cabin = FALSE /// a list of all vision traits to give to the occupant. var/list/vision_modes = list() @@ -959,9 +958,6 @@ if(user.has_buckled_mobs()) //mob attached to us to_chat(user, "You can't enter the exosuit with other creatures attached to you!") return - if(cramped_cabin && check_clothing()) - to_chat(user, "This vehicle's cabin is too cramped when you have a helmet or outer suit on!") - return visible_message("[user] starts to climb into [name].") @@ -1054,11 +1050,6 @@ grant_vision() return TRUE -/obj/mecha/proc/check_clothing(mob/living/carbon/human/user) - if(user.wear_suit && (user.wear_suit != src)) - return FALSE - return TRUE - /obj/mecha/container_resist(mob/living/user) if(occupant) occupant.SetSleeping(destruction_sleep_duration*2) From d94691bef7b724374f346aa7babc393646ab2364 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sat, 5 Oct 2024 06:18:53 +1300 Subject: [PATCH 45/68] Er --- code/__DEFINES/armor.dm | 16 ++++++++-------- .../equipment/weapons/fallout/ballistics.dm | 1 - code/game/mecha/fallout/armoured.dm | 6 ++++-- .../projectiles/projectile/bullets/pistol.dm | 13 ++++++++++++- icons/mecha/sherman.dmi | Bin 2605 -> 2602 bytes 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/armor.dm b/code/__DEFINES/armor.dm index 49ac082282d..2319a523e4d 100644 --- a/code/__DEFINES/armor.dm +++ b/code/__DEFINES/armor.dm @@ -1154,11 +1154,11 @@ GLOBAL_LIST_INIT(all_armor_types, list( * 15mm+ RHA * * * * * * * * * * * */ -#define ARMOR_VALUE_VEHICLE_ARMOURED list(\ +#define ARMOR_VALUE_VEHICLE_ARMORED list(\ "melee" = 75, \ "bullet" = 50, \ - "laser" = 50, \ - "energy" = 25, \ + "laser" = 30, \ + "energy" = 20, \ "bomb" = 35, \ "bio" = 100, \ "rad" = 50, \ @@ -1173,11 +1173,11 @@ GLOBAL_LIST_INIT(all_armor_types, list( * 25mm+ RHA * * * * * * * * * * * */ -#define ARMOR_VALUE_VEHICLE_ARMOURED_HEAVY list(\ - "melee" = 85, \ - "bullet" = 65, \ - "laser" = 65, \ - "energy" = 40, \ +#define ARMOR_VALUE_VEHICLE_ARMORED_HEAVY list(\ + "melee" = 80, \ + "bullet" = 60, \ + "laser" = 50, \ + "energy" = 30, \ "bomb" = 50, \ "bio" = 100, \ "rad" = 100, \ diff --git a/code/game/mecha/equipment/weapons/fallout/ballistics.dm b/code/game/mecha/equipment/weapons/fallout/ballistics.dm index 5a51aefd273..6e857370187 100644 --- a/code/game/mecha/equipment/weapons/fallout/ballistics.dm +++ b/code/game/mecha/equipment/weapons/fallout/ballistics.dm @@ -154,7 +154,6 @@ var/obj/item/projectile/A = new projectile(curloc) A.firer = chassis.occupant A.original = target - A.damage = damage if(!A.suppressed && firing_effect_type) new firing_effect_type(get_turf(src), chassis.dir) diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index 14c8f3e3ed7..3efe8e0221e 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -10,7 +10,7 @@ max_integrity = 500 step_energy_drain = 1.25 step_in = 1.5 - armor = ARMOR_VALUE_VEHICLE_ARMOURED + armor = ARMOR_VALUE_VEHICLE_ARMORED wreckage = /obj/structure/mecha_wreckage/armoured_jeep max_utility_equip = 3 max_weapons_equip = 1 @@ -54,10 +54,12 @@ desc = "A authentic Sherman, this prototype model is part of the Compact Enhanced Mobility lineage and has been fitted with a quadruped propulsion system, the main 75mm cannon has been replaced with twin light sponsons, and much of the orignal armour has been removed. Much of the interior space is occupied by advanced electronics designed to allow a single occupant to command, gun and drive at the same time. The Sherman CEM(x) program was discontinued shortly after the creation of only a few prototypes for unknown reasons." icon = 'icons/mecha/sherman.dmi' icon_state = "sherman" + pixel_x = -8 + pixel_y = -4 max_integrity = 700 // its a tank! step_in = 3 // its a tank.. step_energy_drain = 1.5 - armor = ARMOR_VALUE_VEHICLE_ARMOURED_HEAVY + armor = ARMOR_VALUE_VEHICLE_ARMORED_HEAVY wreckage = /obj/structure/mecha_wreckage/sherman max_utility_equip = 2 max_weapons_equip = 2 diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm index b7f9e610188..dc5e54e0137 100644 --- a/code/modules/projectiles/projectile/bullets/pistol.dm +++ b/code/modules/projectiles/projectile/bullets/pistol.dm @@ -1257,8 +1257,10 @@ SOPORIFIC ROUND CODE // Tracer rounds! For vehicles. -/obj/item/projectile/bullet/c9mm/improvised/tracer +/obj/item/projectile/bullet/c9mm/tracer/minigun name = "9mm improvised tracer bullet" + damage = BULLET_DAMAGE_PISTOL_9MM_HANDLOAD + armour_penetration = 0.2 light_range = 3 light_power = 0.7 @@ -1270,3 +1272,12 @@ SOPORIFIC ROUND CODE light_range = 2 light_power = 0.5 light_color = "#FF7F01" + + +/obj/item/projectile/bullet/c9mm/improvised/tracer + name = "9mm tracer bullet" + + light_range = 2 + light_power = 0.5 + light_color = "#FF7F01" + diff --git a/icons/mecha/sherman.dmi b/icons/mecha/sherman.dmi index 03b7cae749d40d66b1b846371938da112784c4ad..f3f5d9fc78b4db43af5153e4e2ecf76027c591e2 100644 GIT binary patch delta 48 zcmV-00MGxe6si=EY5{zaYh)nJFGxjFY=~cRQc-?3Zsp1fu6{0HM*{%Bx;C%D Date: Sat, 5 Oct 2024 06:22:41 +1300 Subject: [PATCH 46/68] Update armoured.dm --- code/game/mecha/fallout/armoured.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index 3efe8e0221e..9c0e08e7e08 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -16,7 +16,6 @@ max_weapons_equip = 1 max_misc_equip = 1 facing_modifiers = list(FRONT_ARMOUR = 1.25, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.85) - cramped_cabin = TRUE /obj/mecha/combat/phazon/buggy/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) @@ -65,7 +64,6 @@ max_weapons_equip = 2 max_misc_equip = 1 facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.7) - cramped_cabin = TRUE /obj/mecha/combat/phazon/m4sherman_cemx/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) From a3d19fac64d8168624bf987591055c1ce9e90631 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sat, 5 Oct 2024 07:47:39 +1300 Subject: [PATCH 47/68] Balance --- code/game/mecha/combat/phazon.dm | 2 +- code/game/mecha/equipment/tools/other_tools.dm | 2 +- code/game/mecha/fallout/birds.dm | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index cc9cd39c3fa..4b3ed6d3ec3 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -6,7 +6,7 @@ dir_in = 2 //Facing South. step_energy_drain = 3 max_integrity = 200 - deflect_chance = 30 + deflect_chance = 5 armor = ARMOR_VALUE_HEAVY max_temperature = 25000 infra_luminosity = 3 diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 0d479298fc9..603f6c9881c 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -179,7 +179,7 @@ name = "armor booster module (Ranged Weaponry)" desc = "A large plate of hardened steel, can be attached to a vehicle to boost its defense at the cost of miles per gallon. The shape makes it only useful against ranged attacks." icon_state = "mecha_abooster_proj" - armor_mod = list("melee" = 0, "bullet" = 15, "laser" = 10, "energy" = 5, "bomb" = 0, "bio" = 0, "fire" = 0, "acid" = 0) + armor_mod = list("melee" = 0, "bullet" = 12.5, "laser" = 10, "energy" = 5, "bomb" = 0, "bio" = 0, "fire" = 0, "acid" = 0) move_power_drain = 1.5 ////////////////////////////////// REPAIR DROID ////////////////////////////////////////////////// diff --git a/code/game/mecha/fallout/birds.dm b/code/game/mecha/fallout/birds.dm index 6f14e590f2a..e63eeef1c39 100644 --- a/code/game/mecha/fallout/birds.dm +++ b/code/game/mecha/fallout/birds.dm @@ -16,6 +16,7 @@ wreckage = /obj/structure/mecha_wreckage/vertibird add_req_access = 1 internal_damage_threshold = 25 + deflect_chance = 30 max_utility_equip = 4 max_weapons_equip = 4 max_misc_equip = 2 From 0092368db7d3ce96c6f579c5945b576adfef6f34 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sat, 5 Oct 2024 07:47:49 +1300 Subject: [PATCH 48/68] Update trucks.dm --- code/game/mecha/fallout/trucks.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index 997e999de2e..a78d997609d 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -7,14 +7,13 @@ icon_state = "ncrtruck" pixel_x = -22 pixel_y = -5 - max_integrity = 600 + max_integrity = 300 step_in = 1.2 armor = ARMOR_VALUE_VEHICLE_MEDIUM step_energy_drain = 0.6 stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/ncrtruck - var/hides = 0 max_weapons_equip = 1 max_utility_equip = 8 From 1686e7ce0fa334b8a44acb301cfefe721f3e5d81 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sat, 5 Oct 2024 07:48:43 +1300 Subject: [PATCH 49/68] 400 --- code/game/mecha/fallout/trucks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index a78d997609d..01244c15e15 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -7,7 +7,7 @@ icon_state = "ncrtruck" pixel_x = -22 pixel_y = -5 - max_integrity = 300 + max_integrity = 400 step_in = 1.2 armor = ARMOR_VALUE_VEHICLE_MEDIUM step_energy_drain = 0.6 From 20cd7b1bfff9efc3b7186f5ba82955c695532ca1 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sat, 5 Oct 2024 13:40:11 +1300 Subject: [PATCH 50/68] Update trucks.dm --- code/game/mecha/fallout/trucks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index 01244c15e15..30aadc3bbab 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -81,7 +81,7 @@ desc = "A truck running on powercells. Nice eh ? still a wreck. This Truck has been given to the NCR MPs, the running gear has been improved." icon = 'icons/mecha/ncrtruck-mp.dmi' icon_state = "ncrtruck" - max_integrity = 600 + max_integrity = 400 step_in = 1 step_energy_drain = 0.6 armor = ARMOR_VALUE_VEHICLE_MEDIUM From 0215c305c575dc00e1e6aaee07d070520cf77379 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sat, 5 Oct 2024 19:29:36 +1300 Subject: [PATCH 51/68] Yes --- code/game/mecha/mecha_defense.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 15ae4422953..9b881f699b7 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -186,11 +186,13 @@ to_chat(user, span_notice("You undo the securing bolts.")) else if(state==2) state = 1 + move_resist = initial(move_resist) to_chat(user, span_notice("You tighten the securing bolts.")) return else if(istype(W, /obj/item/crowbar)) if(state==2) state = 3 + move_resist = MOVE_RESIST_DEFAULT to_chat(user, span_notice("You open the hatch to the power unit.")) else if(state==3) state=2 From 9945351c2f62216b50bd2e76a1bf6a561a7ba294 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sun, 6 Oct 2024 07:44:17 +1300 Subject: [PATCH 52/68] fixes --- code/game/mecha/fallout/armoured.dm | 4 ++-- code/game/mecha/fallout/pickuptrucks.dm | 26 ++++++++++++------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index 9c0e08e7e08..9c77cf5bba6 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -17,14 +17,14 @@ max_misc_equip = 1 facing_modifiers = list(FRONT_ARMOUR = 1.25, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.85) -/obj/mecha/combat/phazon/buggy/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/armoured_jeep/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/buggy/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/armoured_jeep/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index 7da59ff08cf..7721a20d7d0 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -151,37 +151,35 @@ var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13 ME.attach(src) -/obj/mecha/combat/phazon/pickuptruck/mechanic/go_out() +/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/go_out() ..() update_icon() -/obj/mecha/combat/phazon/pickuptruck/mechanic/moved_inside(mob/living/carbon/human/H) +/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/pickuptruck/mechanic/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/pickuptruck/mechanic/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/pickuptruck/mechanic/loaded/Initialize() +/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) //jeep @@ -205,29 +203,29 @@ max_utility_equip = 4 max_misc_equip = 1 -/obj/mecha/combat/phazon/jeep/go_out() +/obj/mecha/combat/phazon/pickuptruck/jeep/go_out() ..() update_icon() -/obj/mecha/combat/phazon/jeep/moved_inside(mob/living/carbon/human/H) +/obj/mecha/combat/phazon/pickuptruck/jeep/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/jeep/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/pickuptruck/jeep/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/jeep/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/pickuptruck/jeep/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/jeep/loaded/Initialize() +/obj/mecha/combat/phazon/pickuptruck/jeep/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -240,7 +238,7 @@ //jeep Enclave -/obj/mecha/combat/phazon/jeep/enclave +/obj/mecha/combat/phazon/pickuptruck/jeep/enclave name = "\improper pickup truck" desc = "A old military vehicule, runing on fuel., and recolored" icon = 'icons/mecha/jeepenclave.dmi' @@ -248,7 +246,7 @@ ///jeep BOS -/obj/mecha/combat/phazon/jeep/bos +/obj/mecha/combat/phazon/pickuptruck/jeep/bos name = "\improper pickup truck" desc = "A old military vehicule, runing on fuel, and recolored" icon = 'icons/mecha/jeepbos.dmi' From a6348a182abb633933c46a0581498106f9034885 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sun, 6 Oct 2024 07:58:24 +1300 Subject: [PATCH 53/68] Actual fixes (hopefully) --- code/game/mecha/fallout/pickuptrucks.dm | 28 ++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index 7721a20d7d0..3e44bfcd79c 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -125,7 +125,7 @@ //pickuptruck mechanic -/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck +/obj/mecha/combat/phazon/mechanic name = "\improper mechanic pickup truck" desc = "A old vehicule, with a crane runing on fuel." icon = 'icons/mecha/pickuptruck-mechanics.dmi' @@ -142,7 +142,7 @@ max_utility_equip = 6 max_misc_equip = 1 -/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/Initialize() +/obj/mecha/combat/phazon/mechanic/Initialize() . = ..() for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) E.detach() @@ -151,29 +151,29 @@ var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13 ME.attach(src) -/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/go_out() +/obj/mecha/combat/phazon/mechanic/go_out() ..() update_icon() -/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/moved_inside(mob/living/carbon/human/H) +/obj/mecha/combat/phazon/mechanic/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/mechanic/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/mechanic/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/pickuptruck/mechanics_pickuptruck/loaded/Initialize() +/obj/mecha/combat/phazon/mechanic/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -203,29 +203,29 @@ max_utility_equip = 4 max_misc_equip = 1 -/obj/mecha/combat/phazon/pickuptruck/jeep/go_out() +/obj/mecha/combat/phazon/jeep/go_out() ..() update_icon() -/obj/mecha/combat/phazon/pickuptruck/jeep/moved_inside(mob/living/carbon/human/H) +/obj/mecha/combat/phazon/jeep/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/pickuptruck/jeep/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/jeep/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/pickuptruck/jeep/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/jeep/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/pickuptruck/jeep/loaded/Initialize() +/obj/mecha/combat/phazon/jeep/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -238,7 +238,7 @@ //jeep Enclave -/obj/mecha/combat/phazon/pickuptruck/jeep/enclave +/obj/mecha/combat/phazon/jeep/enclave name = "\improper pickup truck" desc = "A old military vehicule, runing on fuel., and recolored" icon = 'icons/mecha/jeepenclave.dmi' @@ -246,7 +246,7 @@ ///jeep BOS -/obj/mecha/combat/phazon/pickuptruck/jeep/bos +/obj/mecha/combat/phazon/jeep/bos name = "\improper pickup truck" desc = "A old military vehicule, runing on fuel, and recolored" icon = 'icons/mecha/jeepbos.dmi' From 008e13c30a0c7e101d0d219f0b1a3bce6b03a6c2 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sun, 6 Oct 2024 08:05:34 +1300 Subject: [PATCH 54/68] Update pickuptrucks.dm --- code/game/mecha/fallout/pickuptrucks.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index 3e44bfcd79c..783e92d9561 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -125,7 +125,7 @@ //pickuptruck mechanic -/obj/mecha/combat/phazon/mechanic +/obj/mecha/combat/phazon/pickuptruck/mechanic name = "\improper mechanic pickup truck" desc = "A old vehicule, with a crane runing on fuel." icon = 'icons/mecha/pickuptruck-mechanics.dmi' @@ -142,7 +142,7 @@ max_utility_equip = 6 max_misc_equip = 1 -/obj/mecha/combat/phazon/mechanic/Initialize() +/obj/mecha/combat/phazon/pickuptruck/mechanic/Initialize() . = ..() for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) E.detach() @@ -151,29 +151,29 @@ var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13 ME.attach(src) -/obj/mecha/combat/phazon/mechanic/go_out() +/obj/mecha/combat/phazon/pickuptruck/mechanic/go_out() ..() update_icon() -/obj/mecha/combat/phazon/mechanic/moved_inside(mob/living/carbon/human/H) +/obj/mecha/combat/phazon/pickuptruck/mechanic/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/mechanic/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/pickuptruck/mechanic/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/mechanic/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/pickuptruck/mechanic/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/mechanic/loaded/Initialize() +/obj/mecha/combat/phazon/pickuptruck/mechanic/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat From 980ed2b541835dc5fd2945adadbed6b508c65093 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sun, 6 Oct 2024 09:26:05 +1300 Subject: [PATCH 55/68] Update carriages.dm --- code/game/mecha/fallout/carriages.dm | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/code/game/mecha/fallout/carriages.dm b/code/game/mecha/fallout/carriages.dm index 75900aa4fa7..46510f1c2bb 100644 --- a/code/game/mecha/fallout/carriages.dm +++ b/code/game/mecha/fallout/carriages.dm @@ -97,11 +97,30 @@ step_in = 1.6 step_energy_drain = 0.6 armor = ARMOR_VALUE_VEHICLE_HEAVY + stepsound = 'sound/effects/footstep/gallop2.ogg' + turnsound = 'sound/effects/footstep/gallop1.ogg' + wreckage = /obj/structure/mecha_wreckage/fallout max_utility_equip = 4 max_weapons_equip = 1 max_misc_equip = 1 +/obj/mecha/combat/phazon/truckcaravan/GrantActions(mob/living/user, human_occupant = 0) + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) + smoke_action.Grant(user, src) + +/obj/mecha/combat/phazon/truckcaravan/RemoveActions(mob/living/user, human_occupant = 0) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) + smoke_action.Remove(user) + /obj/mecha/combat/phazon/truckcaravan/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new From d75a60d740b9376b49c2597710ade5739eb1eced Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sun, 6 Oct 2024 13:28:48 +1300 Subject: [PATCH 56/68] comments out armored vehicles, adds/changes a few other things --- .../crafting/recipes/vehicle_parts.dm | 38 ++++++++++++++++-- .../equipment/weapons/fallout/ballistics.dm | 21 +++++++++- .../mecha/equipment/weapons/mecha_ammo.dm | 8 ++++ code/game/mecha/fallout/armoured.dm | 26 +++++++----- code/game/mecha/fallout/carriages.dm | 2 + .../projectiles/projectile/bullets/special.dm | 28 +++++++++++-- icons/fallout/objects/guns/projectiles.dmi | Bin 1370 -> 1444 bytes icons/mecha/mecha_ammo.dmi | Bin 1031 -> 1106 bytes icons/mecha/mecha_equipment.dmi | Bin 24679 -> 25030 bytes sound/mecha/tanktracks.mp3 | Bin 0 -> 30093 bytes 10 files changed, 105 insertions(+), 18 deletions(-) create mode 100644 sound/mecha/tanktracks.mp3 diff --git a/code/datums/components/crafting/recipes/vehicle_parts.dm b/code/datums/components/crafting/recipes/vehicle_parts.dm index bce4be6eb56..da8de9d9702 100644 --- a/code/datums/components/crafting/recipes/vehicle_parts.dm +++ b/code/datums/components/crafting/recipes/vehicle_parts.dm @@ -41,10 +41,10 @@ subcategory = CAT_VEHICLEPARTS // Le classic sherman tank - +/* /datum/crafting_recipe/sherman - name = "Sherman M4-CEM(X)" - result = /obj/mecha/combat/phazon/m4sherman_cemx + name = "Sherman M4-C(X)" + result = /obj/mecha/combat/phazon/m4sherman_cx reqs = list(/obj/item/stack/sheet/metal = 75, /obj/item/stack/sheet/plasteel = 50, /obj/item/stack/sheet/mineral/titanium = 25, @@ -81,7 +81,7 @@ time = 180 category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS - +*/ //LMG /datum/crafting_recipe/gun/vehicle/lmg_improvised @@ -166,6 +166,36 @@ category = CAT_VEHICLES subcategory = CAT_VEHICLEPARTS +// Autocannon & ammo +/* + +/datum/crafting_recipe/gun/vehicle/cannon + name = "Vehicular minicannon" + result = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minicannon + reqs = list(/obj/item/stack/sheet/plasteel = 15, + /obj/item/stack/crafting/metalparts = 10, + /obj/item/stack/crafting/goodparts = 5, + /obj/item/stack/sheet/prewar = 5, + /obj/item/stack/sheet/mineral/titanium = 10, + /obj/item/stack/rods = 10) + tools = list(TOOL_WORKBENCH) + time = 180 + category = CAT_VEHICLES + subcategory = CAT_VEHICLEPARTS + +/datum/crafting_recipe/mech_ammo/cannon_ammo + name = "Vehicular Minicannon ammunition" + result = /obj/item/mecha_ammo/cannon + reqs = list(/obj/item/stack/crafting/metalparts = 5, + /obj/item/stack/sheet/metal = 5, + /obj/item/stack/sheet/mineral/titanium = 5, + /obj/item/stack/ore/blackpowder = 5) + tools = list(TOOL_AWORKBENCH) + time = 5 + category = CAT_VEHICLES + subcategory = CAT_VEHICLEPARTS + +*/ // Pneumatic launcher /datum/crafting_recipe/gun/PheumonicLauncherVehicle diff --git a/code/game/mecha/equipment/weapons/fallout/ballistics.dm b/code/game/mecha/equipment/weapons/fallout/ballistics.dm index 6e857370187..1c2e7c859f5 100644 --- a/code/game/mecha/equipment/weapons/fallout/ballistics.dm +++ b/code/game/mecha/equipment/weapons/fallout/ballistics.dm @@ -34,7 +34,7 @@ name = "\improper Rapid-fire vehicular shotgun" desc = "A rapid-fire shotgun fitted for mounting on a combat vehicle, fires fewer heavy pellets, but faster." icon_state = "vehicle_scatter_rapid" - fire_sound = 'sound/weapons/sound_weapons_mech_mortar.ogg' + fire_sound = 'sound/weapons/sound_weapons_mech_shotgun.ogg' equip_cooldown = 8 projectile = /obj/item/projectile/bullet/pellet/shotgun_trainshot/tracer projectiles = 40 @@ -100,6 +100,25 @@ harmful = TRUE ammo_type = "lmg" +// Vehicular minicannon! + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minicannon + name = "\improper Vehicular Minicannon" + desc = "A small, semi-automatic cannon, adapted for combat vehicles." + icon_state = "vehicle_autocannon" + fire_sound = 'sound/weapons/sound_weapons_mech_mortar.ogg' + equip_cooldown = 30 + projectile = /obj/item/projectile/rock/cannonball + projectiles = 3 + projectiles_cache = 0 + projectiles_cache_max = 0 + projectiles_per_shot = 1 + variance = 6 + is_automatic = TRUE + randomspread = 1.2 + harmful = TRUE + ammo_type = "cannon" + // Minigun! /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minigun diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/game/mecha/equipment/weapons/mecha_ammo.dm index c544794e8c8..c8a75bbe5a2 100644 --- a/code/game/mecha/equipment/weapons/mecha_ammo.dm +++ b/code/game/mecha/equipment/weapons/mecha_ammo.dm @@ -113,3 +113,11 @@ icon_state = "minigun" rounds = 600 ammo_type = "minigun" + +/obj/item/mecha_ammo/cannon + name = "Cannon ammo pack" + desc = "A handful of cannon balls, for use with a vehicle's cannon." + icon_state = "cannon" + rounds = 1 + ammo_type = "cannon" + direct_load = TRUE diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index 9c77cf5bba6..000f5943b01 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -5,6 +5,8 @@ icon_state = "armoured_jeep" stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' + can_be_locked = FALSE + enter_delay = 30 pixel_x = -7 pixel_y = -5 max_integrity = 500 @@ -15,7 +17,7 @@ max_utility_equip = 3 max_weapons_equip = 1 max_misc_equip = 1 - facing_modifiers = list(FRONT_ARMOUR = 1.25, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.85) + facing_modifiers = list(FRONT_ARMOUR = 1.25, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.6) /obj/mecha/combat/phazon/armoured_jeep/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) @@ -48,24 +50,28 @@ ME.attach(src) max_ammo() -/obj/mecha/combat/phazon/m4sherman_cemx - name = "\improper Sherman M4-CEMX" - desc = "A authentic Sherman, this prototype model is part of the Compact Enhanced Mobility lineage and has been fitted with a quadruped propulsion system, the main 75mm cannon has been replaced with twin light sponsons, and much of the orignal armour has been removed. Much of the interior space is occupied by advanced electronics designed to allow a single occupant to command, gun and drive at the same time. The Sherman CEM(x) program was discontinued shortly after the creation of only a few prototypes for unknown reasons." +/obj/mecha/combat/phazon/m4sherman_cx + name = "\improper West-Tek Sherman M4-CX" + desc = "A authentic Sherman, this one is a Pre-War prototype designed by Wesk-Tek to explore the practicality of a significantly downsized tank platform. The 75mm cannon has been replaced by two light, modular weapons sponsons and the cast steel hull has been replaced by a much thinner composite to save on weight and volume. The program was cancelled due to a lack of funding and failure to meet objectives before the War, but the schematics are occasionally still found in the wasteland." icon = 'icons/mecha/sherman.dmi' icon_state = "sherman" + stepsound = 'sound/mecha/tanktracks.mp3' + turnsound = 'sound/mecha/tanktracks.mp3' + can_be_locked = FALSE + enter_delay = 50 pixel_x = -8 pixel_y = -4 - max_integrity = 700 // its a tank! - step_in = 3 // its a tank.. + max_integrity = 600 // its a tank! + step_in = 3 step_energy_drain = 1.5 armor = ARMOR_VALUE_VEHICLE_ARMORED_HEAVY wreckage = /obj/structure/mecha_wreckage/sherman max_utility_equip = 2 max_weapons_equip = 2 max_misc_equip = 1 - facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.7) + facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.6) -/obj/mecha/combat/phazon/m4sherman_cemx/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/m4sherman_cx/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) @@ -73,7 +79,7 @@ klaxon_action.Grant(user, src) zoom_action.Grant(user, src) -/obj/mecha/combat/phazon/m4sherman_cemx/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/combat/phazon/m4sherman_cx/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) @@ -81,7 +87,7 @@ klaxon_action.Remove(user) zoom_action.Remove(user, src) -/obj/mecha/combat/phazon/m4sherman_cemx/loaded/Initialize() +/obj/mecha/combat/phazon/m4sherman_cx/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat diff --git a/code/game/mecha/fallout/carriages.dm b/code/game/mecha/fallout/carriages.dm index 46510f1c2bb..d77ae28d7fb 100644 --- a/code/game/mecha/fallout/carriages.dm +++ b/code/game/mecha/fallout/carriages.dm @@ -54,6 +54,8 @@ desc = "A light vehicle, not very powerfull or solid, running on a power cell... Okay, its a lie. Its actually run on power generated by the horse...The cell is here to make sure that some componant of the half buggy pulled by horses works. This one as been recolored by the legions... And Prime Decanus Messala ''Gunner'' Davius is gonna shoot with his shotgun." icon = 'icons/mecha/buggy-legiongun.dmi' icon_state = "legiongun" + stepsound = 'sound/effects/footstep/gallop2.ogg' + turnsound = 'sound/effects/footstep/gallop1.ogg' max_integrity = 250 step_energy_drain = 0.6 step_in = 1.2 diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index fb84573b1ce..3de2161048a 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -6,7 +6,7 @@ stamina = BULLET_STAMINA_PISTOL_10MM spread = BULLET_SPREAD_SURPLUS recoil = BULLET_RECOIL_PISTOL_10MM - + pixels_per_second = BULLET_SPEED_PISTOL_22 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -26,7 +26,7 @@ stamina = BULLET_STAMINA_PISTOL_44 spread = BULLET_SPREAD_SURPLUS recoil = BULLET_RECOIL_PISTOL_44 - + pixels_per_second = BULLET_SPEED_PISTOL_22 damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -63,7 +63,7 @@ spread = -15 // shockingly accurate recoil = BULLET_RECOIL_FLINTLOCK wound_bonus = BULLET_WOUND_FLINTLOCK - + pixels_per_second = BULLET_SPEED_FLINTLOCK damage_falloff = BULLET_FALLOFF_DEFAULT_PISTOL_LIGHT @@ -87,3 +87,25 @@ flag = "bullet" hitsound_wall = "ricochet" impact_effect_type = /obj/effect/temp_visual/impact_effect + +/obj/item/projectile/rock/cannonball + name = "iron cannon ball" + icon = 'icons/fallout/objects/guns/projectiles.dmi' + icon_state = "cannon" + damage = 70 + armour_penetration = -0.2 + sharpness = SHARP_NONE + var/sturdy = list( + /turf/closed, + /obj/mecha, + /obj/machinery/door, + /obj/structure + ) + +/obj/item/projectile/rock/cannonball/on_hit(atom/target, blocked=0) + ..() + for(var/i in sturdy) + if(istype(target, i)) + explosion(target, 0, 1, 1, 2) + return BULLET_ACT_HIT + new /obj/item/broken_missile(get_turf(src), 1) diff --git a/icons/fallout/objects/guns/projectiles.dmi b/icons/fallout/objects/guns/projectiles.dmi index 6e3b258642b8b667db825d26cb1e6413168e089f..189d32ac35cb4a81799a2a6472b9aa369d6b7cb8 100644 GIT binary patch delta 1215 zcmV;w1VH=R3Zx5=Bmq&8B}ODPDC3MV zh4DpjVZOgD=E3kBviSe?_VuAO?jqQjrg_F$YubPIQG(yQ*oa-cG=O5$s0~;dK(TGF z8<5YzJi*4SJJTWe9Rv6`ZEt#Xf6ovI-qOX(u6tQC11U;PurK8puKND9Wd>3V+hAY) zu-=h_jp^3Qmu@Y0an$N*Sp5PKV4`|>B3PTv9&5WQN!Shu2lVB4I31kS( zZ7d{^;r(^8qN1XrqN1Xr;sTq}1QcxEX3nrUL95t@?eJfCK#agvnxMt>$`dqBu@@#7 zqep<{u-z68Az?EI5D;|Q?cw>PUIXCLFcyCw!2ukk5T0{)7?cq2P&0^d189VW1`#x= zVdVJ&a0Pke5d+VVt#0(zfffwT4%Q3qV+gIY+mNS>O{S#pyniQVAo*aMr=83I5-@rL zIQ%wn3mms^*OLwzcK_~4?&N5fpRaTwN&%b32)6)4kYW#dIm?Md>`??2f^ZPo)B=Bp za*!hw{L2j3>QNWrG9q$2VdNG#Jc@Vd{_uP_g49B+7IF;~3kkeJsgv4N_BgkH1cjiw zn3x>5ECz~F)Cg(|+R0ITNv~n{1ZTgktf;7{`1P23p`QIzHv@vtt*EEQ`1vBBG(j`- z2vQ6m+W3^#|1^PYa{Z5Y&AfL8S*CyPi*X1wZIAtj-TNq97gQUUjQPzClefI@eo+78 z)Nl?d2f@D&Pj^=%akDv#O4g5Q@1Lc}H+u&aUMwCN=d=3Xg?|phbvJF^-nM5^$%3un z$Ppk92zpU|qmw*IIrZw&zhnP&m1CDJi2U+d2ngKJ08Sno#i48c@4|mlr}BRaR?LB9 z&O_J#a0>X4#IpVu{euoNmkM?^gu4DG5292+$w3V|ba7}PDkM-JQ}sVohA37LRmInT zivZB{zZ-t(m>6muR;I$qq0hC2L#Pl`mt&J-_7R-Hk{)CB1ZTgktf;7{`1L4VsI{rS z@KonMUnG>Di)81(I85J9d-Q=48mi|L6C%M89}BS^*>aMQVxQf z)$@P2kUuZHg&c$z+@k+Y3e>*=%3P~1CML%X1j|BQtrR{$sVwRBEy3i__8g@}{PNq% dii+9cFYFyf!~EhliU11$002ovPDHLkV1gwvPtpJY delta 1140 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 diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi index 3ec0225ef0ae31432a63ff136814df7d017c1ba8..494c239daf8bb6a513189022cfe32c84bf59e5ca 100644 GIT binary patch delta 5803 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 delta 5449 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 diff --git a/sound/mecha/tanktracks.mp3 b/sound/mecha/tanktracks.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b445f0043c5ca3b09b17b91ed9b2a1ec111fe8e1 GIT binary patch literal 30093 zcmb5VcT`i~*7qAAK!5-tw9s2ZFQIp&_uixnp;zf$4ZZhXCG;*;0YT}#Hw6*tQWX#d zLG=1N=iEEq``l+d_kHIW8GEh0*B^V0ujvJt zrUo32%K%umNO1g%Pp!qftAuD{oOC!=Eo8u(17F_5lpxYJpPeAmu0E22Lx5NSF@nU2g_kL?Mtx5C2y7q-LO9}ZxKN>*Lc@wBkNJCpMRL|pHHB6L1Y!Qy zf`tk%zd{k0zq3e46lh__-({h~^Y1!XGz-w>L-A+H8EhZ~0Kg&rYkgFz zCj3?y>1Eq;2Iyk}AXwupQS(-i5meuE&o~wd4m_o3TvTgjqf3}<*0K0?-=~_1_k{#y zSL9Lh^GX!pW||eYhte3i(5H{BZLB&;W7ZKhlZuUW{xP$=SHVSGl`?p?nX~9?|TE@ zw!dBZZO@bU>dR|BX9&B|^H1&fQ_o)fddBqb!>gZ{xq-2w&;NY=^C$H0=g-OYpR^Oc z-Y2hsgS5~#t2s@!z|Ni_? zv+ZK3sIF2KV;+6~fwe)j*f^s~0HJkL@UW^--89TdUPqFK+_@l#$t;<|aUfrQ0AK)v zVEu46{$A_YCM9E!H8KK7<1kPlpknajG2iZ6tJCTuqd_y@*!6i+mE1mCX}T_$y?*fP z9eJHa$Rn->ro8K-sf*3-)Qe9-n?K3iv;FjUCwTL{OT|zAT>tv?^>VZQ&(Qb#n7|AR+dTL3ddrKL_LibjdN7aI}HKGSLX;ZiK$QS{~ZKDS@>s4;iTy)WV?M(eFHUXDgQE0U?R6KGOWP zCV1&YC8FC-#>dm!XZ6tp@!(W!jfZw#SRG2UD)t&GE`y3b8fCCow!3@~T9pEYi&6gQ zZAhr527atEU$(v;6?EiGwNfBKtRD$v7a#V9fWhF5X4DUvYj<{_}H z-CZ#v|C!Wr88=)NCY{mYfuUp7HoN0Edl*{8*Qlc$x(+2R%I9i1-a02wLvEFft0K}G zi3>}#uO0vVcBp&4Ba!R8D?R@g=UsJhHgj)h9_5|bc48_(fl z7qbzzHje$=kKIlb8RhRFU{L@i+|*(3ykzfR&&?rG5IiElNQ5wHPbL!2ihQYIe*>5G z8;iF}1GpjsvEDDnCY)2^5k-&8>2sr;v?j=-Z5QPtl}E;-*z?VDAjT(IzJeO(`QRr$ z8gEZC-c*3dSeNGc*eYG7^JQ+dqZe3qkE-Pziq{6#;qoLIuW$DYWj3!IcB+Sf%nSxv z3XvS_%+=))Xkat|`=4X)ulUW@t2|t*%!TI^k7^?lu-~|le^5wOyIZnC`P4UVL-K)zY zCt7_}H}&PtGN!^ESbO*8Y2$k3oq6O>(-(!ovs(hAMw{#;_$gq$z#rvoLVKPFA{ zee*CtizzO8HIJZ`w3QDYox%w)4Dt(gl+F4^MTjh0fQ6E;Cqmzceu$dSjvj$ynxzlE z=)MLMBnTH!XmTat23b>)V+lIS(FZ#*Q>X2lwfgk5+5b>4$U?PUbs?V;xPLx%!_qnK`wwiRMSF z6p)v*UdK0_v8RS30vteqE+=1QY02eg=hG9tVxj#0i;A&jru58dj*;)5TPg$hLeL1# zFGB0XAL?B7T{+t}`kQE^7;-2>sg@`Z!iT-@$uVG|>r1VypFG*E-5yfM;~4e#KJ=n| zrx1W37H zX8wa`dR@9qU!f(zp@!X&wE5QAoU($rq7+~NoEh*p`1#+ke>1dyX}v^OXm{C{w4UXe z_V>gH)AbY-SNtKsos!q~9)Mk3?91#NYXC9sNBfaSqgj}@XjRHDBVpU409N8=J6m3c zr*JJ51v-nQwtxy|Z^Su{+9<`+_V7Ldhw2@$xsaP%UWSW|Kz)v!o`FRsH2G~nP=G8| zDHDBzX|K8{FE_i$32q)0EHjTUew$`ZIwwEI)lQtVI&+)3azgWz()&5^H^N*KlW-H{ z?eg1zV$)Xr4H*X_#+srX#E4C>&Lib$5&nC6dS?E8R1x~Ld}^Akc6~p1P2&RNUJC#~ zONBtYa{RQkki^Q#pW|Jp_W~|R2k0nR&)_AITD=IU@oFgKJGUaXc zJMTE6hAxgQ1DPp08f~AhrZtkPJ7w50TlpJH%4i!APO5ENROm>@*yK@TF#4ZA*wj5? zX!l~|)O)%TXeFC#bmIJinjZDovs%nJgb~qn#`|g0yKA98n*EHk`71?Q{DHHV!j#tL zLa2Cw$Hw{Br5-D8V?`cmdxv|*Y)jH=3u48v(yj2Zk96oPQ-=alrlvc#@s z`i&#)ZV3x~mSKb8bwcszL{vE9^L(e_QuLLXE>c|%lWk!)mRQ)jG?G2a3{}_-UegU$ zx1H&_P(Ze7VupD>*kql|X_)F7GvZSXi|+7JiD@RElXov|w)X(ni!UI7RWA21b4{D-AZiVqfnr7plj7Jvg(6n zSVSH{x{#rje%(zus@g|nF%dJx1)0P)3@a@~-BA%Uzq?A86C|>7c3(U#X^t@VG>}HA z|54wHc%Am@u3Vbq!;!c^37=}DWdcp;D8lyVVrvJsp#)RD{BG+?=hy20>TCWdl>Qyd z?N`_s7isJ25AaM@xPxtAvSIq3+q;8*{xVe4mJa}AZ7izE@-H3HYnCgcG>PJg$gz0` zOhUZTXf220C7mbPZ_jINOt)q@Mh+*{#a~dESV>~+xCeN8XG+ZrHNu;|=i#s{0B?GB zST*uX*Bm9@khkB;_t9)0yb1TVw23nF7`E~7_tl2eyf9*5Rke|@8+Wp{B>01=srL*7 zy-)a_`PRwF$>)u;m|H)c@HqFGiKdo%z5A{nFBtz?@l`qCyNK+)rlRwm$QVRW)dbYx zngsx0apN`?w|I~-X9r_kP)f`q^bYd=!;Av3{=8801!?!bLY7%t%_|9gPI9Z@?frVI zt5r=4qvm-8Eab@02Rd|ojOWVYZ_fHX??s!^Ib?H&8RT{DZiQK{9ZSRR3E>ZhP z^;No3#uZfCx082c^~iHdS@#~BKxq*wa0(%p}Lh#WQii54otE=CN(1(sn11O z&u9vwnPUoS6IEe|+nf(Z*}X=Hk1rKt8=Dw5GkQwI$%r|SzdRTaDck+1Y{zc7X1;Vw ze3TfkP1ns{i|NIi`%CY~1u4Lh)I=EZf<((3sLLq*P`;?Ar)_hcs zRrHda`#$sbvXVyb8wS*cksq0}@`(+^7?0yv>%ro9rKP50qe~;h3H{DmZMK}f9s~VXO zNroT4kuvAKIr8#};2f1>^w!0Q?!RDs9>1UI;VFTu8opYipy!u)cltI6+4zPK^PQSK zZe!HK%*WU7di*QSG~+6Dg2bz|E0At-D92d*Y1-;j;C#~l`!42)?bl3{3paUZSw$Zqb`OH za;Uw6JeCt{oIMU6CmUFd|0@_o%>JCx>(O*I{j)W?#0@*`k;)~xFGYSDj_fA1Q12)H zU6s0;CvtQkAOF}I-i+wpmv-@+st+9599N0_es0I@m&(dTC^ zk~_olN+OPzb4LWE-%{akb-KHo(Eu#3-PMY2!{5RKEXk1&k~$;IV>Fhn%1xZ3I;x#k zk-LdnVZiQ7;!zMILeNw_BpbrWixpZFh}ZovNN(XX3rf7`eVmU7G8HRO1nPcfq9pMA zXMp<{*3Rl&0e^qtT;7~Mqo-k24Il<=|8Y+||Ml9eO2%k%eWw&1m!0b45If&?qjkxQ ziO+YpA*)H1da{c>`!=&30}*SWPV%aO{;_0i=e<;yu}+lX%N8h91z zj6_Fr9o*=eRbJY(c8+iQEAf}TDa(GyXk20;@?M>{493LRd)H}r_UXoedvIV$9 zEsh1iOuPrdj=88RFXo0VS%3RmNmA(iGEbYzAqp`s?(F8}OwOOr{h^{4nQzh}%vF?> zx<$2oOkk&6_;Ac2)NRmpipL$eWvkdpRd1YW)M7ee^CB&(e4aSG{!;W<^kw4y;rf&B zNt33*uOI7hLWVKRpPOl<&&K%e1Lmx+Q&89WRyJ$`LCu#}96$#(v`Zf7P^y-%T3h5O z)_{;gpdfk^ln}EkC~>1e%vbf!2x4R)-;b>b!1|xu&;Rr6Ke1f5#S)!|PFu&+WQFTd z2Q6igvX^7Z5QzX+N^h$K0GqC3vIm@dBUz~`;)uJWxIKxHzp!WKbOHIe^L)bvqC8`I zgt2UuZ$k?zkLTl<)s6-pY5H!%Gz_W|aRJXK&q2SJ@e-zvbqic>UiK$Di%Ido5R!uN z2k1VHx*S*+|H?8r{f7P8j3^`0zXM76g389$zt%g|&W`Qs1e z&2mC`IsqTTw4R$PK2i2w2x&? zn1-<$)}B+~-K9~gUAbYmpf6(TJBzt*Q@-i;Y>pW&=uBhf;W+UxsG>Pp5uM=doZ!A`68vR(iU)EbJq2Z{CQM}+8PzUi8qw=9l#Rx@ zN`Y%E(NZ&Ov6yPdJ1l1_w|9sn3SA@;N~Fh0?x*(taTg>~pT6qk zy^m4~ro(J`tB$h`yWti86&+c+SDlmD3o2m_>8()!Ct1RLG?I`e2cQA8E1Q?7hDe2A zVPVS;poP#Vm1XsSZ#=QN41%9>W@nZG8d&I2Jzk61yvql|ITO@QiT+DAuQZ-NimUyY zlYcQx`>O}f$sm}0*$w_%DED0^dViP|3tm|45t!j}U<{seR;ePT7h&zh(RfT?YDDR! z9<_oI90}IDn2M^Z-}(`clgCtR$OGZH(|9RSjrd`ff7_;%L3t1K?t!hz&gF*X<_1a=r0N+ zM4}Cl4yuMMCP=20r?Q9MfVn5}NfTccx!z=sw9R}-hAyz=nnVK7%2whI`DOkNV9xJE z#q`=<%aly3GEFs9B@;G;9OajqvP>jA#xC7MxE@fgR%BoS(4VUX-LlshrlUsC@YP+a z92l3VyUf0sUE&}a(y%z&;Wlv;DuNhP98FY>fc3sHuy9PLXPeUH4-FEZR1s!{d(mew zXe;Qb-~b3ffWHFve`o(;sKv&pDA?}&jaFjTW3Y`mLx|=-46zBg5%&sq0V0ihm#g*8 z5M40&wNwJMiZ(rh<|tN+mSjm5Atc5U#Tf_7VePikmk$3WV<46Vp03MyX83;eFh%Vb zD|BApI4#@EvoZ%oOP@+qaG?;Qpgs_C(&Tp&tjz_JV;kWyq~|qaY8;oWujtUH(Ml>c zl^ILifeyFhzn3*&D0O|j=4gh3tFh{1k&K>k-%XR~az%WJJ%*m{K2gkEA&OpoqJ4I7 zu08v9i~|>SlasN}S>i>dYYzY7HkwZeV;8@D&`)EVcr7ew{`aM6#g&KYpFZwiPbtWoI zgOvgWEoGwfRk#EzKgYUlL;yW6bygorNw-N3%D@d<7Z*E9Po^9W9;|W<$_(%>RZD!1 zb1}L;vPLwX$~uwcwS;qgT@KIN97)p*`$~(J*b222Wmq8Jji3lB_{SoK$`v9b(Ey;Q zFy;A7auiL{v=k|_)|?ouFTp~Zj|KtoVPJZz06bOiF1|tx^p75ug>n&7Z~@!!+**7K zOg~$y6+ZE*lR^#1iZl7hoWi?d)n$F9M*mfWGPlV=27AE2Wpb!A)zjE|%hGIq@ zEz{}g^jB+5UOOJSz#^Wg>+B~jNej5nRCDA5pvAq{m6CIV734YHi6!Q>HXw?|!tTQ0gdwQpB)KAzN(F3fer9lA$}C_54qg^X)9DP#D?c7`J3_w5ViFalz3Q)`}CX{db;K4A1ND z!{7TadWeU*vBcSYP8?XS6-{ezVnjX&#h;hi(cf!5rhw6 zQ}1wWVFNn$dOt>JnX+YGvR@HXJu}}9qbmr1u4Y>;Wr>m*v_9_mp}8=zEVv15Gpp3+ zssP}qlCZf*4M!6Uw46)LqtM2@Me=6WkbXJKGWFf5Bo=lhYzOUacS>q8bx*7nwK9bg znxK~@$RAF1G*<+fZ-^|$T^QAZC)7tU#ty|&R*m^D_|+m(va@G65gyW;TKCkip9spiIpD7oX+-$C=xX%<<>UJ!}(Op z%SPe`X+Dl@M96FL5og*Z@Z{+X>d&K3S3bBO#w+U}sCJQYUIq`$mD?TLUOv~Hg9#7F zFEjB%HDjF>Bj^+7vnk1_DasjnZ)rPDq(t2L?CSD-NT@z3VGSJ3ciXEHu>P? z)7`$qW8#Lgg zg+dX!al!!V@&M-l%FBN@|2IPi?2ioTLQv-e4eMF%1U4`lKSeLQgekaytIj`u2$E7v z7w>%_KQJEyVdjj74}sAAis-0Wb~zhI#l|gv=v9|p^dkqJP#+2-u7Ean6>O1hR)kBm zUoD*BCV+VPZm?on<0&&?t|*Ix+s60TnGXrgeyw&u@`wf-nY5ReYr)wSZ?- z6ozVS*N=_0m7mojU$1!Qr@h2}b8J}7j$Ul5_8jatoR=D_+XVC^z?YD<@W#n3c%Yt9 z-1U`0MoZTE>EOd2g!sDMB(US`D4{C z%Wvgvy{Arzm}{5P6jNjO8$^qcNW~m`)gJ?^lWYaQ)HgZKPoY|m!uWUy(8|=Hks;ux{F@RCUXKKNzFgQ)mq!nucX=he z+g5lmCg67xsYgyuW0*4SPCtEvxnA&l9gjcSibUH3^>G8I?W^|-Uo0_I2a-GHUl^+( zNKpGB*d-$Rnce*mb*r3emWI7(LJLPn1R$z^FmeY8X%SL|(Bw2{E(%ocDG&ejp++Dj z#vKwH&o@nXp-9EWvU0I`5jvm;3KD%pHo-vzDMTDCnEzTJ z`WHhaque(0Mfs@nu9M>|cd#5yK$x7DT~ZXo3(lF|sxAP)==~B-R@{tsC6GHVq95+e zOF9k&uid9pltAhyR?*ndX7jvA;vjnC{b38D4BucqeUQ`ogcwF>c6*3(J{J6 z`|e#Hsp%?C)C=h#F#TSQPX0>`sG+=dLRe#Qo>>*u;E&gYRqWIj93RYh7{nX~F3!`q z>@e2j>%Pvq^Ro<mXZkgXhD=-9Ye}rK@4V$zs=9z6SDR1!#&=`FGCEQ)zE4-rqJ*ZhX=TasA|uWUeB-LVE&0~&qe5I7 zD@ECRbl{l52uL&@ur(rDZ7)EJ;3ZEL-{?n}&BOZF;wF`QT9Z!cFdnOnyo|K`PWR<=d{K+W834uD~GL|CI-kC z#2)lCroK&^tSfwirI^Z?R-#FsqjBKaHiYttNo41sGxKQ8_Sdo~6>I76UnnBm^%mtZ zeg19%X+9WU+DfZj<=O!e>I4^uw@oy@(Z3MFD*#mmCLptnH8WXWXbwph7q)wz{KAaj zAmaJ<-(<}bkVsBPQ|!bHjDmSP>#hbC3MB9pKavwXc;s&qZlpl>NTgKbXTtkmRWDvc zuP;s9*hkS1Il~5ww~n&>qa!4TM7?+nAMhG0c!uy5DDgLm@nBS&U7hKx2rr&YF<~)t z;IYq?7BxoKyA1RD)d0Vbjh#>sNUhnqwKu6L`cUZiP=ihXlG8+=Z}@eJh_Au0HDB(; zg{RSe65jyMg?zxHlt@C6W9Bx;JNA-jmmp7OZCQTJj#U&;H~p(mrcq=J(7JE~7qJu6 z_clW^^9l&oI-I5f@Nl^W2%bDNOsU?ntLs7v32Uz3sRvk7WzU#NrBH2q6pEpJ6As3m z9JLKLO{s>kG#TM(@bh2I(##x;V*^G9klbMkcCT2C2a;{CSooPt;pcLCQf7T^lFMT} zEuUFD*2X`k3hj{ciyU}O8?{(}8yer02&8^k%)g;)D^pQ8IQ!@18UAhqabl&VfL-WM z@(815boHV@p{y7)OTO{F%B&ftpl;i_tLlx=a)F6bd~X+Nku9s1n@b;TXH`A&6L9gwSn_|E;n1 z&icv);-nngeptVpk!Z2ReYTM5v zcj;&k2VvIO&hIP_|SQCX*iG@uWC;w<@0Jmj%!!AHyrXCvOJ$~M%piDW;bPvQ5 zdk2iy){*^8Wvz4z*D|D8p3i{b<})#Pc^iA^cheZ70nic&c2OZ=G!^qlFjQ*SLBU9y zm3Rcq^8Pk$bgF!Ihp-<+ruxuLvRSn3@@3G%ce`WX;=0DdnGz=2^GteN05V+W0bdF~ zeuXhR$`Us!Dh3ry%bJRlNF;)}2_l*<$(NZHWt{jNfQy}kbO??X(;+xv7iD;b>m!`( zLGDN+Q8v~pQ?SRu7!s@168(wGgcTZ>(Z6L!FSQzPd%g{+qR)AJr~V$9(l#6^P3-*X zi(-a*Im##f(+-xAEdct8rZLdZk+YSO2ttp?k{m^UNft z*mBJ(C>FOM!`4>|4n7m&T>$~8A&XhMB@}$`?>%4LQLHO1j5(=9MAd%D!181p_<^{W z@?TfTl|Nm`sbQ!R{mkjVH#R}+V%Bri=r8#M~UnKbXFQ2#+)O=}aQ=vB~YdfV=_te9He^;ks@W=U7-|Ut99sScGXN$!G z0HFVu#OTjIEvMiEHk-wwWIg2DhQcU!u&$YFh^FUu!r-BR+e}_-3jn)hVd8k*x-BZldxCUzne>=>;>r$oM)vDe3Gu6{94VA6kB-Jg);X z2we+X{4US6xlE6jK`QKAaQ|t1M|W7D#rTuYYYyKmD&J08vhmX7ACV!U^XbzX9ytDW zoA5EY^<{Nk)+fUBGRWfYvA5&PlFq$A|9|-F#oLE5Oiihw<; zV`W()V$$4Hbt28pNwRGXsmpc4^)|bswPmHE6JiG~&yyFU)%YtV?_M(}f*7DlGatle z1d$S{l*Ge`W;tojQUa91=k1d36~Z}5^ae_z$x;5_vet7?w$u}rL{4GyUZZWXRU&xV zA+Fb;@6j_-N|Ywq0KneHczjBs_rM@n9jqQq2(rbk7>SV=&7_6 zFyYKy_GZ(*w3#SInBj{Q_=&y@Y%P0Nu73C`(A{8-C^e!>x3XE^EWLLxh>s*FgHWh_ zJvi72R|{^M&0J7)sz#Dlw&7>s!MD-TWSL}I+St9_|3f1M4c7}#w=))h?ki5`);K0C z?(XAA%HQWdJbBkFgK7qk&aHSV?0nd)@ITXeFC}LU9wARMe!AHOBI|#w7ya7}jdWTq(gmY@UlFZWIG(z| zu)+?{9vB4dp7h`^N_=IqGxSl=e8#8`POeM*cw=F6Y@cTftH}IT0nI zSjuA}r|k-_oEu+c%wpH&HynG*l`~DNWmKP=!<(rRjBcP`njGwLCK*BTvBFszA#rxw ze({e8zwbpS5$LJPwJi~B+D1!5@LYGTSVMk#C<@WmTX4X6is&m}Z zna;PCKAoeNc*a6Iehb7gTrdcppF80f+09)47CFqX8!*Qd6lzK}r#|8j&A9!_+v6#L z(079hc}}R6PZ)Z!mj(l)LBM#A5`dou3g6q-@vR{NYzoj}fxgOxmkS`ypMBu}}9l=2(^ z+!&=S^kG#}90e1$8#sc707h^vX5ad2w4}?_w3?y*&AzYU>>2WPdOuh`xzmn*Ky zoLDiAneaC8@VmSj%Jh~hxA8B^_5ru`2tz}R+Y|mX- zt(s4Me=tuQ$aKV4s`E!ZAgO30l$do_Qao0WVs?2WrprItKJDX8*T5}aH@BTt$x+1K z_U&9G-zzB#7N6=k=c8kO(lv3kcmLjwVv$`)8l&jUp;spt4r{Es>DX7vYI5y^?4I#B zlis1!RP{f+to4|s^}w@KJI4)PCX;@|uT;`%G1IKCy?opC^h?n1vmT2u+5NY-B|j6U z5BuR<3?ev6smfH!MA7vHvDh!{0L-@b3L)z|)ut4!2EmF3eJfeXNXk*i$GN&2a))ng zNn?yH=T1p=EgYU0R2d#_$y36%zfU-RTjUC?&1yt%R2Jty?ans4O+YZw&(HjLSWL&x z)_c#YmDmF_IpNYg(B$_HBZsULP79FF3lJ*B@hm#bq*_Gy9+ELV?>};^HSOri%WXqt zl)v$;Y#ZNfPQ&BHm;8PZm-;i8b|>xEGrR)y;4LQrXdC-NsI=b6p=>Q;0^N^IREHw4 z+F&y(Lf(!AP_&qH`kt2&bO~meUU{VYMc>`_DrA}b!Osdlp)nr5n=?4}j zeR#p(V0K5@$+pazr95&VW&f0}XT|Zmz2p%8iMvIws^cRGVPA8g$aHxln%BpFwvEi` zjNvt&j@^6vGTV1PacBT`vgEZ=@Dc?UUzz+u3=3AAHiS$}n^_%*OdP_*0s;EQh4rJJ z-NA(V+CWEkqR1OL?#`ILV@3oezLv%l=NTIb|KrZJT(!zn%fT9-LJ3CK+_~jQ+OYGP zkMA<}yjkBBzuM`>GK$nRuwB*?VwkX_ap4xFr?m+PBFt!RN}r~SZK8GwY!h0sQa|ZH ze_L%;x@4)lQ+d$v?6dUUY<>gx#e$*E6@q#mDTBeH`kU=qS zXmn5j)&(NRTljIQu$k+jiUdk=iD3o2EukGanCbMIu-PqO+w9zNQQl0S+HIcsj5Vvvul^|9q}b`~!b}Z2R;L zW(mXF7Qf)9maRUqIMnmSIN%ZCuw{-FH5 zvc1ZoZusYG;90t|%IomkpHo|=(KX3x#W3(BF9W9L%rz{llb=S&qA3X0u3Gt%0TG%KVOJ=TNg9&s&@L#zM!O zw6`frNqb6}m*sD(EmzWwHMbp1^CWJi?3W%f?L0@mBYQCV`c|;r^LJ(Jp3y`eyN>>)RQl75m?+Kis5&CBP(tRt5WGdLE5t|~ zx6U@3R_*-+StR;iY1(n{a0(=CQENSr3X2a70YyG#Rg>J(0V}m+Kq5zX5;;=p0+%&B zQ%4xG##^jxXu)3#nA>=ay^GqagDCI%xHq;G-dLGEZZfI)BBHGloBlX(eDlvx(h=!T zdrXG$>Z{9!wFJ8f+-jjd-`z*Q;*G`1NAK~;ejmNK&9It%`7H1LZJWZw&bX4cy8o}Q z`Zq%da2tc7VAR%#`?}vhEvMUmV>v{T645`cK7zpj?2o;hN+id|i~5>4SURdU^b`O= z7VM>LMuG=`6fF-5d5jq|O~V=C`z{H$BNvg}k8#{~j&JMFs0w$oH)b@et@T#Q=|b^NYi$>_ArN_Yo?hufYTN(n2Jr`AyV55 zfN8Ale78OP-5HO5$Jp^C@STNn*W@Yq)fz|tl=ZRGs(xi-G?w3}^MVY4ez%(cJLH$!E%zd9j<10}zhDFef zZQqYfyPZrNyr%#xo-QHHKvBWx3QpX3`QY%1Q6fk_FVukr^%w?+l}7xn%jpHWCoY)GVR1|dyfx}lNEVfnxpLzAh2~C=) zD1%Z&{I5!mOy!uCL0dbTHBucvn**iz)bKxJAWDaTOR5^ zS@-?xhw=kLl)dbB2j}_gW~v_u0sxi0vp}3IK$0=1*y9lZ#@59Qbe0Yri_`LEb-}@h zC>!Po#XN??MEKjIXE&<$MQ#tOACL@Wih(x}f(5nNuH1FBZ8tVPpS?QvDef($Y`38U zE3V(_NeSPZexTWFL+RNj-4H8Hiy2N>abT^^RcC z^JyM?8lUc!&aa7xTSQM7*kBG5$EjNr;I_AUJF)7H{8$}|qcNt%YZk^gKSM}6!zIEb zkL$4zMZ)QC=AaJDmwoG(nTsm#&dC*8D=W!a%p;x6 znqandg~|^THa!}Q1#g8e3H4RdD<55XyrtOZvC>Lm02MtUuc?(r1Hsc|?;s9m~th?VKxn2c>9F5lu&i zi4)C5pg>~=H%X9+if_HHr3#7|L1X(WEvdCe(pVW zg;3nRznwOUrb|n$y+H@l8P#4Pk7(ZcPWgG-NdBH)-T4?8zVgkTibju0a22Sv zXu;}QWOjV&?(N_k94OD_@;Ya=H@ z6OVwlUU=@0z`G`H3h5A{%gY`Mknc}rZG1A6f=I`?-YHH_H8UAyf$n1kU zW~D32)IMBxgVMC)X%9;a{}k}~rEJm7C2#Vm{{1a=N2=vK0N9;Mj3>wHvK(`66infY z3!1h9Az=gr>?}C>R@}Dw=1t5Uc>&0RCTLt!S^3%&7mBxyai`<)cLN+4Z9IKxfuJeX7;AX0ZMfEsE4`w` z$T`!;s3s+sgIMP~Ifp^x=+0I1w=VRpKaunGmTnEVK-`p`y>5ohp{|FchfUHerikU* zvT`%UN9~TuVsEUy*mn=8Cbku!X4i7j5v}ZxNI}>}ZoA&-RCGU5UPY7zJFmNu3pHlNz+GaN1*jgiI zAD&WGtT>#MuawCDGL1gs>w?EdQq5{+6V*i{=DjyWeVJqZ2*g=9uw_Q!aX3=kty4WE zaup_TC--;B11|3aJGEv*8FFSZdl?NaRjFM54it&3^Pv-1-~W_QC+PCN zlPOHRepl7U-ZJN#gWF2V=MVN;83dM=R@|akC3jgpvYBUT3`2GmV-q<|!Zmuv7w@%4 zxCYWbZ?_VAw@39lna$jyyKE!y=yVI8iz}PD8kgszHFb@oky~kebT`aK@rA?X76J+# z&Of4M!@IdV`@Q(V&|f`n`-KluY!4M@UpmZBQ#rwXJ@y}Fy~5qODgNYX$Mb&O;IcuS zkuJbVmxqlZI8JV3FH3N{IlI6Vxqx^6J9Tog-jIz^H6-A=&^|79jBDf3koAO_AgV9! zn$EIMZ>cOPO-1FqNYJ#KlwCx3&syxO8vOcB!y30kBObFjV!E8KIq|uonmMF~tI}(f z?dx+UVZqZ~8Er&aqte61pY(*Y0oYZ&Su$g*cz_s1d^DI|83~XlDcDlLnGqsYAUwDK z%H{NbwRe_5ZHDch4-g~-4ek&ef=kgB*8sttLU4Bql(x9LYm2*EfkJ`cTHH%5|WPj@DHo=KjW|6KmNzJAe&T$MKp@T9t+)+&{lF;Jhl6(DGh zDu@UlDhdM3;*|sL@h1Rts+ik&?dk-dNvPP%#iIwm#=pyFC)|K3=q>1Tf+joeu=b(q z`mr6&X?R`UaCzFS>`KJl-c_ZJkD+jM3CKY0O`YfjA&*H)Mucr(j~u-ZI~M^)<{UmB zyCRL#ft`z2^(UeEbR&-)s^G2Qu{r2AVjKNhmHshC?LupJP65-Z&z%-qE6XY@+Lkj8 z0&9y$II^9#_`WC^f!pUil|Z>Hf73RM{Ctc3%|}wdKm0`jHFj$*EKy^|)pO zM<{Fw--(8b`mQ)6cLk7uPlDPv&rOa-!nApYzQF{a?k*F9Jm~7@iYpj1!TZIXzw+pK z75 zpo(TO05Gq6H7hBAH1BFeDIS2yDJ#e6!HCU8ip`V(hy?Yk#EK@_cALXvoZBy*XIU&T zi$AM`E{25EB28Ya{ce_RxSw`T zKaLJF^|rK~LGjRZrgz3Taq-jN*81vd@VkPi1Kez{wP<m#C z6ioa&_9GwV<8NV7rld8wwS50fP-TA;}EhAic&&QsWDegKy|Af+^d%|A5@Wt9-N@3sl{1W~o&9mPY zzB&u`$9Z+@;!;%?hoAk=VSKwls65)-!6!t{)d)~5K>^(gUIWyoI5@3I4^)tIQJ<)1 zmk*l74?KKH1OQ1+Wg2}m*6^9M9hL!Px|XA*$5$BjlU9RJHwv+;{IMZDC|V)ViUYIU z6qNAC3dYzi)Mg6ToqcG=D`{s#mH=zVt6rvJ*mFgZ8b|Saw25aJahE9diZ(WG6;ct? zKC*F}`k5IMS9#)aR9;h}zIQ&)d{@RaZG-l?NwqGibMRWso3{-wr0@j>-8A1_s$bj& z^t|&4uoks-yKr0oglQwd zS)em&H%1xY%@n1bxVf8Vb&>9 z(%3g=vPNOoh_zNF)xriUYf7*~$Wv=wX>;y2roYdjA4AJ6c}A`Fij;f9+uzbwP83ec zZF-seY}xgeVjuP1CnR+z67j|G$Hxf8SqnY~);oQ+Eo&zxU1BzkgGlK)a)0tcO?yta3jmisPiFMJ{R5`4{|m23r5Ap`kC2x$OXd z%a66yC63V_DU0HiT${wkR|Tu5BH6Zpkd2N0+bJi@UpV~;|KhX+eJl({ocEEGfF=bcdfkFS@hP0E>uEl5KT(TkEZKSl)4# zO^Jd30c*zeYey>Hw z>46sjOjM3hiN4|N2r+0e?1ZuwEbba5C(Sj5RZ-3PNvTXi%bzUX9!>CAa`JmA_vplq zhRBB}4lMkd2~b zLGwWRsppHG;+Jhkm(_1qBb@6-Ly@mNkuCd2UtmpG)fxMX2W1(xWb{oxoRxnW)0v4f zk|n|+Stwb`8(_dwY1^S65*^U$X%<11>>Z$xyey^L{8hu>z3%|xiD{0Nv+PL@;jy@W zbh!cB1z;GZhnN|iX_TxCYD#>EoXq2SWDMbOUOF1Y_4&;bBlsI$uyO#ZxC)@G@+4C-y2j<$3umI>wy$6TL_d;;xC@3Px(@P3gONPlp6y z-*G9dQlTpHI2+r3E5!F89b)aGQ1aPW=t{DVrun!UW3J7!;;FY*GeJ*h=tdn2KR9Du z)&Sj7(uO+OGTu`ZH@H8UjiB{oHyI3r7V>@V#9apN8^nJXw`h*!N7;gb9n*MI;}(sx zuGs@E^5;@27XC=2Pte_1IeEI&=9xSQmu-*%&M17j_bFwYiI_Vk zm+6;-Mk+kSRz)TaAxyOoCx5~fTN-%-@>z~^8&nv|hSFicqA_qLxZ7vRB1YpYH5qtA z{`&#ZKQu&e0JhPg2~_tOa;bhqk~C70r6@dNeL~L!o$&vG^)cyQF(D{OA6Hc>WLRL( ziz!qgh*lZx*5~$7Hjr4NXR85>*?zm!30?l`vFi|ijVJJ1_RFFKVC&rn5y~d6MbZt= zCYiP>P8YM%lzFGfm)zQ&a!!DV_t$8G7^7{`+`^>`n!K6C<{7c$N%ceRl*D0E5vF3I zN(!RMGaXI$d9_cf z%yv|WVa+&c5W#hYQG7_4Y8;2hBiu{R3(W^VQ)jEckOeigSmYlp3+>wXA{JMz7&no+ zoSKH`+kUXf$XaV0%;OpIT2ggJ4`0mC>V?~?5Ak}HCPp_0a!GiRLptW@A!=$zoKcCC{olbufV^i(KHb z$k}?Y^2{>7om$vaGYsiVh4MuYxci!uPh0-X%e?xds{U@Y@bV`FUoZ1|3+j8G^F-YV|L|ZV!vsjyNpO}QJWeLAT zB}()0Q7kht%d?Ns0=F3Vcy#4K8~?AHl4+` z*v7O{aVDs^*~W~2Z|1JbYH|RuoOORnAOxAwIti{5)q%#>Y%Z<$9X{4s-$H?(nM$YK!j^fD#~rebG6@awYcSCS)b4+<#I> z9~+oOE5_bwi@2Y|5Xrn8q~gGxm?qy*5E1K3sq={nj;vH`qpnhnQ(Qv0pXwWJLP}V0 z9Dwx+8%O$ZkC~82^K|an_@Y{dBEitUqe4R62j1=tXnJyoU(QOR#DakT=n;Ov!}+V6 zWOaR=&K7~%cxAUI6pYjPoV9HJi-`@-8Hs)H(xd&ySwnHwX>GDM>?Wuev{GQRIgK@M z@1wARS&dR%9{TOnu4GnMvFIMC))ov%>P7PjNF~vI#BCUslYf?nA8T*|&=@!&Jz?!PzYoS@mou3pe?UZtlTBt1s88`?e3_5X%3vcCn+7?A%Cf6BemFMj!S_-%H^!n>fX*WX!*XTVLcF5a9R$0QH8n{MsSA5`rZA>@S`D44>{{HxJv$IB2QzZaBV`Ju; zW)?C1j;9NrN};jCJWS-poY^{vYqpgPlryp6sg;5?y{(JWq9fs^BWT%NW-98e3l!)7 z21N5{Bo|;~h$F;kemS~sXtzZpXyiY)ot4Wf&Z5xl|J91sS}h_?66zI?3xO+HXudo0 zzIVu{%F%JHRsGpS8K>$K#`J4jgClyDAd8Oz*F?ut;m=D%qaGTh%O)4Z#UvO*Je&>@ z{y8<9tW0iUe=GbWr=Kww@8Pc9mjD3ZR6}OIgjncDQsTUK+!!=V(FTkrF|z1G4YS%V z!sXuW%Nz<(_?djM>81E!q&5noG;V2}i%a%;95c>}N|BX@QhygNO8Jw9a)R8^RFZbP z{Jx=v-_2NbW)&vLetVaB#4Q!zf6;85*Z1uWoYgA~>qNm0FH?l})FhRw##mn*;}x}@ z#XX1O*3!c%QbK(l|ALG-B!ye)Y6}ls!T`cvwedeZd{yfjO!l|bt2U6MG{@!PZ|6~( z0{~cl&>HO-YL|$x3bRHHLm7#2kVt-lkVGAfEIk>P!O-Ti@vl-#GIEQ)`V!m8AGX6u zMYHkze^OYh+>-X~p(z+ps$2cFi5W90HWgi8VQ%6`@ie+knema zRzIZ1j2N8m6g!%=@+DllJDIFxHw&drBRshsX5PQ(Tz&!`+~z{1rbP0Do=N!BIn4)F z{FPVt)g7F*nxpPLd-bbe&mLYkmg_X2La8y*$2sLP<+Lee4kl>VjZO~ocd9F%^#e;K zpZ70Bk^4*xQil)E!hB11hhT3Jt?}7cljniUR&D=l%kv+!^v`f868QYF)kl-R6EAn! z7FJDJ@ba-d6cyQ@K%*%04jLWN19;}%>m3|q3*?~WH|#N zUQm@l0z}}Uj!PhEtg39F_+u7Zktpbkoi;dJR_`kd-T>w02WDnx8vKwF7 z6V@7R%=D5S5>q}ERXVu4=%7}t^E&uaX3ETTqOHMn->CO!-_L-jqmz}TRbIuR@Ov~R z_gRb&M>KlnNA(sFEK(VQD5VfV8|*yJW}7Phw7Y3rVkX=ihWiOJkd*)qt{Bs4l9hsc zBN2c=*&z(WPVQ?(@r;Tn;=&f^vD~8Lmydn} z(XPdaJFv4ytP5S;d$>J)66cZK`i^#Ta`G6p@Hln+9==QS6s>k5c+Z@TUW1Yr)(pqR z7Z^374Ta!R;NT@A04L57C{u+Aq^qY~I>>mF8!9cyb6Eg&^fD4}5a+Gw*X(f?7p&Z> zMKICO@n{D6G^YO8Vd6wJ-Z#gFmvDBakouVnMBjUg%ky3krxHn=-h5FIIwksP04ITw z77B=q!=~w&$YZ44eRpA122<=tJ@Xy=QCslru5cF{sRm+&G~LiEr6$zC8zGUPYbH0& zoYCL4$X7-&8Z4ZzsS%w(OEBE-kR6d|EqjtrjVlH$s~XSj>nrRt@FM^jF(Dj+96-@f zFq_Jj3WkqO(mil;1w;VfkAj+q>RNt7Eq1!%6MB5;^(W61&m^_0bemn#t(kSh zuEKlX=VXH!Bw#m}<8FSIE*f&kOCCamGB7!{-PA6AhY>uQ5FB1?U%ofo5d%GNT}y>p zsa2_$w1E|E7j1O#VimwlOtwPgw%-*J<B73h+4Faz?6xyknq**f+K0Q4A zX#)P2Ch6Z(3Z0LHMk6b)F7AILH2P5vy^(S45s>R|sMe?`{rzu~4|km6O;bV45Pwn` zVz<>a%s<1Rc+jM-zDC3A*sas&LzeggQ)X>}4-h`yhe*w*|-Lx~fD0p8l= z{5EX?owMKM41@&q%%XNIK1Nkw{WX0m`AkT_a>YaQ_Ympu@@drfwcqi>6CCy=JuYdL zo!2$n&$@PZoAVv1q<>lX)akCtj&(gr%5)*p%gw$|?Zl6QmN;7J3uWIv!Ozza61~l| zHN}ZaMblH%`YC4iVdURvnvPldvj@V6K5I7qN_=gJhTQP8`l!Zkp3r- zT1Ry@@t zAi01{Lj+EScue?8JxaxlJhFzgM`72z&~d-cjGg{#C?a07vq@1!G+53Nn2MLB+L#;z z*Z?|&D-{>*pc$oCR_+jm^sBrj5}p^G6&I;*2b=81=&ukPnaYU6V)VhBon#{HZ zVthpYE&p0nC)&qH=B_n>d_yK+pJ}6KLNf-d_;5JpTADy6m=lU|yt>oe|FLm|YN|8L z$&dYG^R40UbWMJjjX?FCz?Lox3(aTG($spa{13xmq@{eB!^>Q5U@n6ufn~9aCO6-O zq;;k@+k&ra--+~h{8{Ju{N~~S4Zt(Pi_Ir3YkN}Omsg8VNQ~A91v?!%dY9qqXQCWz zpv3j*(_DI{&Oeu9W=G#NA5l{k8GrxNZpMZ~jhiT#AcCJqO`0!ilmQW}jf^3vEu2@f zR8wR=j|9kYOk!he#kHqon4Ri}T{ERAj?K4aUyF$yVK8Zj^k^j26bJ0%jFr)Ax}+D# zA7@gsE9uwH%F#HNhF6IN$4`xkCVHXoJydc`c+@GSdfsY&VuX18b&k#JJ%H;5EiZ>o zY3gHuGv&kYtr}pd(qMM<DI z#i5`Ey_l0Hm4$_P({4s7v`k*9^){TF|%jXnRlU&B%4A_QV~$ql)*OXiRL)Bn`PW zTV!qo24~cmA}(;xBNU>|Nl3CK#7)c)%2rVHR<{CzxZgGCX`&jNnHov>B|i%u(nnvY3+KPp~8Q(loXG+PS+N{zC&H?RJ|^%+9l9@qI=ggJW}Ub?2PZ{ta9R?(CoygGF({Yp-jcZ-~amo&wtd+e}4DR zwA}uZxekfD`BJZXSDNElt5H*ciksu%1eo^(RL)TJNKRMs>{|zOxfmM_fdHy_v=E?W zIUARzG4Ym2bS`JmOj=>ffDB&285zdQQm?F3g$$6KMpNIp^~rS8UE}6&opbo z7=hih83ny~6N4hP0K%VS(T<|>Hs44cGOpLviVzpb??3L+M(gm#MsPn7kp4NRvGF-} znG34R3HVqm;#ke5JGHAso$g5o1wZ?9K_9Z1&Em1Kf4|vkQj^RU+3WqlLMh&K?EbLx z@Q4EBt&H}G*D?a2VOncg4jE88iLodFIzrI5#J+!@CjxfB2NlE_X2thY*@Y9(T~oTF zOs0N=^mmSMVjIz8s)A^V_n?%T)81Ph$=;2*FzUg#+@nM*>s*m7%`7xujPX<%a0MLZ z7LvPiLT?B1d7~w%xF;l=oM~;^xY{2<~31K0WOATR%h7iI{9OXE0pB}Bycru%lCYX1U2mLwyuML zZa{Wpr`V03>1L!HUYPgqBVx=f>nAQRE^;#=cY))tGU@{wE`BzSQ{b|?)J{GGyrYS3 zERn6wr7AK=HYvGR+qzlxH139LVLbXj5vQ&z#BI7z=4G^6%#}Z?)M6))ICLxlOFaH^ z3o%P^V^Xg|GG43HihVv6^e`D%2cQr`M%O0UeN6G0JGCP_+SGTeV3^>0skj3B@;Y2* zapzo)(L!lCPR1GpkV_W$L0s0Limy*+;Tt`eG*-2V|6>HQ=h6)s)tCnf8lx?{Ko|WY zZ4v15^5yotlAVjvFVTrMrOG`u4ai8YMR?EUMo+%Ss}BuSNy+!;vcO0z*4wE=>d;c|V?w`KgF!Ljk#6`2OLw&r(_N>v!vqbZewmm>9 z>@-!*w(>~Z4w?_u)U%lfOxg@a)4}_d?Zg0-Vg$6*5%d586-Kba)ioL}_bV>*#*Au{ zXz9+vK=E4i=;9E+*{wc6l)M3zCY8i{*?Q(i)Zv;lNhGb>$KTJ0+B+7Cntxc?AoaD$ zCi{LA&jm1^O{FrKb;p~Pwe8M*M!Zrsb#pze`dv;>;4a89LupV`gN6}6;!Qaf zxslM|WmDmzL1x51V;2C}qnAO=Q)4=js85wj%`nHFi6#j%b*j-}(UVi&UhA}RSiQza z9aKqkGDX+o~}R&5>pnL1s@>3Zo@r zrVCfbKL)-4W5zbT5%CSg745R(`dugk$f6v9N`Q5FqA3gIu!hkXM>Vv_Jy?8t&FVkf zUd?!14Y=4!b_sgJo_WV^)3KiJGzYE%HFn)`9hmH*5TLw;%<;idl^ z$AT!cBm78Iw$&HCnm0l;yxs59Y^Uy0UysF_ z_lMz1ulm>TAJ@ZJV1?!Y1QAgm-iyTa_32Ifik~kI9t-#{&tRTye^Eb^Gga692VSGb z+k45M#nCQ)TeWcksA+UT@bCjlQlpd@_u^-3vZk=LTU+Z?*|V8Fe5}9G*c@P9GoMdGQ3&5q_?TrCg(x96auJmCx@;ZmX%M@Dr)$4(=RUTE+rQPqoaU(6d z0~p@0jpCss%L27rbz+mN&DJJ#RA$T)Fr)(_$MHqsA~oJbywHvRL|PL5`JGtv(G(pB zv@;hyu}>ieAJ{QhY}zej^EpYRkmazP@R1dR@SCR?ISlxO#3^kMi56o~C|!dX2)~T| zCxXJi+M<7G2xq9rVj<6Q@B(#C9p-puL@^ei^3`fPjH|v1G}$c)sGtw}#0bal=$AzS zGr6wpIqn-lDL|FN5rSN4+{lditAP>&zA1H33hkVJNU@h$yWt>58%T_|GZQW$u9GK> zt4NEe6iU_ZIiTRGhf%Z0q+Vjpw7^v3yGOBdG#-%kyd?BZ#OCM#cIChue z=druKP0*6};f<5tkiCkQYy_k6Zle#x;7yG_&EtB#|IsSKnf&GS>$Yk4miCvM%@X4mFJFmHKO}ry zp?n8Qx2=(l#xP4YuL#fO46J4t`?LJ$g?qQIl0Jy-)%9a)sWXvMftns&Sn<70LY{Cu!Tu*hOnPf1&pfD z0F#O3V(fy0cXde-M1`pG0Vq6%Z9+CY9i0lZO~&5nZKVGcsQ-C-GCN+Xfg~#Ojd&&L zU_Ei8YBufSh}_<$onAd%0q!Dt#`-m+Xa1adC50?jcq4rZwq_MnA(iF+1S|V_PNo!& zQ3y}DeF7F~-L0)^&5B4~zw0{Jd6JiGLEQ*>s?p5$KmugG+Ss}$#>>y-Sti-k?(cH{ zjls!1KUxRjx&7q(8k(gi8Pzq;KA!8J`$Eu_$-@83;kmwPfbmR9Ykp~S7A61_4rVYK2T-cK{*EQRvyLmE ztCF^=?^W^pjaYm98{DWjWRnK-_hYUdge+>D)Ncq|c?ok_^EhY&`-&Ki(FHa6=UqA) zix9ufOC701>f#fL!)(q*bA|X8a?wq(XY#Z!CGeuct-NDIWfBx{h#}0}y$`&eB8VZP z3NyG&HI)YQ0-!F-W3L^5iZngF36^Dis8z1rcl(p{qfeFhP}RH$Hl~ZYB|6VU0=$L) z`bFXBHgLg%!)acH&=W+-xnRDBY*$Fh{h|oj*G35c_lC% z&AGI`gFB=A-jHPXnH$tRd2otJ@y^Q&4>{Cr{ZgkYi=jT+y+s&f?LM2!_tz zH|%Do$6Uu=DANgM>$MNH)iFh3O<$?3*?)10KO$CXnTjKtL5)c%xI#D zVEqBG1Hm~vJLTAXkQ05|9F8sILu+G8Fo684;ML=X6n@5h6r&JMXuJdw9ynCa4i`6t z95a}+7BhKH3{(Dgkp?zT;8b@1x(vTyUIUk${)7Qi*nwrrpV9OwS}m_Hx!V@kwkp5V_gt z6g{h z^zAC&Q(Y-pX7o5zkiEbqROv9Z10%GBsMU$+ovg8J`hS^!`&ZlZujhZ)&^L>DnjEA@ z2X}6ZBW#Ys>M^I#lNmb6=Zv2(AojR@Xk$P%EE#9AR7?Pn-cwm?$v-nI%>dV=5#T_N z$0uSc9Z{jU#j>|nczWvEto5OpLe>8X`zvdJnJf9Cpk~=iJX-`%R`9d^Vl^p>8DrKN z*j%XQtVXx&pDta>$8HgT?$OxV`eW39q5Jh#y4UvFn@@``6*o@0K1Oy{&~Z}fe(r&# zwLHbmmdg~++=yeZK4od^q2tK7Q9yc0O{c*~^pfl=#(UoS?Jj+!nicFe^V-vtDyB$J zw;OTh1)#BWBoMs<2F14i4(k)fj4Sc742>uPjI#0~NW<;U&Qm8RC3BtOxs%hYo?a=K z0QI8GhV=JHzR7#lG7d?+99I)lT-V~|F9!X90aQ_o-k^$Nt(qJ(FCkvz5GTSOSm=PV z#H)OqQaW|XNE@WQ9j~GBa4KP=@SCNcvVBjV^ciLllf#!5pV`7!H7<5C`u+A({wR7r z?@f;8?xbG&YL2Zj(_tcow5rsCVH4*j%O(WX#_^HvkzsK^zo02?HiDXK9ST(&=r2xQ zTfoK)4H=fnN}%o&9DEYx+7b6-&c3c2eP*vo5_TRCsx%b7QatHzPZV`ZfU&o(Wqwmy z6I2+5D@3q(ywn zaWpW%XLrLA_=0A$KOF?froF0WL*L*Rvk~ea>&DOLB~Qw+Zhax#Ua2-d-L06;eCC+p zTE{mRn?U#an2;F&+3Oz3@9%kHc%mj;mfDyVX+VJHJ9nIKplSG=ynD(R!#DJKMd0Ls zN2KK;hquPqo9@uc;JCw@atx{ zbk*)8gGO>PZh*gW#Ugbv(buMg&bzYr`L4vL^_5jW;=nnPS0Qi2c_;;o+P=FuPw6ub zEst@YnY2luaCcs!z`sU}^y)I6*f>Lf|2YLkFL5y=17ZJ1ecJyjpvUt+Gz7pRwwNz) z1^_y_Pv&d80aW`hO^u_1F-RMnY6QPOek-H<^D7DZgpL-xzG;Br(77FMtyn%$F{023 zmF(V%cf+wWr{$<1$sJ|=^%6Z2skvQft(MvP#IN)jcW}dYl-M71ojgC@;D@wJOzQo~xw9xqxSnZ}WnSK75hn>*b*b^YI2R@7G8{hKA9H{4 z>Gr4HPL6V|_p7vDy#*^hU)pL~)7E=lWV`S9_~?;w&%NNgHFGm+@hjuorM%1H5ZJ4C zt9?&@VyEjA*Us~}f5gHDYIBryd>|(HOJ_+3ik}6P>s`nVZeeXgGKNQ+qGf6k3Un`w zzV2a#IWRN2(+$&6@06sl-b_n!jb~IP+>h5vN6_nEbti5KN(^n&H8r$~U&3+^yC%+g z7i0Fv&+S3VKi-;sEHeXC?TMh*OX-c@{UWsv5%q8O*AdVQjN<1YlPamAn5&+pM zzY;OQEztE3beeei3EnN2NKT0dcDwj=`qwtNZjpwVKWl|gNx?huaT6XOBm@y{B*GB( zrmqYu83^!>*BG~XTniQrqPm-N!td$^%Hcy)K^4V8Y(;Y93xqrOm;b9Zhxpd&2)(RWV$u|Rs zg;JV=e4zIfgI8nxQKPvz{OU)kS$o{K^k%=GI(c7*X<^0S$jbl#I5N>LqFluBeX+@M z+a6%W-gHKlmQM}0e+@?ca3272s*H_)-_RGTRhTBa|Mm>`$au_cVoG>D+~o2&Axp)y z_6@8A-aK%?1&<8L*Nest$vODmJX~hrP*LAV^&I^8n~P@R_jYyWLt=y7{ZU16*_*Z+S4|4%=G{{b{Vh9>|3 literal 0 HcmV?d00001 From 07bf90d20a5f90e77745b652c9b72e2d45693d67 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sun, 6 Oct 2024 13:29:26 +1300 Subject: [PATCH 57/68] misc. --- code/game/mecha/equipment/tools/fallout/utility_modules.dm | 4 ++-- code/game/mecha/equipment/tools/other_tools.dm | 2 +- code/game/mecha/fallout/pickuptrucks.dm | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/mecha/equipment/tools/fallout/utility_modules.dm b/code/game/mecha/equipment/tools/fallout/utility_modules.dm index d22b6a62a1e..6f00d936d26 100644 --- a/code/game/mecha/equipment/tools/fallout/utility_modules.dm +++ b/code/game/mecha/equipment/tools/fallout/utility_modules.dm @@ -57,9 +57,9 @@ AddComponent(component_type) var/datum/component/storage/STR = GetComponent(/datum/component/storage) //STR.storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT - STR.max_combined_w_class = 100 + STR.max_combined_w_class = 10 STR.max_w_class = WEIGHT_CLASS_HUGE - STR.max_items = 50 + STR.max_items = 20 storagespace = STR diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 603f6c9881c..256ba5b0a33 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -172,7 +172,7 @@ name = "armor booster module (Close Combat Weaponry)" desc = "A large plate of hardened steel, can be attached to a vehicle to boost its defense at the cost of miles per gallon. The shape makes it only useful against melee attacks." icon_state = "mecha_abooster_ccw" - armor_mod = list("melee" = 15, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "fire" = 0, "acid" = 0) + armor_mod = list("melee" = 12.5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "fire" = 0, "acid" = 0) move_power_drain = 1 /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index 783e92d9561..7c1201a7978 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -111,7 +111,7 @@ wreckage = /obj/structure/mecha_wreckage/buggy cargo_capacity = 1 - facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 2) // There's whole ass paladin in the way.. + facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.5) // There's whole ass paladin in the way.. /obj/mecha/combat/phazon/pickuptruck/bos/armed/loaded/Initialize() . = ..() @@ -193,7 +193,7 @@ step_in = 1.2 step_energy_drain = 0.4 max_integrity = 200 - armor = ARMOR_VALUE_VEHICLE_MED_LIGHT + armor = ARMOR_VALUE_VEHICLE_MEDIUM stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy From ea2aa7111e465b299b6fbb4402bd66ec0edb0089 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Mon, 7 Oct 2024 18:01:15 +1300 Subject: [PATCH 58/68] sherman sprites --- icons/mecha/sherman.dmi | Bin 2602 -> 3214 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mecha/sherman.dmi b/icons/mecha/sherman.dmi index f3f5d9fc78b4db43af5153e4e2ecf76027c591e2..a9d667cca9ef2a07fa16a0d4852c5fb76a4e30ac 100644 GIT binary patch delta 3105 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 delta 2488 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 Date: Mon, 7 Oct 2024 18:01:35 +1300 Subject: [PATCH 59/68] Test, do not push, yet --- code/game/mecha/combat/phazon.dm | 20 ++++---- code/game/mecha/fallout/armoured.dm | 34 ++++++++++++- code/game/mecha/fallout/birds.dm | 16 +++++- code/game/mecha/fallout/buggies.dm | 16 +++++- code/game/mecha/fallout/pickuptrucks.dm | 49 +++++++++++++++++-- code/game/mecha/fallout/trucks.dm | 19 +++++++- code/game/mecha/mecha.dm | 38 +++++++++++++-- code/game/mecha/mecha_defense.dm | 65 +++++++++++++++++++++---- 8 files changed, 225 insertions(+), 32 deletions(-) diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 4b3ed6d3ec3..b1ed39aa554 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -1,6 +1,6 @@ /obj/mecha/combat/phazon name = "\improper Phazon" - desc = "This is a Phazon exosuit. The pinnacle of scientific research and pride of Nanotrasen, it uses cutting edge bluespace technology and expensive materials." + desc = "This is a Phazon exosuit.The base vehicle type for Fallout, it is composed of cutting edge bullshitium, and you should not be seeing this." icon_state = "phazon" step_in = 2 dir_in = 2 //Facing South. @@ -14,7 +14,6 @@ add_req_access = 1 internal_damage_threshold = 25 force = 15 - phase_state = "phazon-phase" can_be_locked = TRUE facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.15) // experimental: weaker at the front because that's where the engine is.. @@ -30,12 +29,15 @@ icon_state = "derelict" /obj/mecha/combat/phazon/GrantActions(mob/living/user, human_occupant = 0) - ..() - switch_damtype_action.Grant(user, src) - phasing_action.Grant(user, src) - + cycle_action.Grant(user, src) + lights_action.Grant(user, src) + stats_action.Grant(user, src) + eject_action.Grant(user, src) + klaxon_action.Grant(user, src) /obj/mecha/combat/phazon/RemoveActions(mob/living/user, human_occupant = 0) - ..() - switch_damtype_action.Remove(user) - phasing_action.Remove(user) + cycle_action.Remove(user) + lights_action.Remove(user) + stats_action.Remove(user) + eject_action.Remove(user) + klaxon_action.Remove(user) \ No newline at end of file diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index 000f5943b01..b0774a11df7 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -6,6 +6,7 @@ stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' can_be_locked = FALSE + static_dir = FALSE enter_delay = 30 pixel_x = -7 pixel_y = -5 @@ -14,10 +15,25 @@ step_in = 1.5 armor = ARMOR_VALUE_VEHICLE_ARMORED wreckage = /obj/structure/mecha_wreckage/armoured_jeep + awkward_turning = TRUE max_utility_equip = 3 max_weapons_equip = 1 max_misc_equip = 1 facing_modifiers = list(FRONT_ARMOUR = 1.25, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.6) + directional_comps = list( + list( + list(25,0.5,30) + ), + list( + list(50,1.25,15) + ), + list( + list(50,1.25,15) + ), + list( + list(75,1.5,30) + ) + ) /obj/mecha/combat/phazon/armoured_jeep/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) @@ -58,7 +74,8 @@ stepsound = 'sound/mecha/tanktracks.mp3' turnsound = 'sound/mecha/tanktracks.mp3' can_be_locked = FALSE - enter_delay = 50 + static_dir = FALSE + enter_delay = 40 pixel_x = -8 pixel_y = -4 max_integrity = 600 // its a tank! @@ -66,10 +83,25 @@ step_energy_drain = 1.5 armor = ARMOR_VALUE_VEHICLE_ARMORED_HEAVY wreckage = /obj/structure/mecha_wreckage/sherman + awkward_turning = TRUE max_utility_equip = 2 max_weapons_equip = 2 max_misc_equip = 1 facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.6) + directional_comps = list( + list( + list(100,1,50) + ), + list( + list(45,1.5,15) + ), + list( + list(45,1.5,15) + ), + list( + list(75,2,30) + ) + ) /obj/mecha/combat/phazon/m4sherman_cx/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) diff --git a/code/game/mecha/fallout/birds.dm b/code/game/mecha/fallout/birds.dm index e63eeef1c39..0b5d5ac623b 100644 --- a/code/game/mecha/fallout/birds.dm +++ b/code/game/mecha/fallout/birds.dm @@ -24,9 +24,23 @@ movement_type = FLYING stepsound = 'sound/f13machines/vertibird_loop.ogg' turnsound = 'sound/f13machines/vertibird_loop.ogg' - facing_modifiers = list(FRONT_ARMOUR = 1, SIDE_ARMOUR = 1, BACK_ARMOUR = 1) + directional_comps = list( + list( + list(25,1,0) + ), + list( + list(50,1,15) + ), + list( + list(50,1,15) + ), + list( + list(50,1,15) + ) + ) + /obj/structure/mecha_wreckage/vertibird name = "\improper Vertibird Wreck" desc = "Mayday, Mayday, Vertibird going down... IN STYLE." diff --git a/code/game/mecha/fallout/buggies.dm b/code/game/mecha/fallout/buggies.dm index 8f138bcb2c5..1611710dddb 100644 --- a/code/game/mecha/fallout/buggies.dm +++ b/code/game/mecha/fallout/buggies.dm @@ -13,9 +13,23 @@ stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy - facing_modifiers = list(FRONT_ARMOUR = 1.15, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.85) // Engine's on the back, IG + directional_comps = list( + list( + list(25,1.5,15) + ), + list( + list(5,1,0) + ), + list( + list(5,1,0) + ), + list( + list(25,1.5,15) + ) + ) + max_utility_equip = 2 max_weapons_equip = 1 max_misc_equip = 1 diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index 7c1201a7978..fedf825f6b3 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -15,13 +15,26 @@ turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/fallout cargo_capacity = 2 - max_weapons_equip = 1 max_utility_equip = 5 max_misc_equip = 1 - facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.25) + directional_comps = list( + list( + list(75,1.5,30) + ), + list( + list(10,0.5,10) + ), + list( + list(10,0.5,10) + ), + list( + list(10,0.5,10) + ) + ) + /obj/mecha/combat/phazon/pickuptruck/Initialize(mapload) . = ..() var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/vehicle_straps/ME = new(src) @@ -110,9 +123,23 @@ armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/buggy cargo_capacity = 1 - facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.5) // There's whole ass paladin in the way.. + directional_comps = list( + list( + list(75,1.5,30) + ), + list( + list(10,0.5,10) + ), + list( + list(10,0.5,10) + ), + list( + list(50,0.5,20) + ) + ) + /obj/mecha/combat/phazon/pickuptruck/bos/armed/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new @@ -137,11 +164,25 @@ step_energy_drain = 0.6 armor = ARMOR_VALUE_VEHICLE_MED_LIGHT // Less armor, more tools cargo_capacity = 5 - max_weapons_equip = 1 max_utility_equip = 6 max_misc_equip = 1 + directional_comps = list( + list( + list(75,1.5,30) + ), + list( + list(10,0.5,10) + ), + list( + list(10,0.5,10) + ), + list( + list(75,1.25,15) + ) + ) + /obj/mecha/combat/phazon/pickuptruck/mechanic/Initialize() . = ..() for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index 30aadc3bbab..655d41cbebf 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -14,13 +14,27 @@ stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/ncrtruck - + awkward_turning = TRUE max_weapons_equip = 1 max_utility_equip = 8 max_misc_equip = 1 - internal_damage_threshold = 25 + directional_comps = list( + list( + list(75,1.5,30) + ), + list( + list(10,0.5,0) + ), + list( + list(10,0.5,0) + ), + list( + list(50,0.5,10) + ) + ) + /obj/structure/mecha_wreckage/ncrtruck name = "\improper NCR Truck wreckage" desc = "Its a truck ! BROKEN TRUCK." @@ -86,6 +100,7 @@ step_energy_drain = 0.6 armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/ncrtruck + awkward_turning = FALSE max_weapons_equip = 1 max_utility_equip = 3 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 12dca1a8958..6ee9b25e786 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -107,6 +107,28 @@ var/list/cargo = new var/cargo_capacity = 0 // for now, copy attributes from ripley so don't have to remap // lazy + var/static_dir = TRUE + var/awkward_turning = FALSE + + // FRONT, LEFT , RIGHT, BACK + /// List of internal components per direction , will cause increased mech damge incase of mech AP and block shots from hitting the driver + // internal list should be list[ref] = list(hitChance, hitMult, APthreshold) + var/list/directional_comps = list( + list( + list(100,2, 30) + ), + list( + list(30,2, 30) + ), + list( + list(30,2, 30) + ), + list( + list(5,2, 30) + ) + ) + + /// a list of all vision traits to give to the occupant. var/list/vision_modes = list() @@ -625,7 +647,12 @@ set_glide_size(DELAY_TO_GLIDE_SIZE(step_in)) move_result = mechsteprand() else if(dir != direction && (!strafe || occupant.client.keys_held["Alt"])) - move_result = mechturn(direction) + + if(direction == REVERSE_DIR(dir) && awkward_turning) + direction = mechturn(direction, pick(90, -90)) + + else + move_result = mechturn(direction) else set_glide_size(DELAY_TO_GLIDE_SIZE(step_in)) move_result = mechstep(direction) @@ -987,8 +1014,9 @@ forceMove(loc) log_append_to_last("[H] moved in as pilot.") icon_state = initial(icon_state) - setDir(dir_in) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) + if(static_dir) + setDir(dir_in) if(!internal_damage) SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) return 1 @@ -1042,8 +1070,9 @@ brainmob.update_mouse_pointer() icon_state = initial(icon_state) update_icon() - setDir(dir_in) mecha_log_message("[mmi_as_oc] moved in as pilot.") + if(static_dir) + setDir(dir_in) if(!internal_damage) SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) GrantActions(brainmob) @@ -1109,7 +1138,8 @@ mmi.update_icon() L.mobility_flags = NONE icon_state = initial(icon_state)+"-open" - setDir(dir_in) + if(static_dir) + setDir(dir_in) if(L && L.client) L.update_mouse_pointer() diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 9b881f699b7..5ae0a9ef749 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -6,7 +6,18 @@ return facing_modifiers[FRONT_ARMOUR] return facing_modifiers[SIDE_ARMOUR] //if its not a front hit or back hit then assume its from the side +/obj/mecha/proc/attack_dir_for_modules(relative_dir) + if(relative_dir > -45 && relative_dir < 45) + return 1 + else if(relative_dir < -45 && relative_dir > -135) + return 2 + else if(relative_dir > 45 && relative_dir < 135) + return 3 + else if(relative_dir >= -180 && relative_dir <= 180) + return 4 + /obj/mecha/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, armour_penetration = 0, atom/attacked_by) + . = ..() if(. && obj_integrity > 0) spark_system.start() @@ -32,6 +43,7 @@ if(attack_dir) var/facing_modifier = get_armour_facing(abs(dir2angle(dir) - dir2angle(attack_dir))) + if(.) . *= facing_modifier @@ -86,7 +98,48 @@ /obj/mecha/bullet_act(obj/item/projectile/Proj) //wrapper mecha_log_message("Hit by projectile. Type: [Proj.name]([Proj.flag]).", color="red") - . = ..() + if(!(Proj.damage_type in list(BRUTE, BURN))) + return BULLET_ACT_BLOCK + var/attack_dir = get_dir(src, Proj) + var/facing_modifier = get_armour_facing(abs(dir2angle(dir) - dir2angle(attack_dir))) + var/true_armor = clamp(round(armor.bullet*facing_modifier/100 - Proj.armour_penetration ,0.01), 0, 1) + var/true_damage = round(Proj.damage * (1 - true_armor)) + var/minimum_damage_to_penetrate = round(armor.bullet/3*(1 - Proj.armour_penetration), 0.01) + if(prob(true_armor/2)) + Proj.setAngle(SIMPLIFY_DEGREES(Proj.Angle + rand(40,150))) + return BULLET_ACT_FORCE_PIERCE + Proj.damage = true_damage + if(true_damage < minimum_damage_to_penetrate) + take_damage(true_damage, Proj.damage_type, null, null, attack_dir, Proj.armour_penetration, Proj) + return BULLET_ACT_BLOCK + var/modules_index = attack_dir_for_modules(dir2angle(attack_dir) - dir2angle(dir)) + for(var/i=1 to length(directional_comps[modules_index])) + if(!prob(directional_comps[modules_index][1])) + continue + var/damage_mult = directional_comps[modules_index][2] + var/ap_threshold = directional_comps[modules_index][3] + var/armor_rating = directional_comps[modules_index][4] + damage_mult = min(0.15,(Proj.damage + Proj.armour_penetration) / (Proj.damage + armor_rating)) + directional_comps[modules_index][4] -= damage_mult * Proj.damage + take_damage(true_damage * damage_mult, Proj.damage_type, null, null, attack_dir, Proj.armour_penetration, Proj) + if(Proj.armour_penetration < ap_threshold) + return BULLET_ACT_BLOCK + else + Proj.armour_penetration -= ap_threshold + + var/list/hittable_occupants = list() + if(occupant) + hittable_occupants[occupant] = 80 + for(var/obj/item/mecha_parts/mecha_equipment/seat/other_occupant in src) + if(other_occupant.patient && other_occupant.patient.stat != DEAD) + hittable_occupants[other_occupant.patient] = 70 + + var/mob/living/true_target = pickweight(hittable_occupants, 50) + if(true_target) + . = true_target.bullet_act(Proj, Proj.def_zone) + else + . = ..() + /obj/mecha/ex_act(severity, target) severity-- // MORE DAMAGE @@ -104,12 +157,6 @@ for(var/Y in trackers) var/obj/item/mecha_parts/mecha_tracking/MT = Y MT.ex_act(severity, target) - for(var/Z in cargo) - var/obj/O = Z - if(prob(30/severity)) - cargo -= O - O.forceMove(drop_location()) - . = ..() if(occupant) occupant.ex_act(severity,target) @@ -186,13 +233,11 @@ to_chat(user, span_notice("You undo the securing bolts.")) else if(state==2) state = 1 - move_resist = initial(move_resist) to_chat(user, span_notice("You tighten the securing bolts.")) return else if(istype(W, /obj/item/crowbar)) if(state==2) state = 3 - move_resist = MOVE_RESIST_DEFAULT to_chat(user, span_notice("You open the hatch to the power unit.")) else if(state==3) state=2 @@ -317,4 +362,4 @@ visual_effect_icon = ATTACK_EFFECT_MECHFIRE else if(damtype == TOX) visual_effect_icon = ATTACK_EFFECT_MECHTOXIN - ..() + ..() \ No newline at end of file From 8efb2d368a083aa4468e2f4666eeedbe860f061d Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Thu, 10 Oct 2024 13:22:40 +1300 Subject: [PATCH 60/68] Revert "Test, do not push, yet" This reverts commit c7dfb2b74dfc0ca4237e4dd3eeaebf8ba6c9ec29. --- code/game/mecha/combat/phazon.dm | 20 ++++---- code/game/mecha/fallout/armoured.dm | 34 +------------ code/game/mecha/fallout/birds.dm | 16 +----- code/game/mecha/fallout/buggies.dm | 16 +----- code/game/mecha/fallout/pickuptrucks.dm | 49 ++----------------- code/game/mecha/fallout/trucks.dm | 19 +------- code/game/mecha/mecha.dm | 38 ++------------- code/game/mecha/mecha_defense.dm | 65 ++++--------------------- 8 files changed, 32 insertions(+), 225 deletions(-) diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index b1ed39aa554..4b3ed6d3ec3 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -1,6 +1,6 @@ /obj/mecha/combat/phazon name = "\improper Phazon" - desc = "This is a Phazon exosuit.The base vehicle type for Fallout, it is composed of cutting edge bullshitium, and you should not be seeing this." + desc = "This is a Phazon exosuit. The pinnacle of scientific research and pride of Nanotrasen, it uses cutting edge bluespace technology and expensive materials." icon_state = "phazon" step_in = 2 dir_in = 2 //Facing South. @@ -14,6 +14,7 @@ add_req_access = 1 internal_damage_threshold = 25 force = 15 + phase_state = "phazon-phase" can_be_locked = TRUE facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.15) // experimental: weaker at the front because that's where the engine is.. @@ -29,15 +30,12 @@ icon_state = "derelict" /obj/mecha/combat/phazon/GrantActions(mob/living/user, human_occupant = 0) - cycle_action.Grant(user, src) - lights_action.Grant(user, src) - stats_action.Grant(user, src) - eject_action.Grant(user, src) - klaxon_action.Grant(user, src) + ..() + switch_damtype_action.Grant(user, src) + phasing_action.Grant(user, src) + /obj/mecha/combat/phazon/RemoveActions(mob/living/user, human_occupant = 0) - cycle_action.Remove(user) - lights_action.Remove(user) - stats_action.Remove(user) - eject_action.Remove(user) - klaxon_action.Remove(user) \ No newline at end of file + ..() + switch_damtype_action.Remove(user) + phasing_action.Remove(user) diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index b0774a11df7..000f5943b01 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -6,7 +6,6 @@ stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' can_be_locked = FALSE - static_dir = FALSE enter_delay = 30 pixel_x = -7 pixel_y = -5 @@ -15,25 +14,10 @@ step_in = 1.5 armor = ARMOR_VALUE_VEHICLE_ARMORED wreckage = /obj/structure/mecha_wreckage/armoured_jeep - awkward_turning = TRUE max_utility_equip = 3 max_weapons_equip = 1 max_misc_equip = 1 facing_modifiers = list(FRONT_ARMOUR = 1.25, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.6) - directional_comps = list( - list( - list(25,0.5,30) - ), - list( - list(50,1.25,15) - ), - list( - list(50,1.25,15) - ), - list( - list(75,1.5,30) - ) - ) /obj/mecha/combat/phazon/armoured_jeep/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) @@ -74,8 +58,7 @@ stepsound = 'sound/mecha/tanktracks.mp3' turnsound = 'sound/mecha/tanktracks.mp3' can_be_locked = FALSE - static_dir = FALSE - enter_delay = 40 + enter_delay = 50 pixel_x = -8 pixel_y = -4 max_integrity = 600 // its a tank! @@ -83,25 +66,10 @@ step_energy_drain = 1.5 armor = ARMOR_VALUE_VEHICLE_ARMORED_HEAVY wreckage = /obj/structure/mecha_wreckage/sherman - awkward_turning = TRUE max_utility_equip = 2 max_weapons_equip = 2 max_misc_equip = 1 facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.6) - directional_comps = list( - list( - list(100,1,50) - ), - list( - list(45,1.5,15) - ), - list( - list(45,1.5,15) - ), - list( - list(75,2,30) - ) - ) /obj/mecha/combat/phazon/m4sherman_cx/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) diff --git a/code/game/mecha/fallout/birds.dm b/code/game/mecha/fallout/birds.dm index 0b5d5ac623b..e63eeef1c39 100644 --- a/code/game/mecha/fallout/birds.dm +++ b/code/game/mecha/fallout/birds.dm @@ -24,22 +24,8 @@ movement_type = FLYING stepsound = 'sound/f13machines/vertibird_loop.ogg' turnsound = 'sound/f13machines/vertibird_loop.ogg' - facing_modifiers = list(FRONT_ARMOUR = 1, SIDE_ARMOUR = 1, BACK_ARMOUR = 1) - directional_comps = list( - list( - list(25,1,0) - ), - list( - list(50,1,15) - ), - list( - list(50,1,15) - ), - list( - list(50,1,15) - ) - ) + facing_modifiers = list(FRONT_ARMOUR = 1, SIDE_ARMOUR = 1, BACK_ARMOUR = 1) /obj/structure/mecha_wreckage/vertibird name = "\improper Vertibird Wreck" diff --git a/code/game/mecha/fallout/buggies.dm b/code/game/mecha/fallout/buggies.dm index 1611710dddb..8f138bcb2c5 100644 --- a/code/game/mecha/fallout/buggies.dm +++ b/code/game/mecha/fallout/buggies.dm @@ -13,22 +13,8 @@ stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy - facing_modifiers = list(FRONT_ARMOUR = 1.15, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.85) // Engine's on the back, IG - directional_comps = list( - list( - list(25,1.5,15) - ), - list( - list(5,1,0) - ), - list( - list(5,1,0) - ), - list( - list(25,1.5,15) - ) - ) + facing_modifiers = list(FRONT_ARMOUR = 1.15, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.85) // Engine's on the back, IG max_utility_equip = 2 max_weapons_equip = 1 diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index fedf825f6b3..7c1201a7978 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -15,25 +15,12 @@ turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/fallout cargo_capacity = 2 + max_weapons_equip = 1 max_utility_equip = 5 max_misc_equip = 1 - facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.25) - directional_comps = list( - list( - list(75,1.5,30) - ), - list( - list(10,0.5,10) - ), - list( - list(10,0.5,10) - ), - list( - list(10,0.5,10) - ) - ) + facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.25) /obj/mecha/combat/phazon/pickuptruck/Initialize(mapload) . = ..() @@ -123,22 +110,8 @@ armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/buggy cargo_capacity = 1 - facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.5) // There's whole ass paladin in the way.. - directional_comps = list( - list( - list(75,1.5,30) - ), - list( - list(10,0.5,10) - ), - list( - list(10,0.5,10) - ), - list( - list(50,0.5,20) - ) - ) + facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.5) // There's whole ass paladin in the way.. /obj/mecha/combat/phazon/pickuptruck/bos/armed/loaded/Initialize() . = ..() @@ -164,25 +137,11 @@ step_energy_drain = 0.6 armor = ARMOR_VALUE_VEHICLE_MED_LIGHT // Less armor, more tools cargo_capacity = 5 + max_weapons_equip = 1 max_utility_equip = 6 max_misc_equip = 1 - directional_comps = list( - list( - list(75,1.5,30) - ), - list( - list(10,0.5,10) - ), - list( - list(10,0.5,10) - ), - list( - list(75,1.25,15) - ) - ) - /obj/mecha/combat/phazon/pickuptruck/mechanic/Initialize() . = ..() for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index 655d41cbebf..30aadc3bbab 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -14,26 +14,12 @@ stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/ncrtruck - awkward_turning = TRUE + max_weapons_equip = 1 max_utility_equip = 8 max_misc_equip = 1 - internal_damage_threshold = 25 - directional_comps = list( - list( - list(75,1.5,30) - ), - list( - list(10,0.5,0) - ), - list( - list(10,0.5,0) - ), - list( - list(50,0.5,10) - ) - ) + internal_damage_threshold = 25 /obj/structure/mecha_wreckage/ncrtruck name = "\improper NCR Truck wreckage" @@ -100,7 +86,6 @@ step_energy_drain = 0.6 armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/ncrtruck - awkward_turning = FALSE max_weapons_equip = 1 max_utility_equip = 3 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 6ee9b25e786..12dca1a8958 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -107,28 +107,6 @@ var/list/cargo = new var/cargo_capacity = 0 // for now, copy attributes from ripley so don't have to remap // lazy - var/static_dir = TRUE - var/awkward_turning = FALSE - - // FRONT, LEFT , RIGHT, BACK - /// List of internal components per direction , will cause increased mech damge incase of mech AP and block shots from hitting the driver - // internal list should be list[ref] = list(hitChance, hitMult, APthreshold) - var/list/directional_comps = list( - list( - list(100,2, 30) - ), - list( - list(30,2, 30) - ), - list( - list(30,2, 30) - ), - list( - list(5,2, 30) - ) - ) - - /// a list of all vision traits to give to the occupant. var/list/vision_modes = list() @@ -647,12 +625,7 @@ set_glide_size(DELAY_TO_GLIDE_SIZE(step_in)) move_result = mechsteprand() else if(dir != direction && (!strafe || occupant.client.keys_held["Alt"])) - - if(direction == REVERSE_DIR(dir) && awkward_turning) - direction = mechturn(direction, pick(90, -90)) - - else - move_result = mechturn(direction) + move_result = mechturn(direction) else set_glide_size(DELAY_TO_GLIDE_SIZE(step_in)) move_result = mechstep(direction) @@ -1014,9 +987,8 @@ forceMove(loc) log_append_to_last("[H] moved in as pilot.") icon_state = initial(icon_state) + setDir(dir_in) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) - if(static_dir) - setDir(dir_in) if(!internal_damage) SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) return 1 @@ -1070,9 +1042,8 @@ brainmob.update_mouse_pointer() icon_state = initial(icon_state) update_icon() + setDir(dir_in) mecha_log_message("[mmi_as_oc] moved in as pilot.") - if(static_dir) - setDir(dir_in) if(!internal_damage) SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) GrantActions(brainmob) @@ -1138,8 +1109,7 @@ mmi.update_icon() L.mobility_flags = NONE icon_state = initial(icon_state)+"-open" - if(static_dir) - setDir(dir_in) + setDir(dir_in) if(L && L.client) L.update_mouse_pointer() diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 5ae0a9ef749..9b881f699b7 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -6,18 +6,7 @@ return facing_modifiers[FRONT_ARMOUR] return facing_modifiers[SIDE_ARMOUR] //if its not a front hit or back hit then assume its from the side -/obj/mecha/proc/attack_dir_for_modules(relative_dir) - if(relative_dir > -45 && relative_dir < 45) - return 1 - else if(relative_dir < -45 && relative_dir > -135) - return 2 - else if(relative_dir > 45 && relative_dir < 135) - return 3 - else if(relative_dir >= -180 && relative_dir <= 180) - return 4 - /obj/mecha/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, armour_penetration = 0, atom/attacked_by) - . = ..() if(. && obj_integrity > 0) spark_system.start() @@ -43,7 +32,6 @@ if(attack_dir) var/facing_modifier = get_armour_facing(abs(dir2angle(dir) - dir2angle(attack_dir))) - if(.) . *= facing_modifier @@ -98,48 +86,7 @@ /obj/mecha/bullet_act(obj/item/projectile/Proj) //wrapper mecha_log_message("Hit by projectile. Type: [Proj.name]([Proj.flag]).", color="red") - if(!(Proj.damage_type in list(BRUTE, BURN))) - return BULLET_ACT_BLOCK - var/attack_dir = get_dir(src, Proj) - var/facing_modifier = get_armour_facing(abs(dir2angle(dir) - dir2angle(attack_dir))) - var/true_armor = clamp(round(armor.bullet*facing_modifier/100 - Proj.armour_penetration ,0.01), 0, 1) - var/true_damage = round(Proj.damage * (1 - true_armor)) - var/minimum_damage_to_penetrate = round(armor.bullet/3*(1 - Proj.armour_penetration), 0.01) - if(prob(true_armor/2)) - Proj.setAngle(SIMPLIFY_DEGREES(Proj.Angle + rand(40,150))) - return BULLET_ACT_FORCE_PIERCE - Proj.damage = true_damage - if(true_damage < minimum_damage_to_penetrate) - take_damage(true_damage, Proj.damage_type, null, null, attack_dir, Proj.armour_penetration, Proj) - return BULLET_ACT_BLOCK - var/modules_index = attack_dir_for_modules(dir2angle(attack_dir) - dir2angle(dir)) - for(var/i=1 to length(directional_comps[modules_index])) - if(!prob(directional_comps[modules_index][1])) - continue - var/damage_mult = directional_comps[modules_index][2] - var/ap_threshold = directional_comps[modules_index][3] - var/armor_rating = directional_comps[modules_index][4] - damage_mult = min(0.15,(Proj.damage + Proj.armour_penetration) / (Proj.damage + armor_rating)) - directional_comps[modules_index][4] -= damage_mult * Proj.damage - take_damage(true_damage * damage_mult, Proj.damage_type, null, null, attack_dir, Proj.armour_penetration, Proj) - if(Proj.armour_penetration < ap_threshold) - return BULLET_ACT_BLOCK - else - Proj.armour_penetration -= ap_threshold - - var/list/hittable_occupants = list() - if(occupant) - hittable_occupants[occupant] = 80 - for(var/obj/item/mecha_parts/mecha_equipment/seat/other_occupant in src) - if(other_occupant.patient && other_occupant.patient.stat != DEAD) - hittable_occupants[other_occupant.patient] = 70 - - var/mob/living/true_target = pickweight(hittable_occupants, 50) - if(true_target) - . = true_target.bullet_act(Proj, Proj.def_zone) - else - . = ..() - + . = ..() /obj/mecha/ex_act(severity, target) severity-- // MORE DAMAGE @@ -157,6 +104,12 @@ for(var/Y in trackers) var/obj/item/mecha_parts/mecha_tracking/MT = Y MT.ex_act(severity, target) + for(var/Z in cargo) + var/obj/O = Z + if(prob(30/severity)) + cargo -= O + O.forceMove(drop_location()) + . = ..() if(occupant) occupant.ex_act(severity,target) @@ -233,11 +186,13 @@ to_chat(user, span_notice("You undo the securing bolts.")) else if(state==2) state = 1 + move_resist = initial(move_resist) to_chat(user, span_notice("You tighten the securing bolts.")) return else if(istype(W, /obj/item/crowbar)) if(state==2) state = 3 + move_resist = MOVE_RESIST_DEFAULT to_chat(user, span_notice("You open the hatch to the power unit.")) else if(state==3) state=2 @@ -362,4 +317,4 @@ visual_effect_icon = ATTACK_EFFECT_MECHFIRE else if(damtype == TOX) visual_effect_icon = ATTACK_EFFECT_MECHTOXIN - ..() \ No newline at end of file + ..() From 5e15ec27cc52c2458dc61dfa4ae4e158ce961e78 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Thu, 10 Oct 2024 13:38:22 +1300 Subject: [PATCH 61/68] how did I miss that? --- code/game/mecha/combat/phazon.dm | 1 + code/game/mecha/fallout/pickuptrucks.dm | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 4b3ed6d3ec3..6cf4711f34c 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -16,6 +16,7 @@ force = 15 phase_state = "phazon-phase" can_be_locked = TRUE + canstrafe = FALSE facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.15) // experimental: weaker at the front because that's where the engine is.. diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index 7c1201a7978..bdb6835225f 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -183,9 +183,9 @@ //jeep -/obj/mecha/combat/phazon/pickuptruck/jeep +/obj/mecha/combat/phazon/jeep name = "\improper pickup truck" - desc = "A old vehicule, runing on fuel." + desc = "A old vehicle, runing on fuel." icon = 'icons/mecha/jeep.dmi' icon_state = "jeep" pixel_x = -15 From 979005979de49357c9dc458dca02897a229c5961 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Mon, 14 Oct 2024 21:56:31 +1300 Subject: [PATCH 62/68] fixes --- .../equipment/tools/fallout/utility_modules.dm | 3 +-- code/game/mecha/fallout/carriages.dm | 2 -- code/game/mecha/fallout/pickuptrucks.dm | 7 +++++-- code/game/mecha/fallout/trucks.dm | 7 ++++--- code/game/mecha/mecha_defense.dm | 15 ++++++++++++++- 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/code/game/mecha/equipment/tools/fallout/utility_modules.dm b/code/game/mecha/equipment/tools/fallout/utility_modules.dm index 6f00d936d26..9cfa1ac3993 100644 --- a/code/game/mecha/equipment/tools/fallout/utility_modules.dm +++ b/code/game/mecha/equipment/tools/fallout/utility_modules.dm @@ -59,10 +59,9 @@ //STR.storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT STR.max_combined_w_class = 10 STR.max_w_class = WEIGHT_CLASS_HUGE - STR.max_items = 20 + STR.max_items = 10 storagespace = STR - /obj/item/mecha_parts/mecha_equipment/trunk/AllowDrop() return !QDELETED(src) diff --git a/code/game/mecha/fallout/carriages.dm b/code/game/mecha/fallout/carriages.dm index d77ae28d7fb..d996da86dc7 100644 --- a/code/game/mecha/fallout/carriages.dm +++ b/code/game/mecha/fallout/carriages.dm @@ -113,7 +113,6 @@ stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) - smoke_action.Grant(user, src) /obj/mecha/combat/phazon/truckcaravan/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) @@ -121,7 +120,6 @@ stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) - smoke_action.Remove(user) /obj/mecha/combat/phazon/truckcaravan/loaded/Initialize() . = ..() diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index bdb6835225f..020753da547 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -225,6 +225,11 @@ eject_action.Remove(user) klaxon_action.Remove(user) +/obj/mecha/combat/phazon/jeep/Initialize(mapload) + . = ..() + var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/vehicle_straps/ME = new(src) + ME.attach(src) + /obj/mecha/combat/phazon/jeep/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new @@ -232,8 +237,6 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/seat ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/seat - ME.attach(src) //jeep Enclave diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index 30aadc3bbab..c2526ce0c06 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -48,7 +48,6 @@ stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) - strafing_action.Grant(user, src) /obj/mecha/combat/phazon/ncrtruck/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) @@ -56,7 +55,6 @@ stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) - strafing_action.Remove(user, src) /obj/mecha/combat/phazon/ncrtruck/loaded/Initialize() . = ..() @@ -124,11 +122,14 @@ desc = "A Modified vehicule made to carry people in need to a hospital." icon = 'icons/mecha/ambulance.dmi' icon_state = "ambulance" + stepsound = 'sound/f13machines/buggy_loop.ogg' + turnsound = 'sound/f13machines/buggy_loop.ogg' + pixel_x = -20 + pixel_y = -5 step_in = 1 armor = ARMOR_VALUE_VEHICLE_MEDIUM max_integrity = 300 step_energy_drain = 0.5 - max_weapons_equip = 1 max_utility_equip = 5 max_misc_equip = 1 diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 9b881f699b7..e4574ead7aa 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -251,6 +251,19 @@ to_chat(user, span_warning("The [name] is at full integrity!")) return 1 + else if(istype(W, /obj/item/multitool) && user.a_intent != INTENT_HARM) + if(dna_lock || LAZYLEN(operation_req_access) || LAZYLEN(req_access)) + to_chat(user, span_notice("You start hacking the vehicle's lock system..")) + if(W.use_tool(src, user, 150, volume=100)) + to_chat(user, span_notice("You clear the vehicle's electronic lock.")) + dna_lock = 0 + operation_req_access = list() + req_access = list() + else + to_chat(user, span_notice("This vehicle isn't locked.")) + return 1 + return 1 + else if(istype(W, /obj/item/mecha_parts/mecha_tracking)) var/obj/item/mecha_parts/mecha_tracking/tracker = W tracker.try_attach_part(user, src) @@ -282,7 +295,7 @@ /obj/mecha/proc/full_repair(refill_tank) obj_integrity = max_integrity if(fuel_holder && refill_tank) - fuel_holder.reagents.add_reagent("welding_fuel", fuel_holder.volume) + fuel_holder.reagents.add_reagent(/datum/reagent/fuel, fuel_holder.volume) if(internal_damage & MECHA_INT_FIRE) clearInternalDamage(MECHA_INT_FIRE) if(internal_damage & MECHA_INT_TEMP_CONTROL) From fba9939d0ea1681c06d9dbb1724e7fe0781cc331 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Mon, 14 Oct 2024 22:41:09 +1300 Subject: [PATCH 63/68] fix birds (hopefully) --- code/game/mecha/fallout/birds.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/mecha/fallout/birds.dm b/code/game/mecha/fallout/birds.dm index e63eeef1c39..850bb27a003 100644 --- a/code/game/mecha/fallout/birds.dm +++ b/code/game/mecha/fallout/birds.dm @@ -11,6 +11,7 @@ step_in = 0.6 dir_in = 2 step_energy_drain = 0.75 + normal_step_energy_drain = 0.75 max_integrity = 150 armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/vertibird @@ -90,6 +91,7 @@ icon_state = "vb" step_in = 0.8 step_energy_drain = 0.7 + normal_step_energy_drain = 0.7 max_integrity = 200 wreckage = /obj/structure/mecha_wreckage/vertibird add_req_access = 1 @@ -145,6 +147,7 @@ icon_state = "vb" step_in = 0.6 step_energy_drain = 0.75 + normal_step_energy_drain = 0.75 max_integrity = 150 wreckage = /obj/structure/mecha_wreckage/vertibird add_req_access = 1 @@ -201,6 +204,7 @@ icon_state = "vb" step_in = 0.6 step_energy_drain = 0.75 + normal_step_energy_drain = 0.75 max_integrity = 150 wreckage = /obj/structure/mecha_wreckage/vertibird add_req_access = 1 @@ -258,7 +262,8 @@ pixel_x = -125 pixel_y = 0 step_in = 4 - step_energy_drain = 0.2 + step_energy_drain = 0.1 + normal_step_energy_drain = 0.1 max_integrity = 100 armor = ARMOR_VALUE_VEHICLE_HEAVY max_utility_equip = 6 From e45acb12ccec5f55088012876048f2ad6c6dd65d Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sat, 19 Oct 2024 21:36:25 +1300 Subject: [PATCH 64/68] New --- .../map_files/Baltimore/baltimore_surface.dmm | 24 +++--- .../Baltimore/baltimore_upperlevel.dmm | 10 +-- .../map_files/Pahrump-AB/Pahrump-AB-Upper.dmm | 8 +- _maps/map_files/Pahrump-AB/Pahrump-AB.dmm | 42 +++++----- code/game/atoms_movement.dm | 4 +- code/game/mecha/combat/combat.dm | 6 -- code/game/mecha/fallout/armoured.dm | 16 ++-- code/game/mecha/fallout/base_vehicle.dm | 37 +++++++++ code/game/mecha/fallout/birds.dm | 56 ++++++------- code/game/mecha/fallout/buggies.dm | 56 ++++++------- code/game/mecha/fallout/carriages.dm | 32 ++++---- code/game/mecha/fallout/cars.dm | 26 +++--- code/game/mecha/fallout/pickuptrucks.dm | 74 ++++++++---------- code/game/mecha/fallout/trucks.dm | 40 +++++----- code/game/mecha/mecha.dm | 7 ++ hailmary.dme | 1 + icons/mecha/corvega.dmi | Bin 21536 -> 21322 bytes icons/mecha/vehicle_base.dmi | Bin 0 -> 21445 bytes 18 files changed, 239 insertions(+), 200 deletions(-) create mode 100644 code/game/mecha/fallout/base_vehicle.dm create mode 100644 icons/mecha/vehicle_base.dmi diff --git a/_maps/map_files/Baltimore/baltimore_surface.dmm b/_maps/map_files/Baltimore/baltimore_surface.dmm index 16e408b797f..fe2d39907f1 100644 --- a/_maps/map_files/Baltimore/baltimore_surface.dmm +++ b/_maps/map_files/Baltimore/baltimore_surface.dmm @@ -3039,7 +3039,7 @@ /turf/open/floor/plasteel/f13/vault_floor/floor, /area/f13/raider_mall) "bch" = ( -/obj/mecha/combat/phazon/truckcaravan/loaded{ +/obj/mecha/base_vehicle/truckcaravan/loaded{ dir = 8 }, /turf/open/floor/f13/wood, @@ -6445,7 +6445,7 @@ name = "red light fixture"; dir = 8 }, -/obj/mecha/combat/phazon/buggy/red/loaded, +/obj/mecha/base_vehicle/buggy/red/loaded, /turf/open/floor/plasteel/f13/vault_floor/plating, /area/f13/ruins) "cpw" = ( @@ -15591,10 +15591,10 @@ /area/f13/ruins) "fEi" = ( /obj/structure/table/wood/fancy/red, -/obj/mecha/combat/phazon/highwayman/loaded{ +/obj/mecha/base_vehicle/highwayman/loaded{ dir = 8 }, -/obj/mecha/combat/phazon/highwayman/loaded{ +/obj/mecha/base_vehicle/highwayman/loaded{ dir = 8 }, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust{ @@ -18306,7 +18306,7 @@ /turf/open/indestructible/ground/outside/gravel, /area/f13/wasteland/town) "gzh" = ( -/obj/mecha/combat/phazon/pickuptruck/bos/loaded, +/obj/mecha/base_vehicle/pickuptruck/bos/loaded, /turf/open/floor/f13/wood{ icon_state = "housewood2" }, @@ -30253,7 +30253,7 @@ /area/f13/building/boat) "kNW" = ( /obj/structure/table/wood/fancy, -/obj/mecha/combat/phazon/buggy/red{ +/obj/mecha/base_vehicle/buggy/red{ dir = 8 }, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust{ @@ -32437,7 +32437,7 @@ }, /area/f13/building/boat) "lAv" = ( -/obj/mecha/combat/phazon/pickuptruck/loaded, +/obj/mecha/base_vehicle/pickuptruck/loaded, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust{ name = "Old Docks"; sunlight_state = 1 @@ -39963,7 +39963,7 @@ /turf/open/indestructible/ground/outside/ruins, /area/f13/wasteland/city/citycenter) "oiF" = ( -/obj/mecha/combat/phazon/corvega/police/loaded{ +/obj/mecha/base_vehicle/corvega/police/loaded{ dir = 8 }, /turf/open/indestructible/ground/outside/sidewalkdirt, @@ -51287,7 +51287,7 @@ /turf/open/floor/plasteel/f13/vault_floor/plating, /area/f13/ruins) "sbK" = ( -/obj/mecha/combat/phazon/buggy/loaded, +/obj/mecha/base_vehicle/buggy/loaded, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust{ name = "Old Docks"; sunlight_state = 1 @@ -56321,7 +56321,7 @@ /area/f13/wasteland/city/citycenter) "tRY" = ( /obj/structure/table/wood/fancy, -/obj/mecha/combat/phazon/corvega{ +/obj/mecha/base_vehicle/corvega{ dir = 8 }, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust{ @@ -62468,7 +62468,7 @@ /turf/open/floor/plasteel/f13/vault_floor/plating, /area/f13/clinic) "vZh" = ( -/obj/mecha/combat/phazon/pickuptruck/bos/armed/loaded, +/obj/mecha/base_vehicle/pickuptruck/bos/armed/loaded, /turf/open/floor/f13/wood{ icon_state = "housewood2" }, @@ -63585,7 +63585,7 @@ /turf/closed/wall/f13/sunset/brick_small_dark, /area/f13/wasteland/city/citycenter) "wqo" = ( -/obj/mecha/combat/phazon/buggy/flamme/loaded, +/obj/mecha/base_vehicle/buggy/flamme/loaded, /turf/open/floor/plasteel/f13/vault_floor/plating, /area/f13/ruins) "wqA" = ( diff --git a/_maps/map_files/Baltimore/baltimore_upperlevel.dmm b/_maps/map_files/Baltimore/baltimore_upperlevel.dmm index c54569539ce..4ce7a92f57f 100644 --- a/_maps/map_files/Baltimore/baltimore_upperlevel.dmm +++ b/_maps/map_files/Baltimore/baltimore_upperlevel.dmm @@ -417,12 +417,12 @@ }, /area/f13/building/boat) "atl" = ( -/obj/mecha/combat/phazon/vertibird/enclave/loaded, +/obj/mecha/base_vehicle/vertibird/enclave/loaded, /obj/effect/turf_decal/delivery, /turf/open/floor/wood_common/wood_common_light, /area/f13/wasteland/city) "atz" = ( -/obj/mecha/combat/phazon/buggy/red/loaded, +/obj/mecha/base_vehicle/buggy/red/loaded, /turf/open/floor/plating/rust{ sunlight_state = 1; name = "rusted Docks" @@ -8692,7 +8692,7 @@ /turf/open/floor/plating/rust, /area/f13/outpost) "iaa" = ( -/obj/mecha/combat/phazon/vertibird/brotherhood/loaded, +/obj/mecha/base_vehicle/vertibird/brotherhood/loaded, /turf/open/floor/f13/wood{ icon_state = "housewood2" }, @@ -11454,7 +11454,7 @@ }, /area/f13/wasteland/city) "kHu" = ( -/obj/mecha/combat/phazon/vertibird/loaded, +/obj/mecha/base_vehicle/vertibird/loaded, /turf/open/floor/plasteel/f13/vault_floor/misc/vault1{ name = "Docks"; sunlight_state = 1 @@ -21230,7 +21230,7 @@ /turf/open/floor/wood_mosaic, /area/f13/building) "tSN" = ( -/obj/mecha/combat/phazon/buggy/flamme/loaded, +/obj/mecha/base_vehicle/buggy/flamme/loaded, /turf/open/floor/plating/rust{ sunlight_state = 1; name = "rusted Docks" diff --git a/_maps/map_files/Pahrump-AB/Pahrump-AB-Upper.dmm b/_maps/map_files/Pahrump-AB/Pahrump-AB-Upper.dmm index fbfc8c84276..8fa76a30f35 100644 --- a/_maps/map_files/Pahrump-AB/Pahrump-AB-Upper.dmm +++ b/_maps/map_files/Pahrump-AB/Pahrump-AB-Upper.dmm @@ -1645,7 +1645,7 @@ /turf/open/floor/f13/wood, /area/f13/city) "cqG" = ( -/obj/mecha/combat/phazon/vertibird/ncr/loaded, +/obj/mecha/base_vehicle/vertibird/ncr/loaded, /turf/open/floor/f13, /area/f13/ncr) "cqH" = ( @@ -2986,7 +2986,7 @@ /turf/open/floor/plasteel/f13/vault_floor/white, /area/f13/wasteland) "ewP" = ( -/obj/mecha/combat/phazon/vertibird/balloon/loaded, +/obj/mecha/base_vehicle/vertibird/balloon/loaded, /turf/open/floor/wood_common, /area/f13/wasteland) "ext" = ( @@ -14872,7 +14872,7 @@ /turf/open/floor/wood_fancy, /area/f13/legion) "wUp" = ( -/obj/mecha/combat/phazon/vertibird/loaded, +/obj/mecha/base_vehicle/vertibird/loaded, /turf/open/floor/plasteel/airless/white, /area/f13/wasteland) "wUx" = ( @@ -15309,7 +15309,7 @@ }, /area/f13/city) "xHY" = ( -/obj/mecha/combat/phazon/vertibird/brotherhood/loaded, +/obj/mecha/base_vehicle/vertibird/brotherhood/loaded, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, /area/f13/brotherhood/rnd) "xIn" = ( diff --git a/_maps/map_files/Pahrump-AB/Pahrump-AB.dmm b/_maps/map_files/Pahrump-AB/Pahrump-AB.dmm index 20a59bb4f8e..c64e499e349 100644 --- a/_maps/map_files/Pahrump-AB/Pahrump-AB.dmm +++ b/_maps/map_files/Pahrump-AB/Pahrump-AB.dmm @@ -6798,7 +6798,7 @@ /turf/open/floor/plasteel/f13/vault_floor/red/white, /area/f13/building/mall) "aBG" = ( -/obj/mecha/combat/phazon/ambulance{ +/obj/mecha/base_vehicle/ambulance{ dir = 1 }, /turf/open/indestructible/ground/outside/road{ @@ -15611,7 +15611,7 @@ /obj/effect/decal/marking{ icon_state = "dottedverticalcorroded" }, -/obj/mecha/combat/phazon/buggy/rangerarmed/loaded, +/obj/mecha/base_vehicle/buggy/rangerarmed/loaded, /turf/open/indestructible/ground/outside/road{ icon_state = "horizontalbottombordertop0" }, @@ -19584,7 +19584,7 @@ }, /obj/effect/decal/cleanable/generic, /obj/effect/decal/cleanable/dirt, -/obj/mecha/combat/phazon/pickuptruck/mechanic{ +/obj/mecha/base_vehicle/mechanics_pickuptruck{ dir = 4 }, /turf/open/floor/f13{ @@ -19769,7 +19769,7 @@ /turf/open/indestructible/ground/outside/desert, /area/f13/building) "cpr" = ( -/obj/mecha/combat/phazon/pickuptruck/bos/armed, +/obj/mecha/base_vehicle/pickuptruck/bos/armed, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, /area/f13/brotherhood) "cpy" = ( @@ -20240,7 +20240,7 @@ }, /area/f13/wasteland) "ctm" = ( -/obj/mecha/combat/phazon/jeep/loaded{ +/obj/mecha/base_vehicle/jeep/loaded{ dir = 8 }, /turf/open/indestructible/ground/outside/dirt{ @@ -24914,7 +24914,7 @@ /area/f13/wasteland) "epN" = ( /obj/effect/decal/cleanable/oil, -/obj/mecha/combat/phazon/jeep/bos, +/obj/mecha/base_vehicle/jeep/bos, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, /area/f13/brotherhood) "epV" = ( @@ -29698,7 +29698,7 @@ /area/f13/building) "gmA" = ( /obj/structure/flora/grass/coyote/one, -/obj/mecha/combat/phazon/buggy/flamme/loaded{ +/obj/mecha/base_vehicle/buggy/flamme/loaded{ dir = 8 }, /turf/open/indestructible/ground/inside/mountain, @@ -30450,7 +30450,7 @@ /area/f13/legion) "gBa" = ( /obj/effect/decal/cleanable/dirt, -/obj/mecha/combat/phazon/buggy, +/obj/mecha/base_vehicle/buggy, /turf/open/indestructible/ground/outside/road{ icon_state = "verticalinnermain1" }, @@ -33955,7 +33955,7 @@ }, /area/f13/building/massfusion) "hYW" = ( -/obj/mecha/combat/phazon/buggy/ranger/loaded, +/obj/mecha/base_vehicle/buggy/ranger/loaded, /turf/open/indestructible/ground/outside/road{ icon_state = "verticalinnermain1" }, @@ -39764,7 +39764,7 @@ /turf/open/floor/plating/f13/inside, /area/f13/caves) "ksL" = ( -/obj/mecha/combat/phazon/buggy/red/loaded{ +/obj/mecha/base_vehicle/buggy/red/loaded{ dir = 4 }, /turf/open/indestructible/ground/outside/desert/sonora{ @@ -47997,7 +47997,7 @@ /area/f13/ncr) "nID" = ( /obj/effect/decal/cleanable/dirt, -/obj/mecha/combat/phazon/ncrtruck/mp/loaded, +/obj/mecha/base_vehicle/ncrtruck/mp/loaded, /turf/open/indestructible/ground/outside/road, /area/f13/wasteland) "nIG" = ( @@ -51472,7 +51472,7 @@ /area/f13/building/museum) "pcb" = ( /obj/effect/turf_decal/trimline/white/line, -/obj/mecha/combat/phazon/highwayman/loaded{ +/obj/mecha/base_vehicle/highwayman/loaded{ dir = 4 }, /turf/open/indestructible/ground/outside/road{ @@ -51909,7 +51909,7 @@ /turf/open/indestructible/ground/outside/water, /area/f13/wasteland) "plQ" = ( -/obj/mecha/combat/phazon/buggy/legion/loaded, +/obj/mecha/base_vehicle/buggy/legion/loaded, /turf/open/indestructible/ground/outside/desert/sonora{ dir = 4; icon_state = "desertsmooth4" @@ -53544,7 +53544,7 @@ /area/f13/building/hospital) "pQI" = ( /obj/effect/turf_decal/trimline/white/line, -/obj/mecha/combat/phazon/buggy/dune{ +/obj/mecha/base_vehicle/buggy/dune{ dir = 4 }, /turf/open/indestructible/ground/outside/road{ @@ -56187,7 +56187,7 @@ /area/f13/wasteland) "qZj" = ( /obj/structure/flora/branch, -/obj/mecha/combat/phazon/buggy/legionarmed/loaded, +/obj/mecha/base_vehicle/buggy/legionarmed/loaded, /turf/open/indestructible/ground/outside/dirt{ dir = 8; icon_state = "dirtcorner" @@ -59928,7 +59928,7 @@ }, /area/f13/legion) "sIS" = ( -/obj/mecha/combat/phazon/corvega/police/loaded, +/obj/mecha/base_vehicle/corvega/police/loaded, /turf/open/indestructible/ground/outside/sidewalk, /area/f13/city) "sJn" = ( @@ -62845,7 +62845,7 @@ "tTf" = ( /obj/effect/decal/cleanable/oil, /obj/effect/decal/cleanable/dirt, -/obj/mecha/combat/phazon/jeep/loaded{ +/obj/mecha/base_vehicle/jeep/loaded{ dir = 8 }, /turf/open/indestructible/ground/outside/road{ @@ -64563,7 +64563,7 @@ /turf/closed/wall/f13/wood/house, /area/f13/brotherhood) "uFF" = ( -/obj/mecha/combat/phazon/ambulance{ +/obj/mecha/base_vehicle/ambulance{ dir = 4 }, /turf/open/indestructible/ground/outside/sidewalk{ @@ -66762,7 +66762,7 @@ /obj/effect/decal/cleanable/dirt{ color = "#363636" }, -/obj/mecha/combat/phazon/pickuptruck/mechanic{ +/obj/mecha/base_vehicle/mechanics_pickuptruck{ dir = 4 }, /turf/open/floor/f13{ @@ -70613,7 +70613,7 @@ /turf/open/floor/grass, /area/f13/wasteland) "xfe" = ( -/obj/mecha/combat/phazon/ncrtruck/loaded, +/obj/mecha/base_vehicle/ncrtruck/loaded, /turf/open/indestructible/ground/outside/road{ icon_state = "verticalinnermain1" }, @@ -72629,7 +72629,7 @@ /turf/open/indestructible/ground/outside/dirt, /area/f13/wasteland) "xYD" = ( -/obj/mecha/combat/phazon/pickuptruck/bos/loaded, +/obj/mecha/base_vehicle/pickuptruck/bos/loaded, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, /area/f13/brotherhood) "xYE" = ( diff --git a/code/game/atoms_movement.dm b/code/game/atoms_movement.dm index 2a4d09b1598..1750d74e9ec 100644 --- a/code/game/atoms_movement.dm +++ b/code/game/atoms_movement.dm @@ -16,7 +16,7 @@ if(set_dir_on_move) setDir(direction) - var/is_multi_tile_object = bound_width > 32 || bound_height > 32 + var/is_multi_tile_object = bound_width > 64 || bound_height > 64 var/list/old_locs if(is_multi_tile_object && isturf(loc)) @@ -235,7 +235,7 @@ if (old_turf?.z != new_turf?.z) on_changed_z_level(old_turf, new_turf) - + return TRUE diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index a29c4c721c1..e7a1ef4ddda 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -9,9 +9,3 @@ max_weapons_equip = 3 max_utility_equip = 1 max_misc_equip = 2 - -/obj/mecha/combat/proc/max_ammo() //Max the ammo stored for Nuke Ops mechs, or anyone else that calls this - for(var/obj/item/I in equipment) - if(istype(I, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/)) - var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun = I - gun.projectiles_cache = gun.projectiles_cache_max diff --git a/code/game/mecha/fallout/armoured.dm b/code/game/mecha/fallout/armoured.dm index 000f5943b01..3f242f821bc 100644 --- a/code/game/mecha/fallout/armoured.dm +++ b/code/game/mecha/fallout/armoured.dm @@ -1,4 +1,4 @@ -/obj/mecha/combat/phazon/armoured_jeep +/obj/mecha/base_vehicle/armoured_jeep name = "\improper uparmored M38" desc = "A apparently original M38 jeep, modified with a almost fully armored chassis. Much of the interior space is occupied by advanced electronics designed to allow a single occupant to command, gun and drive at the same time." icon = 'icons/mecha/armoured_jeep.dmi' @@ -19,14 +19,14 @@ max_misc_equip = 1 facing_modifiers = list(FRONT_ARMOUR = 1.25, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.6) -/obj/mecha/combat/phazon/armoured_jeep/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/armoured_jeep/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/armoured_jeep/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/armoured_jeep/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) @@ -39,7 +39,7 @@ icon = 'icons/mecha/armoured_jeep.dmi' icon_state = "armoured_jeep-broken" -/obj/mecha/combat/phazon/armoured_jeep/loaded/Initialize() +/obj/mecha/base_vehicle/armoured_jeep/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -50,7 +50,7 @@ ME.attach(src) max_ammo() -/obj/mecha/combat/phazon/m4sherman_cx +/obj/mecha/base_vehicle/m4sherman_cx name = "\improper West-Tek Sherman M4-CX" desc = "A authentic Sherman, this one is a Pre-War prototype designed by Wesk-Tek to explore the practicality of a significantly downsized tank platform. The 75mm cannon has been replaced by two light, modular weapons sponsons and the cast steel hull has been replaced by a much thinner composite to save on weight and volume. The program was cancelled due to a lack of funding and failure to meet objectives before the War, but the schematics are occasionally still found in the wasteland." icon = 'icons/mecha/sherman.dmi' @@ -71,7 +71,7 @@ max_misc_equip = 1 facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.6) -/obj/mecha/combat/phazon/m4sherman_cx/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/m4sherman_cx/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) @@ -79,7 +79,7 @@ klaxon_action.Grant(user, src) zoom_action.Grant(user, src) -/obj/mecha/combat/phazon/m4sherman_cx/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/m4sherman_cx/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) @@ -87,7 +87,7 @@ klaxon_action.Remove(user) zoom_action.Remove(user, src) -/obj/mecha/combat/phazon/m4sherman_cx/loaded/Initialize() +/obj/mecha/base_vehicle/m4sherman_cx/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat diff --git a/code/game/mecha/fallout/base_vehicle.dm b/code/game/mecha/fallout/base_vehicle.dm new file mode 100644 index 00000000000..b25fbbf960f --- /dev/null +++ b/code/game/mecha/fallout/base_vehicle.dm @@ -0,0 +1,37 @@ +/obj/mecha/base_vehicle + name = "\improper real fallout MECHA" + desc = "A oddly flimsy-looking car, with a sign featuring a crudely-drawn walking robot on the roof. The sign reads: 'MECHA IS REAL!'. You get a feeling this isn't supposed to exist." + icon = 'icons/mecha/vehicle_base.dmi' + icon_state = "vehicle_base" + stepsound = 'sound/f13machines/buggy_loop.ogg' + turnsound = 'sound/f13machines/buggy_loop.ogg' + step_in = 2 + dir_in = 2 //Facing South. + step_energy_drain = 1 + max_integrity = 100 + deflect_chance = 0 + armor = ARMOR_VALUE_VEHICLE_VLIGHT + max_temperature = 25000 + wreckage = /obj/structure/mecha_wreckage/fallout + internal_damage_threshold = 25 + force = 5 + can_be_locked = TRUE + canstrafe = FALSE + + facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.15) // experimental: weaker at the front because that's where the engine is.. + + max_utility_equip = 3 + max_weapons_equip = 0 + max_misc_equip = 1 + +/obj/structure/mecha_wreckage/fallout + name = "\improper vehicle wreckage" + desc = "A destroyed vehicle." + icon = 'icons/fallout/vehicles/medium_vehicles.dmi' + icon_state = "derelict" + +/obj/mecha/base_vehicle/GrantActions(mob/living/user, human_occupant = 0) + ..() + +/obj/mecha/base_vehicle/RemoveActions(mob/living/user, human_occupant = 0) + ..() diff --git a/code/game/mecha/fallout/birds.dm b/code/game/mecha/fallout/birds.dm index 850bb27a003..3164d483dcc 100644 --- a/code/game/mecha/fallout/birds.dm +++ b/code/game/mecha/fallout/birds.dm @@ -1,6 +1,6 @@ //////////// VERTIBIRD ////////////// -/obj/mecha/combat/phazon/vertibird +/obj/mecha/base_vehicle/vertibird name = "\improper Vertibird" desc = "A real useable, and working vertibird, maintained with luck, sweat, and ducktape. This one seems to be more focused toward combat." icon = 'icons/mecha/vb-vertibird.dmi' @@ -19,7 +19,7 @@ internal_damage_threshold = 25 deflect_chance = 30 max_utility_equip = 4 - max_weapons_equip = 4 + max_weapons_equip = 2 max_misc_equip = 2 canstrafe = TRUE movement_type = FLYING @@ -36,7 +36,7 @@ pixel_x = -138 pixel_y = -138 -/obj/mecha/combat/phazon/vertibird/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/vertibird/GrantActions(mob/living/user, human_occupant = 0) internals_action.Grant(user, src) cycle_action.Grant(user, src) lights_action.Grant(user, src) @@ -46,7 +46,7 @@ eject_action.Grant(user, src) landing_action.Grant(user, src) -/obj/mecha/combat/phazon/vertibird/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/vertibird/RemoveActions(mob/living/user, human_occupant = 0) internals_action.Remove(user) cycle_action.Remove(user) lights_action.Remove(user) @@ -56,7 +56,7 @@ eject_action.Remove(user) landing_action.Remove(user) -/obj/mecha/combat/phazon/vertibird/obj_destruction() +/obj/mecha/base_vehicle/vertibird/obj_destruction() for(var/mob/M in src) to_chat(M, span_brass("The vertibird is going to Crash")) M.dust() @@ -64,11 +64,11 @@ src.visible_message(span_userdanger("The reactor has gone critical, its going to blow!")) addtimer(CALLBACK(src,.proc/go_critical),breach_time) -/obj/mecha/combat/phazon/vertibird/proc/go_critical() +/obj/mecha/base_vehicle/vertibird/proc/go_critical() explosion(get_turf(loc)) Destroy(src) -/obj/mecha/combat/phazon/vertibird/loaded/Initialize() +/obj/mecha/base_vehicle/vertibird/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid ME.attach(src) @@ -84,7 +84,7 @@ ///NCR VERTIBIRD -/obj/mecha/combat/phazon/vertibird/ncr +/obj/mecha/base_vehicle/vertibird/ncr name = "\improper NCR Vertibird" desc = "A real useable, and working vertibird, maintained with luck, sweat, and ducktape. This one seems to be more focused toward Troop transport, and his painted in the colors of the NCR." icon = 'icons/mecha/vb-vertibird-ncr.dmi' @@ -98,7 +98,7 @@ max_utility_equip = 8 max_weapons_equip = 1 -/obj/mecha/combat/phazon/vertibird/ncr/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/vertibird/ncr/GrantActions(mob/living/user, human_occupant = 0) internals_action.Grant(user, src) cycle_action.Grant(user, src) lights_action.Grant(user, src) @@ -109,7 +109,7 @@ smoke_action.Grant(user, src) landing_action.Grant(user, src) -/obj/mecha/combat/phazon/vertibird/ncr/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/vertibird/ncr/RemoveActions(mob/living/user, human_occupant = 0) internals_action.Remove(user) cycle_action.Remove(user) lights_action.Remove(user) @@ -120,7 +120,7 @@ smoke_action.Remove(user) landing_action.Remove(user) -/obj/mecha/combat/phazon/vertibird/ncr/loaded/Initialize() +/obj/mecha/base_vehicle/vertibird/ncr/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid ME.attach(src) @@ -140,7 +140,7 @@ ///VERTIBIRD ENCLAVE -/obj/mecha/combat/phazon/vertibird/enclave +/obj/mecha/base_vehicle/vertibird/enclave name = "\improper Enclave Naval Vertibird" desc = "A real useable, and working vertibird, maintained with luck, sweat, and ducktape. This one seems to be more focused toward combat, and be stored in a ship. Thats peak Enclave tech." icon = 'icons/mecha/vb-vertibird-enclave.dmi' @@ -152,10 +152,10 @@ wreckage = /obj/structure/mecha_wreckage/vertibird add_req_access = 1 max_utility_equip = 4 - max_weapons_equip = 4 + max_weapons_equip = 2 max_misc_equip = 2 -/obj/mecha/combat/phazon/vertibird/enclave/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/vertibird/enclave/GrantActions(mob/living/user, human_occupant = 0) internals_action.Grant(user, src) cycle_action.Grant(user, src) lights_action.Grant(user, src) @@ -165,7 +165,7 @@ eject_action.Grant(user, src) landing_action.Grant(user, src) -/obj/mecha/combat/phazon/vertibird/enclave/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/vertibird/enclave/RemoveActions(mob/living/user, human_occupant = 0) internals_action.Remove(user) cycle_action.Remove(user) lights_action.Remove(user) @@ -175,7 +175,7 @@ eject_action.Remove(user) landing_action.Remove(user) -/obj/mecha/combat/phazon/vertibird/enclave/obj_destruction() +/obj/mecha/base_vehicle/vertibird/enclave/obj_destruction() for(var/mob/M in src) to_chat(M, span_brass(" The vertibird is going to Crash !")) M.dust() @@ -183,7 +183,7 @@ src.visible_message(span_userdanger("The reactor has gone critical, its going to blow!")) addtimer(CALLBACK(src,.proc/go_critical),breach_time) -/obj/mecha/combat/phazon/vertibird/enclave/loaded/Initialize() +/obj/mecha/base_vehicle/vertibird/enclave/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid ME.attach(src) @@ -197,7 +197,7 @@ /// BOS Vertibird -/obj/mecha/combat/phazon/vertibird/brotherhood +/obj/mecha/base_vehicle/vertibird/brotherhood name = "\improper Brotherhood Vertibird" desc = "A real useable, and working vertibird, maintained with luck, sweat, and ducktape. This one seems to be more focused toward combat, and marked with brotherhood markings." icon = 'icons/mecha/vb-vertibird-bos.dmi' @@ -209,10 +209,10 @@ wreckage = /obj/structure/mecha_wreckage/vertibird add_req_access = 1 max_utility_equip = 4 - max_weapons_equip = 4 + max_weapons_equip = 2 max_misc_equip = 2 -/obj/mecha/combat/phazon/vertibird/brotherhood/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/vertibird/brotherhood/GrantActions(mob/living/user, human_occupant = 0) internals_action.Grant(user, src) cycle_action.Grant(user, src) lights_action.Grant(user, src) @@ -222,7 +222,7 @@ eject_action.Grant(user, src) landing_action.Grant(user, src) -/obj/mecha/combat/phazon/vertibird/brotherhood/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/vertibird/brotherhood/RemoveActions(mob/living/user, human_occupant = 0) internals_action.Remove(user) cycle_action.Remove(user) lights_action.Remove(user) @@ -232,7 +232,7 @@ eject_action.Remove(user) landing_action.Remove(user) -/obj/mecha/combat/phazon/vertibird/brotherhood/obj_destruction() +/obj/mecha/base_vehicle/vertibird/brotherhood/obj_destruction() for(var/mob/M in src) to_chat(M, span_brass(" The vertibird is going to Crash !")) M.dust() @@ -240,7 +240,7 @@ src.visible_message(span_userdanger("The reactor has gone critical, its going to blow!")) addtimer(CALLBACK(src,.proc/go_critical),breach_time) -/obj/mecha/combat/phazon/vertibird/brotherhood/loaded/Initialize() +/obj/mecha/base_vehicle/vertibird/brotherhood/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rapid ME.attach(src) @@ -254,7 +254,7 @@ ///Legion balloon -/obj/mecha/combat/phazon/vertibird/balloon +/obj/mecha/base_vehicle/vertibird/balloon name = "\improper Legion Recon balloon" desc = "The legion maybe doesn't have fancy birds, but will still by the will of Caesar, get wings... And hot air." icon = 'icons/mecha/legionballoon.dmi' @@ -272,7 +272,7 @@ stepsound = 'sound/f13ambience/ambigen_15.ogg' turnsound = 'sound/f13ambience/ambigen_15.ogg' -/obj/mecha/combat/phazon/vertibird/balloon/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/vertibird/balloon/GrantActions(mob/living/user, human_occupant = 0) internals_action.Grant(user, src) cycle_action.Grant(user, src) lights_action.Grant(user, src) @@ -283,7 +283,7 @@ smoke_action.Grant(user, src) landing_action.Grant(user, src) -/obj/mecha/combat/phazon/vertibird/balloon/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/vertibird/balloon/RemoveActions(mob/living/user, human_occupant = 0) internals_action.Remove(user) cycle_action.Remove(user) lights_action.Remove(user) @@ -294,7 +294,7 @@ smoke_action.Remove(user) landing_action.Remove(user) -/obj/mecha/combat/phazon/vertibird/balloon/obj_destruction() +/obj/mecha/base_vehicle/vertibird/balloon/obj_destruction() for(var/mob/M in src) to_chat(M, " The balloon is going to crash!") M.dust() @@ -302,7 +302,7 @@ src.visible_message("The balloon's burner is about to blow!") addtimer(CALLBACK(src,.proc/go_critical),breach_time) -/obj/mecha/combat/phazon/vertibird/balloon/loaded/Initialize() +/obj/mecha/base_vehicle/vertibird/balloon/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg ME.attach(src) diff --git a/code/game/mecha/fallout/buggies.dm b/code/game/mecha/fallout/buggies.dm index 8f138bcb2c5..daf90d6c2ab 100644 --- a/code/game/mecha/fallout/buggies.dm +++ b/code/game/mecha/fallout/buggies.dm @@ -1,6 +1,6 @@ //Buggy -/obj/mecha/combat/phazon/buggy +/obj/mecha/base_vehicle/buggy name = "\improper Buggy" desc = "A light vehicle, not very powerfull or solid, running on a powercell." icon = 'icons/mecha/buggy.dmi' @@ -17,7 +17,7 @@ facing_modifiers = list(FRONT_ARMOUR = 1.15, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.85) // Engine's on the back, IG max_utility_equip = 2 - max_weapons_equip = 1 + max_weapons_equip = 0 max_misc_equip = 1 /obj/structure/mecha_wreckage/buggy @@ -26,29 +26,29 @@ icon = 'icons/fallout/vehicles/medium_vehicles.dmi' icon_state = "buggy-broken" -/obj/mecha/combat/phazon/buggy/go_out() +/obj/mecha/base_vehicle/buggy/go_out() ..() update_icon() -/obj/mecha/combat/phazon/buggy/moved_inside(mob/living/carbon/human/H) +/obj/mecha/base_vehicle/buggy/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/buggy/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/buggy/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/buggy/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/buggy/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/buggy/loaded/Initialize() +/obj/mecha/base_vehicle/buggy/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -56,13 +56,13 @@ //Buggydune -/obj/mecha/combat/phazon/buggy/dune +/obj/mecha/base_vehicle/buggy/dune name = "\improper Buggy" desc = "A light vehicle, not very powerfull or solid, running on a powercell." icon = 'icons/mecha/buggy.dmi' icon_state = "buggydune" -/obj/mecha/combat/phazon/buggy/dune/loaded/Initialize() +/obj/mecha/base_vehicle/buggy/dune/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -70,13 +70,13 @@ //Buggyred -/obj/mecha/combat/phazon/buggy/red +/obj/mecha/base_vehicle/buggy/red name = "\improper Buggy" desc = "A light vehicle, not very powerfull or solid, running on a powercell." icon = 'icons/mecha/buggy.dmi' icon_state = "buggyred" -/obj/mecha/combat/phazon/buggy/red/loaded/Initialize() +/obj/mecha/base_vehicle/buggy/red/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -84,13 +84,13 @@ //Buggyflame -/obj/mecha/combat/phazon/buggy/flamme +/obj/mecha/base_vehicle/buggy/flamme name = "\improper Buggy" desc = "A light vehicle, not very powerfull or solid, running on a powercell." icon = 'icons/mecha/buggy.dmi' icon_state = "buggyflame" -/obj/mecha/combat/phazon/buggy/flamme/loaded/Initialize() +/obj/mecha/base_vehicle/buggy/flamme/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -98,14 +98,14 @@ //Buggy Ranger -/obj/mecha/combat/phazon/buggy/ranger +/obj/mecha/base_vehicle/buggy/ranger name = "\improper Ranger Buggy" desc = "A light vehicle, not very powerfull or solid, running on a powercell. This one as been recolored by the Rangers." icon = 'icons/mecha/hanlonbuggy.dmi' icon_state = "hanlonbuggy" armor = ARMOR_VALUE_VEHICLE_MED_LIGHT -/obj/mecha/combat/phazon/buggy/ranger/loaded/Initialize() +/obj/mecha/base_vehicle/buggy/ranger/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -113,22 +113,24 @@ //Buggy Ranger AND RICO -/obj/mecha/combat/phazon/buggy/rangerarmed +/obj/mecha/base_vehicle/buggy/rangerarmed name = "\improper Vet Ranger Buggy with gunner" desc = "A light vehicle, not very powerfull or solid, running on a powercell. This one as been recolored by the Rangers... And Ranger Rico ''Gunner'' Davberger is gonna shoot with his shotgun." icon = 'icons/mecha/buggyrangergun.dmi' icon_state = "rangergun" armor = ARMOR_VALUE_VEHICLE_MED_LIGHT -/obj/mecha/combat/phazon/buggy/rangerarmed/go_out() + max_weapons_equip = 1 + +/obj/mecha/base_vehicle/buggy/rangerarmed/go_out() ..() update_icon() -/obj/mecha/combat/phazon/buggy/rangerarmed/moved_inside(mob/living/carbon/human/H) +/obj/mecha/base_vehicle/buggy/rangerarmed/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/buggy/rangerarmed/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/buggy/rangerarmed/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) @@ -136,7 +138,7 @@ klaxon_action.Grant(user, src) smoke_action.Grant(user, src) -/obj/mecha/combat/phazon/buggy/rangerarmed/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/buggy/rangerarmed/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) @@ -144,7 +146,7 @@ klaxon_action.Remove(user) smoke_action.Remove(user) -/obj/mecha/combat/phazon/buggy/rangerarmed/loaded/Initialize() +/obj/mecha/base_vehicle/buggy/rangerarmed/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -155,35 +157,35 @@ //Buggyblue -/obj/mecha/combat/phazon/buggy/blue +/obj/mecha/base_vehicle/buggy/blue name = "\improper Minutemen Buggy" desc = "A light vehicle, not very powerful or solid, running on fuel." icon = 'icons/mecha/buggy.dmi' icon_state = "buggyblue" -/obj/mecha/combat/phazon/buggy/blue/go_out() +/obj/mecha/base_vehicle/buggy/blue/go_out() ..() update_icon() -/obj/mecha/combat/phazon/buggy/blue/moved_inside(mob/living/carbon/human/H) +/obj/mecha/base_vehicle/buggy/blue/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/buggy/blue/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/buggy/blue/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/buggy/blue/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/buggy/blue/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/buggy/blue/loaded/Initialize() +/obj/mecha/base_vehicle/buggy/blue/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat diff --git a/code/game/mecha/fallout/carriages.dm b/code/game/mecha/fallout/carriages.dm index d996da86dc7..788c51f25b2 100644 --- a/code/game/mecha/fallout/carriages.dm +++ b/code/game/mecha/fallout/carriages.dm @@ -1,6 +1,6 @@ //Legion Chariot -/obj/mecha/combat/phazon/buggy/legion +/obj/mecha/base_vehicle/buggy/legion name = "\improper Legion Chariot" desc = "A light vehicle, not very powerfull or solid, running on a power cell... Okay, its a lie. Its actually run on power generated by the horse...The cell is here to make sure that some componant of the half buggy pulled by horses works." icon = 'icons/mecha/buggy-legion.dmi' @@ -19,29 +19,29 @@ max_weapons_equip = 1 max_misc_equip = 1 -/obj/mecha/combat/phazon/buggy/legion/go_out() +/obj/mecha/base_vehicle/buggy/legion/go_out() ..() update_icon() -/obj/mecha/combat/phazon/buggy/legion/moved_inside(mob/living/carbon/human/H) +/obj/mecha/base_vehicle/buggy/legion/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/buggy/legion/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/buggy/legion/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/buggy/legion/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/buggy/legion/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/buggy/legion/loaded/Initialize() +/obj/mecha/base_vehicle/buggy/legion/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -49,7 +49,7 @@ //Buggy Legion AND MESALLA -/obj/mecha/combat/phazon/buggy/legionarmed +/obj/mecha/base_vehicle/buggy/legionarmed name = "\improper Legion Chariot with gunner" desc = "A light vehicle, not very powerfull or solid, running on a power cell... Okay, its a lie. Its actually run on power generated by the horse...The cell is here to make sure that some componant of the half buggy pulled by horses works. This one as been recolored by the legions... And Prime Decanus Messala ''Gunner'' Davius is gonna shoot with his shotgun." icon = 'icons/mecha/buggy-legiongun.dmi' @@ -61,7 +61,9 @@ step_in = 1.2 armor = ARMOR_VALUE_VEHICLE_MED_LIGHT -/obj/mecha/combat/phazon/buggy/legionarmed/GrantActions(mob/living/user, human_occupant = 0) + max_weapons_equip = 1 + +/obj/mecha/base_vehicle/buggy/legionarmed/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) @@ -69,7 +71,7 @@ klaxon_action.Grant(user, src) smoke_action.Grant(user, src) -/obj/mecha/combat/phazon/buggy/legionarmed/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/buggy/legionarmed/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) @@ -77,7 +79,7 @@ klaxon_action.Remove(user) smoke_action.Remove(user) -/obj/mecha/combat/phazon/buggy/legionarmed/loaded/Initialize() +/obj/mecha/base_vehicle/buggy/legionarmed/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -88,7 +90,7 @@ //truckcaravan -/obj/mecha/combat/phazon/truckcaravan +/obj/mecha/base_vehicle/truckcaravan name = "\improper Truck caravan" desc = "A vehicle, not very powerfull or solid, running on a power cell... Okay, its a lie. Its pulled by two brahmins...The cell is here to make sure that some componant of the half buggy pulled by brahmins works." icon = 'icons/mecha/truckcaravan.dmi' @@ -104,24 +106,24 @@ wreckage = /obj/structure/mecha_wreckage/fallout max_utility_equip = 4 - max_weapons_equip = 1 + max_weapons_equip = 0 max_misc_equip = 1 -/obj/mecha/combat/phazon/truckcaravan/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/truckcaravan/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/truckcaravan/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/truckcaravan/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/truckcaravan/loaded/Initialize() +/obj/mecha/base_vehicle/truckcaravan/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat diff --git a/code/game/mecha/fallout/cars.dm b/code/game/mecha/fallout/cars.dm index 5386a5e17fa..d78e5a83f86 100644 --- a/code/game/mecha/fallout/cars.dm +++ b/code/game/mecha/fallout/cars.dm @@ -1,6 +1,6 @@ //Highwayman -/obj/mecha/combat/phazon/highwayman +/obj/mecha/base_vehicle/highwayman name = "\improper highwayman eco" desc = "A fast vehicule, runing on powercell. YUP ! ITS THE HIGHWAYMAN ! Kinda. Its not the original, but a budget version." icon = 'icons/mecha/highwayman.dmi' @@ -15,29 +15,29 @@ turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/fallout -/obj/mecha/combat/phazon/highwayman/go_out() +/obj/mecha/base_vehicle/highwayman/go_out() ..() update_icon() -/obj/mecha/combat/phazon/highwayman/moved_inside(mob/living/carbon/human/H) +/obj/mecha/base_vehicle/highwayman/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/highwayman/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/highwayman/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/highwayman/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/highwayman/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/highwayman/loaded/Initialize() +/obj/mecha/base_vehicle/highwayman/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -45,7 +45,7 @@ //corvega -/obj/mecha/combat/phazon/corvega +/obj/mecha/base_vehicle/corvega name = "\improper Corvega" desc = "A old vehicule, runing on powercell." icon = 'icons/mecha/corvega.dmi' @@ -54,7 +54,7 @@ armor = ARMOR_VALUE_VEHICLE_MED_LIGHT wreckage = /obj/structure/mecha_wreckage/buggy -/obj/mecha/combat/phazon/corvega/loaded/Initialize() +/obj/mecha/base_vehicle/corvega/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -64,7 +64,7 @@ //corvega police -/obj/mecha/combat/phazon/corvega/police +/obj/mecha/base_vehicle/corvega/police name = "\improper Police Corvega" desc = "A old vehicule, runing on powercell. Seems to have been the proprety of the PreWar Yuma PD." icon = 'icons/mecha/corvega-police.dmi' @@ -73,7 +73,9 @@ armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/buggy -/obj/mecha/combat/phazon/corvega/police/GrantActions(mob/living/user, human_occupant = 0) + max_weapons_equip = 1 + +/obj/mecha/base_vehicle/corvega/police/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) @@ -81,7 +83,7 @@ klaxon_action.Grant(user, src) sirens_action.Grant(user, src) -/obj/mecha/combat/phazon/corvega/police/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/corvega/police/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) @@ -89,7 +91,7 @@ klaxon_action.Remove(user) sirens_action.Remove(user) -/obj/mecha/combat/phazon/corvega/police/loaded/Initialize() +/obj/mecha/base_vehicle/corvega/police/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat diff --git a/code/game/mecha/fallout/pickuptrucks.dm b/code/game/mecha/fallout/pickuptrucks.dm index 020753da547..29e4abaaa45 100644 --- a/code/game/mecha/fallout/pickuptrucks.dm +++ b/code/game/mecha/fallout/pickuptrucks.dm @@ -1,6 +1,6 @@ //pickuptruck -/obj/mecha/combat/phazon/pickuptruck +/obj/mecha/base_vehicle/pickuptruck name = "\improper pickup truck" desc = "A old vehicule, runing on powercell." icon = 'icons/mecha/pickuptruck.dmi' @@ -16,40 +16,40 @@ wreckage = /obj/structure/mecha_wreckage/fallout cargo_capacity = 2 - max_weapons_equip = 1 + max_weapons_equip = 0 max_utility_equip = 5 max_misc_equip = 1 facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.25) -/obj/mecha/combat/phazon/pickuptruck/Initialize(mapload) +/obj/mecha/base_vehicle/pickuptruck/Initialize(mapload) . = ..() var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/vehicle_straps/ME = new(src) ME.attach(src) -/obj/mecha/combat/phazon/pickuptruck/go_out() +/obj/mecha/base_vehicle/pickuptruck/go_out() ..() update_icon() -/obj/mecha/combat/phazon/pickuptruck/moved_inside(mob/living/carbon/human/H) +/obj/mecha/base_vehicle/pickuptruck/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/pickuptruck/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/pickuptruck/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/pickuptruck/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/pickuptruck/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/pickuptruck/loaded/Initialize() +/obj/mecha/base_vehicle/pickuptruck/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -61,7 +61,7 @@ //pickuptruck blue -/obj/mecha/combat/phazon/pickuptruck/blue +/obj/mecha/base_vehicle/pickuptruck/blue name = "\improper pickup truck" desc = "A old vehicule, runing on powercell." icon = 'icons/mecha/pickuptruck-blue.dmi' @@ -70,7 +70,7 @@ armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/buggy -/obj/mecha/combat/phazon/pickuptruck/blue/loaded/Initialize() +/obj/mecha/base_vehicle/pickuptruck/blue/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -82,7 +82,7 @@ //pickuptruck bos -/obj/mecha/combat/phazon/pickuptruck/bos +/obj/mecha/base_vehicle/pickuptruck/bos name = "\improper BoS pickup truck" desc = "A old vehicule, runing on powercell." icon = 'icons/mecha/pickuptruck-bos.dmi' @@ -91,7 +91,7 @@ armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/buggy -/obj/mecha/combat/phazon/pickuptruck/bos/loaded/Initialize() +/obj/mecha/base_vehicle/pickuptruck/bos/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -101,7 +101,7 @@ //pickuptruck bos AND Kiana -/obj/mecha/combat/phazon/pickuptruck/bos/armed +/obj/mecha/base_vehicle/pickuptruck/bos/armed name = "\improper BoS pickup truck with gunner" desc = "A old vehicule, runing on powercell. Its a A modified brotherhood truck, with the addition of a laser rifle at the back, maned by Paladin Kiana Davberg." icon = 'icons/mecha/pickuptruck-gunbos.dmi' @@ -111,9 +111,11 @@ wreckage = /obj/structure/mecha_wreckage/buggy cargo_capacity = 1 + max_weapons_equip = 1 + facing_modifiers = list(FRONT_ARMOUR = 0.8, SIDE_ARMOUR = 1, BACK_ARMOUR = 1.5) // There's whole ass paladin in the way.. -/obj/mecha/combat/phazon/pickuptruck/bos/armed/loaded/Initialize() +/obj/mecha/base_vehicle/pickuptruck/bos/armed/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -125,7 +127,7 @@ //pickuptruck mechanic -/obj/mecha/combat/phazon/pickuptruck/mechanic +/obj/mecha/base_vehicle/mechanics_pickuptruck name = "\improper mechanic pickup truck" desc = "A old vehicule, with a crane runing on fuel." icon = 'icons/mecha/pickuptruck-mechanics.dmi' @@ -133,47 +135,44 @@ stepsound = 'sound/f13machines/buggy_loop.ogg' turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/buggy + max_integrity = 300 step_in = 1.2 step_energy_drain = 0.6 armor = ARMOR_VALUE_VEHICLE_MED_LIGHT // Less armor, more tools cargo_capacity = 5 - max_weapons_equip = 1 + max_weapons_equip = 0 max_utility_equip = 6 max_misc_equip = 1 -/obj/mecha/combat/phazon/pickuptruck/mechanic/Initialize() +/obj/mecha/base_vehicle/mechanics_pickuptruck/Initialize() . = ..() - for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) - E.detach() - qdel(E) - equipment.Cut() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13 ME.attach(src) -/obj/mecha/combat/phazon/pickuptruck/mechanic/go_out() +/obj/mecha/base_vehicle/mechanics_pickuptruck/mechanic/go_out() ..() update_icon() -/obj/mecha/combat/phazon/pickuptruck/mechanic/moved_inside(mob/living/carbon/human/H) +/obj/mecha/base_vehicle/mechanics_pickuptruck/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/pickuptruck/mechanic/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/mechanics_pickuptruck/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/pickuptruck/mechanic/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/mechanics_pickuptruck/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/pickuptruck/mechanic/loaded/Initialize() +/obj/mecha/base_vehicle/mechanics_pickuptruck/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -183,7 +182,7 @@ //jeep -/obj/mecha/combat/phazon/jeep +/obj/mecha/base_vehicle/pickuptruck/jeep name = "\improper pickup truck" desc = "A old vehicle, runing on fuel." icon = 'icons/mecha/jeep.dmi' @@ -199,38 +198,33 @@ wreckage = /obj/structure/mecha_wreckage/buggy cargo_capacity = 1 - max_weapons_equip = 1 + max_weapons_equip = 0 max_utility_equip = 4 max_misc_equip = 1 -/obj/mecha/combat/phazon/jeep/go_out() +/obj/mecha/base_vehicle/pickuptruck/jeep/go_out() ..() update_icon() -/obj/mecha/combat/phazon/jeep/moved_inside(mob/living/carbon/human/H) +/obj/mecha/base_vehicle/pickuptruck/jeep/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/jeep/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/pickuptruck/jeep/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/jeep/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/pickuptruck/jeep/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/jeep/Initialize(mapload) - . = ..() - var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/fallout13/vehicle_straps/ME = new(src) - ME.attach(src) - -/obj/mecha/combat/phazon/jeep/loaded/Initialize() +/obj/mecha/base_vehicle/pickuptruck/jeep/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -241,7 +235,7 @@ //jeep Enclave -/obj/mecha/combat/phazon/jeep/enclave +/obj/mecha/base_vehicle/pickuptruck/jeep/enclave name = "\improper pickup truck" desc = "A old military vehicule, runing on fuel., and recolored" icon = 'icons/mecha/jeepenclave.dmi' @@ -249,7 +243,7 @@ ///jeep BOS -/obj/mecha/combat/phazon/jeep/bos +/obj/mecha/base_vehicle/pickuptruck/jeep/bos name = "\improper pickup truck" desc = "A old military vehicule, runing on fuel, and recolored" icon = 'icons/mecha/jeepbos.dmi' diff --git a/code/game/mecha/fallout/trucks.dm b/code/game/mecha/fallout/trucks.dm index c2526ce0c06..c84753e4703 100644 --- a/code/game/mecha/fallout/trucks.dm +++ b/code/game/mecha/fallout/trucks.dm @@ -1,6 +1,6 @@ //////////// NCR TRUCK ////////////// -/obj/mecha/combat/phazon/ncrtruck +/obj/mecha/base_vehicle/ncrtruck name = "\improper NCR Truck" desc = "A truck running on powercells. Nice eh ? still a wreck." icon = 'icons/mecha/ncrtruck.dmi' @@ -15,7 +15,7 @@ turnsound = 'sound/f13machines/buggy_loop.ogg' wreckage = /obj/structure/mecha_wreckage/ncrtruck - max_weapons_equip = 1 + max_weapons_equip = 0 max_utility_equip = 8 max_misc_equip = 1 @@ -27,36 +27,36 @@ icon = 'icons/fallout/vehicles/medium_vehicles.dmi' icon_state = "derelict" -/obj/mecha/combat/phazon/ncrtruck/go_out() +/obj/mecha/base_vehicle/ncrtruck/go_out() ..() update_icon() -/obj/mecha/combat/phazon/ncrtruck/moved_inside(mob/living/carbon/human/H) +/obj/mecha/base_vehicle/ncrtruck/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/ncrtruck/Destroy() +/obj/mecha/base_vehicle/ncrtruck/Destroy() for(var/atom/movable/A in cargo) A.forceMove(drop_location()) step_rand(A) cargo.Cut() return ..() -/obj/mecha/combat/phazon/ncrtruck/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/ncrtruck/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) eject_action.Grant(user, src) klaxon_action.Grant(user, src) -/obj/mecha/combat/phazon/ncrtruck/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/ncrtruck/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) eject_action.Remove(user) klaxon_action.Remove(user) -/obj/mecha/combat/phazon/ncrtruck/loaded/Initialize() +/obj/mecha/base_vehicle/ncrtruck/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -74,7 +74,7 @@ //////////// NCR TRUCK MP ////////////// -/obj/mecha/combat/phazon/ncrtruck/mp +/obj/mecha/base_vehicle/ncrtruck/mp name = "\improper NCR MP Truck" desc = "A truck running on powercells. Nice eh ? still a wreck. This Truck has been given to the NCR MPs, the running gear has been improved." icon = 'icons/mecha/ncrtruck-mp.dmi' @@ -85,11 +85,11 @@ armor = ARMOR_VALUE_VEHICLE_MEDIUM wreckage = /obj/structure/mecha_wreckage/ncrtruck - max_weapons_equip = 1 + max_weapons_equip = 0 max_utility_equip = 3 max_misc_equip = 1 -/obj/mecha/combat/phazon/ncrtruck/mp/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/ncrtruck/mp/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) @@ -97,7 +97,7 @@ klaxon_action.Grant(user, src) sirens_action.Grant(user, src) -/obj/mecha/combat/phazon/ncrtruck/mp/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/ncrtruck/mp/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) @@ -105,7 +105,7 @@ klaxon_action.Remove(user) sirens_action.Remove(user) -/obj/mecha/combat/phazon/ncrtruck/mp/loaded/Initialize() +/obj/mecha/base_vehicle/ncrtruck/mp/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat @@ -117,7 +117,7 @@ //Ambulance -/obj/mecha/combat/phazon/ambulance +/obj/mecha/base_vehicle/ambulance name = "\improper Ambulance" desc = "A Modified vehicule made to carry people in need to a hospital." icon = 'icons/mecha/ambulance.dmi' @@ -130,20 +130,20 @@ armor = ARMOR_VALUE_VEHICLE_MEDIUM max_integrity = 300 step_energy_drain = 0.5 - max_weapons_equip = 1 + max_weapons_equip = 0 max_utility_equip = 5 max_misc_equip = 1 -/obj/mecha/combat/phazon/ambulance/go_out() +/obj/mecha/base_vehicle/ambulance/go_out() ..() update_icon() -/obj/mecha/combat/phazon/ambulance/moved_inside(mob/living/carbon/human/H) +/obj/mecha/base_vehicle/ambulance/moved_inside(mob/living/carbon/human/H) ..() update_icon() -/obj/mecha/combat/phazon/ambulance/GrantActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/ambulance/GrantActions(mob/living/user, human_occupant = 0) cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) @@ -151,7 +151,7 @@ klaxon_action.Grant(user, src) sirens_action.Grant(user, src) -/obj/mecha/combat/phazon/ambulance/RemoveActions(mob/living/user, human_occupant = 0) +/obj/mecha/base_vehicle/ambulance/RemoveActions(mob/living/user, human_occupant = 0) cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) @@ -159,7 +159,7 @@ klaxon_action.Remove(user) sirens_action.Remove(user) -/obj/mecha/combat/phazon/ambulance/loaded/Initialize() +/obj/mecha/base_vehicle/ambulance/loaded/Initialize() . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new ME = new /obj/item/mecha_parts/mecha_equipment/seat diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 12dca1a8958..072a259349e 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -196,6 +196,7 @@ diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() + full_repair(refill_tank=1) /obj/mecha/proc/grant_vision() if(!occupant) @@ -1251,3 +1252,9 @@ else if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. to_chat(user, span_warning("You fail to push [O] out of [src]!")) + +/obj/mecha/proc/max_ammo() //Max the ammo stored for Nuke Ops mechs, or anyone else that calls this + for(var/obj/item/I in equipment) + if(istype(I, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/)) + var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun = I + gun.projectiles_cache = gun.projectiles_cache_max diff --git a/hailmary.dme b/hailmary.dme index 802c414db12..6d016bf6cd2 100644 --- a/hailmary.dme +++ b/hailmary.dme @@ -1013,6 +1013,7 @@ #include "code\game\mecha\equipment\weapons\fallout\lasers.dm" #include "code\game\mecha\equipment\weapons\fallout\launchers.dm" #include "code\game\mecha\fallout\armoured.dm" +#include "code\game\mecha\fallout\base_vehicle.dm" #include "code\game\mecha\fallout\birds.dm" #include "code\game\mecha\fallout\buggies.dm" #include "code\game\mecha\fallout\carriages.dm" diff --git a/icons/mecha/corvega.dmi b/icons/mecha/corvega.dmi index 040f5c23494e9b86ba628d3241fc62c52551676c..36be15b553fd3ef2fb572a80b815db4b184d9a7b 100644 GIT binary patch literal 21322 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 z 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 Date: Sat, 19 Oct 2024 21:39:14 +1300 Subject: [PATCH 65/68] Update mecha.dm --- code/game/mecha/mecha.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 072a259349e..5a2cab51d55 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -196,7 +196,6 @@ diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() - full_repair(refill_tank=1) /obj/mecha/proc/grant_vision() if(!occupant) From fac37d73a5ed4173ebff4cd17928d4a2fd385096 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sat, 19 Oct 2024 21:47:30 +1300 Subject: [PATCH 66/68] Update Pahrump-AB.dmm --- _maps/map_files/Pahrump-AB/Pahrump-AB.dmm | 348 ++++++++++++++-------- 1 file changed, 219 insertions(+), 129 deletions(-) diff --git a/_maps/map_files/Pahrump-AB/Pahrump-AB.dmm b/_maps/map_files/Pahrump-AB/Pahrump-AB.dmm index c64e499e349..cfe8bc88a24 100644 --- a/_maps/map_files/Pahrump-AB/Pahrump-AB.dmm +++ b/_maps/map_files/Pahrump-AB/Pahrump-AB.dmm @@ -693,8 +693,8 @@ }, /area/f13/wasteland) "adf" = ( -/obj/structure/table/wood/settler, /obj/machinery/light/small, +/obj/machinery/seed_extractor, /turf/open/indestructible/ground/outside/dirt, /area/f13/ncr) "adg" = ( @@ -1344,7 +1344,10 @@ /area/f13/building) "agm" = ( /obj/structure/closet/cabinet, -/obj/effect/spawner/lootdrop/f13/junkspawners, +/obj/item/clothing/head/f13/ncr/ncr_flapcap, +/obj/item/clothing/head/beret/ncr_dresscap, +/obj/item/clothing/under/f13/ncr/ncr_dress, +/obj/item/clothing/suit/armor/ncrarmor/ncr_dressjack, /turf/open/floor/wood_fancy, /area/f13/ncr) "agp" = ( @@ -2223,7 +2226,6 @@ /obj/structure/chair/f13chair2{ dir = 8 }, -/obj/effect/landmark/start/f13/ncrcombatmedic, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, /area/f13/ncr) "ajZ" = ( @@ -2284,6 +2286,10 @@ /area/f13/bunker) "akh" = ( /obj/structure/rack, +/obj/machinery/light{ + dir = 1; + pixel_x = 16 + }, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, /area/f13/ncr) "aki" = ( @@ -2457,7 +2463,6 @@ /obj/structure/chair/f13chair2{ dir = 8 }, -/obj/effect/landmark/start/f13/ncrcombatmedic, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, /area/f13/ncr) "akP" = ( @@ -2686,6 +2691,7 @@ "alK" = ( /obj/structure/bed, /obj/item/bedsheet/brown, +/obj/effect/landmark/start/f13/ncrheavytrooper, /turf/open/floor/wood_fancy, /area/f13/ncr) "alL" = ( @@ -3151,8 +3157,6 @@ "anL" = ( /obj/structure/chair/comfy, /obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/f13/ncrcaptain, -/obj/effect/landmark/start/f13/ncrcolonel, /turf/open/floor/plasteel/vault, /area/f13/ncr) "anM" = ( @@ -3252,6 +3256,7 @@ "aog" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, +/obj/item/kirbyplants, /turf/open/floor/plasteel/vault, /area/f13/ncr) "aoh" = ( @@ -3465,7 +3470,7 @@ /turf/open/floor/plasteel/vault, /area/f13/ncr) "apn" = ( -/obj/structure/chair/f13foldupchair{ +/obj/structure/chair/folding{ dir = 1 }, /turf/open/floor/f13{ @@ -3844,10 +3849,8 @@ /turf/open/indestructible/ground/outside/road, /area/f13/wasteland) "are" = ( -/obj/structure/chair/f13foldupchair{ - dir = 4; - pixel_x = -8; - pixel_y = 6 +/obj/structure/chair/folding{ + dir = 4 }, /turf/open/floor/plasteel/vault, /area/f13/ncr) @@ -3982,8 +3985,6 @@ /obj/structure/chair/office{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/f13/ncrdrillsergeant, /turf/open/floor/plasteel/vault, /area/f13/ncr) "arJ" = ( @@ -4272,12 +4273,6 @@ icon_state = "greenrustychess" }, /area/f13/building/massfusion) -"asP" = ( -/obj/structure/closet/cabinet, -/obj/effect/spawner/lootdrop/f13/junkspawners, -/obj/effect/spawner/lootdrop/f13/junkspawners, -/turf/open/floor/wood_fancy, -/area/f13/ncr) "asR" = ( /obj/structure/tires, /turf/open/indestructible/ground/outside/dirt, @@ -12956,6 +12951,11 @@ /area/f13/radiation) "aXS" = ( /obj/structure/rack/shelf_metal, +/obj/item/radio/headset/headset_bos, +/obj/item/radio/headset/headset_bos, +/obj/item/radio/headset/headset_bos, +/obj/item/radio/headset/headset_bos, +/obj/item/radio/headset/headset_bos, /turf/open/floor/f13{ icon_state = "reddirtyfull" }, @@ -14683,10 +14683,8 @@ }, /area/f13/building) "bgB" = ( -/obj/structure/chair/f13foldupchair{ - dir = 8; - pixel_x = 12; - pixel_y = 6 +/obj/structure/chair/folding{ + dir = 8 }, /turf/open/floor/plasteel/f13/vault_floor/dark, /area/f13/ncr) @@ -15835,6 +15833,14 @@ }, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, /area/f13/caves) +"bnv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, +/area/f13/ncr) "bnz" = ( /obj/structure/table/wood, /obj/machinery/processor/chopping_block, @@ -16228,7 +16234,15 @@ }, /area/f13/wasteland) "bqU" = ( -/obj/structure/reagent_dispensers/watertank/high, +/obj/structure/closet/crate/wooden, +/obj/item/shovel/spade, +/obj/item/shovel/spade, +/obj/item/cultivator/rake, +/obj/item/cultivator/rake, +/obj/item/storage/bag/plants, +/obj/item/storage/bag/plants, +/obj/item/reagent_containers/glass/bucket/wood, +/obj/item/reagent_containers/glass/bucket/wood, /turf/open/indestructible/ground/outside/dirt, /area/f13/ncr) "bqX" = ( @@ -16397,10 +16411,6 @@ icon_state = "whitegreenrustychess" }, /area/f13/village) -"btf" = ( -/obj/structure/chair/f13foldupchair, -/turf/open/floor/plasteel/vault, -/area/f13/ncr) "btj" = ( /mob/living/simple_animal/hostile/retaliate/goat/bighorn, /obj/structure/flora/grass/coyote/one, @@ -16820,12 +16830,14 @@ }, /area/f13/legion) "bxA" = ( -/obj/structure/chair/f13foldupchair, /obj/machinery/light{ dir = 4; light_color = "#c1caff" }, /obj/effect/decal/cleanable/dirt, +/obj/structure/chair/folding{ + dir = 1 + }, /turf/open/floor/plasteel/vault, /area/f13/ncr) "bxC" = ( @@ -21026,6 +21038,17 @@ /obj/structure/destructible/tribal_torch/lit, /turf/open/indestructible/ground/outside/desert, /area/f13/wasteland) +"cIg" = ( +/obj/structure/reagent_dispensers/fueltank/vehicle_gas_station{ + icon_state = "vat"; + tank_volume = 1500; + name = "Gas Tank"; + color = "#FF0000" + }, +/turf/open/indestructible/ground/outside/gravel/corner{ + dir = 4 + }, +/area/f13/wasteland) "cIk" = ( /obj/item/bedsheet, /obj/structure/bed/old, @@ -22930,7 +22953,6 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/effect/landmark/start/f13/scribe, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, /area/f13/brotherhood) "dzg" = ( @@ -23733,10 +23755,6 @@ /obj/structure/sign/poster/prewar/poster74, /turf/closed/wall/f13/supermart, /area/f13/building/mall) -"dRl" = ( -/obj/effect/landmark/start/f13/scribe, -/turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, -/area/f13/brotherhood) "dRq" = ( /obj/item/reagent_containers/rag/towel/random{ pixel_x = 15; @@ -23821,6 +23839,12 @@ /area/f13/wasteland) "dSW" = ( /obj/structure/closet, +/obj/item/clothing/accessory/armband/black, +/obj/item/clothing/accessory/armband/black, +/obj/item/clothing/head/f13/ncr/steelpot_mp, +/obj/item/clothing/head/f13/ncr/steelpot_mp, +/obj/item/clothing/head/f13/ncr/steelpot_mp, +/obj/item/clothing/head/f13/ncr/steelpot_mp, /turf/open/floor/f13{ icon_state = "darkdirtysolid" }, @@ -25389,11 +25413,11 @@ /turf/open/floor/wood_common, /area/f13/village) "ezA" = ( -/obj/structure/chair/f13foldupchair{ - dir = 1 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/structure/chair/folding{ + dir = 1 + }, /turf/open/floor/plasteel/vault, /area/f13/ncr) "ezK" = ( @@ -28190,13 +28214,6 @@ /obj/structure/table/wood, /turf/open/floor/plasteel/cafeteria, /area/f13/city) -"fCA" = ( -/obj/effect/landmark/start/f13/seniorscribe, -/obj/effect/landmark/start/f13/headscribe, -/turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust{ - icon_state = "whitedirtysolid" - }, -/area/f13/brotherhood/chemistry) "fCH" = ( /obj/item/screwdriver{ pixel_y = 10 @@ -31341,6 +31358,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/f13/wood, /area/f13/village) +"gPZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/fueltank/vehicle_gas_station{ + icon_state = "vat"; + tank_volume = 1500; + name = "Gas Tank"; + color = "#FF0000" + }, +/turf/open/indestructible/ground/outside/sidewalk{ + icon_state = "verticalrightborderright0" + }, +/area/f13/wasteland) "gQA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -32349,6 +32379,17 @@ /mob/living/simple_animal/hostile/raider/ranged/biker, /turf/open/floor/plasteel/f13/vault_floor/blue/side, /area/f13/building/hospital) +"hnE" = ( +/obj/structure/table, +/obj/item/reagent_containers/jerrycan, +/obj/item/reagent_containers/jerrycan, +/obj/item/reagent_containers/jerrycan, +/obj/item/reagent_containers/jerrycan, +/obj/item/reagent_containers/jerrycan, +/turf/open/indestructible/ground/outside/sidewalk{ + icon_state = "horizontaltopbordertop0" + }, +/area/f13/wasteland) "hnO" = ( /obj/effect/spawner/lootdrop/f13/junkspawners, /obj/structure/flora/grass/wasteland{ @@ -32691,12 +32732,10 @@ /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, /area/f13/brotherhood/offices1st) "hwO" = ( -/obj/structure/chair/f13foldupchair{ - dir = 8; - pixel_x = 12; - pixel_y = 6 - }, /obj/effect/decal/cleanable/dirt, +/obj/structure/chair/folding{ + dir = 8 + }, /turf/open/floor/plasteel/vault, /area/f13/ncr) "hwP" = ( @@ -33162,7 +33201,6 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/f13/ncrlieutenant, /turf/open/floor/plasteel/vault, /area/f13/ncr) "hHo" = ( @@ -33623,16 +33661,6 @@ icon_state = "verticalleftborderright0" }, /area/f13/building) -"hRZ" = ( -/obj/item/reagent_containers/jerrycan, -/obj/item/reagent_containers/jerrycan, -/obj/item/reagent_containers/jerrycan, -/obj/item/reagent_containers/jerrycan, -/obj/item/reagent_containers/jerrycan, -/turf/open/indestructible/ground/outside/sidewalk{ - icon_state = "verticaloutermain0" - }, -/area/f13/wasteland) "hSb" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/f13/wood{ @@ -34023,6 +34051,8 @@ /area/f13/building) "ibi" = ( /obj/machinery/seed_extractor, +/obj/item/reagent_containers/food/snacks/grown/xander, +/obj/item/reagent_containers/food/snacks/grown/broc, /turf/open/indestructible/ground/outside/sidewalk, /area/f13/ncr) "ibj" = ( @@ -37165,10 +37195,8 @@ /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, /area/f13/caves) "jjK" = ( -/obj/structure/chair/f13foldupchair{ - dir = 8; - pixel_x = 12; - pixel_y = 6 +/obj/structure/chair/folding{ + dir = 8 }, /turf/open/floor/plasteel/vault, /area/f13/ncr) @@ -38043,6 +38071,12 @@ dir = 1 }, /area/f13/building/hospital) +"jDH" = ( +/obj/structure/bed, +/obj/item/bedsheet/brown, +/obj/effect/landmark/start/f13/ncrsergeant, +/turf/open/floor/wood_fancy, +/area/f13/ncr) "jDQ" = ( /turf/closed/wall/r_wall, /area/f13/brotherhood/leisure) @@ -41915,7 +41949,9 @@ }, /area/f13/village) "llo" = ( -/obj/structure/simple_door/room, +/obj/structure/simple_door/room{ + name = "Sergeant Room" + }, /turf/open/floor/wood_fancy, /area/f13/ncr) "llA" = ( @@ -43374,6 +43410,27 @@ "lRe" = ( /turf/closed/wall/f13/store, /area/f13/building/trainstation) +"lRg" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/closet/anchored, +/obj/item/clothing/under/f13/ncr, +/obj/item/clothing/under/f13/ncr, +/obj/item/clothing/under/f13/ncr, +/obj/item/clothing/under/f13/ncr, +/obj/item/clothing/under/f13/ncr/conscript, +/obj/item/clothing/under/f13/ncr/conscript, +/obj/item/clothing/under/f13/ncr/conscript, +/obj/item/clothing/under/f13/ncr/conscript, +/obj/item/clothing/suit/armor/ncrarmor, +/obj/item/clothing/suit/armor/ncrarmor, +/obj/item/clothing/suit/armor/ncrarmor/conscript, +/obj/item/clothing/suit/armor/ncrarmor/conscript, +/obj/item/clothing/suit/armor/ncrarmor/conscript, +/obj/item/clothing/suit/armor/ncrarmor/conscript, +/turf/open/floor/plasteel/f13/vault_floor/dark, +/area/f13/ncr) "lRo" = ( /turf/open/indestructible/ground/outside/sidewalk{ dir = 8; @@ -44370,6 +44427,15 @@ icon_state = "bluedirtychess2" }, /area/f13/village) +"mki" = ( +/obj/structure/reagent_dispensers/fueltank/vehicle_gas_station{ + icon_state = "vat"; + tank_volume = 1500; + name = "Gas Tank"; + color = "#FF0000" + }, +/turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, +/area/f13/brotherhood) "mkx" = ( /obj/structure/timeddoor, /turf/open/floor/f13{ @@ -45069,10 +45135,8 @@ }, /area/f13/building/mall) "mwJ" = ( -/obj/structure/chair/f13foldupchair{ - dir = 8; - pixel_x = 12; - pixel_y = 6 +/obj/structure/chair/folding{ + dir = 8 }, /turf/open/floor/plasteel/f13/vault_floor/dark{ icon_state = "darkdirty" @@ -47118,6 +47182,10 @@ }, /turf/open/indestructible/ground/outside/sidewalk, /area/f13/bunker) +"noN" = ( +/obj/structure/chalkboard, +/turf/open/floor/plasteel/f13/vault_floor/dark, +/area/f13/ncr) "noQ" = ( /obj/structure/barricade/sandbags, /turf/open/indestructible/ground/outside/dirt{ @@ -47995,11 +48063,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/f13/vault_floor/dark, /area/f13/ncr) -"nID" = ( -/obj/effect/decal/cleanable/dirt, -/obj/mecha/base_vehicle/ncrtruck/mp/loaded, -/turf/open/indestructible/ground/outside/road, -/area/f13/wasteland) "nIG" = ( /obj/structure/filingcabinet/security, /turf/open/floor/plasteel/f13/vault_floor/floor, @@ -49613,7 +49676,43 @@ /turf/open/indestructible/ground/inside/mountain, /area/f13/legion) "ose" = ( -/obj/item/kirbyplants, +/obj/structure/closet/locker/oldstyle{ + anchored = 1 + }, +/obj/item/clothing/accessory/ncr/TPR, +/obj/item/clothing/accessory/ncr/TPR, +/obj/item/clothing/accessory/ncr/TPR, +/obj/item/clothing/accessory/ncr/TPR, +/obj/item/clothing/accessory/ncr/SPC, +/obj/item/clothing/accessory/ncr/SPC, +/obj/item/clothing/accessory/ncr/SPC, +/obj/item/clothing/accessory/ncr/SGT, +/obj/item/clothing/accessory/ncr/SGT, +/obj/item/clothing/accessory/ncr/REC, +/obj/item/clothing/accessory/ncr/REC, +/obj/item/clothing/accessory/ncr/REC, +/obj/item/clothing/accessory/ncr/REC, +/obj/item/clothing/accessory/ncr/REC, +/obj/item/clothing/accessory/ncr/MCPL, +/obj/item/clothing/accessory/ncr/MCPL, +/obj/item/clothing/accessory/ncr/MCPL, +/obj/item/clothing/accessory/ncr/SSGT, +/obj/item/clothing/accessory/ncr/SSGT, +/obj/item/clothing/accessory/ncr/FSGT, +/obj/item/clothing/accessory/ncr/CPL, +/obj/item/clothing/accessory/ncr/CPL, +/obj/item/clothing/accessory/ncr/CPL, +/obj/item/clothing/accessory/medal/silver/valor, +/obj/item/clothing/accessory/medal/silver/valor, +/obj/item/clothing/accessory/medal/silver/valor, +/obj/item/clothing/accessory/medal/silver/valor, +/obj/item/clothing/accessory/medal/gold/captain, +/obj/item/clothing/accessory/medal/gold/captain, +/obj/item/clothing/accessory/medal/gold/heroism, +/obj/item/clothing/accessory/medal/gold/heroism, +/obj/item/clothing/accessory/medal/bronze_heart, +/obj/item/clothing/accessory/medal/bronze_heart, +/obj/item/clothing/accessory/medal/bronze_heart, /turf/open/floor/plasteel/vault, /area/f13/ncr) "oso" = ( @@ -49706,12 +49805,6 @@ }, /turf/open/indestructible/ground/outside/water, /area/f13/wasteland) -"otl" = ( -/obj/effect/landmark/start/f13/ncrmp, -/turf/open/floor/f13{ - icon_state = "floorrusty" - }, -/area/f13/ncr) "otm" = ( /obj/effect/landmark/start/f13/wastelander, /turf/open/indestructible/ground/outside/desert{ @@ -53451,13 +53544,6 @@ /obj/structure/chair, /turf/open/floor/f13/wood, /area/f13/building) -"pOW" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/table/reinforced, -/turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, -/area/f13/ncr) "pOY" = ( /obj/effect/decal/cleanable/oil/streak, /turf/open/indestructible/ground/outside/road{ @@ -55873,7 +55959,7 @@ /turf/open/floor/plasteel/f13/vault_floor/white, /area/f13/city) "qSH" = ( -/obj/structure/chair/f13foldupchair{ +/obj/structure/chair/folding{ dir = 1 }, /turf/open/floor/plasteel/vault, @@ -57997,10 +58083,8 @@ /turf/open/indestructible/ground/outside/desert, /area/f13/wasteland) "rSg" = ( -/obj/structure/chair/f13foldupchair{ - dir = 4; - pixel_x = -8; - pixel_y = 6 +/obj/structure/chair/folding{ + dir = 4 }, /turf/open/floor/plasteel/f13/vault_floor/dark{ icon_state = "darkdirty" @@ -59158,10 +59242,6 @@ icon_state = "dirt" }, /area/f13/wasteland) -"spG" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, -/area/f13/ncr) "spL" = ( /obj/structure/flora/ausbushes/grassybush, /turf/open/indestructible/ground/outside/dirt{ @@ -61163,7 +61243,6 @@ /area/f13/wasteland) "tnD" = ( /obj/structure/chair/office, -/obj/effect/landmark/start/f13/ncrrep, /turf/open/floor/plasteel/vault, /area/f13/ncr) "tnG" = ( @@ -61632,6 +61711,8 @@ /area/f13/building/mall) "twp" = ( /obj/machinery/workbench, +/obj/item/reagent_containers/food/snacks/grown/broc, +/obj/item/reagent_containers/food/snacks/grown/xander, /turf/open/indestructible/ground/outside/dirt, /area/f13/ncr) "tws" = ( @@ -61747,10 +61828,10 @@ }, /area/f13/building/museum) "tzb" = ( -/obj/structure/chair/f13foldupchair{ +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/folding{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/vault, /area/f13/ncr) "tzf" = ( @@ -62992,6 +63073,13 @@ /obj/structure/obstacle/barbedwire, /turf/open/indestructible/ground/inside/mountain, /area/f13/caves) +"tVM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/mecha/base_vehicle/ncrtruck/mp/loaded, +/turf/open/indestructible/ground/outside/road{ + icon_state = "topshadowleft" + }, +/area/f13/wasteland) "tVN" = ( /obj/machinery/light/small, /obj/effect/decal/cleanable/dirt, @@ -64525,6 +64613,8 @@ /obj/item/melee/onehanded/club/ncrflag, /obj/item/clothing/head/f13/ncr, /obj/item/clothing/head/f13/ncr, +/obj/item/clothing/head/f13/ncr/goggles, +/obj/item/clothing/head/f13/ncr/goggles, /turf/open/floor/plasteel/f13/vault_floor/dark, /area/f13/ncr) "uFh" = ( @@ -64795,10 +64885,10 @@ }, /area/f13/wasteland) "uJk" = ( -/obj/structure/chair/f13foldupchair{ +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/folding{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/f13{ icon_state = "floordirtysolid" }, @@ -74075,9 +74165,9 @@ uIX cmi aoo bOm -otl +cjh ojV -otl +cjh cmi uDh kOP @@ -75097,8 +75187,8 @@ gBs gBs aOk kGV -otl -otl +cjh +cjh cmi cmi obz @@ -76878,7 +76968,7 @@ apI lZB jIJ xLa -lZB +rSg rSg rSg aNa @@ -77158,7 +77248,7 @@ kGV kGV vsg aQZ -tyE +tVM iZS iZS iZS @@ -77392,7 +77482,7 @@ apI lZB rvG xLa -hmu +noN rbV axe rbV @@ -77406,9 +77496,9 @@ xLa xLC pxI akh -spG -kGV -pOW +akD +akD +akD akt akD bAm @@ -77637,7 +77727,7 @@ xLa xLa xLa xLa -jGR +dgL xLa xLa tHb @@ -77664,7 +77754,7 @@ xLC pxI bpT akt -uDh +bnv vjj akt gEL @@ -77893,7 +77983,7 @@ xLa anb abE abE -dgL +jGR hmu hmu hmu @@ -78420,7 +78510,7 @@ xLa oeB xLa xLa -lZB +mwJ mwJ bgB aOD @@ -78690,7 +78780,7 @@ xLa rnk rnk kGV -arX +lRg hmu lTF axa @@ -78935,7 +79025,7 @@ xLa apX aqi arY -hRZ +lpo hmz hmz lpo @@ -80738,7 +80828,7 @@ mHp gBa oXi jIk -hax +gPZ khV mHp evq @@ -80996,7 +81086,7 @@ apQ ahQ hEG aZE -aQZ +hnE mHp bMM fiV @@ -81233,7 +81323,7 @@ xLa alC anL aJR -btf +qSH abE abE opm @@ -82277,7 +82367,7 @@ xLa aon aqy rFj -nID +fiV uNJ bMM fiV @@ -85864,7 +85954,7 @@ agm djQ qqf xLa -asP +agm djQ qqf xLa @@ -86374,11 +86464,11 @@ aae aae aae xLa -alK +jDH djQ xtp xLa -alK +jDH djQ xtp xLa @@ -109262,7 +109352,7 @@ eBH eEQ wXj trK -fCA +iuN iuN rbN aae @@ -111555,7 +111645,7 @@ aaa aaa aae pxe -dRl +oYF vUO vgm vgm @@ -114638,7 +114728,7 @@ aaa (162,1,1) = {" aaa woD -oYF +mki oYF oYF oYF @@ -125918,7 +126008,7 @@ uYK fEW npa cwz -eJI +cIg ufF ccj sWC From 07d4a5391de26e653a3c857cc7bf8bd925a66ad6 Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sat, 19 Oct 2024 22:35:32 +1300 Subject: [PATCH 67/68] Update Pahrump-AB.dmm --- _maps/map_files/Pahrump-AB/Pahrump-AB.dmm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_maps/map_files/Pahrump-AB/Pahrump-AB.dmm b/_maps/map_files/Pahrump-AB/Pahrump-AB.dmm index cfe8bc88a24..f7dfd3be0b4 100644 --- a/_maps/map_files/Pahrump-AB/Pahrump-AB.dmm +++ b/_maps/map_files/Pahrump-AB/Pahrump-AB.dmm @@ -20252,7 +20252,7 @@ }, /area/f13/wasteland) "ctm" = ( -/obj/mecha/base_vehicle/jeep/loaded{ +/obj/mecha/base_vehicle/pickuptruck/jeep/loaded{ dir = 8 }, /turf/open/indestructible/ground/outside/dirt{ @@ -24938,7 +24938,7 @@ /area/f13/wasteland) "epN" = ( /obj/effect/decal/cleanable/oil, -/obj/mecha/base_vehicle/jeep/bos, +/obj/mecha/base_vehicle/pickuptruck/jeep/bos, /turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust, /area/f13/brotherhood) "epV" = ( @@ -62926,7 +62926,7 @@ "tTf" = ( /obj/effect/decal/cleanable/oil, /obj/effect/decal/cleanable/dirt, -/obj/mecha/base_vehicle/jeep/loaded{ +/obj/mecha/base_vehicle/pickuptruck/jeep/loaded{ dir = 8 }, /turf/open/indestructible/ground/outside/road{ From 9a809e609dab092da96a923be85e136f422f5b8e Mon Sep 17 00:00:00 2001 From: githubuser4141 Date: Sun, 20 Oct 2024 07:10:13 +1300 Subject: [PATCH 68/68] boom --- code/game/mecha/mecha.dm | 2 +- code/game/objects/objs.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 5a2cab51d55..f69d91b1be0 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -239,7 +239,7 @@ else M.forceMove(loc) if(wreckage) - if(prob(1)) + if(prob(85)) explosion(get_turf(src), 0, 1, 2, 3) var/obj/structure/mecha_wreckage/WR = new wreckage(loc, AI) for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 8ffd0a45820..a6a700e92d7 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -387,7 +387,7 @@ return if(length(armor_tokens) < 1) return // all done! - + for(var/list/token in armor_tokens) for(var/modifier in token) switch(GLOB.armor_token_operation_legend[modifier])