-- блок Tasks:
-- restore_health - на сколько увеличивается здоровье при выполнении задачи
-- time_tick - время в сек. между вызовами таймера задачи, влияет на скорость выполнения задачи
-- sleeping - на сколько засыпать после задачи, 0 - не засыпать вообще
-- блок Params: - основные параметры , каждый описан в блоке
require( "scripts/game/deftasks.lua" );
require( "scripts/game/deftime.lua" );
-- class sheep
GameObject = {
    Params = {
        ID="goat";        -- do not change this parameter
        width=1;           -- do not change this parameter
        height=2;          -- do not change this parameter
        health=3800;       -- здоровье
        hungry=3500;       -- голод
        thirst=3000;       -- жажда
        create_product = 20;  -- сколько создаёт продукта(шерсти)
        product_name = "milkgoat"; -- do not change this parameter
        RandomTasks=3;-- брать задания из списка
        speed=650;          -- скорость, нужна для определения животных
        group=2;            -- животное
        emotion=4;          -- do not change this parameter
        Impatience = 100;    -- ammount of health that dissapers each second      
        GridData= { 1, 1 };
        start_with_hearts = 3;   -- начать с указанным кол-вом сердечек
    };
    -- list of all tasks for an object
    Tasks = {
        eating = { FuncName="EatingTaskExecute",     sleeping={0},  time_tick=450,   skill_up = 0, restore_health=1000 };
        milking = { FuncName="MilkingTaskExecute", sleeping={8},  time_tick=1000,  skill_up = 0, restore_health=0, final_cycle=1, not_need_action=1 };
        watering = { FuncName="WateringTaskExecute", sleeping={0},  time_tick=300,   skill_up = 0, restore_health=1000 };
    };
-- все что ниже этой линии не трогать
    ActivePoints = { 
        watering = { 
                   { {}, 2,1,0,  0,  2,1,0 };
                   }; 
        eating = { 
                   { {}, 2,1,0,  0,  2,1,0 };
                   }; 
        milking = { 
                   { {}, 0,-1,0,   0,  0,-1,0  };
                   };
        take   = { 
                   { {"milkgoat"}, 2,0,0, 0,  0,0,0 };
                 }; 
    };
    Objects = {
        milkgoat = {};
    };
    -- list of all triggers for an object
    Triggers = {
        Anger = {FuncName="AngerTriger", NotRunWhen={"eating","milking","watering"}}
    };
    --tasks to be performed after an object is created
    InitActiveTasks = {};
    --tasks an object is waiting ofr after it is created
    InitExpectedTasks = {};
    --для RandomTasks=3 чтобы брать задания из списка
    Cycle = {
        index=0;
        index_sleep=0;
        max_index = 0;
    };
};

--жизненный цикл по умолчанию, не надо трогать
life_cycle = {
    { "eating", 2 };
    { "watering", 3 };
    { "milking", 8 };
};

function GameObject:Get()
    return self;
end


-- вся инициализация должа проходить только в этой функции
function OnInit()
    OnInitHealth();
end
    

function isMayByTask(aTask)
    aObj = GameObject:Get();   

    --if (aTask=="milking") then        
    --    if ((aObj.Params.health / aObj.Params.MaxHealth)<0.75)then  
    --        return 0;
    --    end;
    --end;
    return 1;   
end


function OnNextTask(aPrevTask, aNextTask)
    if (aNextTask=="milking") then        
        CPP_SetVisPrefix("_f");
    end;
end



function GetParams()
    aObj = GameObject:Get();   
    return aObj.Params;
end

-- perform Task EATING over external object and return true if task is completed
function EatingTaskExecute()
    aObject = GameObject:Get();
    if (aObject.Params.hungry == 5000) then
        CPP_SetAnimState("nasip_seno2");
    else 
        if (aObject.Params.hungry == 3000) then CPP_SetAnimState("nasip_seno1");
        else
            if (aObject.Params.hungry == 1000) then CPP_SetAnimState("eating_sheep"); end
        end
    end
    local res = defEatingTaskExecute(aObject.Params,aObject.Tasks.eating);
    if (res == 0) then 
        CPP_SetAnimState("normal");
        aObject.Params.hungry = 5000;
        --SleepAfterTask(aObject.Tasks.eating);               
        SleepAfterTaskCycle();
        return 0;
    end
    return 1;
end
-- perform Task MILKING  over external object and return true if task is completed
function MilkingTaskExecute()
    aObject = GameObject:Get();
    CPP_SetVisPrefix("");
    --CPP_CreateProduct(aObject.Params.product_name,GetProductCreate());
    local countProduct = GetProductCreate();
    CPP_SetAnimState("normal");
    --SleepAfterTask(aObject.Tasks.milking);
    SleepAfterTaskCycle();
    CPP_ChildObjAnimState("milkgoat","milk",3,1,countProduct);
    return 0;
end

-- perform Task MILKING  over external object and return true if task is completed
function WateringTaskExecute()
    aObject = GameObject:Get();
        if (aObject.Params.thirst == 3000) then CPP_SetAnimState("drink_cow1");
        else
            if (aObject.Params.thirst == 1000) then CPP_SetAnimState("watering_sheep"); end
        end
    local res = defWateringTaskExecute(aObject.Params,aObject.Tasks.watering);
    if (res == 0) then 
        CPP_SetAnimState("normal");
        aObject.Params.thirst = 5000;
        SleepAfterTaskCycle();
        --SleepAfterTask(aObject.Tasks.watering);         
        return 0;
    end
    return 1;
end



