- type: entity
  id: BaseThruster
  parent: BaseStructureDynamic
  name: thruster
  description: A thruster that allows a shuttle to move.
  abstract: true
  placement:
    mode: SnapgridCenter
  components:
  - type: Fixtures
    fixtures:
      fix1:
        shape:
          !type:PhysShapeAabb
          bounds: "-0.45,-0.45,0.45,0.45"
        density: 60
        mask:
        - MachineMask
        layer:
        - MachineLayer
  - type: AmbientSound
    enabled: false
    range: 4
    volume: -4
    sound:
      path: /Audio/Effects/shuttle_thruster.ogg
  - type: Transform
    anchored: true
  - type: Physics
    bodyType: Static
  - type: Rotatable
    rotateWhileAnchored: true
  - type: Thruster
    damage:
      types:
        Heat: 40
  - type: InteractionOutline
  - type: Sprite
  - type: Appearance
  - type: ApcPowerReceiver
    powerLoad: 1500
  - type: ExtensionCableReceiver
  - type: StaticPrice
    price: 300
  - type: GuideHelp
    guides:
    - ShuttleCraft

- type: entity
  id: Thruster
  name: thruster
  parent: [ BaseThruster, ConstructibleMachine ]
  components:
  - type: Machine
    board: ThrusterMachineCircuitboard
  - type: Damageable
    damageModifierSet: Electronic
  - type: Injurable
    damageContainer: StructuralInorganic
  - type: Destructible
    thresholds:
    - trigger:
        !type:DamageTrigger
        damage: 300  # Changed 100->300 because impact damage is real
      behaviors:
      - !type:DoActsBehavior
        acts: ["Destruction"]
      - !type:PlaySoundBehavior
        sound:
          collection: MetalBreak
      - !type:ChangeConstructionNodeBehavior
        node: machineFrame
  - type: Sprite
    sprite: Structures/Shuttles/thruster.rsi
    layers:
    - state: base
      map: ["enum.ThrusterVisualLayers.Base"]
    - state: thrust
      map: ["enum.ThrusterVisualLayers.ThrustOn"]
      shader: unshaded
      visible: false
    - state: thrust_burn_unshaded
      map: ["enum.ThrusterVisualLayers.ThrustingUnshaded"]
      shader: unshaded
      visible: false
      offset: 0, 1

- type: entity
  parent: Thruster
  id: ThrusterXenoborg
  components:
  # temporary solution until thruster rework
  - type: Thruster
    canToggle: false # no turning it off by just clicking it
  - type: Anchorable
    flags:
    - Anchorable # no unwrenching it
  - type: Rotatable
    rotateWhileAnchored: false # no rotating it backwards so it doesn't face space
  - type: Sprite
    sprite: Structures/Shuttles/xenoborg_thruster.rsi

- type: entity
  id: ThrusterLarge
  name: large thruster
  parent: BaseThruster
  placement:
    mode: AlignTileAny
  components:
  - type: Destructible
    thresholds:
    - trigger:
        !type:DamageTrigger
        damage: 900
      behaviors:
      - !type:DoActsBehavior
        acts: ["Destruction"]
      - !type:PlaySoundBehavior
        sound:
          collection: MetalBreak
  - type: Fixtures
    fixtures:
      fix1:
        shape:
          !type:PhysShapeAabb
          bounds: "-0.45,-1.45,1.45,0.45"
        density: 1750
        mask:
        - MachineMask
        layer:
        - MachineLayer
  - type: ApcPowerReceiver
    powerLoad: 10000
  - type: Thruster
    thrust: 2560000
    basePowerLoad: 10000
    burnShape: ["-0.3,0.5","0.2,1.6","0.8,1.6","1.3,0.5"]
    damage:
      types:
        Heat: 120
  - type: Sprite
    sprite: Structures/Shuttles/thruster_large.rsi
    offset: 0.5,-0.5
    layers:
    - state: base
      map: ["enum.ThrusterVisualLayers.Base"]
    - state: thrust
      map: ["enum.ThrusterVisualLayers.ThrustOn"]
      shader: unshaded
      visible: false
    - state: thrust_burn_unshaded
      map: ["enum.ThrusterVisualLayers.ThrustingUnshaded"]
      shader: unshaded
      visible: false
      offset: 0, 2
  - type: Anchorable
    flags: None
  - type: StaticPrice
    price: 1500

- type: entity
  id: ThrusterUnanchored
  parent: Thruster
  suffix: Unanchored
  components:
    - type: Transform
      anchored: false
    - type: Physics
      bodyType: Dynamic

