From 94270f243e9c0bcec112b2abb7cd7799f5f01ea4 Mon Sep 17 00:00:00 2001 From: celest Date: Mon, 28 Feb 2005 05:08:52 +0000 Subject: * Updated Endure, Tiger Fist, Chain Crush, and Palm Push Strike * Some rewrites on the passive guild skills effects git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/branches/stable@1192 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/battle.c | 12 ++-- src/map/map.h | 7 +-- src/map/pc.c | 79 ++++++++---------------- src/map/skill.c | 185 ++++++++++++------------------------------------------- src/map/skill.h | 3 + src/map/status.c | 95 ++++++++++++++-------------- src/map/status.h | 3 +- 7 files changed, 124 insertions(+), 260 deletions(-) (limited to 'src') diff --git a/src/map/battle.c b/src/map/battle.c index f58151f3d..cc82c6ddc 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -2235,16 +2235,16 @@ static struct Damage battle_calc_pc_weapon_attack( sd->state.arrow_atk = 1; break; case CH_TIGERFIST: // 伏虎拳 - damage = damage*(100+ 20*skill_lv)/100; - damage2 = damage2*(100+ 20*skill_lv)/100; + damage = damage*(40+ 100*skill_lv)/100; + damage2 = damage*(40+ 100*skill_lv)/100; break; case CH_CHAINCRUSH: // 連柱崩撃 - damage = damage*(100+ 60*skill_lv)/100; - damage2 = damage2*(100+ 60*skill_lv)/100; + damage = damage*(400+ 100*skill_lv)/100; + damage2 = damage*(400+ 100*skill_lv)/100; break; case CH_PALMSTRIKE: // 猛虎硬派山 - damage = damage*(50+ 100*skill_lv)/100; - damage2 = damage2*(50+ 100*skill_lv)/100; + damage = damage*(200+ 100*skill_lv)/100; + damage2 = damage*(200+ 100*skill_lv)/100; break; case LK_SPIRALPIERCE: /* スパイラルピアース */ damage = damage*(100+ 50*skill_lv)/100; //増加量が分からないので適当に diff --git a/src/map/map.h b/src/map/map.h index fb11bc784..dc95fa02b 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -139,10 +139,7 @@ struct map_session_data { unsigned potionpitcher_flag : 1; unsigned storage_flag : 1; unsigned snovice_flag : 4; - int leadership_flag; - int glorywounds_flag; - int soulcold_flag; - int hawkeyes_flag; + int gmaster_flag; // originally by Qamera, adapted by celest unsigned event_death : 1; unsigned event_kill : 1; @@ -653,6 +650,8 @@ enum { #define CELL_MASK 0x0f #define CELL_NPC 0x80 // NPCセル #define CELL_BASILICA 0x40 // BASILICAセル +#define CELL_MOONLIT 0x100 +#define CELL_REGEN 0x200 /* * map_getcell()で使用されるフラグ */ diff --git a/src/map/pc.c b/src/map/pc.c index 484a25b18..2b04699d2 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -3227,24 +3227,6 @@ static int pc_walk(int tid,unsigned int tick,int id,int data) if(moveblock) map_addblock(&sd->bl); skill_unit_move(&sd->bl,tick,1); - #if 0 - 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); - } - } - #endif - 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; @@ -3349,25 +3331,12 @@ int pc_walktoxy(struct map_session_data *sd,int x,int y) pc_walktoxy_sub(sd); } - if (sd->sc_data && sd->status.guild_id > 0) { - struct skill_unit *su; - struct skill_unit_group *sg; - if (sd->state.leadership_flag && (su=(struct skill_unit *)sd->state.leadership_flag) && - (sg=su->group) && sg->src_id == sd->bl.id) { - skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y)); - } - if (sd->state.glorywounds_flag && (su=(struct skill_unit *)sd->state.glorywounds_flag) && - (sg=su->group) && sg->src_id == sd->bl.id) { - skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y)); - } - if (sd->state.soulcold_flag && (su=(struct skill_unit *)sd->state.soulcold_flag) && - (sg=su->group) && sg->src_id == sd->bl.id) { - skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y)); - } - if (sd->state.hawkeyes_flag && (su=(struct skill_unit *)sd->state.hawkeyes_flag) && - (sg=su->group) && sg->src_id == sd->bl.id) { - skill_unit_move_unit_group(sg,sd->bl.m,(x - sd->bl.x),(y - sd->bl.y)); - } + if (sd->state.gmaster_flag > 0) { + struct guild *g = (struct guild *)sd->state.gmaster_flag; + if (g) + map_foreachinarea (skill_guildaura_sub, sd->bl.m, + sd->bl.x-2, sd->bl.y-2, sd->bl.x+2, sd->bl.y+2, BL_PC, + sd->bl.id, sd->status.guild_id, g); } return 0; @@ -4573,12 +4542,14 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage) // ? いていたら足を止める if (sd->sc_data) { - if (sd->sc_data[SC_ENDURE].timer == -1 && sd->sc_data[SC_BERSERK].timer == -1 && !sd->special_state.infinite_endure) - pc_stop_walking(sd,3); - else if(sd->sc_data[SC_ENDURE].timer != -1 && (src != NULL && src->type==BL_MOB) && (--sd->sc_data[SC_ENDURE].val2) <= 0) - status_change_end(&sd->bl, SC_ENDURE, -1); - } else - pc_stop_walking(sd,3); + if (sd->sc_data[SC_BERSERK].timer != -1 || + sd->special_state.infinite_endure) + ; // do nothing + else if (sd->sc_data[SC_ENDURE].timer != -1 && (src != NULL && src->type == BL_MOB) && !map[sd->bl.m].flag.gvg) { + if ((--sd->sc_data[SC_ENDURE].val2) < 0) + status_change_end(&sd->bl, SC_ENDURE, -1); + } else pc_stop_walking(sd,3); + } // 演奏/ダンスの中? if(damage > sd->status.max_hp>>2) @@ -4643,17 +4614,19 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage) status_calc_pc(sd,0); if (src && src->type == BL_PC) { - if (sd->state.event_death) - pc_setglobalreg(sd,"killerrid",((struct map_session_data *)src)->status.account_id); - - if (((struct map_session_data *)src)->state.event_kill) { - struct npc_data *npc; - if ((npc = npc_name2id(script_config.kill_event_name))) { - run_script(npc->u.scr.script,0,sd->bl.id,npc->bl.id); // PCKillNPC - sprintf (tmp_output, "Event '"CL_WHITE"%s"CL_RESET"' executed.\n", script_config.kill_event_name); - ShowStatus(tmp_output); + struct map_session_data *ssd = (struct map_session_data *)src; + if (ssd) { + if (sd->state.event_death) + pc_setglobalreg(sd,"killerrid",(ssd->status.account_id)); + if (ssd->state.event_kill) { + struct npc_data *npc; + if ((npc = npc_name2id(script_config.kill_event_name))) { + run_script(npc->u.scr.script,0,sd->bl.id,npc->bl.id); // PCKillNPC + sprintf (tmp_output, "Event '"CL_WHITE"%s"CL_RESET"' executed.\n", script_config.kill_event_name); + ShowStatus(tmp_output); + } } - } + } } if (sd->state.event_death) { diff --git a/src/map/skill.c b/src/map/skill.c index ee05cc2c4..85bb081a7 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1,4 +1,4 @@ -// $Id: skill.c,v 1.8 2004/02/24 10:28:24 PM Celestia $ +// $Id: skill.c,v 1.8 2004/02/27 5:34:51 PM Celestia $ /* スキル?係 */ #include @@ -672,10 +672,6 @@ struct skill_unit_layout *skill_get_unit_layout(int skillid,int skilllv,struct b return &skill_unit_layout[0]; } -// case GD_LEADERSHIP: return 0xc1; -// case GD_GLORYWOUNDS: return 0xc2; -// case GD_SOULCOLD: return 0xc3; -// case GD_HAWKEYES: return 0xc4; // 0x89,0x8a,0x8b 表示無し // 0x9a 炎?性の詠唱みたいなエフェクト // 0x9b 水?性の詠唱みたいなエフェクト @@ -1713,6 +1709,42 @@ int skill_check_unit_range2(int m,int x,int y,int skillid, int skilllv) return c; } +int skill_guildaura_sub (struct block_list *bl,va_list ap) +{ + struct map_session_data *sd; + struct guild *g; + int gid, id; + int flag = 0; + + nullpo_retr(0, sd=(struct map_session_data *)bl); + + nullpo_retr(0, ap); + id = va_arg(ap,int); + gid = va_arg(ap,int); + if (sd->status.guild_id != gid) + return 0; + + g = va_arg(ap,struct guild *); + if (guild_checkskill(g, GD_LEADERSHIP)>0) flag |= 1<<0; + if (guild_checkskill(g, GD_GLORYWOUNDS)>0) flag |= 1<<1; + if (guild_checkskill(g, GD_SOULCOLD)>0) flag |= 1<<2; + if (guild_checkskill(g, GD_HAWKEYES)>0) flag |= 1<<3; + if (guild_checkskill(g, GD_CHARISMA)>0) flag |= 1<<4; + + if (flag > 0) { + if (sd->sc_count && sd->sc_data[SC_GUILDAURA].timer != -1) { + if (sd->sc_data[SC_GUILDAURA].val4 != flag) { + sd->sc_data[SC_GUILDAURA].val4 = flag; + status_calc_pc (sd, 0); + } + return 0; + } + status_change_start(&sd->bl, SC_GUILDAURA,1,id,0,flag,0,0 ); + } + + return 0; +} + /*========================================================================= * 範?スキル使用?理小分けここから */ @@ -5142,15 +5174,6 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, case RG_GRAFFITI: /* Graffiti */ count=1; // Leave this at 1 [Valaris] break; - - case GD_LEADERSHIP: - case GD_GLORYWOUNDS: - case GD_SOULCOLD: - case GD_HAWKEYES: - range=2; - target=BCT_ALL; - limit=300000; - break; } nullpo_retr(NULL, group=skill_initunitgroup(src,(count > 0 ? count : layout->count), @@ -5211,28 +5234,6 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, unit->limit=limit; unit->range=range; - // [celest] - if (sc_data && src->type == BL_PC) { - struct map_session_data *sd = (struct map_session_data *)src; - if (sd) { - // attach the unit's id to the caster - switch (skillid) { - case GD_LEADERSHIP: - sd->state.leadership_flag = (int)group; - break; - case GD_GLORYWOUNDS: - sd->state.glorywounds_flag = (int)group; - break; - case GD_SOULCOLD: - sd->state.soulcold_flag = (int)unit; - break; - case GD_HAWKEYES: - sd->state.hawkeyes_flag = (int)unit; - break; - } - } - } - if (range==0 && active_flag) map_foreachinarea(skill_unit_effect,unit->bl.m ,unit->bl.x,unit->bl.y,unit->bl.x,unit->bl.y @@ -5378,56 +5379,6 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick); break; - // New guild skills [Celest] - case 0xc1: // GD_LEADERSHIP - { - struct map_session_data *sd, *tsd; - tsd=(struct map_session_data *)ss; - if (tsd && (sd=(struct map_session_data *)bl) && - sd->status.guild_id == tsd->status.guild_id && - sd != tsd) { - sd->state.leadership_flag = (int)src; - status_calc_pc (sd, 0); - } - } - break; - case 0xc2: // GD_GLORYWOUNDS - { - struct map_session_data *sd, *tsd; - tsd=(struct map_session_data *)ss; - if (tsd && (sd=(struct map_session_data *)bl) && - sd->status.guild_id == tsd->status.guild_id && - sd != tsd) { - sd->state.glorywounds_flag = (int)src; - status_calc_pc (sd, 0); - } - } - break; - case 0xc3: // GD_SOULCOLD - { - struct map_session_data *sd, *tsd; - tsd=(struct map_session_data *)ss; - if (tsd && (sd=(struct map_session_data *)bl) && - sd->status.guild_id == tsd->status.guild_id && - sd != tsd) { - sd->state.soulcold_flag = (int)src; - status_calc_pc (sd, 0); - } - } - break; - case 0xc4: // GD_HAWKEYES - { - struct map_session_data *sd, *tsd; - tsd=(struct map_session_data *)ss; - if (tsd && (sd=(struct map_session_data *)bl) && - sd->status.guild_id == tsd->status.guild_id && - sd != tsd) { - sd->state.hawkeyes_flag = (int)src; - status_calc_pc (sd, 0); - } - } - break; - case 0xb2: /* あなたを_?いたいです */ case 0xb3: /* ゴスペル */ //case 0xb6: /* フォグウォ?ル */ - moved [celest] @@ -5783,35 +5734,7 @@ 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 map_session_data *sd; - if (bl->type == BL_PC && (sd=(struct map_session_data *)bl) && sd->state.leadership_flag > 0) - sd->state.leadership_flag = 0; - } - break; - case 0xc2: // GD_GLORYWOUNDS - { - struct map_session_data *sd; - if (bl->type == BL_PC && (sd=(struct map_session_data *)bl) && sd->state.glorywounds_flag > 0) - sd->state.glorywounds_flag = 0; - } - break; - case 0xc3: // GD_SOULCOLD - { - struct map_session_data *sd; - if (bl->type == BL_PC && (sd=(struct map_session_data *)bl) && sd->state.soulcold_flag > 0) - sd->state.soulcold_flag = 0; - } - break; - case 0xc4: // GD_HAWKEYES - { - struct map_session_data *sd; - if (bl->type == BL_PC && (sd=(struct map_session_data *)bl) && sd->state.hawkeyes_flag > 0) - sd->state.hawkeyes_flag = 0; - } - break; + /* default: if(battle_config.error_log) printf("skill_unit_onout: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id); @@ -5904,38 +5827,6 @@ 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->state.leadership_flag = 0; - } - } - break; - case 0xc2: // GD_GLORYWOUNDS - { - struct map_session_data *sd; - if ((sd = (struct map_session_data *)(map_id2bl(sg->src_id)))!= NULL) { - sd->state.glorywounds_flag = 0; - } - } - break; - case 0xc3: // GD_SOULCOLD - { - struct map_session_data *sd; - if ((sd = (struct map_session_data *)(map_id2bl(sg->src_id)))!= NULL) { - sd->state.soulcold_flag = 0; - } - } - break; - case 0xc4: // GD_HAWKEYES - { - struct map_session_data *sd; - if ((sd = (struct map_session_data *)(map_id2bl(sg->src_id)))!= NULL) { - sd->state.hawkeyes_flag = 0; - } - } - break; } return 0; } diff --git a/src/map/skill.h b/src/map/skill.h index c4b2f69cd..a14aa95fd 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -153,6 +153,9 @@ int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int struct skill_unit_group *skill_check_dancing( struct block_list *src ); void skill_stop_dancing(struct block_list *src, int flag); +// Guild skills [celest] +int skill_guildaura_sub (struct block_list *bl,va_list ap); + // 詠唱キャンセル int skill_castcancel(struct block_list *bl,int type); diff --git a/src/map/status.c b/src/map/status.c index 34e3127e0..50fa778e1 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -530,6 +530,12 @@ int status_calc_pc(struct map_session_data* sd,int first) pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3); } + if (sd->status.guild_id > 0) { + struct guild *g = guild_search(sd->status.guild_id); + if (g && strcmp(sd->status.name,g->master)==0) + sd->state.gmaster_flag = (int)g; + } + for(i=0;i<10;i++) { index = sd->equip_index[i]; if(index < 0) @@ -708,40 +714,6 @@ int status_calc_pc(struct map_session_data* sd,int first) sd->paramb[3] += (skill+1)*0.5; } - // New guild skills - Celest - if (sd->status.guild_id > 0 && !(first&4)) { - struct guild *g; - if ((g = guild_search(sd->status.guild_id)) && strcmp(sd->status.name,g->master)==0) { - if (!sd->state.leadership_flag && guild_checkskill(g, GD_LEADERSHIP)>0) { - skill_unitsetting(&sd->bl,GD_LEADERSHIP,1,sd->bl.x,sd->bl.y,0); - } - if (!sd->state.glorywounds_flag && guild_checkskill(g, GD_GLORYWOUNDS)>0) { - skill_unitsetting(&sd->bl,GD_GLORYWOUNDS,1,sd->bl.x,sd->bl.y,0); - } - if (!sd->state.soulcold_flag && guild_checkskill(g, GD_SOULCOLD)>0) { - skill_unitsetting(&sd->bl,GD_SOULCOLD,1,sd->bl.x,sd->bl.y,0); - } - if (!sd->state.hawkeyes_flag && guild_checkskill(g, GD_HAWKEYES)>0) { - skill_unitsetting(&sd->bl,GD_HAWKEYES,1,sd->bl.x,sd->bl.y,0); - } - } - else if (g) { - if (sd->sc_count && sd->sc_data[SC_BATTLEORDERS].timer != -1) { - sd->paramb[0]+= 5; - sd->paramb[3]+= 5; - sd->paramb[4]+= 5; - } - if (sd->state.leadership_flag) - sd->paramb[0] += 2; - if (sd->state.glorywounds_flag) - sd->paramb[2] += 2; - if (sd->state.soulcold_flag) - sd->paramb[1] += 2; - if (sd->state.hawkeyes_flag) - sd->paramb[4] += 2; - } - } - // ステ?タス?化による基本パラメ?タ補正 if(sd->sc_count){ if(sd->sc_data[SC_CONCENTRATE].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1){ // 集中力向上 @@ -827,6 +799,22 @@ int status_calc_pc(struct map_session_data* sd,int first) sd->paramb[5]+= 2; } } + // New guild skills - Celest + if (sd->sc_data[SC_BATTLEORDERS].timer != -1) { + sd->paramb[0]+= 5; + sd->paramb[3]+= 5; + sd->paramb[4]+= 5; + } + if (sd->sc_data[SC_GUILDAURA].timer != -1) { + if (sd->sc_data[SC_GUILDAURA].val4 & 1<<0) + sd->paramb[0] += 2; + if (sd->sc_data[SC_GUILDAURA].val4 & 1<<1) + sd->paramb[2] += 2; + if (sd->sc_data[SC_GUILDAURA].val4 & 1<<2) + sd->paramb[1] += 2; + if (sd->sc_data[SC_GUILDAURA].val4 & 1<<3) + sd->paramb[4] += 2; + } } //1度も死んでないJob70スパノビに+10 @@ -1355,6 +1343,13 @@ int status_calc_pc(struct map_session_data* sd,int first) } } } + // custom stats, since there's no info on how much it actually gives ^^; [Celest] + if (sd->sc_data[SC_GUILDAURA].timer != -1) { + if (sd->sc_data[SC_GUILDAURA].val4 & 1<<4) { + sd->hit += 10; + sd->flee += 10; + } + } } if (sd->speed_rate <= 0) @@ -3789,6 +3784,11 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val calc_flag = 1; break; + case SC_GUILDAURA: + calc_flag = 1; + tick = 1000; + break; + default: if(battle_config.error_log) printf("UnknownStatusChange [%d]\n", type); @@ -4019,12 +4019,9 @@ int status_change_end( struct block_list* bl , int type,int tid ) case SC_EDP: case SC_SLOWDOWN: case SC_SPEEDUP0: -/* case SC_LEADERSHIP: - case SC_GLORYWOUNDS: - case SC_SOULCOLD: - case SC_HAWKEYES:*/ case SC_BATTLEORDERS: case SC_REGENERATION: + case SC_GUILDAURA: calc_flag = 1; break; case SC_AUTOBERSERK: @@ -4666,17 +4663,6 @@ int status_change_timer(int tid, unsigned int tick, int id, int data) } break; -/* case SC_LEADERSHIP: - case SC_GLORYWOUNDS: - case SC_SOULCOLD: - case SC_HAWKEYES: - if (sd) { - sc_data[type].timer = add_timer( - 1000+tick, status_change_timer, - bl->id, data); - } - break;*/ - // Celest case SC_CONFUSION: { @@ -4852,6 +4838,17 @@ int status_change_timer(int tid, unsigned int tick, int id, int data) status_calc_pc (sd, 0); } break; + + case SC_GUILDAURA: + { + struct block_list *tbl = map_id2bl(sc_data[type].val2); + if (tbl && battle_check_range(bl, tbl, 2)) + sc_data[type].timer = add_timer( + 1000 + tick, status_change_timer, + bl->id, data); + return 0; + } + break; } return status_change_end( bl,type,tid ); diff --git a/src/map/status.h b/src/map/status.h index fbeee7300..c07840993 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -174,7 +174,8 @@ enum { // struct map_session_data SC_LANDPROTECTOR =193, SC_ADAPTATION =194, SC_CHASEWALK =195, - SC_REGENERATION =196, + SC_REGENERATION =196, + SC_GUILDAURA =199 }; extern int SkillStatusChangeTable[]; -- cgit v1.2.3-70-g09d2