diff options
author | Happy <markaizer@gmail.com> | 2014-08-21 04:50:46 +0800 |
---|---|---|
committer | Happy <markaizer@gmail.com> | 2014-08-21 04:50:46 +0800 |
commit | f52e1007fe08c67003c0bc4c78231904dd3fd5cc (patch) | |
tree | 99907d827264e501774e58ab4630e41fa7103c02 /src/map/mercenary.c | |
parent | 2410110dece79b4598c12f1c953219f1d0d1904a (diff) | |
parent | 769b1d05aa5cfa8cddfe7d21b35d5c5e4da3bbd6 (diff) | |
download | hercules-f52e1007fe08c67003c0bc4c78231904dd3fd5cc.tar.gz hercules-f52e1007fe08c67003c0bc4c78231904dd3fd5cc.tar.bz2 hercules-f52e1007fe08c67003c0bc4c78231904dd3fd5cc.tar.xz hercules-f52e1007fe08c67003c0bc4c78231904dd3fd5cc.zip |
Merge pull request #1 from HerculesWS/master
Update from original
Diffstat (limited to 'src/map/mercenary.c')
-rw-r--r-- | src/map/mercenary.c | 288 |
1 files changed, 164 insertions, 124 deletions
diff --git a/src/map/mercenary.c b/src/map/mercenary.c index 566f68409..80bcfdf05 100644 --- a/src/map/mercenary.c +++ b/src/map/mercenary.c @@ -2,64 +2,66 @@ // See the LICENSE file // Portions Copyright (c) Athena Dev Teams -#include "../common/cbasetypes.h" -#include "../common/malloc.h" -#include "../common/socket.h" -#include "../common/timer.h" -#include "../common/nullpo.h" -#include "../common/mmo.h" -#include "../common/random.h" -#include "../common/showmsg.h" -#include "../common/strlib.h" -#include "../common/utils.h" +#define HERCULES_CORE -#include "log.h" -#include "clif.h" +#include "mercenary.h" + +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "atcommand.h" +#include "battle.h" #include "chrif.h" +#include "clif.h" +#include "guild.h" #include "intif.h" #include "itemdb.h" +#include "log.h" #include "map.h" -#include "pc.h" -#include "status.h" -#include "skill.h" #include "mob.h" -#include "pet.h" -#include "battle.h" +#include "npc.h" #include "party.h" -#include "guild.h" -#include "atcommand.h" +#include "pc.h" +#include "pet.h" #include "script.h" -#include "npc.h" +#include "skill.h" +#include "status.h" #include "trade.h" #include "unit.h" -#include "mercenary.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> +#include "../common/cbasetypes.h" +#include "../common/malloc.h" +#include "../common/mmo.h" +#include "../common/nullpo.h" +#include "../common/random.h" +#include "../common/showmsg.h" +#include "../common/socket.h" +#include "../common/strlib.h" +#include "../common/timer.h" +#include "../common/utils.h" -struct s_mercenary_db mercenary_db[MAX_MERCENARY_CLASS]; // Mercenary Database +struct mercenary_interface mercenary_s; int merc_search_index(int class_) { int i; - ARR_FIND(0, MAX_MERCENARY_CLASS, i, mercenary_db[i].class_ == class_); + ARR_FIND(0, MAX_MERCENARY_CLASS, i, mercenary->db[i].class_ == class_); return (i == MAX_MERCENARY_CLASS)?-1:i; } bool merc_class(int class_) { - return (bool)(merc_search_index(class_) > -1); + return (bool)(mercenary->search_index(class_) > -1); } struct view_data * merc_get_viewdata(int class_) { - int i = merc_search_index(class_); + int i = mercenary->search_index(class_); if( i < 0 ) return 0; - return &mercenary_db[i].vd; + return &mercenary->db[i].vd; } int merc_create(struct map_session_data *sd, int class_, unsigned int lifetime) @@ -69,10 +71,10 @@ int merc_create(struct map_session_data *sd, int class_, unsigned int lifetime) int i; nullpo_retr(0,sd); - if( (i = merc_search_index(class_)) < 0 ) + if( (i = mercenary->search_index(class_)) < 0 ) return 0; - db = &mercenary_db[i]; + db = &mercenary->db[i]; memset(&merc,0,sizeof(struct s_mercenary)); merc.char_id = sd->status.char_id; @@ -82,7 +84,7 @@ int merc_create(struct map_session_data *sd, int class_, unsigned int lifetime) merc.life_time = lifetime; // Request Char Server to create this mercenary - intif_mercenary_create(&merc); + intif->mercenary_create(&merc); return 1; } @@ -93,8 +95,8 @@ int mercenary_get_lifetime(struct mercenary_data *md) if( md == NULL || md->contract_timer == INVALID_TIMER ) return 0; - td = iTimer->get_timer(md->contract_timer); - return (td != NULL) ? DIFF_TICK(td->tick, iTimer->gettick()) : 0; + td = timer->get(md->contract_timer); + return (td != NULL) ? DIFF_TICK32(td->tick, timer->gettick()) : 0; } int mercenary_get_guild(struct mercenary_data *md) @@ -211,30 +213,29 @@ int mercenary_save(struct mercenary_data *md) { md->mercenary.hp = md->battle_status.hp; md->mercenary.sp = md->battle_status.sp; - md->mercenary.life_time = mercenary_get_lifetime(md); + md->mercenary.life_time = mercenary->get_lifetime(md); - intif_mercenary_save(&md->mercenary); + intif->mercenary_save(&md->mercenary); return 1; } -static int merc_contract_end(int tid, unsigned int tick, int id, intptr_t data) -{ +int merc_contract_end_timer(int tid, int64 tick, int id, intptr_t data) { struct map_session_data *sd; struct mercenary_data *md; - if( (sd = iMap->id2sd(id)) == NULL ) + if( (sd = map->id2sd(id)) == NULL ) return 1; if( (md = sd->md) == NULL ) return 1; if( md->contract_timer != tid ) { - ShowError("merc_contract_end %d != %d.\n", md->contract_timer, tid); + ShowError("merc_contract_end_timer %d != %d.\n", md->contract_timer, tid); return 0; } md->contract_timer = INVALID_TIMER; - merc_delete(md, 0); // Mercenary soldier's duty hour is over. + mercenary->delete(md, 0); // Mercenary soldier's duty hour is over. return 0; } @@ -244,10 +245,10 @@ int merc_delete(struct mercenary_data *md, int reply) struct map_session_data *sd = md->master; md->mercenary.life_time = 0; - merc_contract_stop(md); + mercenary->contract_stop(md); if( !sd ) - return unit_free(&md->bl, CLR_OUTSIGHT); + return unit->free(&md->bl, CLR_OUTSIGHT); if( md->devotion_flag ) { @@ -257,38 +258,37 @@ int merc_delete(struct mercenary_data *md, int reply) switch( reply ) { - case 0: mercenary_set_faith(md, 1); break; // +1 Loyalty on Contract ends. - case 1: mercenary_set_faith(md, -1); break; // -1 Loyalty on Mercenary killed + case 0: mercenary->set_faith(md, 1); break; // +1 Loyalty on Contract ends. + case 1: mercenary->set_faith(md, -1); break; // -1 Loyalty on Mercenary killed } clif->mercenary_message(sd, reply); - return unit_remove_map(&md->bl, CLR_OUTSIGHT); + return unit->remove_map(&md->bl, CLR_OUTSIGHT, ALC_MARK); } void merc_contract_stop(struct mercenary_data *md) { nullpo_retv(md); if( md->contract_timer != INVALID_TIMER ) - iTimer->delete_timer(md->contract_timer, merc_contract_end); + timer->delete(md->contract_timer, mercenary->contract_end_timer); md->contract_timer = INVALID_TIMER; } void merc_contract_init(struct mercenary_data *md) { if( md->contract_timer == INVALID_TIMER ) - md->contract_timer = iTimer->add_timer(iTimer->gettick() + md->mercenary.life_time, merc_contract_end, md->master->bl.id, 0); + md->contract_timer = timer->add(timer->gettick() + md->mercenary.life_time, mercenary->contract_end_timer, md->master->bl.id, 0); md->regen.state.block = 0; } -int merc_data_received(struct s_mercenary *merc, bool flag) -{ +int merc_data_received(struct s_mercenary *merc, bool flag) { struct map_session_data *sd; struct mercenary_data *md; struct s_mercenary_db *db; - int i = merc_search_index(merc->class_); + int i = mercenary->search_index(merc->class_); - if( (sd = iMap->charid2sd(merc->char_id)) == NULL ) + if( (sd = map->charid2sd(merc->char_id)) == NULL ) return 0; if( !flag || i < 0 ) { // Not created - loaded - DB info @@ -296,31 +296,30 @@ int merc_data_received(struct s_mercenary *merc, bool flag) return 0; } - db = &mercenary_db[i]; - if( !sd->md ) - { + db = &mercenary->db[i]; + if( !sd->md ) { sd->md = md = (struct mercenary_data*)aCalloc(1,sizeof(struct mercenary_data)); md->bl.type = BL_MER; - md->bl.id = npc_get_new_npc_id(); + md->bl.id = npc->get_new_npc_id(); md->devotion_flag = 0; md->master = sd; md->db = db; memcpy(&md->mercenary, merc, sizeof(struct s_mercenary)); - status_set_viewdata(&md->bl, md->mercenary.class_); - status_change_init(&md->bl); - unit_dataset(&md->bl); + status->set_viewdata(&md->bl, md->mercenary.class_); + status->change_init(&md->bl); + unit->dataset(&md->bl); md->ud.dir = sd->ud.dir; md->bl.m = sd->bl.m; md->bl.x = sd->bl.x; md->bl.y = sd->bl.y; - unit_calc_pos(&md->bl, sd->bl.x, sd->bl.y, sd->ud.dir); + unit->calc_pos(&md->bl, sd->bl.x, sd->bl.y, sd->ud.dir); md->bl.x = md->ud.to_x; md->bl.y = md->ud.to_y; - iMap->addiddb(&md->bl); - status_calc_mercenary(md,1); + map->addiddb(&md->bl); + status_calc_mercenary(md,SCO_FIRST); md->contract_timer = INVALID_TIMER; merc_contract_init(md); } @@ -331,12 +330,11 @@ int merc_data_received(struct s_mercenary *merc, bool flag) } if( sd->status.mer_id == 0 ) - mercenary_set_calls(md, 1); + mercenary->set_calls(md, 1); sd->status.mer_id = merc->mercenary_id; - if( md && md->bl.prev == NULL && sd->bl.prev != NULL ) - { - iMap->addblock(&md->bl); + if( md && md->bl.prev == NULL && sd->bl.prev != NULL ) { + map->addblock(&md->bl); clif->spawn(&md->bl); clif->mercenary_info(sd); clif->mercenary_skillblock(sd); @@ -355,7 +353,7 @@ void mercenary_heal(struct mercenary_data *md, int hp, int sp) int mercenary_dead(struct mercenary_data *md) { - merc_delete(md, 1); + mercenary->delete(md, 1); return 0; } @@ -364,7 +362,7 @@ int mercenary_killbonus(struct mercenary_data *md) const enum sc_type scs[] = { SC_MER_FLEE, SC_MER_ATK, SC_MER_HP, SC_MER_SP, SC_MER_HIT }; int index = rnd() % ARRAYLENGTH(scs); - sc_start(&md->bl, scs[index], 100, rnd() % 5, 600000); + sc_start(NULL,&md->bl, scs[index], 100, rnd() % 5, 600000); return 0; } @@ -375,8 +373,8 @@ int mercenary_kills(struct mercenary_data *md) if( (md->mercenary.kill_count % 50) == 0 ) { - mercenary_set_faith(md, 1); - mercenary_killbonus(md); + mercenary->set_faith(md, 1); + mercenary->killbonus(md); } if( md->master ) @@ -397,78 +395,74 @@ int mercenary_checkskill(struct mercenary_data *md, uint16 skill_id) return 0; } -static bool read_mercenarydb_sub(char* str[], int columns, int current) -{ +bool read_mercenarydb_sub(char* str[], int columns, int current) { int ele; struct s_mercenary_db *db; - struct status_data *status; + struct status_data *mstatus; - db = &mercenary_db[current]; + db = &mercenary->db[current]; db->class_ = atoi(str[0]); safestrncpy(db->sprite, str[1], NAME_LENGTH); safestrncpy(db->name, str[2], NAME_LENGTH); db->lv = atoi(str[3]); - status = &db->status; + mstatus = &db->status; db->vd.class_ = db->class_; - status->max_hp = atoi(str[4]); - status->max_sp = atoi(str[5]); - status->rhw.range = atoi(str[6]); - status->rhw.atk = atoi(str[7]); - status->rhw.atk2 = status->rhw.atk + atoi(str[8]); - status->def = atoi(str[9]); - status->mdef = atoi(str[10]); - status->str = atoi(str[11]); - status->agi = atoi(str[12]); - status->vit = atoi(str[13]); - status->int_ = atoi(str[14]); - status->dex = atoi(str[15]); - status->luk = atoi(str[16]); + mstatus->max_hp = atoi(str[4]); + mstatus->max_sp = atoi(str[5]); + mstatus->rhw.range = atoi(str[6]); + mstatus->rhw.atk = atoi(str[7]); + mstatus->rhw.atk2 = mstatus->rhw.atk + atoi(str[8]); + mstatus->def = atoi(str[9]); + mstatus->mdef = atoi(str[10]); + mstatus->str = atoi(str[11]); + mstatus->agi = atoi(str[12]); + mstatus->vit = atoi(str[13]); + mstatus->int_ = atoi(str[14]); + mstatus->dex = atoi(str[15]); + mstatus->luk = atoi(str[16]); db->range2 = atoi(str[17]); db->range3 = atoi(str[18]); - status->size = atoi(str[19]); - status->race = atoi(str[20]); + mstatus->size = atoi(str[19]); + mstatus->race = atoi(str[20]); ele = atoi(str[21]); - status->def_ele = ele%10; - status->ele_lv = ele/20; - if( status->def_ele >= ELE_MAX ) - { - ShowWarning("Mercenary %d has invalid element type %d (max element is %d)\n", db->class_, status->def_ele, ELE_MAX - 1); - status->def_ele = ELE_NEUTRAL; + mstatus->def_ele = ele%10; + mstatus->ele_lv = ele/20; + if( mstatus->def_ele >= ELE_MAX ) { + ShowWarning("Mercenary %d has invalid element type %d (max element is %d)\n", db->class_, mstatus->def_ele, ELE_MAX - 1); + mstatus->def_ele = ELE_NEUTRAL; } - if( status->ele_lv < 1 || status->ele_lv > 4 ) - { - ShowWarning("Mercenary %d has invalid element level %d (max is 4)\n", db->class_, status->ele_lv); - status->ele_lv = 1; + if( mstatus->ele_lv < 1 || mstatus->ele_lv > 4 ) { + ShowWarning("Mercenary %d has invalid element level %d (max is 4)\n", db->class_, mstatus->ele_lv); + mstatus->ele_lv = 1; } - status->aspd_rate = 1000; - status->speed = atoi(str[22]); - status->adelay = atoi(str[23]); - status->amotion = atoi(str[24]); - status->dmotion = atoi(str[25]); + mstatus->aspd_rate = 1000; + mstatus->speed = atoi(str[22]); + mstatus->adelay = atoi(str[23]); + mstatus->amotion = atoi(str[24]); + mstatus->dmotion = atoi(str[25]); return true; } -int read_mercenarydb(void) -{ - memset(mercenary_db,0,sizeof(mercenary_db)); - sv->readdb(iMap->db_path, "mercenary_db.txt", ',', 26, 26, MAX_MERCENARY_CLASS, &read_mercenarydb_sub); +int read_mercenarydb(void) { + memset(mercenary->db,0,sizeof(mercenary->db)); + sv->readdb(map->db_path, "mercenary_db.txt", ',', 26, 26, MAX_MERCENARY_CLASS, mercenary->read_db_sub); return 0; } -static bool read_mercenary_skilldb_sub(char* str[], int columns, int current) +bool read_mercenary_skilldb_sub(char* str[], int columns, int current) {// <merc id>,<skill id>,<skill level> struct s_mercenary_db *db; int i, class_; uint16 skill_id, skill_lv; class_ = atoi(str[0]); - ARR_FIND(0, MAX_MERCENARY_CLASS, i, class_ == mercenary_db[i].class_); + ARR_FIND(0, MAX_MERCENARY_CLASS, i, class_ == mercenary->db[i].class_); if( i == MAX_MERCENARY_CLASS ) { ShowError("read_mercenary_skilldb : Class %d not found in mercenary_db for skill entry.\n", class_); @@ -482,7 +476,7 @@ static bool read_mercenary_skilldb_sub(char* str[], int columns, int current) return false; } - db = &mercenary_db[i]; + db = &mercenary->db[i]; skill_lv = atoi(str[2]); i = skill_id - MC_SKILLBASE; @@ -492,20 +486,66 @@ static bool read_mercenary_skilldb_sub(char* str[], int columns, int current) return true; } -int read_mercenary_skilldb(void) -{ - sv->readdb(iMap->db_path, "mercenary_skill_db.txt", ',', 3, 3, -1, &read_mercenary_skilldb_sub); +int read_mercenary_skilldb(void) { + sv->readdb(map->db_path, "mercenary_skill_db.txt", ',', 3, 3, -1, mercenary->read_skill_db_sub); return 0; } -int do_init_mercenary(void) -{ - read_mercenarydb(); - read_mercenary_skilldb(); +void do_init_mercenary(bool minimal) { + if (minimal) + return; + + mercenary->read_db(); + mercenary->read_skilldb(); - //add_timer_func_list(mercenary_contract, "mercenary_contract"); - return 0; + timer->add_func_list(mercenary->contract_end_timer, "merc_contract_end_timer"); } -int do_final_mercenary(void); +/*===================================== +* Default Functions : mercenary.h +* Generated by HerculesInterfaceMaker +* created by Susu +*-------------------------------------*/ +void mercenary_defaults(void) { + mercenary = &mercenary_s; + + /* vars */ + memset(mercenary->db,0,sizeof(mercenary->db)); + + /* funcs */ + + mercenary->init = do_init_mercenary; + + mercenary->class = merc_class; + mercenary->get_viewdata = merc_get_viewdata; + + mercenary->create = merc_create; + mercenary->data_received = merc_data_received; + mercenary->save = mercenary_save; + + mercenary->heal = mercenary_heal; + mercenary->dead = mercenary_dead; + + mercenary->delete = merc_delete; + mercenary->contract_stop = merc_contract_stop; + + mercenary->get_lifetime = mercenary_get_lifetime; + mercenary->get_guild = mercenary_get_guild; + mercenary->get_faith = mercenary_get_faith; + mercenary->set_faith = mercenary_set_faith; + mercenary->get_calls = mercenary_get_calls; + mercenary->set_calls = mercenary_set_calls; + mercenary->kills = mercenary_kills; + + mercenary->checkskill = mercenary_checkskill; + mercenary->read_db = read_mercenarydb; + mercenary->read_skilldb = read_mercenary_skilldb; + + mercenary->killbonus = mercenary_killbonus; + mercenary->search_index = merc_search_index; + + mercenary->contract_end_timer = merc_contract_end_timer; + mercenary->read_db_sub = read_mercenarydb_sub; + mercenary->read_skill_db_sub = read_mercenary_skilldb_sub; +} |