summaryrefslogtreecommitdiff
path: root/src/map/skill-pools.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/skill-pools.c')
-rw-r--r--src/map/skill-pools.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/map/skill-pools.c b/src/map/skill-pools.c
new file mode 100644
index 0000000..de7f04b
--- /dev/null
+++ b/src/map/skill-pools.c
@@ -0,0 +1,165 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "timer.h"
+#include "nullpo.h"
+#include "malloc.h"
+#include "magic.h"
+
+#include "battle.h"
+#include "clif.h"
+#include "intif.h"
+#include "itemdb.h"
+#include "map.h"
+#include "mob.h"
+#include "party.h"
+#include "pc.h"
+#include "script.h"
+#include "skill.h"
+#include "../common/socket.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+int skill_pool_skills[MAX_POOL_SKILLS];
+int skill_pool_skills_size = 0;
+
+extern 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;
+}
+
+
+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;
+ MAP_LOG_PC(sd, "SKILL-ACTIVATE %d %d %d", skill_id, sd->status.skill[skill_id].lv, skill_power(sd, skill_id));
+ return 0;
+ }
+ pc_calcstatus(sd, 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;
+}