mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-26 14:39:58 +01:00
Completely strips silicon control options out of open cage mechs (except mech domination). Adds flags to handle granular control restrictions and beacon limitations. (#91118)
## About The Pull Request Open cabin mechs cannot be piloted by silicon pilots. MMI's, uploaded AI's, positronics or AI control beacons. The mechs can still be tracker beaconed. It can also be dominated via the malfunctioning AI power. Adds some flags to help flag which mechs can or cannot be beaconed, or which are silicon compatible. ## Why It's Good For The Game I'm not going to lie. I do feel a bit pressured on this change in particular. This is somewhat meant to be an intended feature. But I think the cats out of the bag on open cabin mechs and the ways to circumvent their downsides. And the more I think about it, the more I come to realize that I frankly haven't had many, if any, good interactions with a posibrain/MMI mech army. So making that more efficient is...a problem. Using a silicon-based pilot can help you evade the potential consequences of being a flesh and bone pilot inside of a steel mesh cabin and being shot repeatedly. So you may as well, in those instances, treat it as a sealed cabin mech. And these mechs are surprisingly pretty strong statistically. Especially the Paddy with its ability to equip actual lethal weaponry. They're cheap, can be mass produced, come out early, and durable. The only limitation is pilots, and if you're printing positronics and get ghosts for those positronics, you can usually just keep producing more. From a purely objective standpoint, there isn't much reason to not push out posi-paddys over any other mech. Rather than settle for a perfect answer, let's at least require some human pilots in these mechs so that their supposed downside is more of an Achilles heel. ## Changelog 🆑 balance: Caged mechs cannot accept silicon pilots. AI uploaded pilots, AI control beacons, MMIs or positronics. Malfunctioning AIs can still dominate these mechs. code: Allows for a higher degree of granularity for what mechs can and cannot accept by including additoinal mecha flags to block beacon type installations, pilot uploads and so on. /🆑
This commit is contained in:
@@ -17,10 +17,16 @@
|
||||
#define CANNOT_INTERACT (1<<9)
|
||||
/// posibrains can drive this mecha
|
||||
#define MMI_COMPATIBLE (1<<10)
|
||||
/// AI's can be placed inside this mech. This only prevents direct uploads. It does not prevent mech domination on the mech.
|
||||
#define AI_COMPATIBLE (1<<11)
|
||||
/// Can click from any direction and perform stuff
|
||||
#define OMNIDIRECTIONAL_ATTACKS (1<<11)
|
||||
#define OMNIDIRECTIONAL_ATTACKS (1<<12)
|
||||
/// Prevents overpenetrating through the mecha and into the cockpit using an armour penetrating weapon
|
||||
#define CANNOT_OVERPENETRATE (1<<12)
|
||||
#define CANNOT_OVERPENETRATE (1<<13)
|
||||
/// Can have a tracking beacon placed into the mech
|
||||
#define BEACON_TRACKABLE (1<<14)
|
||||
/// Can have an AI control beacon placed into the mech
|
||||
#define BEACON_CONTROLLABLE (1<<15)
|
||||
|
||||
#define MECHA_MELEE (1 << 0)
|
||||
#define MECHA_RANGED (1 << 1)
|
||||
|
||||
@@ -268,8 +268,11 @@ DEFINE_BITFIELD(mecha_flags, list(
|
||||
"QUIET_TURNS" = QUIET_TURNS,
|
||||
"CANNOT_INTERACT" = CANNOT_INTERACT,
|
||||
"MMI_COMPATIBLE" = MMI_COMPATIBLE,
|
||||
"AI_COMPATIBLE" = AI_COMPATIBLE,
|
||||
"OMNIDIRECTIONAL_ATTACKS" = OMNIDIRECTIONAL_ATTACKS,
|
||||
"CANNOT_OVERPENETRATE" = CANNOT_OVERPENETRATE,
|
||||
"BEACON_TRACKABLE" = BEACON_TRACKABLE,
|
||||
"BEACON_CONTROLLABLE" = BEACON_CONTROLLABLE,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(mob_biotypes, list(
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
/// Keeps track of the mech's servo motor
|
||||
var/obj/item/stock_parts/servo/servo
|
||||
///Contains flags for the mecha
|
||||
var/mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE
|
||||
var/mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | BEACON_TRACKABLE | AI_COMPATIBLE | BEACON_CONTROLLABLE
|
||||
|
||||
///Spark effects are handled by this datum
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
@@ -85,8 +85,6 @@
|
||||
var/obj/machinery/camera/exosuit/chassis_camera
|
||||
///Portable camera camerachunk update
|
||||
var/updating = FALSE
|
||||
///Determines whether or not you can install tracking beacons in the mech.
|
||||
var/can_be_tracked = TRUE
|
||||
|
||||
var/max_temperature = 25000
|
||||
|
||||
|
||||
@@ -45,10 +45,9 @@
|
||||
overclock_coeff = 2
|
||||
overclock_temp_danger = 20
|
||||
force = 30
|
||||
can_be_tracked = FALSE
|
||||
accesses = list(ACCESS_SYNDICATE)
|
||||
wreckage = /obj/structure/mecha_wreckage/gygax/dark
|
||||
mecha_flags = ID_LOCK_ON | CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE
|
||||
mecha_flags = ID_LOCK_ON | CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | AI_COMPATIBLE
|
||||
max_equip_by_category = list(
|
||||
MECHA_L_ARM = 1,
|
||||
MECHA_R_ARM = 1,
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
exit_delay = 40
|
||||
accesses = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE)
|
||||
wreckage = /obj/structure/mecha_wreckage/honker
|
||||
mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE
|
||||
mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | BEACON_TRACKABLE | AI_COMPATIBLE | BEACON_CONTROLLABLE
|
||||
mech_type = EXOSUIT_MODULE_HONK
|
||||
max_equip_by_category = list(
|
||||
MECHA_L_ARM = 1,
|
||||
@@ -51,7 +51,7 @@
|
||||
max_temperature = 35000
|
||||
accesses = list(ACCESS_SYNDICATE)
|
||||
wreckage = /obj/structure/mecha_wreckage/honker/dark
|
||||
mecha_flags = ID_LOCK_ON | CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE
|
||||
mecha_flags = ID_LOCK_ON | CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | AI_COMPATIBLE
|
||||
max_equip_by_category = list(
|
||||
MECHA_L_ARM = 1,
|
||||
MECHA_R_ARM = 1,
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
wreckage = /obj/structure/mecha_wreckage/justice
|
||||
mech_type = EXOSUIT_MODULE_JUSTICE
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
mecha_flags = ID_LOCK_ON | QUIET_STEPS | QUIET_TURNS | CAN_STRAFE | HAS_LIGHTS | MMI_COMPATIBLE | IS_ENCLOSED
|
||||
mecha_flags = ID_LOCK_ON | QUIET_STEPS | QUIET_TURNS | CAN_STRAFE | HAS_LIGHTS | MMI_COMPATIBLE | IS_ENCLOSED | AI_COMPATIBLE
|
||||
destroy_wall_sound = 'sound/vehicles/mecha/mech_blade_break_wall.ogg'
|
||||
brute_attack_sound = 'sound/vehicles/mecha/mech_blade_attack.ogg'
|
||||
attack_verbs = list("cut", "cuts", "cutting")
|
||||
|
||||
@@ -9,11 +9,10 @@
|
||||
max_temperature = 60000
|
||||
destruction_sleep_duration = 40
|
||||
exit_delay = 40
|
||||
can_be_tracked = FALSE
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
accesses = list(ACCESS_CENT_SPECOPS)
|
||||
wreckage = /obj/structure/mecha_wreckage/marauder
|
||||
mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE
|
||||
mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | AI_COMPATIBLE
|
||||
mech_type = EXOSUIT_MODULE_MARAUDER
|
||||
force = 45
|
||||
max_equip_by_category = list(
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
exit_delay = 40
|
||||
wreckage = /obj/structure/mecha_wreckage/reticence
|
||||
accesses = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE)
|
||||
mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | QUIET_STEPS | QUIET_TURNS | MMI_COMPATIBLE
|
||||
mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | QUIET_STEPS | QUIET_TURNS | MMI_COMPATIBLE | AI_COMPATIBLE
|
||||
mech_type = EXOSUIT_MODULE_RETICENCE
|
||||
max_equip_by_category = list(
|
||||
MECHA_L_ARM = 1,
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
base_icon_state = "savannah_ivanov"
|
||||
icon_state = "savannah_ivanov_0_0"
|
||||
//does not include mmi compatibility
|
||||
mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS
|
||||
mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | BEACON_TRACKABLE | BEACON_CONTROLLABLE
|
||||
mech_type = EXOSUIT_MODULE_SAVANNAH
|
||||
movedelay = 3
|
||||
max_integrity = 450 //really tanky, like damn
|
||||
|
||||
@@ -93,6 +93,9 @@
|
||||
if(!AI)
|
||||
to_chat(user, span_warning("There is no AI currently installed on this device."))
|
||||
return
|
||||
if(!(mecha_flags & AI_COMPATIBLE)) //If the mech isn't compatible with an AI transfer, early return.
|
||||
to_chat(user, span_warning("An AI cannot be installed into [src]."))
|
||||
return
|
||||
if(AI.deployed_shell) //Recall AI if shelled so it can be checked for a client
|
||||
AI.disconnect_shell()
|
||||
if(AI.stat || !AI.client)
|
||||
|
||||
@@ -85,6 +85,8 @@
|
||||
var/recharging = FALSE
|
||||
/// The Mecha that this tracking beacon is attached to
|
||||
var/obj/vehicle/sealed/mecha/chassis
|
||||
/// The type of flag this part checks before being able to be installed into the mech
|
||||
var/flag_to_check = BEACON_TRACKABLE
|
||||
|
||||
/**
|
||||
* Returns a html formatted string describing attached mech status
|
||||
@@ -122,7 +124,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/try_attach_part(mob/user, obj/vehicle/sealed/mecha/mecha_to_attach, attach_right = FALSE)
|
||||
if(!mecha_to_attach.can_be_tracked)
|
||||
if(!(mecha_to_attach.mecha_flags & flag_to_check))
|
||||
return
|
||||
if(!..())
|
||||
return
|
||||
@@ -151,3 +153,4 @@
|
||||
name = "exosuit AI control beacon"
|
||||
desc = "A device used to transmit exosuit data. Also allows active AI units to take control of said exosuit."
|
||||
ai_beacon = TRUE
|
||||
flag_to_check = BEACON_CONTROLLABLE
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
wreckage = /obj/structure/mecha_wreckage/clarke
|
||||
mech_type = EXOSUIT_MODULE_CLARKE
|
||||
enter_delay = 40
|
||||
mecha_flags = IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | OMNIDIRECTIONAL_ATTACKS
|
||||
mecha_flags = IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | OMNIDIRECTIONAL_ATTACKS | BEACON_TRACKABLE | AI_COMPATIBLE | BEACON_CONTROLLABLE
|
||||
accesses = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING)
|
||||
allow_diagonal_movement = FALSE
|
||||
pivot_step = TRUE
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
MECHA_POWER = 1,
|
||||
MECHA_ARMOR = 1,
|
||||
)
|
||||
mecha_flags = CAN_STRAFE | HAS_LIGHTS | MMI_COMPATIBLE
|
||||
mecha_flags = CAN_STRAFE | HAS_LIGHTS | BEACON_TRACKABLE
|
||||
wreckage = /obj/structure/mecha_wreckage/ripley
|
||||
mech_type = EXOSUIT_MODULE_RIPLEY
|
||||
possible_int_damage = MECHA_INT_FIRE|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT
|
||||
@@ -75,7 +75,7 @@
|
||||
movedelay = 4
|
||||
max_temperature = 30000
|
||||
max_integrity = 250
|
||||
mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE
|
||||
mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | BEACON_TRACKABLE | AI_COMPATIBLE | BEACON_CONTROLLABLE
|
||||
possible_int_damage = MECHA_INT_FIRE|MECHA_INT_TEMP_CONTROL|MECHA_CABIN_AIR_BREACH|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT
|
||||
armor_type = /datum/armor/mecha_ripley_mk2
|
||||
wreckage = /obj/structure/mecha_wreckage/ripley/mk2
|
||||
@@ -188,7 +188,7 @@
|
||||
|
||||
/obj/vehicle/sealed/mecha/ripley/paddy/preset
|
||||
accesses = list(ACCESS_SECURITY)
|
||||
mecha_flags = CAN_STRAFE | HAS_LIGHTS | MMI_COMPATIBLE | ID_LOCK_ON
|
||||
mecha_flags = CAN_STRAFE | HAS_LIGHTS | ID_LOCK_ON
|
||||
equip_by_category = list(
|
||||
MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/energy/disabler,
|
||||
MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/paddy_claw,
|
||||
@@ -208,7 +208,7 @@
|
||||
lights_power = 7
|
||||
wreckage = /obj/structure/mecha_wreckage/ripley/deathripley
|
||||
step_energy_drain = 0
|
||||
mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE
|
||||
mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | AI_COMPATIBLE
|
||||
enter_delay = 40
|
||||
silicon_icon_state = null
|
||||
equip_by_category = list(
|
||||
|
||||
Reference in New Issue
Block a user