diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/map/map.h | 2 | ||||
-rw-r--r-- | src/map/pc.c | 55 | ||||
-rw-r--r-- | src/map/skill.c | 234 | ||||
-rw-r--r-- | src/map/skill.h | 34 |
4 files changed, 244 insertions, 81 deletions
diff --git a/src/map/map.h b/src/map/map.h index f54579ea2..48f1eb750 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -17,7 +17,7 @@ #define DAMAGELOG_SIZE 30 #define LOOTITEM_SIZE 10 #define MAX_SKILL_LEVEL 100 -#define MAX_STATUSCHANGE 200 +#define MAX_STATUSCHANGE 210 #define MAX_SKILLUNITGROUP 32 #define MAX_MOBSKILLUNITGROUP 8 #define MAX_SKILLUNITGROUPTICKSET 128 diff --git a/src/map/pc.c b/src/map/pc.c index b2fb1e120..b755d1790 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -1,4 +1,4 @@ -// $Id: pc.c 101 2004-09-25 17:57:22Z Valaris $ +// $Id: pc.c 101 2004-11-23 14:33:00Z Celestia $ #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -1434,10 +1434,40 @@ int pc_calcstatus(struct map_session_data* sd,int first) sd->paramb[4] += skill; if((skill=pc_checkskill(sd,BS_HILTBINDING))>0) { // Hilt binding gives +1 str +4 atk - sd->paramb[4] ++; + sd->paramb[0] ++; sd->base_atk += 4; } + // 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_count) { + if (sd->sc_data[SC_LEADERSHIP].timer != -1) + sd->paramb[0] += 2; + if (sd->sc_data[SC_GLORYWOUNDS].timer != -1) + sd->paramb[2] += 2; + if (sd->sc_data[SC_SOULCOLD].timer != -1) + sd->paramb[1] += 2; + if (sd->sc_data[SC_HAWKEYES].timer != -1) + sd->paramb[4] += 2; + if (sd->sc_data[SC_BATTLEORDERS].timer != -1) { + sd->paramb[0]+= 5; + sd->paramb[3]+= 5; + sd->paramb[4]+= 5; + } + } + } + // ステ?タス?化による基本パラメ?タ補正 if(sd->sc_count){ if(sd->sc_data[SC_CONCENTRATE].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1){ // 集中力向上 @@ -6301,7 +6331,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int pos) // 二刀流?理 if ((pos==0x22) // 一?、?備要求箇所が二刀流武器かチェックする && (id->equip==2) // ? 手武器 - && (pc_checkskill(sd, AS_LEFT) > 0 || sd->status.class == 12) ) // 左手修?有 + && (pc_checkskill(sd, AS_LEFT) > 0 || pc_calc_base_job2(sd->status.class) == 12) ) // 左手修?有 { int tpos=0; if(sd->equip_index[8] >= 0) @@ -6745,9 +6775,13 @@ static int pc_spheal(struct map_session_data *sd) a = natural_heal_diff_tick; if(pc_issit(sd)) a += a; - if (sd->sc_data[SC_MAGNIFICAT].timer!=-1) // マグニフィカ?ト - a += a; - if((skill = pc_checkskill(sd,HP_MEDITATIO)) > 0) //Increase natural SP regen with Meditatio [DracoRPG] + if (sd->sc_count) { + if (sd->sc_data[SC_MAGNIFICAT].timer!=-1) // マグニフィカ?ト + a += a; + if (sd->sc_data[SC_REGENERATION].timer != -1) + a *= sd->sc_data[SC_REGENERATION].val1; + } + if((skill = pc_checkskill(sd,HP_MEDITATIO)) > 0) //Increase natural SP regen with Meditatio [DracoRPG] a += a*skill*3/100; gc=guild_mapname2gc(sd->mapname); // Increased guild castle regen [Valaris] @@ -6774,9 +6808,12 @@ static int pc_hpheal(struct map_session_data *sd) a = natural_heal_diff_tick; if(pc_issit(sd)) a += a; - if( sd->sc_data[SC_MAGNIFICAT].timer!=-1 ) // Modified by RoVeRT - a += a; - + if (sd->sc_count) { + if( sd->sc_data[SC_MAGNIFICAT].timer!=-1 ) // Modified by RoVeRT + a += a; + if (sd->sc_data[SC_REGENERATION].timer != -1) + a *= sd->sc_data[SC_REGENERATION].val1; + } gc=guild_mapname2gc(sd->mapname); // Increased guild castle regen [Valaris] if(gc) { struct guild *g; diff --git a/src/map/skill.c b/src/map/skill.c index b77706b00..7dea5f682 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -740,29 +740,94 @@ struct skill_arrow_db skill_arrow_db[MAX_SKILL_ARROW_DB]; /* アブラカダブラ?動スキルデ?タベ?ス */ struct skill_abra_db skill_abra_db[MAX_SKILL_ABRA_DB]; -int skill_get_hit( int id ){ return (id < MAX_SKILL_DB) ? skill_db[id].hit : 0; } -int skill_get_inf( int id ){ return (id < MAX_SKILL_DB) ? skill_db[id].inf : guild_skill_get_inf(id); } -int skill_get_pl( int id ){ return (id < MAX_SKILL_DB) ? skill_db[id].pl : 0; } -int skill_get_nk( int id ){ return (id < MAX_SKILL_DB) ? skill_db[id].nk : 2; } -int skill_get_max( int id ){ return (id < MAX_SKILL_DB) ? skill_db[id].max : guild_skill_get_max(id); } -int skill_get_range( int id , int lv ){ return (lv <= 0) ? 0: ((id < MAX_SKILL_DB) ? skill_db[id].range[lv-1] : guild_skill_get_max(id)); } -int skill_get_hp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].hp[lv-1]; } -int skill_get_sp( int id ,int lv ){ return (lv <= 0) ? 0: ((id < MAX_SKILL_DB) ? skill_db[id].sp[lv-1] : guild_skill_get_sp(id, lv)); } -int skill_get_zeny( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].zeny[lv-1]; } -int skill_get_num( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].num[lv-1]; } -int skill_get_cast( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].cast[lv-1]; } -int skill_get_delay( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].delay[lv-1]; } -int skill_get_time( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].upkeep_time[lv-1]; } -int skill_get_time2( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].upkeep_time2[lv-1]; } -int skill_get_castdef( int id ){ return skill_db[id].cast_def_rate; } -int skill_get_weapontype( int id ){ return skill_db[id].weapon; } -int skill_get_inf2( int id ){ return (id < MAX_SKILL_DB) ? skill_db[id].inf2 : 0; } -int skill_get_castcancel( int id ){ return (id < MAX_SKILL_DB) ? skill_db[id].maxcount : 0; } -int skill_get_maxcount( int id ){ return skill_db[id].maxcount; } -int skill_get_blewcount( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].blewcount[lv-1]; } -int skill_get_mhp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].mhp[lv-1]; } -int skill_get_castnodex( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].castnodex[lv-1]; } - +int skill_get_hit( int id ){ + if (id >= 10000 && id < 10015) id -= 9500; + return skill_db[id].hit; +} +int skill_get_inf( int id ){ + return (id < 500) ? skill_db[id].inf : guild_skill_get_inf(id); +} +int skill_get_pl( int id ){ + if (id >= 10000 && id < 10015) id-= 9500; + return skill_db[id].pl; +} +int skill_get_nk( int id ){ + if (id >= 10000 && id < 10015) id-= 9500; + return skill_db[id].nk; +} +int skill_get_max( int id ){ + return (id < 500) ? skill_db[id].max : guild_skill_get_max(id); +} +int skill_get_range( int id , int lv ){ + if (lv <= 0) return 0; + return (id < 500) ? skill_db[id].range[lv-1] : guild_skill_get_range(id); +} +int skill_get_hp( int id ,int lv ){ + if (id >= 10000 && id < 10015) id-= 9500; + return (lv <= 0) ? 0: skill_db[id].hp[lv-1]; +} +int skill_get_sp( int id ,int lv ){ + if (id >= 10000 && id < 10015) id-= 9500; + //if (lv <= 0) return 0; + //return (id < 500) ? skill_db[id].sp[lv-1] : guild_skill_get_sp(id, lv); + return (lv <= 0) ? 0: skill_db[id].sp[lv-1]; +} +int skill_get_zeny( int id ,int lv ){ + if (id >= 10000 && id < 10015) id-= 9500; + return (lv <= 0) ? 0:skill_db[id].zeny[lv-1]; +} +int skill_get_num( int id ,int lv ){ + if (id >= 10000 && id < 10015) id-= 9500; + return (lv <= 0) ? 0:skill_db[id].num[lv-1]; +} +int skill_get_cast( int id ,int lv ){ + if (id >= 10000 && id < 10015) id-= 9500; + return (lv <= 0) ? 0:skill_db[id].cast[lv-1]; +} +int skill_get_delay( int id ,int lv ){ + if (id >= 10000 && id < 10015) id-= 9500; + return (lv <= 0) ? 0:skill_db[id].delay[lv-1]; +} +int skill_get_time( int id ,int lv ){ + if (id >= 10000 && id < 10015) id-= 9500; + return (lv <= 0) ? 0:skill_db[id].upkeep_time[lv-1]; +} +int skill_get_time2( int id ,int lv ){ + if (id >= 10000 && id < 10015) id-= 9500; + return (lv <= 0) ? 0:skill_db[id].upkeep_time2[lv-1]; +} +int skill_get_castdef( int id ){ + if (id >= 10000 && id < 10015) id-= 9500; + return skill_db[id].cast_def_rate; +} +int skill_get_weapontype( int id ){ + if (id >= 10000 && id < 10015) id-= 9500; + return skill_db[id].weapon; +} +int skill_get_inf2( int id ){ + if (id >= 10000 && id < 10015) id-= 9500; + return skill_db[id].inf2; +} +int skill_get_castcancel( int id ){ + if (id >= 10000 && id < 10015) id-= 9500; + return skill_db[id].maxcount; +} +int skill_get_maxcount( int id ){ + if (id >= 10000 && id < 10015) id-= 9500; + return skill_db[id].maxcount; +} +int skill_get_blewcount( int id ,int lv ){ + if (id >= 10000 && id < 10015) id-= 9500; + return (lv <= 0) ? 0:skill_db[id].blewcount[lv-1]; +} +int skill_get_mhp( int id ,int lv ){ + if (id >= 10000 && id < 10015) id-= 9500; + return (lv <= 0) ? 0:skill_db[id].mhp[lv-1]; +} +int skill_get_castnodex( int id ,int lv ){ + if (id >= 10000 && id < 10015) id-= 9500; + return (lv <= 0) ? 0:skill_db[id].castnodex[lv-1]; +} int skill_tree_get_max(int id, int b_class){ struct pc_base_job s_class = pc_calc_base_job(b_class); int i, skillid; @@ -872,8 +937,14 @@ int skill_get_unit_id(int id,int flag) case WE_CALLPARTNER: return 0xb2; /* あなたに逢いたい */ case PA_GOSPEL: return 0xb3; /* ゴスペル */ case HP_BASILICA: return 0xb4; /* バジリカ */ + case CG_MOONLIT: return 0xb5; case PF_FOGWALL: return 0xb6; /* フォグウォ?ル */ case PF_SPIDERWEB: return 0xb7; /* スパイダ?ウェッブ */ + // temporary unit ID's [Celest] + case GD_LEADERSHIP: return 0xc1; + case GD_GLORYWOUNDS: return 0xc2; + case GD_SOULCOLD: return 0xc3; + case GD_HAWKEYES: return 0xc4; } return 0; /* @@ -2169,6 +2240,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) return 1; map_freeblock_lock(); + switch(skillid) { /* 武器攻?系スキル */ @@ -2750,9 +2822,9 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int return 1; if(battle_get_class(bl) == 1288) return 1; - if (skillnotok(skillid, (struct map_session_data *)bl)) // [MouseJstr] - return 0; - + if (skillnotok(skillid, (struct map_session_data *)bl)) // [MouseJstr] + return 0; + map_freeblock_lock(); switch(skillid) { @@ -4320,9 +4392,23 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int } break; case GD_BATTLEORDER: + { + struct guild *g = NULL; + if (sd && sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id))) { + for(i = 0; i < g->max_member; i++) { + if ((dstsd = g->member[i].sd) != NULL) { + 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 ); + } + } + } + } + printf("Guild skill castend:%d\n",skillid); + break; case GD_REGENERATION: case GD_RESTORE: case GD_EMERGENCYCALL: + printf("Guild skill castend:%d\n",skillid); break; default: printf("Unknown skill used:%d\n",skillid); @@ -5085,12 +5171,17 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, 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); if(sc_data) { if (sc_data[SC_DELUGE].timer!=-1) limit *= 2; - } + } break; case RG_GRAFFITI: /* Graffiti */ count=1; // Leave this at 1 [Valaris] @@ -5292,6 +5383,7 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid, case DC_DONTFORGETME: /* 私を忘れないで… */ case DC_FORTUNEKISS: /* 幸運のキス */ case DC_SERVICEFORYOU: /* サ?ビスフォ?ユ? */ + case CG_MOONLIT: ux+=(i%7-3); uy+=(i/7-3); if(i==40) @@ -6870,6 +6962,12 @@ 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; + break; } sd->skillid = skill_num; @@ -7005,7 +7103,7 @@ int skill_use_id( struct map_session_data *sd, int target_id, case GD_REGENERATION: case GD_RESTORE: case GD_EMERGENCYCALL: - printf ("guild skill used : id = %d\n", skill_num); + casttime = 1000; // temporary [Celest] break; } @@ -7024,8 +7122,7 @@ int skill_use_id( struct map_session_data *sd, int target_id, if( casttime>0 || forcecast ){ /* 詠唱が必要 */ struct mob_data *md; - clif_skillcasting( &sd->bl, - sd->bl.id, target_id, 0,0, skill_num,casttime); + clif_skillcasting( &sd->bl, sd->bl.id, target_id, 0,0, skill_num,casttime); /* 詠唱反?モンスタ? */ if( bl->type==BL_MOB && (md=(struct mob_data *)bl) && mob_db[md->class].mode&0x10 && @@ -7961,9 +8058,17 @@ int skill_status_change_end(struct block_list* bl, int type, int tid) case SC_MATKPOT: /* magic attack potion [Valaris] */ case SC_WEDDING: //結婚用(結婚衣裳になって?くのが?いとか) case SC_MELTDOWN: /* メルトダウン */ - case SC_EDP: // Celest + // Celest + case SC_EDP: case SC_MARIONETTE: case SC_MARIONETTE2: + case SC_SLOWDOWN: + case SC_LEADERSHIP: + case SC_GLORYWOUNDS: + case SC_SOULCOLD: + case SC_HAWKEYES: + case SC_BATTLEORDERS: + case SC_REGENERATION: calc_flag = 1; break; case SC_BERSERK: /* バ?サ?ク */ @@ -9282,6 +9387,13 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val if (!val3) val3 = -1; break; case SC_SLOWDOWN: + case SC_LEADERSHIP: + case SC_GLORYWOUNDS: + case SC_SOULCOLD: + case SC_HAWKEYES: + case SC_BATTLEORDERS: + case SC_REGENERATION: + calc_flag = 1; break; default: if(battle_config.error_log) @@ -10193,26 +10305,26 @@ int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int if(group->unit!=NULL){ if(!battle_config.unit_movement_type){ - int i; - for(i=0;i<group->unit_count;i++){ - struct skill_unit *unit=&group->unit[i]; - if(unit->alive && !(m==unit->bl.m && dx==0 && dy==0)){ - int range=unit->range; - map_delblock(&unit->bl); - unit->bl.m = m; - unit->bl.x += dx; - unit->bl.y += dy; - map_addblock(&unit->bl); - clif_skill_setunit(unit); - if(range>0){ - if(range<7) - range=7; - map_foreachinarea( skill_unit_move_unit_group_sub, unit->bl.m, - unit->bl.x-range,unit->bl.y-range,unit->bl.x+range,unit->bl.y+range,0, - &unit->bl,gettick() ); + int i; + for(i=0;i<group->unit_count;i++){ + struct skill_unit *unit=&group->unit[i]; + if(unit->alive && !(m==unit->bl.m && dx==0 && dy==0)){ + int range=unit->range; + map_delblock(&unit->bl); + unit->bl.m = m; + unit->bl.x += dx; + unit->bl.y += dy; + map_addblock(&unit->bl); + clif_skill_setunit(unit); + if(range>0){ + if(range<7) + range=7; + map_foreachinarea( skill_unit_move_unit_group_sub, unit->bl.m, + unit->bl.x-range,unit->bl.y-range,unit->bl.x+range,unit->bl.y+range,0, + &unit->bl,gettick() ); + } } } - } }else{ int i,j, *r_flag, *s_flag, *m_flag; struct skill_unit *unit1; @@ -10250,9 +10362,9 @@ int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int //?純移動(rangeも?承の必要無し) int range=unit1->range; map_delblock(&unit1->bl); - unit1->bl.m = m; - unit1->bl.x += dx; - unit1->bl.y += dy; + unit1->bl.m = m; + unit1->bl.x += dx; + unit1->bl.y += dy; map_addblock(&unit1->bl); clif_skill_setunit(unit1); if(range > 0){ @@ -10290,9 +10402,9 @@ int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int } } } - free(r_flag); - free(s_flag); - free(m_flag); + free(r_flag); + free(s_flag); + free(m_flag); } } return 0; @@ -10631,7 +10743,9 @@ int skill_readdb(void) continue; i=atoi(split[0]); - if(i<0 || i>MAX_SKILL_DB) + if (i>=10000 && i<10015) // for guild skills [Celest] + i -= 9500; + else if(i<0 || i>MAX_SKILL_DB) continue; /* printf("skill id=%d\n",i); */ @@ -10703,7 +10817,9 @@ int skill_readdb(void) continue; i=atoi(split[0]); - if(i<0 || i>MAX_SKILL_DB) + if (i>=10000 && i<10015) // for guild skills [Celest] + i -= 9500; + else if(i<0 || i>MAX_SKILL_DB) continue; memset(split2,0,sizeof(split2)); @@ -10842,7 +10958,9 @@ int skill_readdb(void) continue; i=atoi(split[0]); - if(i<0 || i>MAX_SKILL_DB) + if (i>=10000 && i<10015) // for guild skills [Celest] + i -= 9500; + else if(i<0 || i>MAX_SKILL_DB) continue; memset(split2,0,sizeof(split2)); diff --git a/src/map/skill.h b/src/map/skill.h index 8d756ebaf..774076649 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -4,11 +4,11 @@ #include "map.h" -#define MAX_SKILL_DB 472 -#define MAX_SKILL_PRODUCE_DB 150 +#define MAX_SKILL_DB 515 +#define MAX_SKILL_PRODUCE_DB 150 #define MAX_PRODUCE_RESOURCE 7 -#define MAX_SKILL_ARROW_DB 150 -#define MAX_SKILL_ABRA_DB 350 +#define MAX_SKILL_ARROW_DB 150 +#define MAX_SKILL_ABRA_DB 350 // スキルデ?タベ?ス struct skill_db { @@ -320,27 +320,35 @@ enum { // struct map_session_data の status_changeの番?テ?ブル // Used by English Team SC_BROKNARMOR =32, SC_BROKNWEAPON =33, + SC_SLOWDOWN =45, // for skill slowdown SC_SIGHTTRASHER =73, // SC_BASILICA =125, // 125 is the same id as joint break SC_BASILICA =102, // temporarily use this before an actual id is found [celest] - SC_EDP = 114, // - SC_MARIONETTE2 = 122, // Marionette target + SC_EDP =114, // + SC_MARIONETTE2 =122, // Marionette target SC_ENSEMBLE =159, SC_FOGWALL =178, SC_GOSPEL =179, - SC_LANDPROTECTOR =182, - SC_ADAPTATION =183, - SC_CHASEWALK =184, + SC_LANDPROTECTOR =182, + SC_ADAPTATION =183, + SC_CHASEWALK =184, SC_ATKPOT =185, // [Valaris] SC_MATKPOT =186, // [Valaris] SC_MINDBREAKER =191, SC_SPELLBREAKER =192, + SC_DPOISON =193, /* 猛毒 */ + SC_BLOCKSKILL =194, // for disallowing the use of a skill for a time period // [Celest] - SC_SLOWDOWN = 45, // for skill slowdown - SC_BLEEDING = 124, // Temporarily same id as headcrush - SC_DPOISON = 193, /* 猛毒 */ - SC_BLOCKSKILL = 194, // for disallowing the use of a skill for a time period + SC_BLEEDING = 124, // Temporarily same id as headcrush + SC_MOONLIT = 195, + SC_LEADERSHIP = 196, + SC_GLORYWOUNDS = 197, + SC_SOULCOLD = 198, + SC_HAWKEYES = 199, + SC_BATTLEORDERS = 200, + SC_REGENERATION = 201, + // -- testing various SC effects // SC_AURABLADE =81, |