// returns initial state
            private State InitStates()
            {
                aiTools = GetComponent <AiTools>();
                aiTools.Init();
                SearchEnemy      searchEnemyState      = new SearchEnemy(aiTools);
                SearchHealthPack searchHealthPackState = new SearchHealthPack(aiTools);
                Attack           attackState           = new Attack(aiTools);
                Defence          defenceState          = new Defence(aiTools);

                searchEnemyState.AddTransition(
                    new Transition(
                        () => aiTools.agentState.isEnemyVisible,
                        attackState
                        )
                    );

                searchEnemyState.AddTransition(
                    new Transition(
                        () => (aiTools.world.healthPacksAvailable > 0) && (aiTools.agentState.health <= GameDefines.LOW_HP),
                        searchHealthPackState
                        )
                    );

                attackState.AddTransition(
                    new Transition(
                        () => (aiTools.agentState.health <= GameDefines.MEDIUM_HP),
                        defenceState
                        )
                    );

                attackState.AddTransition(
                    new Transition(
                        () => (aiTools.agentState.health > GameDefines.MEDIUM_HP) && !aiTools.agentState.isEnemyVisible,
                        searchEnemyState
                        )
                    );

                defenceState.AddTransition(
                    new Transition(
                        () => (aiTools.world.healthPacksAvailable > 0) && ((aiTools.agentState.health <= GameDefines.LOW_HP) || !aiTools.agentState.isEnemyVisible),
                        searchHealthPackState
                        )
                    );

                defenceState.AddTransition(
                    new Transition(
                        () => (!aiTools.agentState.isEnemyVisible && ((aiTools.world.healthPacksAvailable == 0) || aiTools.agentState.health > GameDefines.LOW_HP)),
                        searchEnemyState
                        )
                    );

                searchHealthPackState.AddTransition(
                    new Transition(
                        () => (aiTools.agentState.health > GameDefines.LOW_HP) || (aiTools.world.healthPacksAvailable == 0),
                        searchEnemyState
                        )
                    );

                return(searchEnemyState);
            }