Updated new guild skills (50%)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/athena@338 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
(no author) 2004-11-24 02:55:55 +00:00
parent a1de05ce9f
commit 427a127b53
5 changed files with 294 additions and 39 deletions

View File

@ -5,7 +5,7 @@ Date Added
* @charpetfriendly is now #petfriendly [MC Cameri]
* @charstats is now #stats [MC Cameri]
* Skill Updates: [celest]
- Added some code for the new guild skills (10%) and Moonlit Petals (5%)
- Added some code for the new guild skills (50%) and Moonlit Petals (5%)
- Notes to other devs: Guild skills with id's 10000-10014 will be stored in
skill_db[500-514]
- Corrected Hilt Binding

View File

@ -940,6 +940,8 @@ int guild_skillup(struct map_session_data *sd,int skill_num,int flag)
g->skill[idx].lv < guild_skill_get_max(skill_num) ){
intif_guild_skillup(g->guild_id,skill_num,sd->status.account_id,flag);
}
pc_calcstatus (sd, 0); // Celest
return 0;
}
// スキルポイント割り振り通知

View File

@ -1,4 +1,4 @@
// $Id: pc.c 101 2004-11-23 14:33:00Z Celestia $
// $Id: pc.c 101 2004-11-24 10:52:07 Celestia $
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -1438,20 +1438,28 @@ int pc_calcstatus(struct map_session_data* sd,int first)
sd->base_atk += 4;
}
// Celest
// New guild skills - Celest
if (sd->status.guild_id > 0) {
struct guild *g;
if ((g = guild_search(sd->status.guild_id)) && strcmp(sd->status.name,g->master)==0) {
if (guild_checkskill(g, GD_LEADERSHIP)>0)
; //skillunitsetting
if (guild_checkskill(g, GD_GLORYWOUNDS)>0)
; //skillunitsetting
if (guild_checkskill(g, GD_SOULCOLD)>0)
; //skillunitsetting
if (guild_checkskill(g, GD_HAWKEYES)>0)
; //skillunitsetting
if (!sd->sc_data[SC_LEADERSHIP].val4 && guild_checkskill(g, GD_LEADERSHIP)>0) {
//skill_status_change_start(&sd->bl,SC_LEADERSHIP,1,0,0,0,0,0 );
skill_unitsetting(&sd->bl,GD_LEADERSHIP,1,sd->bl.x,sd->bl.y,0);
}
if (!sd->sc_data[SC_GLORYWOUNDS].val4 && guild_checkskill(g, GD_GLORYWOUNDS)>0) {
//skill_status_change_start(&sd->bl,SC_GLORYWOUNDS,1,0,0,0,0,0 );
skill_unitsetting(&sd->bl,GD_GLORYWOUNDS,1,sd->bl.x,sd->bl.y,0);
}
if (!sd->sc_data[SC_SOULCOLD].val4 && guild_checkskill(g, GD_SOULCOLD)>0) {
//skill_status_change_start(&sd->bl,SC_SOULCOLD,1,0,0,0,0,0 );
skill_unitsetting(&sd->bl,GD_SOULCOLD,1,sd->bl.x,sd->bl.y,0);
}
if (!sd->sc_data[SC_HAWKEYES].val4 && guild_checkskill(g, GD_HAWKEYES)>0) {
//skill_status_change_start(&sd->bl,SC_HAWKEYES,1,0,0,0,0,0 );
skill_unitsetting(&sd->bl,GD_HAWKEYES,1,sd->bl.x,sd->bl.y,0);
}
}
if (sd->sc_count) {
else {
if (sd->sc_data[SC_LEADERSHIP].timer != -1)
sd->paramb[0] += 2;
if (sd->sc_data[SC_GLORYWOUNDS].timer != -1)
@ -3796,8 +3804,21 @@ static int pc_walk(int tid,unsigned int tick,int id,int data)
sd->bl.y = y;
if(moveblock) map_addblock(&sd->bl);
if(sd->sc_data[SC_DANCING].timer!=-1)
skill_unit_move_unit_group((struct skill_unit_group *)sd->sc_data[SC_DANCING].val2,sd->bl.m,dx,dy);
if (sd->status.guild_id > 0) {
struct skill_unit *su;
if (sd->sc_data[SC_LEADERSHIP].val4 && (su=(struct skill_unit *)sd->sc_data[SC_LEADERSHIP].val4)) {
skill_unit_move_unit_group(su->group,sd->bl.m,dx,dy);
}
if (sd->sc_data[SC_GLORYWOUNDS].val4 && (su=(struct skill_unit *)sd->sc_data[SC_GLORYWOUNDS].val4)) {
skill_unit_move_unit_group(su->group,sd->bl.m,dx,dy);
}
if (sd->sc_data[SC_SOULCOLD].val4 && (su=(struct skill_unit *)sd->sc_data[SC_SOULCOLD].val4)) {
skill_unit_move_unit_group(su->group,sd->bl.m,dx,dy);
}
if (sd->sc_data[SC_HAWKEYES].val4 && (su=(struct skill_unit *)sd->sc_data[SC_HAWKEYES].val4)) {
skill_unit_move_unit_group(su->group,sd->bl.m,dx,dy);
}
}
map_foreachinmovearea(clif_pcinsight,sd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,0,sd);
sd->walktimer = -1;
@ -3820,9 +3841,13 @@ static int pc_walk(int tid,unsigned int tick,int id,int data)
break;
}
/* ”íƒfƒBƒ{?ƒVƒ‡ƒ“?<3F>¸ */
if(sd->sc_data) {
if(sd->sc_count) {
if (sd->sc_data[SC_DANCING].timer!=-1)
skill_unit_move_unit_group((struct skill_unit_group *)sd->sc_data[SC_DANCING].val2,sd->bl.m,dx,dy);
if (sd->sc_data[SC_DEVOTION].val1)
skill_devotion2(&sd->bl,sd->sc_data[SC_DEVOTION].val1);
if (sd->sc_data[SC_BASILICA].timer != -1) { // Basilica cancels if caster moves [celest]
struct skill_unit *su;
if ((su = (struct skill_unit *)sd->sc_data[SC_BASILICA].val4)) {

View File

@ -1,4 +1,4 @@
// $Id: skill.c,v 1.8 2004/09/25 05:32:19 MouseJstr Exp $
// $Id: skill.c,v 1.8 2004/11/24 10:51:28 Celestia Exp $
/* スキル?係 */
#include <stdio.h>
@ -837,7 +837,7 @@ int skill_tree_get_max(int id, int b_class){
}
/* プロトタイプ */
struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag);
//struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag);
int skill_check_condition( struct map_session_data *sd,int type);
int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
int skill_frostjoke_scream(struct block_list *bl,va_list ap);
@ -4391,24 +4391,72 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
}
}
break;
// New guild skills [Celest]
case GD_BATTLEORDER:
{
struct guild *g = NULL;
if (sd && sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id))) {
if (sd && sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id)) &&
strcmp(sd->status.name,g->master)==0) {
for(i = 0; i < g->max_member; i++) {
if ((dstsd = g->member[i].sd) != NULL) {
if ((dstsd = g->member[i].sd) != NULL && sd->bl.m == dstsd->bl.m) {
clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(&dstsd->bl,SC_BATTLEORDERS,skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
skill_status_change_start(&dstsd->bl,SC_BATTLEORDERS,skilllv,0,0,0,0,0 );
}
}
}
}
printf("Guild skill castend:%d\n",skillid);
break;
case GD_REGENERATION:
{
struct guild *g = NULL;
if (sd && sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id)) &&
strcmp(sd->status.name,g->master)==0) {
for(i = 0; i < g->max_member; i++) {
if ((dstsd = g->member[i].sd) != NULL && sd->bl.m == dstsd->bl.m) {
clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(&dstsd->bl,SC_REGENERATION,skilllv,0,0,0,0,0 );
}
}
}
}
break;
case GD_RESTORE:
{
struct guild *g = NULL;
int hp, sp;
if (sd && sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id)) &&
strcmp(sd->status.name,g->master)==0) {
for(i = 0; i < g->max_member; i++) {
if ((dstsd = g->member[i].sd) != NULL && sd->bl.m == dstsd->bl.m) {
hp = dstsd->status.max_hp*0.9;
sp = dstsd->status.sp + hp < dstsd->status.max_sp ? hp : dstsd->status.max_sp - dstsd->status.sp;
clif_skill_nodamage(src,bl,AL_HEAL,hp,1);
battle_heal(NULL,bl,hp,sp,0);
}
}
}
}
break;
case GD_EMERGENCYCALL:
printf("Guild skill castend:%d\n",skillid);
{
struct guild *g = NULL;
// i don't know if it actually summons in a circle, but oh well. ;P
int dx[9]={-2, 0, 2,-2, 0, 2,-2, 0, 2};
int dy[9]={-2,-2,-2, 0, 0, 0, 2, 2, 2};
int j = 0;
if (sd && sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id)) &&
strcmp(sd->status.name,g->master)==0) {
for(i = 0; i < g->max_member; i++, j++) {
if (j>8) j=0;
if ((dstsd = g->member[i].sd) != NULL && sd != dstsd &&
!map[sd->bl.m].flag.nowarpto && !map[sd->bl.m].flag.nowarp) {
clif_skill_nodamage(src,bl,skillid,skilllv,1);
pc_setpos(dstsd, sd->mapname, sd->bl.x+dx[j], sd->bl.y+dy[j], 2);
}
}
}
}
break;
default:
printf("Unknown skill used:%d\n",skillid);
@ -4946,6 +4994,7 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,
limit=500;
range=5;
break;
case WZ_HEAVENDRIVE: /* ヘヴンズドライブ */
limit=500;
range=2;
@ -5146,12 +5195,14 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,
val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1;
val2 = battle_get_luk(src)/10;
break;
case AM_DEMONSTRATION: /* デモンストレ?ション */
limit=skill_get_time(skillid,skilllv);
interval=1000;
range=1;
target=BCT_ENEMY;
break;
case WE_CALLPARTNER: /* あなたに逢いたい */
limit=skill_get_time(skillid,skilllv);
range=-1;
@ -5166,16 +5217,19 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,
//skill_status_change_start(src,SC_ANKLE,skilllv,0,0,0,limit,0);
//sd->canmove_tick = gettick() + limit; // added later [celest]
break;
case PA_GOSPEL: /* ゴスペル */
count=49;
target=BCT_PARTY;
limit=skill_get_time(skillid,skilllv);
break;
case CG_MOONLIT:
range=1;
target=BCT_ALL;
limit=skill_get_time(skillid,skilllv);
break;
case PF_FOGWALL: /* フォグウォ?ル */
count=15;
limit=skill_get_time(skillid,skilllv);
@ -5183,11 +5237,21 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,
if (sc_data[SC_DELUGE].timer!=-1) limit *= 2;
}
break;
case RG_GRAFFITI: /* Graffiti */
count=1; // Leave this at 1 [Valaris]
limit=600000; // Time length [Valaris]
break;
};
case GD_LEADERSHIP:
case GD_GLORYWOUNDS:
case GD_SOULCOLD:
case GD_HAWKEYES:
range=2;
target=BCT_NOENEMY;
limit=600000;
break;
}
nullpo_retr(NULL, group=skill_initunitgroup(src,count,skillid,skilllv,skill_get_unit_id(skillid,flag&1)));
group->limit=limit;
@ -5427,8 +5491,25 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,
// [celest]
if (sc_data) {
if (sc_data[SC_BASILICA].timer!=-1) // attach Basilica's id to the caster
sc_data[SC_BASILICA].val4 = (int)unit;
// attach the unit's id to the caster
switch (skillid) {
case HP_BASILICA:
if (sc_data[SC_BASILICA].timer!=-1)
sc_data[SC_BASILICA].val4 = (int)unit;
break;
case GD_LEADERSHIP:
sc_data[SC_LEADERSHIP].val4 = (int)unit;
break;
case GD_GLORYWOUNDS:
sc_data[SC_GLORYWOUNDS].val4 = (int)unit;
break;
case GD_SOULCOLD:
sc_data[SC_SOULCOLD].val4 = (int)unit;
break;
case GD_HAWKEYES:
sc_data[SC_HAWKEYES].val4 = (int)unit;
break;
}
}
}
}
@ -5781,6 +5862,44 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int
}
break;
// New guild skills [Celest]
case 0xc1: // GD_LEADERSHIP
{
struct map_session_data *sd;
if (srcsd && bl->type == BL_PC && (sd=(struct map_session_data *)bl) &&
sd->status.guild_id == srcsd->status.guild_id &&
sd->sc_data[SC_LEADERSHIP].timer == -1 && !sd->sc_data[SC_LEADERSHIP].val4)
skill_status_change_start(bl,SC_LEADERSHIP,1,0,0,0,0,0 );
}
break;
case 0xc2: // GD_GLORYWOUNDS
{
struct map_session_data *sd;
if (srcsd && bl->type == BL_PC && (sd=(struct map_session_data *)bl) &&
sd->status.guild_id == srcsd->status.guild_id &&
sd->sc_data[SC_GLORYWOUNDS].timer == -1 && !sd->sc_data[SC_GLORYWOUNDS].val4)
skill_status_change_start(bl,SC_GLORYWOUNDS,1,0,0,0,0,0 );
}
break;
case 0xc3: // GD_SOULCOLD
{
struct map_session_data *sd;
if (srcsd && bl->type == BL_PC && (sd=(struct map_session_data *)bl) &&
sd->status.guild_id == srcsd->status.guild_id &&
sd->sc_data[SC_SOULCOLD].timer == -1 && !sd->sc_data[SC_SOULCOLD].val4)
skill_status_change_start(bl,SC_SOULCOLD,1,0,0,0,0,0 );
}
break;
case 0xc4: // GD_HAWKEYES
{
struct map_session_data *sd;
if (srcsd && bl->type == BL_PC && (sd=(struct map_session_data *)bl) &&
sd->status.guild_id == srcsd->status.guild_id &&
sd->sc_data[SC_HAWKEYES].timer == -1 && !sd->sc_data[SC_HAWKEYES].val4)
skill_status_change_start(bl,SC_HAWKEYES,1,0,0,0,0,0 );
}
break;
/* default:
if(battle_config.error_log)
printf("skill_unit_onplace: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id);
@ -5916,6 +6035,35 @@ int skill_unit_onout(struct skill_unit *src,struct block_list *bl,unsigned int t
sg->limit=DIFF_TICK(tick,sg->tick)+1000;
}
break;
// New guild skills [Celest]
case 0xc1: // GD_LEADERSHIP
{
struct status_change *sc_data=battle_get_sc_data(bl);
if (sc_data && sc_data[SC_LEADERSHIP].timer != -1)
skill_status_change_end(bl,SC_LEADERSHIP,-1);
}
break;
case 0xc2: // GD_GLORYWOUNDS
{
struct status_change *sc_data=battle_get_sc_data(bl);
if (sc_data && sc_data[SC_GLORYWOUNDS].timer != -1)
skill_status_change_end(bl,SC_GLORYWOUNDS,-1);
}
break;
case 0xc3: // GD_SOULCOLD
{
struct status_change *sc_data=battle_get_sc_data(bl);
if (sc_data && sc_data[SC_SOULCOLD].timer != -1)
skill_status_change_end(bl,SC_SOULCOLD,-1);
}
break;
case 0xc4: // GD_HAWKEYES
{
struct status_change *sc_data=battle_get_sc_data(bl);
if (sc_data && sc_data[SC_HAWKEYES].timer != -1)
skill_status_change_end(bl,SC_HAWKEYES,-1);
}
break;
/* default:
if(battle_config.error_log)
@ -5969,6 +6117,10 @@ int skill_unit_ondelete(struct skill_unit *src,struct block_list *bl,unsigned in
case 0xae: /* 幸運のキス */
case 0xaf: /* サ?ビスフォ?ユ? */
case 0xb4:
case 0xc1:
case 0xc2:
case 0xc3:
case 0xc4:
return skill_unit_onout(src,bl,tick);
/* default:
@ -6024,6 +6176,38 @@ int skill_unit_onlimit(struct skill_unit *src,unsigned int tick)
pc_setpos(p_sd,map[src->bl.m].name,src->bl.x,src->bl.y,3);
}
break;
case 0xc1: // GD_LEADERSHIP
{
struct map_session_data *sd;
if ((sd = (struct map_session_data *)(map_id2bl(sg->src_id)))!= NULL) {
sd->sc_data[SC_LEADERSHIP].val4 = 0;
}
}
break;
case 0xc2: // GD_GLORYWOUNDS
{
struct map_session_data *sd;
if ((sd = (struct map_session_data *)(map_id2bl(sg->src_id)))!= NULL) {
sd->sc_data[SC_GLORYWOUNDS].val4 = 0;
}
}
break;
case 0xc3: // GD_SOULCOLD
{
struct map_session_data *sd;
if ((sd = (struct map_session_data *)(map_id2bl(sg->src_id)))!= NULL) {
sd->sc_data[SC_SOULCOLD].val4 = 0;
}
}
break;
case 0xc4: // GD_HAWKEYES
{
struct map_session_data *sd;
if ((sd = (struct map_session_data *)(map_id2bl(sg->src_id)))!= NULL) {
sd->sc_data[SC_HAWKEYES].val4 = 0;
}
}
break;
}
return 0;
}
@ -6962,11 +7146,21 @@ int skill_use_id( struct map_session_data *sd, int target_id,
sd->skillid_old = skill_num;
}
break;
case GD_BATTLEORDER:
case GD_REGENERATION:
case GD_RESTORE:
case GD_EMERGENCYCALL:
if (skill_lv <= 0) skill_lv = 1;
{
struct guild *g;
if (!sd->status.guild_id)
return 0;
if (!(g = guild_search(sd->status.guild_id)))
return 0;
if (strcmp(sd->status.name,g->master))
return 0;
if (skill_lv <= 0) skill_lv = 1;
}
break;
}
@ -8652,8 +8846,20 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data)
return 0;
}
break;
case SC_LEADERSHIP:
case SC_GLORYWOUNDS:
case SC_SOULCOLD:
case SC_HAWKEYES:
if (sd) {
sc_data[type].timer = add_timer(
1000+tick, skill_status_change_timer,
bl->id, data);
}
break;
}
return skill_status_change_end( bl,type,tid );
}
@ -9283,18 +9489,22 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
case SC_KEEPING:
case SC_BARRIER:
calc_flag = 1;
case SC_HALLUCINATION:
break;
case SC_CONCENTRATION: /* コンセントレ?ション */
*opt3 |= 1;
calc_flag = 1;
break;
case SC_TENSIONRELAX: /* テンションリラックス */
calc_flag = 1;
if(bl->type == BL_PC) {
tick = 10000;
}
break;
case SC_AURABLADE: /* オ?ラブレ?ド */
case SC_PARRYING: /* パリイング */
// case SC_ASSUMPTIO: /* */
@ -9334,6 +9544,7 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
calc_flag = 1;
val2 = (val1 / 2); //Flee上昇率
break;
case SC_BERSERK: /* バ?サ?ク */
if(sd){
sd->status.hp = sd->status.max_hp * 3;
@ -9346,16 +9557,20 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
tick = 10000;
calc_flag = 1;
break;
case SC_ASSUMPTIO: /* アスムプティオ */
*opt3 |= 2048;
break;
case SC_BASILICA: // [celest]
break;
case SC_MARIONETTE: /* マリオネットコントロ?ル */
case SC_MARIONETTE2:
calc_flag = 1;
*opt3 |= 1024;
break;
case SC_MELTDOWN: /* メルトダウン */
case SC_CARTBOOST: /* カ?トブ?スト */
case SC_TRUESIGHT: /* トゥル?サイト */
@ -9363,12 +9578,15 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
case SC_MAGICPOWER: /* 魔法力?幅 */
calc_flag = 1;
break;
case SC_REJECTSWORD: /* リジェクトソ?ド */
val2 = 3; //3回攻?を跳ね返す
break;
case SC_MEMORIZE: /* メモライズ */
val2 = 3; //3回詠唱を1/3にする
break;
case SC_GRAFFITI: /* グラフィティ */
{
struct skill_unit_group *sg = skill_unitsetting(bl,RG_GRAFFITI,val1,val2,val3,0);
@ -9376,25 +9594,40 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
val4 = (int)sg;
}
break;
case SC_SPLASHER: /* ベナムスプラッシャ? */
break;
case SC_FOGWALL:
val2 = 75;
// calc_flag = 1; // not sure of effects yet [celest]
break;
case SC_BLOCKSKILL:
if (!tick) tick = 60000;
if (!val3) val3 = -1;
break;
case SC_SLOWDOWN:
calc_flag = 1;
break;
case SC_LEADERSHIP:
case SC_GLORYWOUNDS:
case SC_SOULCOLD:
case SC_HAWKEYES:
case SC_BATTLEORDERS:
tick = 1000;
calc_flag = 1;
//val4 = 1;
break;
case SC_REGENERATION:
val1 = 2;
case SC_BATTLEORDERS:
tick = 60000; // 1 minute
calc_flag = 1;
break;
default:
if(battle_config.error_log)
printf("UnknownStatusChange [%d]\n", type);
@ -10080,12 +10313,6 @@ int skill_unit_timer_sub( struct block_list *bl, va_list ap )
if(unit->alive &&
(DIFF_TICK(tick,group->tick)>=group->limit || DIFF_TICK(tick,group->tick)>=unit->limit) ){
switch(group->unit_id){
case 0x8f: /* ブラストマイン */
group->unit_id = 0x8c;
clif_changelook(bl,LOOK_BASE,group->unit_id);

View File

@ -102,6 +102,7 @@ int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int
int skill_additional_effect( struct block_list* src, struct block_list *bl,int skillid,int skilllv,int attack_type,unsigned int tick);
// ユニットスキル
struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag);
struct skill_unit *skill_initunit(struct skill_unit_group *group,int idx,int x,int y);
int skill_delunit(struct skill_unit *unit);
struct skill_unit_group *skill_initunitgroup(struct block_list *src,