Friday, September 20, 2024 2:47:28 AM
> settings

Customize


Authenticate

> territory_generator.rb
# frozen_string_literal: true

class TerritoryGenerator
  FLAG_TEXTURES = %w[
    exile_assets\texture\flag\flag_mate_bis_co.paa exile_assets\texture\flag\flag_mate_vish_co.paa exile_assets\texture\flag\flag_mate_hollow_co.paa
    exile_assets\texture\flag\flag_mate_legion_ca.paa exile_assets\texture\flag\flag_mate_21dmd_co.paa exile_assets\texture\flag\flag_mate_spawny_co.paa
    exile_assets\texture\flag\flag_mate_secretone_co.paa exile_assets\texture\flag\flag_mate_stitchmoonz_co.paa
    exile_assets\texture\flag\flag_mate_commandermalc_co.paa \A3\Data_F\Flags\flag_blue_co.paa \A3\Data_F\Flags\flag_green_co.paa
    \A3\Data_F\Flags\flag_red_co.paa \A3\Data_F\Flags\flag_white_co.paa \A3\Data_F\Flags\flag_uk_co.paa exile_assets\texture\flag\flag_country_de_co.paa
    exile_assets\texture\flag\flag_country_at_co.paa exile_assets\texture\flag\flag_country_sct_co.paa exile_assets\texture\flag\flag_country_ee_co.paa
    exile_assets\texture\flag\flag_country_cz_co.paa exile_assets\texture\flag\flag_country_nl_co.paa exile_assets\texture\flag\flag_country_hr_co.paa
    exile_assets\texture\flag\flag_country_cn_co.paa exile_assets\texture\flag\flag_country_ru_co.paa exile_assets\texture\flag\flag_country_ir_co.paa
    exile_assets\texture\flag\flag_country_by_co.paa exile_assets\texture\flag\flag_country_fi_co.paa exile_assets\texture\flag\flag_country_fr_co.paa
    exile_assets\texture\flag\flag_country_au_co.paa exile_assets\texture\flag\flag_country_be_co.paa exile_assets\texture\flag\flag_country_se_co.paa
    exile_assets\texture\flag\flag_country_pl_co.paa exile_assets\texture\flag\flag_country_pl2_co.paa exile_assets\texture\flag\flag_country_pt_co.paa
    exile_assets\texture\flag\flag_mate_zanders_streched_co.paa exile_assets\texture\flag\flag_misc_brunswik_co.paa
    exile_assets\texture\flag\flag_misc_dorset_co.paa exile_assets\texture\flag\flag_misc_svarog_co.paa exile_assets\texture\flag\flag_misc_exile_co.paa
    exile_assets\texture\flag\flag_misc_utcity_co.paa exile_assets\texture\flag\flag_misc_dickbutt_co.paa exile_assets\texture\flag\flag_misc_rainbow_co.paa
    exile_assets\texture\flag\flag_misc_battleye_co.paa exile_assets\texture\flag\flag_misc_bss_co.paa exile_assets\texture\flag\flag_misc_skippy_co.paa
    exile_assets\texture\flag\flag_misc_kiwifern_co.paa exile_assets\texture\flag\flag_misc_trololol_co.paa exile_assets\texture\flag\flag_misc_dream_cat_co.paa
    exile_assets\texture\flag\flag_misc_pirate_co.paa exile_assets\texture\flag\flag_misc_pedobear_co.paa exile_assets\texture\flag\flag_misc_petoria_co.paa
    exile_assets\texture\flag\flag_misc_smashing_co.paa exile_assets\texture\flag\flag_misc_lemonparty_co.paa exile_assets\texture\flag\flag_misc_rma_co.paa
    exile_assets\texture\flag\flag_cp_co.paa exile_assets\texture\flag\flag_trouble2_co.paa exile_assets\texture\flag\flag_exile_city_co.paa
    exile_assets\texture\flag\flag_misc_eraser1_co.paa exile_assets\texture\flag\flag_misc_willbeeaten_co.paa
    exile_assets\texture\flag\flag_misc_privateproperty_co.paa exile_assets\texture\flag\flag_misc_nuclear_co.paa
    exile_assets\texture\flag\flag_misc_lazerkiwi_co.paa exile_assets\texture\flag\flag_misc_beardageddon_co.paa exile_assets\texture\flag\flag_country_dk_co.paa
    exile_assets\texture\flag\flag_country_it_co.paa exile_assets\texture\flag\flag_misc_alkohol_co.paa exile_assets\texture\flag\flag_misc_kickass_co.paa
    exile_assets\texture\flag\flag_misc_knuckles_co.paa exile_assets\texture\flag\flag_misc_snake_co.paa exile_assets\texture\flag\flag_misc_weeb_co.paa
  ].freeze

  TERRITORY_LEVELS = [
    {price: 5_000, radius: 15, object_count: 30},
    {price: 10_000, radius: 30, object_count: 60},
    {price: 15_000, radius: 45, object_count: 90},
    {price: 20_000, radius: 60, object_count: 120},
    {price: 25_000, radius: 75, object_count: 150},
    {price: 30_000, radius: 90, object_count: 180},
    {price: 35_000, radius: 105, object_count: 210},
    {price: 40_000, radius: 120, object_count: 240},
    {price: 45_000, radius: 135, object_count: 270},
    {price: 50_000, radius: 150, object_count: 300}
  ].freeze

  TIME_FORMAT = "%FT%H:%M:%S"

  # {
  #   id,
  #   owner_uid,
  #   owner_name,
  #   territory_name
  #   radius
  #   level
  #   flag_texture
  #   flag_stolen
  #   last_paid_at
  #   build_rights
  #   moderators
  #   object_count
  #   esm_custom_id
  # }
  def self.generate(moderator_count: 3, extra_builders: 0, level: nil, stolen: nil)
    level = level.nil? ? Faker::Number.between(from: 1, to: TERRITORY_LEVELS.size - 1) : level
    raise StandardError, "Level of territory does not exist in TERRITORY_LEVELS" if level > TERRITORY_LEVELS.size

    level_info = TERRITORY_LEVELS[level - 1]
    stolen =
      if stolen.nil?
        rand > 0.7
      else
        stolen
      end

    # Each tier shows up in each array.
    owner = generate_player_name_and_uid.first
    moderators = [owner] + generate_player_name_and_uid(count: moderator_count)
    builders = moderators + generate_player_name_and_uid(count: extra_builders)

    {
      id: Faker::Crypto.md5[0, 5],
      owner_uid: owner.second,
      owner_name: owner.first,

      # Sometimes the test data contains apostrophes
      territory_name: Faker::Name.name.to_json,
      radius: level_info[:radius],
      level: level,
      flag_texture: FLAG_TEXTURES.sample(1).first,
      flag_stolen: stolen,
      last_paid_at: Faker::Time.between(from: 7.days.ago, to: Time.zone.today).utc.strftime(TIME_FORMAT),
      build_rights: builders,
      moderators: moderators,
      object_count: Faker::Number.between(from: 0, to: level_info[:object_count]),
      esm_custom_id: (rand > 0.6) ? Faker::Name.first_name.downcase : nil
    }
  end

  # Generates a player's name and uid as an array
  #
  # @private
  # @params count [Integer] The number of players to generate
  # @return [Array] An array of arrays that contain name and uid
  # @example Returned array
  #   [
  #     ["Name", "UID"],
  #     ["Name", "UID"]
  #   ]
  def self.generate_player_name_and_uid(count: 1)
    return [] if count <= 0

    count.times.map do
      [Faker::Name.name, Faker::Number.number(digits: 17).to_s]
    end
  end
end
All opinions represented herein are my own
- © 2024 itsthedevman
- build 340fbb8