diff options
-rw-r--r-- | Changelog.txt | 5 | ||||
-rw-r--r-- | src/map/clif.c | 5 | ||||
-rw-r--r-- | src/map/map.h | 1 | ||||
-rw-r--r-- | src/map/mob.h | 14 | ||||
-rw-r--r-- | src/map/pc.c | 35 | ||||
-rw-r--r-- | src/map/pc.h | 1 | ||||
-rw-r--r-- | src/map/skill.c | 87 |
7 files changed, 124 insertions, 24 deletions
diff --git a/Changelog.txt b/Changelog.txt index 7feb8b092..05a3cc1e5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,8 +3,13 @@ Date Added * Skill Updates [celest] - Arrow Shower, Double Strafing, Charge Arrow, Throw Arrow, Sharp Shooting, Arrow Vulcan, and Musical Strike now take arrows when used + - Level 6-10 Stone Curse will not consume a red gem now when it fails + - Players should be able to use items when they're stoned but not yet + completely petrified * Added 'guildgetexp' script command [celest] * Added bLongAtkRate item effect [celest] + * Implemented Confusion (50%) - still need more info on how monsters act + when they're confused [celest] 12/6 * Fixed file props for new npcs [MouseJstr] diff --git a/src/map/clif.c b/src/map/clif.c index 3c82b745f..54fd7d9a9 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -7462,7 +7462,8 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd) { sd->sc_data[SC_TRICKDEAD].timer !=-1 || //死んだふり sd->sc_data[SC_BLADESTOP].timer !=-1 || //白刃取り sd->sc_data[SC_SPIDERWEB].timer !=-1 || //スパイダーウェッブ - (sd->sc_data[SC_DANCING].timer !=-1 && sd->sc_data[SC_DANCING].val4)) //合奏スキル演奏中は動けない + (sd->sc_data[SC_DANCING].timer !=-1 && sd->sc_data[SC_DANCING].val4) || //合奏スキル演奏中は動けない + sd->sc_data[SC_CONFUSION].timer !=-1) return; if ((sd->status.option & 2) && pc_checkskill(sd, RG_TUNNELDRIVE) <= 0) return; @@ -8192,7 +8193,7 @@ void clif_parse_UseItem(int fd, struct map_session_data *sd) { clif_clearchar_area(&sd->bl, 1); return; } - if (sd->npc_id!=0 || sd->vender_id != 0 || sd->opt1 > 0 || + if (sd->npc_id!=0 || sd->vender_id != 0 || (sd->opt1 > 0 && sd->opt1 != 6) || (sd->sc_data && (sd->sc_data[SC_TRICKDEAD].timer != -1 || //死んだふり sd->sc_data[SC_BLADESTOP].timer != -1 || //白刃取り sd->sc_data[SC_BERSERK].timer!=-1 || //バーサーク diff --git a/src/map/map.h b/src/map/map.h index 0c456c51a..1a1353983 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -169,6 +169,7 @@ struct map_session_data { unsigned int client_tick,server_tick; struct walkpath_data walkpath; int walktimer; + int next_walktime; int npc_id,areanpc_id,npc_shopid; int npc_pos; int npc_menu; diff --git a/src/map/mob.h b/src/map/mob.h index e5a83be0f..da5725104 100644 --- a/src/map/mob.h +++ b/src/map/mob.h @@ -72,12 +72,12 @@ enum { }; enum { - MSS_IDLE, // 待機 - MSS_WALK, // 移動 - MSS_ATTACK, // 攻撃 - MSS_DEAD, // 死亡 - MSS_LOOT, // ルート - MSS_CHASE, // 突撃 + MSS_IDLE, // ?@ + MSS_WALK, // ? + MSS_ATTACK, // U + MSS_DEAD, // S + MSS_LOOT, // [g + MSS_CHASE, // ? }; int mobdb_searchname(const char *str); @@ -93,6 +93,8 @@ int mob_spawn_guardian(struct map_session_data *sd,char *mapname, // Spawning Gu int mob_walktoxy(struct mob_data *md,int x,int y,int easy); +//int mob_randomwalk(struct mob_data *md,int tick); +//int mob_can_move(struct mob_data *md); int mob_target(struct mob_data *md,struct block_list *bl,int dist); int mob_stop_walking(struct mob_data *md,int type); diff --git a/src/map/pc.c b/src/map/pc.c index b6e4cbbf0..d0563937a 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -685,6 +685,7 @@ int pc_authok(int id, int login_id2, time_t connect_until_time, struct mmo_chars sd->head_dir = 0; sd->state.auth = 1; sd->walktimer = -1; + sd->next_walktime = -1; sd->attacktimer = -1; sd->followtimer = -1; // [MouseJstr] sd->skilltimer = -1; @@ -4212,6 +4213,40 @@ int pc_stop_walking(struct map_session_data *sd,int type) } /*========================================== + * Random walk + *------------------------------------------ + */ +int pc_randomwalk(struct map_session_data *sd,int tick) +{ + const int retrycount = 20; + nullpo_retr(0, sd); + + if(DIFF_TICK(sd->next_walktime,tick)<0){ + int i,x,y,c,d; + d = rand()%7+5; + for(i=0;i<retrycount;i++){ // Search of a movable place + int r=rand(); + x=sd->bl.x+r%(d*2+1)-d; + y=sd->bl.y+r/(d*2+1)%(d*2+1)-d; + if((c=map_getcell(sd->bl.m,x,y))!=1 && c!=5 && pc_walktoxy(sd,x,y)==0){ + break; + } + } + // Working on this part later [celest] + /*for(i=c=0;i<sd->walkpath.path_len;i++){ // The next walk start time is calculated. + if(sd->walkpath.path[i]&1) + c+=sd->speed*14/10; + else + c+=sd->speed; + } + sd->next_walktime = (d=tick+rand()%3000+c); + return d;*/ + return 1; + } + return 0; +} + +/*========================================== * *------------------------------------------ */ diff --git a/src/map/pc.h b/src/map/pc.h index 372dd72f7..3a4352aa6 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -57,6 +57,7 @@ int pc_setpos(struct map_session_data*,char*,int,int,int); int pc_setsavepoint(struct map_session_data*,char*,int,int); int pc_randomwarp(struct map_session_data *sd,int type); int pc_memo(struct map_session_data *sd,int i); +int pc_randomwalk(struct map_session_data*,int tick); int pc_checkadditem(struct map_session_data*,int,int); int pc_inventoryblank(struct map_session_data*); diff --git a/src/map/skill.c b/src/map/skill.c index 77b5b7516..542eb96b4 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1,4 +1,4 @@ -// $Id: skill.c,v 1.8 2004/12/3 7:53:42 PM Celestia Exp $ +// $Id: skill.c,v 1.8 2004/12/7 9:42:00 PM Celestia Exp $ /* スキル?係 */ #include <stdio.h> @@ -3693,19 +3693,32 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int break; case MG_STONECURSE: /* スト?ンカ?ス */ - if (bl->type==BL_MOB && battle_get_mode(bl)&0x20) { - clif_skill_fail(sd,sd->skillid,0,0); - break; + { + // Level 6-10 doesn't consume a red gem if it fails [celest] + int i, gem_flag = 1; + if (bl->type==BL_MOB && battle_get_mode(bl)&0x20) { + clif_skill_fail(sd,sd->skillid,0,0); + break; + } + clif_skill_nodamage(src,bl,skillid,skilllv,1); + if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) + break; + if( rand()%100 < skilllv*4+20 && !battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) + skill_status_change_start(bl,SC_STONE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); + else if(sd) { + if (skilllv > 5) gem_flag = 0; + clif_skill_fail(sd,skillid,0,0); + } + if (dstmd) + mob_target(dstmd,src,skill_get_range(skillid,skilllv)); + if (sd && gem_flag) { + if ((i=pc_search_inventory(sd, skill_db[skillid].itemid[0])) < 0 ) { + clif_skill_fail(sd,sd->skillid,0,0); + break; + } + pc_delitem(sd, i, skill_db[skillid].amount[0], 0); + } } - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - if( rand()%100 < skilllv*4+20 && !battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) - skill_status_change_start(bl,SC_STONE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - else if(sd) - clif_skill_fail(sd,skillid,0,0); - if (dstmd) - mob_target(dstmd,src,skill_get_range(skillid,skilllv)); break; case NV_FIRSTAID: /* ?急手? */ @@ -7204,7 +7217,9 @@ int skill_check_condition(struct map_session_data *sd,int type) if(!(type&1)) return 1; - if(skill != AM_POTIONPITCHER) { + if(skill != AM_POTIONPITCHER && + skill != CR_SLIMPITCHER && + skill != MG_STONECURSE) { if(skill == AL_WARP && !(type&2)) return 1; for(i=0;i<10;i++) { @@ -8659,6 +8674,16 @@ int skill_status_change_end(struct block_list* bl, int type, int tid) case SC_CURSE: calc_flag = 1; break; + + // celest + case SC_CONFUSION: + { + struct map_session_data *sd=NULL; + if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){ + sd->next_walktime = -1; + } + } + break; } if(bl->type==BL_PC && type<SC_SENDMAX) @@ -9195,9 +9220,31 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) bl->id, data); } break; - } - + // Celest + case SC_CONFUSION: + { + int i = 3000; + //struct mob_data *md; + if (sd) { + pc_randomwalk (sd, gettick()); + sd->next_walktime = tick + (i=1000 + rand()%1000); + } /*else if (bl->type==BL_MOB && (md=(struct mob_data *)bl) && md->mode&1 && mob_can_move(md)) { + md->state.state=MS_WALK; + if( DIFF_TICK(md->next_walktime,tick) > + 7000 && + (md->walkpath.path_len==0 || md->walkpath.path_pos>=md->walkpath.path_len) ) + md->next_walktime = tick + 3000*rand()%2000; + mob_randomwalk(md,tick); + }*/ + if ((sc_data[type].val2 -= 1000) > 0) { + sc_data[type].timer = add_timer( + i + tick, skill_status_change_timer, + bl->id, data); + return 0; + } + } + break; + } return skill_status_change_end( bl,type,tid ); } @@ -9752,6 +9799,14 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val tick = tick * sc_def / 100; } break; + case SC_CONFUSION: + val2 = tick; + tick = 100; + clif_emotion(bl,1); + if (sd) { + pc_stop_walking (sd, 0); + } + break; case SC_BLIND: /* 暗? */ calc_flag = 1; if(!(flag&2)) { |