#
# IMPORTANT NOTE
#
# This chart inherits from our common library chart. You can check the default values/options here:
# https://github.com/k8s-at-home/library-charts/tree/main/charts/stable/common/values.yaml
#

image:
  # -- image repository
  repository: factoriotools/factorio
  # -- image tag
  # @default -- chart.appVersion
  tag:
  # -- image pull policy
  pullPolicy: IfNotPresent

initContainers:
  # -- Configures an initContainer that copies the configmap to the factorio conf directory
  # @default -- See values.yaml
  copy-configmap:
    image: busybox
    imagePullPolicy: IfNotPresent
    command:
      - "sh"
      - "-c"
      - |
        mkdir -p /factorio/config
        cp -vL /helmconfig/* /factorio/config/
    volumeMounts:
      - name: factorio-config
        mountPath: /helmconfig/
      - name: config
        mountPath: /factorio/
    securityContext:
      runAsUser: 0

# -- environment variables. See more environment variables in the [factorio documentation](https://factorio.org/docs).
# @default -- See below
env:
  # -- Set the container timezone
  TZ: UTC
  # -- Generate a new save if one does not exist before starting the server
  GENERATE_NEW_SAVE: "{{ .Values.config.factorioServer.generate_new_save }}"
  # -- Load latest when true. Otherwise load SAVE_NAME
  LOAD_LATEST_SAVE: "{{ .Values.config.factorioServer.load_latest_save }}"
  # -- UDP port the server listens on
  PORT: "{{ .Values.service.main.ports.server.port }}"
  # -- TCP port the rcon server listens on
  RCON_PORT: "{{ .Values.service.main.ports.rcon.port }}"
  # -- Name to use for the save file
  SAVE_NAME: "{{ .Values.config.factorioServer.save_name }}"
  # -- factorio.com token
  TOKEN: "{{ .Values.config.factorioServer.token }}"
  # -- If mods should be updated befoqre starting the server
  UPDATE_MODS_ON_START: "{{ .Values.config.factorioServer.update_mods_on_start }}"
  # -- factorio.com username
  USERNAME: "{{ .Values.config.factorioServer.username }}"

# -- Configures service settings for the chart.
# @default -- See values.yaml
service:
  main:
    ports:
      http:
        enabled: false
        primary: false
      server:
        enabled: true
        port: 34197
        protocol: UDP
      rcon:
        enabled: true
        primary: true
        port: 27015
        protocol: TCP

ingress:
  # -- Enable and configure ingress settings for the chart under this key.
  # @default -- See values.yaml
  main:
    enabled: false

# -- Configure persistence settings for the chart under this key.
# @default -- See values.yaml
persistence:
  config:
    enabled: true
    mountPath: /factorio

# -- Configure server settings.  Can be disabled if you wish to configure in the container in the json config files.
# -- See values.yaml for descriptions for many config options, ore refer to https://wiki.factorio.com/Multiplayer.
# @default -- See values.yaml
config:
  factorioServer:
    # -- name to be used for save
    save_name: "_autosave1"
    # -- Generate a New Save
    generate_new_save: false
    # -- Update mods on start
    update_mods_on_start: false
    # -- lets the game know if you want to load the latest save
    load_latest_save: true
    # -- factorio.com token
    token:
    # -- factorio.com password
    username:

  server_settings:
    # -- Your Instance Name
    name: Factorio
    # -- Your Instance Description
    description: "Factorio running on Kubernetes"
    tags:
      - game
      - tags
    # -- Maximum number of players allowed, admins can join even a full server. 0 means unlimited.
    max_players: 0
    # -- Game visibility
    visibility:
      # -- Game will be published on the official Factorio matching server
      public: false
      # -- Game will be broadcast on LAN
      lan: true
    # -- Your factorio.com login credentials. Required for games with visibility public
    username: ""
    password: ""
    # -- Authentication token. May be used instead of password above.
    token: ""
    # -- password required to log into the factorio server
    game_password: ""
    # -- When set to true, the server will only allow clients that have a valid Factorio.com account
    require_user_verification: false
    # -- optional, default value is 0. 0 means unlimited.
    max_upload_in_kilobytes_per_second: 0
    # -- optional, default value is 5. 0 means unlimited.
    max_upload_slots: 5
    # -- optional one tick is 16ms in default speed, default value is 0. 0 means no minimum.
    minimum_latency_in_ticks: 0
    # -- Players that played on this map already can join even when the max player limit was reached.
    ignore_player_limit_for_returning_players: false
    # -- possible values are, true, false and admins-only
    allow_commands: admins-only
    # -- Autosave interval in minutes
    autosave_interval: 10
    # -- server autosave slots, it is cycled through when the server autosaves.
    autosave_slots: 5
    # -- How many minutes until someone is kicked when doing nothing, 0 for never.
    afk_autokick_interval: 0
    # -- Whether should the server be paused when no players are present.
    auto_pause: true
    # -- specifies if anyone can pause or only admins
    only_admins_can_pause_the_game: true
    # -- Whether autosaves should be saved only on server or also on all connected clients. Default is true.
    autosave_only_on_server: true
    # --  Highly experimental feature, enable only at your own
    # --  risk of losing your saves. On UNIX systems, server will fork itself to create an
    # --  autosave. Autosaving on connected Windows clients will be disabled regardless of
    # --  autosave_only_on_server option.
    non_blocking_saving: false
    # --  Long network messages are split into segments that are sent
    # --  over multiple ticks. Their size depends on the number of peers currently connected.
    # --  Increasing the segment size will increase upload bandwidth requirement for the server
    # --  and download bandwidth requirement for clients. This setting only affects server
    # --  outbound messages. Changing these settings can have a negative impact on connection
    # --  stability for some clients.
    minimum_segment_size: 25
    minimum_segment_size_peer_count: 20
    maximum_segment_size: 100
    maximum_segment_size_peer_count: 10

  # -- Password and port for the rcon service
  rcon:
    external: true
    type: LoadBalancer
    password: "replaceme"
    port: 30100

  map_gen_settings:
    # --The inverse of water scale in the map generator GUI.
    terrain_segmentation: 1
    # --  The equivalent to water coverage in the map generator GUI. Higher coverage means
    # --  more water in larger oceans.
    # --  Water level = 10 * log2(this value)
    water: 1
    # -- Width and height of map, in tiles; 0 means infinite
    width: 0
    # -- Width and height of map, in tiles; 0 means infinite
    height: 0
    # -- Multiplier for biter free zone radius
    starting_area: 1
    peaceful_mode: false
    autoplace_controls:
      coal:
        frequency: 1
        size: 1
        richness: 1
      stone:
        frequency: 1
        size: 1
        richness: 1
      copper-ore:
        frequency: 1
        size: 1
        richness: 1
      iron-ore:
        frequency: 1
        size: 1
        richness: 1
      uranium-ore:
        frequency: 1
        size: 1
        richness: 1
      crude-oil:
        frequency: 1
        size: 1
        richness: 1
      trees:
        frequency: 1
        size: 1
        richness: 1
      enemy-base:
        frequency: 1
        size: 1
        richness: 1
    cliff_settings:
      # -- Name of the cliff prototype
      name: cliff
      # -- Elevation of first row of cliffs
      cliff_elevation_0: 10
      # -- Elevation difference between successive rows of cliffs.
      # -- This is inversely proportional to frequency in the map generation GUI. Specifically, when set from the GUI the value is 40 / frequency.
      cliff_elevation_interval: 40
      # -- Called cliff continuity in the map generator GUI. 0 will result in no cliffs, 10 will make all cliff rows completely solid
      richness: 1
    # -- Overrides for property value generators (map type)
    # -- Leave elevation blank to get normal terrain.
    # -- Use ''elevation'': ''0_16-elevation'' to reproduce terrain from 0.16.
    # -- Use ''elevation'': ''0_17-island'' to get an island.
    # -- Moisture and terrain type are also controlled via this.
    # -- "control-setting:moisture:frequency:multiplier is the inverse of the moisture scale in the map generator GUI."
    # -- "control-setting:moisture:bias is the moisture bias in the map generator GUI."
    # -- "control-setting:aux:frequency:multiplier is the inverse of the terrain type scale in the map generator GUI."
    # -- "control-setting:aux:bias is the teraain type bias in the map generator GUI."
    property_expression_names:
      control-setting:moisture:frequency:multiplier: "1"
      control-setting:moisture:bias: "0"
      control-setting:aux:frequency:multiplier: "1"
      control-setting:aux:bias: "0"
    starting_points:
      - "x": 0
        "y": 0
    # -- Use null for a random seed, number for a specific seed.
    seed: null

  map_settings:
    difficulty_settings:
      recipe_difficulty: 0
      technology_difficulty: 0
      technology_price_multiplier: 1
      research_queue_setting: after-victory
    pollution:
      enabled: true
      # -- these are values for 60 ticks (1 simulated second)
      # -- amount that is diffused to neighboring chunk
      diffusion_ratio: 0.02
      min_to_diffuse: 15
      ageing: 1
      expected_max_per_chunk: 150
      min_to_show_per_chunk: 50
      min_pollution_to_damage_trees: 60
      pollution_with_max_forest_damage: 150
      pollution_per_tree_damage: 50
      pollution_restored_per_tree_damage: 10
      max_pollution_to_restore_trees: 20
      enemy_attack_pollution_consumption_modifier: 1
    enemy_evolution:
      enabled: true
      time_factor: 0.000004
      destroy_factor: 0.002
      pollution_factor: 0.0000009
    enemy_expansion:
      enabled: true
      min_base_spacing: 3
      max_expansion_distance: 7
      friendly_base_influence_radius: 2
      enemy_building_influence_radius: 2
      building_coefficient: 0.1
      other_base_coefficient: 2
      neighbouring_chunk_coefficient: 0.5
      neighbouring_base_chunk_coefficient: 0.4
      max_colliding_tiles_coefficient: 0.9
      settler_group_min_size: 5
      settler_group_max_size: 20
      min_expansion_cooldown: 14400
      max_expansion_cooldown: 216000
    unit_group:
      min_group_gathering_time: 3600
      max_group_gathering_time: 36000
      max_wait_time_for_late_members: 7200
      max_group_radius: 30
      min_group_radius: 5
      max_member_speedup_when_behind: 1.4
      max_member_slowdown_when_ahead: 0.6
      max_group_slowdown_factor: 0.3
      max_group_member_fallback_factor: 3
      member_disown_distance: 10
      tick_tolerance_when_member_arrives: 60
      max_gathering_unit_groups: 30
      max_unit_group_size: 200
    steering:
      default:
        radius: 1.2
        separation_force: 0.005
        separation_factor: 1.2
        force_unit_fuzzy_goto_behavior: false
      moving:
        radius: 3
        separation_force: 0.01
        separation_factor: 3
        force_unit_fuzzy_goto_behavior: false
    path_finder:
      fwd2bwd_ratio: 5
      goal_pressure_ratio: 2
      max_steps_worked_per_tick: 100
      max_work_done_per_tick: 8000
      use_path_cache: true
      short_cache_size: 5
      long_cache_size: 25
      short_cache_min_cacheable_distance: 10
      short_cache_min_algo_steps_to_cache: 50
      long_cache_min_cacheable_distance: 30
      cache_max_connect_to_cache_steps_multiplier: 100
      cache_accept_path_start_distance_ratio: 0.2
      cache_accept_path_end_distance_ratio: 0.15
      negative_cache_accept_path_start_distance_ratio: 0.3
      negative_cache_accept_path_end_distance_ratio: 0.3
      cache_path_start_distance_rating_multiplier: 10
      cache_path_end_distance_rating_multiplier: 20
      stale_enemy_with_same_destination_collision_penalty: 30
      ignore_moving_enemy_collision_distance: 5
      enemy_with_different_destination_collision_penalty: 30
      general_entity_collision_penalty: 10
      general_entity_subsequent_collision_penalty: 3
      extended_collision_penalty: 3
      max_clients_to_accept_any_new_request: 10
      max_clients_to_accept_short_new_request: 100
      direct_distance_to_consider_short_request: 100
      short_request_max_steps: 1000
      short_request_ratio: 0.5
      min_steps_to_check_path_find_termination: 2000
      start_to_goal_cost_multiplier_to_terminate_path_find: 500
      overload_levels:
        - 0
        - 100
        - 500
      overload_multipliers:
        - 2
        - 3
        - 4
      negative_path_cache_delay_interval: 20
    max_failed_behavior_count: 3

  admin_list:
    # - "john_doe"
    # - "jane_doe"

  white_list:
    # - "john_doe"
    # - "jane_doe"

  ban_list:
    # - "john_doe"
    # - "jane_doe"
