فهرست منبع

Updated Deadly Poison and Enchant Poison

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1215 54d463be-8e91-2dee-dedb-b68131a5f0ec
celest 20 سال پیش
والد
کامیت
1fcb2bacfc
4فایلهای تغییر یافته به همراه36 افزوده شده و 76 حذف شده
  1. 3 0
      Changelog-SVN.txt
  2. 1 1
      db/skill_cast_db.txt
  3. 21 31
      src/map/skill.c
  4. 11 44
      src/map/status.c

+ 3 - 0
Changelog-SVN.txt

@@ -1,6 +1,9 @@
 Date	Added
 
 03/08
+        * Added chance for Enchant Poison to poison enemy, and reduced Deadly Poison
+          chance [celest]
+        * Compacted some code for Deadly Poison [celest]
         * Added DracoRPG's code for Soul Breaker - the magic attack part should work
           as it should now, thanks! ^^ [celest]
         * Reverted the reverted jA event change but this time without bugs (hopefully) [Shinomori]

+ 1 - 1
db/skill_cast_db.txt

@@ -97,7 +97,7 @@
 135,0,0,500:1000:2000:3000:4000:5000:6000:7000:8000:9000,0	//AS_CLOAKING#クローキング#
 136,0,0,0,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000	//AS_SONICBLOW#ソニックブロー#
 
-138,0,0,30000:45000:60000:75000:90000:105000:120000:135000:150000:165000,0	//AS_ENCHANTPOISON#エンチャントポイズン#
+138,0,0,30000:45000:60000:75000:90000:105000:120000:135000:150000:165000,10000:20000:30000:40000:50000:60000:70000:80000:90000:100000	//AS_ENCHANTPOISON#エンチャントポイズン#
 139,0,0,20000:25000:30000:35000:40000:45000:50000:55000:60000:65000,0 //AS_POISONREACT#?イズンリアクト#
 140,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000	//AS_VENOMDUST#ベナムダスト#
 141,1000,0,5500:6000:6500:7000:7500:8000:8500:9000:9500:10000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000	//AS_SPLASHER#ベナムスプラッシャー#

+ 21 - 31
src/map/skill.c