- type: entity
  id: DebugThruster
  parent: BaseThruster
  suffix: DEBUG
  components:
  - type: Thruster
    basePowerLoad: 0
    requireSpace: false
  - type: ApcPowerReceiver
    needsPower: false
  - type: Sprite
    sprite: Structures/Shuttles/thruster.rsi
    layers:
    - state: base
      map: ["enum.ThrusterVisualLayers.Base"]
    - state: thrust
      map: ["enum.ThrusterVisualLayers.ThrustOn"]
      shader: unshaded
      visible: false
    - state: thrust_burn_unshaded
      map: ["enum.ThrusterVisualLayers.ThrustingUnshaded"]
      shader: unshaded
      visible: false
      offset: 0, 1

- type: entity
  id: Gyroscope
  parent: [ BaseThruster, ConstructibleMachine, BaseConstructibleMachineDestructible ]
  name: gyroscope
  description: Increases the shuttle's potential angular rotation.
  components:
  - type: Thruster
    thrusterType: Angular
    requireSpace: false
    thrust: 3200000
    machinePartThrust: Manipulator
  - type: Sprite
    # Listen I'm not the biggest fan of the sprite but it was the most appropriate thing I could find.
    sprite: Structures/Shuttles/gyroscope.rsi
    snapCardinals: true
    layers:
    - state: base
      map: ["enum.ThrusterVisualLayers.Base"]
    - state: thrust
      map: ["enum.ThrusterVisualLayers.ThrustOn"]
      shader: unshaded
      visible: false
    - state: thrust_burn
      map: [ "enum.ThrusterVisualLayers.Thrusting" ]
      visible: false
    - state: thrust_burn_unshaded
      map: ["enum.ThrusterVisualLayers.ThrustingUnshaded"]
      shader: unshaded
      visible: false
  - type: PointLight
    radius: 1.3
    energy: 0.8
    enabled: false
    mask: /Textures/Effects/LightMasks/cone.png
    autoRot: true
    offset: "0, 0.1" # shine from the top, not bottom of the computer
    color: "#4246b3"
  - type: Machine
    board: GyroscopeMachineCircuitboard
  - type: Destructible
    thresholds:
    - trigger:
        !type:DamageTrigger
        damage: 175
      behaviors:
      - !type:PlaySoundBehavior
        sound:
          collection: MetalBreak
  - type: Damageable
    damageModifierSet: Electronic
  - type: Injurable
    damageContainer: StructuralInorganic
  - type: StaticPrice
    price: 2000

- type: entity
  id: GyroscopeUnanchored
  parent: Gyroscope
  suffix: Unanchored
  components:
    - type: Transform
      anchored: false
    - type: Physics
      bodyType: Dynamic

- type: entity
  id: DebugGyroscope
  parent: BaseThruster
  name: gyroscope
  suffix: DEBUG
  components:
  - type: Thruster
    basePowerLoad: 0
    thrusterType: Angular
    requireSpace: false
    thrust: 160000
  - type: ApcPowerReceiver
    needsPower: false
  - type: Sprite
    sprite: Structures/Shuttles/gyroscope.rsi
    snapCardinals: true
    layers:
    - state: base
      map: ["enum.ThrusterVisualLayers.Base"]
    - state: thrust
      map: ["enum.ThrusterVisualLayers.ThrustOn"]
      shader: unshaded
      visible: false
    - state: thrust_burn_unshaded
      map: ["enum.ThrusterVisualLayers.ThrustingUnshaded"]
      shader: unshaded
      visible: false

- type: entity
  id: RustedThruster
  parent: BaseStructureDynamic
  name: rusted thruster
  description: An unrepairable thruster, broken down from wear and tear. Only useful for scrapping.
  components:
  - type: Fixtures
    fixtures:
      fix1:
        shape:
          !type:PhysShapeAabb
          bounds: "-0.45,-0.45,0.45,0.45"
        density: 60
        mask:
        - MachineMask
        layer:
        - MachineLayer
  - type: Transform
    anchored: true
  - type: Physics
    bodyType: Static
  - type: Rotatable
    rotateWhileAnchored: true
  - type: Sprite
    sprite: Structures/Shuttles/old_thruster.rsi
    state: base
  - type: Damageable
    damageModifierSet: Electronic
  - type: Injurable
    damageContainer: Inorganic
  - type: Destructible
    thresholds:
    - trigger:
        !type:DamageTrigger
        damage: 100  # Considering we need a lot of thrusters didn't want to make an individual one too tanky
      behaviors:
      - !type:DoActsBehavior
        acts: ["Destruction"]
      - !type:PlaySoundBehavior
        sound:
          collection: MetalBreak
  - type: PhysicalComposition
    materialComposition:
      Steel: 1200 # 12 sheets
