// Copyright (c) Strange Loop Games. All rights reserved.
// See LICENSE file in the project root for full license information.
// <auto-generated from AnimalTemplate.tt/>

namespace Eco.Mods.TechTree
{
    using System.Collections.Generic;
    using Eco.Core.Items;
    using Eco.Gameplay.Animals;
    using Eco.Mods.Organisms;
    using Eco.Shared.Localization;
    using Eco.Shared.Math;
    using Vector3 = System.Numerics.Vector3;
    using Eco.Simulation.Agents;
    using Eco.Simulation.Types;
    using Eco.Mods.Organisms.Behaviors;
    using Eco.Shared.Utils;
    using Range = Eco.Shared.Math.Range;
    using Eco.Shared.SharedTypes;

    /// <summary>
    /// <para>Server side animal entity definition for "Alligator".</para>
    /// <para>More information about AnimalEntity objects can be found at https://docs.play.eco/api/server/eco.gameplay/Eco.Gameplay.Animals.AnimalEntity.html</para>
    /// <remarks>
    /// This is an auto-generated class. Don't modify it! All your changes will be wiped with next update! Use Mods* partial methods instead for customization. 
    /// If you wish to modify this class, please create a new partial class or follow the instructions in the "UserCode" folder to override the entire file.
    /// </remarks>
    /// </summary>
    public class Alligator : AnimalEntity
    {
        public Alligator(Animal parent, Vector3 pos, bool corpse = false) : base(parent, pos, species, corpse) { }
        static AnimalSpecies species;

        /// <summary>
        /// <para>Server side species definition for "Alligator".</para>
        /// <para>More information about AnimalSpecies objects can be found at https://docs.play.eco/api/server/eco.simulation/Eco.Simulation.Types.AnimalSpecies.html</para>
        /// </summary>
        /// <inheritdoc/>
        [Ecopedia("Animals", "Reptiles", createAsSubPage: true)]
        [Localized(false, true)]
        public class AlligatorSpecies : AnimalSpecies
        {
            public AlligatorSpecies() : base()
            {
                species = this; // Set the static species variable from our AnimalEntity instance to ourselves for lookup later
                this.InstanceType = typeof(Alligator); // Define our instance type to be a typeof instance of our selves.

                // Define the species name, display name, and description here. These values will be used to represent the animal to the client user.
                this.Name = "Alligator"; //noloc
                this.DisplayName = Localizer.DoStr("Alligator");
                this.DisplayDescription = Localizer.DoStr("A large, scaly reptile with a powerful bite and a long tail, commonly found near rivers, swamps, and lakes in warm regions. Alligators are ancient creatures that have remained virtually unchanged for millions of years.");

                // Define our how long in days it takes this species to mature
                this.MaturityAgeDays = 1;
                
                // Define what our species eats as object type representations as well as our calorie value.
                // If our species does not eat anything the FoodSources variable can represent an empty List object.
                this.FoodSources = new List<System.Type>()
                {
                    typeof(Turkey),
                    typeof(Tuna),
                    typeof(Salmon),
                    typeof(Trout),
                    typeof(Deer),
                    typeof(Elk),
                    typeof(Hare),
                    typeof(Agouti),
                    typeof(SnappingTurtle),
                    typeof(Tortoise),
                    typeof(Crab),
                };
                this.CalorieValue = 100;

                // Movement
                this.Swimming = true;
                this.FloatOnSurface = true;
                this.WanderingSpeed = 0.21f;
                this.Speed = 1.5f;
                this.ClimbHeight = 0;
                this.RotationSpeed = 45;
                this.WanderingRotationSpeed = 22.5f;
                this.MinRotationToSlowDown = 5;

                // Resources
                this.ResourceList = new List<SpeciesResource>()
                {
                    new SpeciesResource(typeof(AlligatorCarcassItem), new Range(1, 1)),
                };
                this.ResourceBonusAtGrowth = 0.9f;
                
                // Behavior
                this.BrainType = typeof(AmphibiousBrain);
                this.IsPredator = true;
                this.Health = 7;
                this.Damage = 3;
                this.ChanceToAttack = 0.8f;
                this.DelayBetweenAttacksRangeSec = new Range(0.8f, 2.5f);
                this.FearFactor = 0;
                this.FleePlayers = true;
                this.AttackRange = 2.5f;
                this.HeadDistance = 1.5f;
                this.TimeAttackToIdle = 3.3f;
                // Climate
                this.ReleasesCO2TonsPerDay = 0.02f;
            }

            // Alligators need water to spawn
            public override bool IsValidSpawnPathPos(Vector3i pos) => World.World.IsUnderwater(pos) || RandomUtil.Chance(.3f);
        }
    


    }
}