@@ -756,42 +756,32 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl,int s
 	switch(skillid){
 	case 0:					/* 通常攻? */
 		/* 自動鷹 */
-		if( sd && pc_isfalcon(sd) && sd->status.weapon == 11 && (skill=pc_checkskill(sd,HT_BLITZBEAT))>0 &&
-			rand()%1000 <= sd->paramc[5]*10/3+1 ) {
-			int lv=(sd->status.job_level+9)/10;
-			skill_castend_damage_id(src,bl,HT_BLITZBEAT,(skill<lv)?skill:lv,tick,0xf00000);
-		}
-		// スナッチャ?
-		if(sd && sd->status.weapon != 11 && (skill=pc_checkskill(sd,RG_SNATCHER)) > 0)
-			if((skill*15 + 55) + (skill2 = pc_checkskill(sd,TF_STEAL))*10 > rand()%1000) {
+		if(sd) {
+			struct status_change *sc_data = status_get_sc_data(bl);
+			if (pc_isfalcon(sd) && sd->status.weapon == 11 && (skill=pc_checkskill(sd,HT_BLITZBEAT))>0 &&
+				rand()%1000 <= sd->paramc[5]*10/3+1 ) {
+				int lv=(sd->status.job_level+9)/10;
+				skill_castend_damage_id(src,bl,HT_BLITZBEAT,(skill<lv)?skill:lv,tick,0xf00000);
+			}
+			// スナッチャ?
+			if(sd->status.weapon != 11 && (skill=pc_checkskill(sd,RG_SNATCHER)) > 0 &&
+				(skill*15 + 55) + (skill2 = pc_checkskill(sd,TF_STEAL))*10 > rand()%1000) {
 				if(pc_steal_item(sd,bl))
 					clif_skill_nodamage(src,bl,TF_STEAL,skill2,1);
 				else if (battle_config.display_snatcher_skill_fail)
 					clif_skill_fail(sd,skillid,0,0);
 			}
-		// エンチャントデットリ?ポイズン(猛毒?果)
-		if (sd && sd->sc_data[SC_EDP].timer != -1 && rand() % 10000 < sd->sc_data[SC_EDP].val2 * sc_def_vit) {
-			int mhp = status_get_max_hp(bl);
-			int hp = status_get_hp(bl);
-			int lvl = sd->sc_data[SC_EDP].val1;
-			int diff;
-			// MHPの1/4以下にはならない
-			if(hp > mhp>>2) {
-				if(bl->type == BL_PC) {
-					diff = mhp*10/100;
-					if (hp - diff < mhp>>2)
-						diff = hp - (mhp>>2);
-					pc_heal(dstsd, -hp, 0);
-				} else if(bl->type == BL_MOB) {
-					struct mob_data *md = (struct mob_data *)bl;
-					hp -= mhp*15/100;
-					if (hp > mhp>>2)
-						md->hp = hp;
-					else
-						md->hp = mhp>>2;
-				}
-			}
-			status_change_start(bl,SC_DPOISON,lvl,0,0,0,skill_get_time2(ASC_EDP,lvl),0);
+			// enchant poison has a chance of poisoning enemy
+			if (sd->sc_data[SC_ENCPOISON].timer != -1 && sc_data && sc_data[SC_POISON].timer == -1 &&
+				rand() % 100 < sd->sc_data[SC_ENCPOISON].val1 * sc_def_vit) {
+				status_change_start(bl,SC_POISON,sd->sc_data[SC_ENCPOISON].val1,
+					0,0,0,skill_get_time2(AS_ENCHANTPOISON,sd->sc_data[SC_ENCPOISON].val1),0);
+			}
+			// エンチャントデットリ?ポイズン(猛毒?果)
+			if (sd->sc_data[SC_EDP].timer != -1 && sc_data && sc_data[SC_DPOISON].timer == -1 &&
+				rand() % 100 < sd->sc_data[SC_EDP].val2 * sc_def_vit)
+				status_change_start(bl,SC_DPOISON,sd->sc_data[SC_EDP].val1,
+					0,0,0,skill_get_time2(ASC_EDP,sd->sc_data[SC_EDP].val1),0);			
 		}
 		break;
 

+ 11 - 44
src/map/status.c

@@ -4464,54 +4464,21 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
 			return 0;
 		}
 		break;
+
 	case SC_POISON:
-		if(sc_data[SC_SLOWPOISON].timer == -1) {
-			if( (--sc_data[type].val3) > 0) {
-				int hp = status_get_max_hp(bl);
-				if(status_get_hp(bl) > hp>>2) {
-					if(sd) {
-						hp = 3 + hp*3/200;
-						pc_heal(sd,-hp,0);
-					}
-					else if(bl->type == BL_MOB) {
-						struct mob_data *md;
-						nullpo_retr(0, md=(struct mob_data *)bl);
-						/*if((md=((struct mob_data *)bl)) == NULL)
-							break;*/
-						hp = 3 + hp/200;
-						md->hp -= hp;
-					}
-				}
-				sc_data[type].timer=add_timer(1000+tick,status_change_timer, bl->id, data );
-				// hmm setting up a timer and breaking then to call status_change_end just right away?
-				// I think you're missing a:
-				return 0;
-				
-			}
-		}
-		else
-		{
-			sc_data[type].timer=add_timer(1000+tick,status_change_timer, bl->id, data );
-			// hmm setting up a timer and breaking then to call status_change_end just right away?
-			// I think you're missing brackets and a:
-			return 0;
-		}
-		break;
 	case SC_DPOISON:
 		if (sc_data[SC_SLOWPOISON].timer == -1 && (--sc_data[type].val3) > 0) {
 			int hp = status_get_max_hp(bl);
-			if (status_get_hp(bl) > hp>>2) {
-				if(sd) {
-					hp = 3 + hp/50;
-					pc_heal(sd, -hp, 0);
-				} else if (bl->type == BL_MOB) {
-					struct mob_data *md;
-					nullpo_retr(0, md=(struct mob_data *)bl);
-					/*if ((md=((struct mob_data *)bl)) == NULL)
-						break;*/
-					hp = 3 + hp/100;
-					md->hp -= hp;
-				}
+			if (type == SC_POISON && status_get_hp(bl) < hp>>2)
+				break;
+			if(sd) {
+				hp = (type == SC_DPOISON) ? 3 + hp/50 : 3 + hp*3/200;
+				pc_heal(sd, -hp, 0);
+			} else if (bl->type == BL_MOB) {
+				struct mob_data *md;
+				nullpo_retr(0, md=(struct mob_data *)bl);
+				hp = (type == SC_DPOISON) ? 3 + hp/100 : 3 + hp/200;
+				md->hp -= hp;
 			}
 		}
 		if (sc_data[type].val3 > 0)