diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/map/mercenary.c | 30 | ||||
-rw-r--r-- | src/map/mercenary.h | 12 | ||||
-rw-r--r-- | src/map/script.c | 130 |
3 files changed, 164 insertions, 8 deletions
diff --git a/src/map/mercenary.c b/src/map/mercenary.c index 4775f9beb..84974e906 100644 --- a/src/map/mercenary.c +++ b/src/map/mercenary.c @@ -94,6 +94,25 @@ int mercenary_get_lifetime(struct mercenary_data *md) return (td != NULL) ? DIFF_TICK(td->tick, gettick()) : 0; } +int mercenary_get_guild(struct mercenary_data *md) +{ + int class_; + + if( md == NULL || md->db == NULL ) + return -1; + + class_ = md->db->class_; + + if( class_ >= 6017 && class_ <= 6026 ) + return ARCH_MERC_GUILD; + if( class_ >= 6027 && class_ <= 6036 ) + return SPEAR_MERC_GUILD; + if( class_ >= 6037 && class_ <= 6046 ) + return SWORD_MERC_GUILD; + + return -1; +} + int mercenary_get_faith(struct mercenary_data *md) { struct map_session_data *sd; @@ -110,8 +129,6 @@ int mercenary_get_faith(struct mercenary_data *md) return sd->status.spear_faith; if( class_ >= 6037 && class_ <= 6046 ) return sd->status.sword_faith; - else - return 0; return 0; } @@ -158,8 +175,6 @@ int mercenary_get_calls(struct mercenary_data *md) return sd->status.spear_calls; if( class_ >= 6037 && class_ <= 6046 ) return sd->status.sword_calls; - else - return 0; return 0; } @@ -231,6 +246,12 @@ int merc_delete(struct mercenary_data *md, int reply) if( !sd ) return unit_free(&md->bl, 0); + if( md->devotion_flag ) + { + md->devotion_flag = 0; + status_change_end(&sd->bl, SC_DEVOTION, -1); + } + switch( reply ) { case 0: mercenary_set_faith(md, 1); break; // +1 Loyalty on Contract ends. @@ -278,6 +299,7 @@ int merc_data_received(struct s_mercenary *merc, bool flag) 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->devotion_flag = 0; md->master = sd; md->db = db; diff --git a/src/map/mercenary.h b/src/map/mercenary.h index 826133660..1cc689208 100644 --- a/src/map/mercenary.h +++ b/src/map/mercenary.h @@ -7,6 +7,12 @@ #include "status.h" // struct status_data, struct status_change #include "unit.h" // struct unit_data +enum { + ARCH_MERC_GUILD, + SPEAR_MERC_GUILD, + SWORD_MERC_GUILD, +}; + struct s_mercenary_db { int class_; char sprite[NAME_LENGTH], name[NAME_LENGTH]; @@ -31,11 +37,12 @@ struct mercenary_data { struct s_mercenary_db *db; struct s_mercenary mercenary; + char blockskill[MAX_SKILL]; struct map_session_data *master; int contract_timer; - - char blockskill[MAX_SKILL]; + + unsigned devotion_flag : 1; }; bool merc_class(int class_); @@ -53,6 +60,7 @@ int merc_delete(struct mercenary_data *md, int reply); void merc_contract_stop(struct mercenary_data *md); int mercenary_get_lifetime(struct mercenary_data *md); +int mercenary_get_guild(struct mercenary_data *md); int mercenary_get_faith(struct mercenary_data *md); int mercenary_set_faith(struct mercenary_data *md, int value); int mercenary_get_calls(struct mercenary_data *md); diff --git a/src/map/script.c b/src/map/script.c index d2a77036b..dc1a0fa6d 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -12810,7 +12810,7 @@ BUILDIN_FUNC(setcell) /*========================================== * Mercenary Commands *------------------------------------------*/ -BUILDIN_FUNC(createmercenary) +BUILDIN_FUNC(mercenary_create) { struct map_session_data *sd; int class_, contract_time; @@ -12860,6 +12860,128 @@ BUILDIN_FUNC(mercenary_sc_start) return 0; } +BUILDIN_FUNC(mercenary_get_calls) +{ + struct map_session_data *sd = script_rid2sd(st); + int guild; + + if( sd == NULL ) + return 0; + + guild = script_getnum(st,2); + switch( guild ) + { + case ARCH_MERC_GUILD: + script_pushint(st,sd->status.arch_calls); + break; + case SPEAR_MERC_GUILD: + script_pushint(st,sd->status.spear_calls); + break; + case SWORD_MERC_GUILD: + script_pushint(st,sd->status.sword_calls); + break; + default: + script_pushint(st,0); + break; + } + + return 0; +} + +BUILDIN_FUNC(mercenary_set_calls) +{ + struct map_session_data *sd = script_rid2sd(st); + int guild, value, *calls; + + if( sd == NULL ) + return 0; + + guild = script_getnum(st,2); + value = script_getnum(st,3); + + switch( guild ) + { + case ARCH_MERC_GUILD: + calls = &sd->status.arch_calls; + break; + case SPEAR_MERC_GUILD: + calls = &sd->status.spear_calls; + break; + case SWORD_MERC_GUILD: + calls = &sd->status.sword_calls; + break; + default: + return 0; // Invalid Guild + } + + *calls += value; + *calls = cap_value(*calls, 0, INT_MAX); + + return 0; +} + +BUILDIN_FUNC(mercenary_get_faith) +{ + struct map_session_data *sd = script_rid2sd(st); + int guild; + + if( sd == NULL ) + return 0; + + guild = script_getnum(st,2); + switch( guild ) + { + case ARCH_MERC_GUILD: + script_pushint(st,sd->status.arch_faith); + break; + case SPEAR_MERC_GUILD: + script_pushint(st,sd->status.spear_faith); + break; + case SWORD_MERC_GUILD: + script_pushint(st,sd->status.sword_faith); + break; + default: + script_pushint(st,0); + break; + } + + return 0; +} + +BUILDIN_FUNC(mercenary_set_faith) +{ + struct map_session_data *sd = script_rid2sd(st); + int guild, value, *calls; + + if( sd == NULL ) + return 0; + + guild = script_getnum(st,2); + value = script_getnum(st,3); + + switch( guild ) + { + case ARCH_MERC_GUILD: + calls = &sd->status.arch_faith; + break; + case SPEAR_MERC_GUILD: + calls = &sd->status.spear_faith; + break; + case SWORD_MERC_GUILD: + calls = &sd->status.sword_faith; + break; + default: + return 0; // Invalid Guild + } + + *calls += value; + *calls = cap_value(*calls, 0, INT_MAX); + if( mercenary_get_guild(sd->md) == guild ) + clif_mercenary_updatestatus(sd,SP_MERCFAITH); + + return 0; +} + /****************** Questlog script commands *******************/ @@ -13290,8 +13412,12 @@ struct script_function buildin_func[] = { BUILDIN_DEF(hasquest, "i"), BUILDIN_DEF(setwall,"siiiiis"), BUILDIN_DEF(delwall,"s"), - BUILDIN_DEF(createmercenary,"ii"), + BUILDIN_DEF(mercenary_create,"ii"), BUILDIN_DEF(mercenary_heal,"ii"), BUILDIN_DEF(mercenary_sc_start,"iii"), + BUILDIN_DEF(mercenary_get_calls,"i"), + BUILDIN_DEF(mercenary_get_faith,"i"), + BUILDIN_DEF(mercenary_set_calls,"ii"), + BUILDIN_DEF(mercenary_set_faith,"ii"), {NULL,NULL,NULL}, }; |