summaryrefslogblamecommitdiff
path: root/src/map/skill-pools.cpp
blob: 204036d6f2e26bfd471cf3a7fda7d80c550fbd58 (plain) (tree)
1
2
3
4
5
6
7
8
9




                   



                                
 










                               

               
                       

      

                                        
 
                                
 







                                                                                  

 
                                  
 



                                          

 
                                                         
 









                                                                          
         
     
 
                 

 
                                                   
 
           
 




                                                

 
                                                 
 
                                 

 
                                                
 
                                              

 
                                                                   
 













                                                                           

 
                                                                       
 
                                                                   

 
                                                                     
 








                                                                  

 
                             
 
                                   

 
                                                           
 


                                      
 

                                                             
 

                                                   
 



                                            
 
                                             
 
                  

 
                                                     
 



                                                                   
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include "../common/timer.hpp"
#include "../common/nullpo.hpp"
#include "../common/mt_rand.hpp"
#include "magic.hpp"

#include "battle.hpp"
#include "clif.hpp"
#include "intif.hpp"
#include "itemdb.hpp"
#include "map.hpp"
#include "mob.hpp"
#include "party.hpp"
#include "pc.hpp"
#include "script.hpp"
#include "skill.hpp"
#include "../common/socket.hpp"

#ifdef MEMWATCH
#include "memwatch.hpp"
#endif

int  skill_pool_skills[MAX_POOL_SKILLS];
int  skill_pool_skills_size = 0;

void skill_pool_register(int id)
{
    if (skill_pool_skills_size + 1 >= MAX_POOL_SKILLS)
    {
        fprintf (stderr,
                 "Too many pool skills! Increase MAX_POOL_SKILLS and recompile.");
        return;
    }

    skill_pool_skills[skill_pool_skills_size++] = id;
}

const char *skill_name (int skill)
{
    if (skill > 0 && skill < MAX_SKILL_DB)
        return skill_names[skill].desc;
    else
        return NULL;
}

int skill_pool (struct map_session_data *sd, int *skills)
{
    int  i, count = 0;

    for (i = 0; count < MAX_SKILL_POOL && i < skill_pool_skills_size; i++)
    {
        int  skill_id = skill_pool_skills[i];
        if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED)
        {
            if (skills)
                skills[count] = skill_id;
            ++count;
        }
    }

    return count;
}

void skill_pool_empty (struct map_session_data *sd)
{
    int  i;

    for (i = 0; i < skill_pool_skills_size; i++)
    {
        int  skill_id = skill_pool_skills[i];
        sd->status.skill[skill_id].flags = 0;
    }
}

int skill_pool_size (struct map_session_data *sd)
{
    return skill_pool (sd, NULL);
}

int skill_pool_max (struct map_session_data *sd)
{
    return sd->status.skill[TMW_SKILLPOOL].lv;
}

int skill_pool_activate (struct map_session_data *sd, int skill_id)
{
    if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED)
        return 0;               // Already there
    else if (sd->status.skill[skill_id].id == skill_id  // knows the skill
             && (skill_pool_size (sd) < skill_pool_max (sd)))
    {
        sd->status.skill[skill_id].flags |= SKILL_POOL_ACTIVATED;
        pc_calcstatus (sd, 0);
        MAP_LOG_PC (sd, "SKILL-ACTIVATE %d %d %d", skill_id,
                    sd->status.skill[skill_id].lv, skill_power (sd,
                                                                skill_id));
        return 0;
    }

    return 1;                   // failed
}

int skill_pool_is_activated (struct map_session_data *sd, int skill_id)
{
    return sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED;
}

int skill_pool_deactivate (struct map_session_data *sd, int skill_id)
{
    if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED)
    {
        sd->status.skill[skill_id].flags &= ~SKILL_POOL_ACTIVATED;
        MAP_LOG_PC (sd, "SKILL-DEACTIVATE %d", skill_id);
        pc_calcstatus (sd, 0);
        return 0;
    }

    return 1;
}

int skill_stat (int skill_id)
{
    return skill_db[skill_id].stat;
}

int skill_power (struct map_session_data *sd, int skill_id)
{
    int  stat = skill_stat (skill_id);
    int  stat_value, skill_value;
    int  result;

    if (stat == 0 || !skill_pool_is_activated (sd, skill_id))
        return 0;

    stat_value = battle_get_stat (stat, &(sd->bl));
    skill_value = sd->status.skill[skill_id].lv;

    if ((skill_value * 10) - 1 > stat_value)
        skill_value += (stat_value / 10);
    else
        skill_value *= 2;

    result = (skill_value * stat_value) / 10;

    return result;
}

int skill_power_bl (struct block_list *bl, int skill)
{
    if (bl->type == BL_PC)
        return skill_power ((struct map_session_data *) bl, skill);
    else
        return 0;
}