Преглед на файлове

- Added the Monk combos to skill_castnodex so their delay is not decreased by skills.
- Added the actual skill delay of 1000ms to Triple Attack and Chain combo in skill_cast_db. Added Combo Finish and TigerFist as well with a delay of 700ms.
- Phantasmic arrow now knockbacks even if it misses.
- Adjusted the way Monk combo times work. The combo time is now always 300ms (adjusted by combo_delay_rate) which takes effect inmediately AFTER your current skill's canact-delay (which is why the particular skill delays were moved to skillcast_db)
- Modified skill_delayfix so it performs the can-act reduction from agi/dex for combos there.
- Modified pc_steal_item so that it behaves more closely to the way it does on Aegis.
- Commented out the monster_noteleport mapflag from the guild castles as this is the Aegis behaviour


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9012 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex преди 18 години
родител
ревизия
b8d25efdf3
променени са 9 файла, в които са добавени 128 реда и са изтрити 107 реда
  1. 10 0
      Changelog-Trunk.txt
  2. 3 0
      conf-tmpl/Changelog.txt
  3. 25 25
      conf-tmpl/mapflag/gvg.txt
  4. 6 0
      db/Changelog.txt
  5. 7 3
      db/skill_cast_db.txt
  6. 5 1
      db/skill_castnodex_db.txt
  7. 28 17
      src/map/pc.c
  8. 1 1
      src/map/pc.h
  9. 43 60
      src/map/skill.c

+ 10 - 0
Changelog-Trunk.txt

@@ -3,6 +3,16 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+2006/10/19
+	* Phantasmic arrow now knockbacks even if it misses. [Skotlex]
+	* Adjusted the way Monk combo times work. The combo time is now always
+	  300ms (adjusted by combo_delay_rate) which takes effect inmediately AFTER
+	  your current skill's canact-delay (which is why the particular skill delays
+	  were moved to skillcast_db) [Skotlex]
+	* Modified skill_delayfix so it performs the can-act reduction from agi/dex
+	  for combos there. [Skotlex]
+	* Modified pc_steal_item so that it behaves more closely to the way it does
+	  on Aegis. [Skotlex]
 2006/10/18
 	* Added a overflow check when calculating party exp share. [Skotlex]
 2006/10/16

+ 3 - 0
conf-tmpl/Changelog.txt

@@ -1,5 +1,8 @@
 Date	Added
 
+2006/10/19
+	* Commented out the monster_noteleport mapflag from the guild castles as
+	  this is the Aegis behaviour [Skotlex]
 2006/10/18
 	* Added monster_noteleport mapflag to the guild castle maps to prevent
 	  "avoiding MVPs" by forcing them to teleport from rude-attacks. [Skotlex]

+ 25 - 25
conf-tmpl/mapflag/gvg.txt

@@ -41,27 +41,27 @@ prtg_cas02.gat	mapflag	gvg_castle
 prtg_cas03.gat	mapflag	gvg_castle
 prtg_cas04.gat	mapflag	gvg_castle
 prtg_cas05.gat	mapflag	gvg_castle
-//Also set monster_noteleport to prevent MVPs from "escaping".
-aldeg_cas01.gat	mapflag	monster_noteleport
-aldeg_cas02.gat	mapflag	monster_noteleport
-aldeg_cas03.gat	mapflag	monster_noteleport
-aldeg_cas04.gat	mapflag	monster_noteleport
-aldeg_cas05.gat	mapflag	monster_noteleport
-gefg_cas01.gat	mapflag	monster_noteleport
-gefg_cas02.gat	mapflag	monster_noteleport
-gefg_cas03.gat	mapflag	monster_noteleport
-gefg_cas04.gat	mapflag	monster_noteleport
-gefg_cas05.gat	mapflag	monster_noteleport
-payg_cas01.gat	mapflag	monster_noteleport
-payg_cas02.gat	mapflag	monster_noteleport
-payg_cas03.gat	mapflag	monster_noteleport
-payg_cas04.gat	mapflag	monster_noteleport
-payg_cas05.gat	mapflag	monster_noteleport
-prtg_cas01.gat	mapflag	monster_noteleport
-prtg_cas02.gat	mapflag	monster_noteleport
-prtg_cas03.gat	mapflag	monster_noteleport
-prtg_cas04.gat	mapflag	monster_noteleport
-prtg_cas05.gat	mapflag	monster_noteleport
+//Uncomment to disable monsters teleporting (prevents them from "escaping" when rude attacked)
+//aldeg_cas01.gat	mapflag	monster_noteleport
+//aldeg_cas02.gat	mapflag	monster_noteleport
+//aldeg_cas03.gat	mapflag	monster_noteleport
+//aldeg_cas04.gat	mapflag	monster_noteleport
+//aldeg_cas05.gat	mapflag	monster_noteleport
+//gefg_cas01.gat	mapflag	monster_noteleport
+//gefg_cas02.gat	mapflag	monster_noteleport
+//gefg_cas03.gat	mapflag	monster_noteleport
+//gefg_cas04.gat	mapflag	monster_noteleport
+//gefg_cas05.gat	mapflag	monster_noteleport
+//payg_cas01.gat	mapflag	monster_noteleport
+//payg_cas02.gat	mapflag	monster_noteleport
+//payg_cas03.gat	mapflag	monster_noteleport
+//payg_cas04.gat	mapflag	monster_noteleport
+//payg_cas05.gat	mapflag	monster_noteleport
+//prtg_cas01.gat	mapflag	monster_noteleport
+//prtg_cas02.gat	mapflag	monster_noteleport
+//prtg_cas03.gat	mapflag	monster_noteleport
+//prtg_cas04.gat	mapflag	monster_noteleport
+//prtg_cas05.gat	mapflag	monster_noteleport
 
 // Novice Guild Castles ===
 //n_castle.gat	mapflag	gvg_castle
@@ -70,10 +70,10 @@ nguild_gef.gat	mapflag	gvg_castle
 nguild_pay.gat	mapflag	gvg_castle
 nguild_prt.gat	mapflag	gvg_castle
 
-nguild_alde.gat	mapflag	monster_noteleport
-nguild_gef.gat	mapflag	monster_noteleport
-nguild_pay.gat	mapflag	monster_noteleport
-nguild_prt.gat	mapflag	monster_noteleport
+//nguild_alde.gat	mapflag	monster_noteleport
+//nguild_gef.gat	mapflag	monster_noteleport
+//nguild_pay.gat	mapflag	monster_noteleport
+//nguild_prt.gat	mapflag	monster_noteleport
 
 // Guild Dungeons =========
 gld_dun01.gat	mapflag	gvg_dungeon

+ 6 - 0
db/Changelog.txt

@@ -19,6 +19,12 @@
 	-----
 
 ========================
+10/19
+	* Added the actual skill delay of 1000ms to Triple Attack and Chain combo
+	  in skill_cast_db. Added Combo Finish and TigerFist as well with a delay of
+	  700ms. [Skotlex]
+	* Added the Monk combos to skill_castnodex so their delay is not decreased
+	  by skills. [Skotlex]
 10/18
 	* Updated the packetdb for the 2006-10-17a client. [Zephiris]
 10/16

+ 7 - 3
db/skill_cast_db.txt

@@ -414,7 +414,8 @@
 261,1000,0,0,600000,0
 //-- MO_ABSORBSPIRITS
 262,2000,0,0,0,0
-
+//-- MO_TRIPLEATTACK
+263,0,1000,0,0,0
 //-- MO_INVESTIGATE
 266,1000,500,0,0,0
 //-- MO_FINGEROFFENSIVE
@@ -427,9 +428,12 @@
 270,0,0,0,180000,0
 //-- MO_EXTREMITYFIST
 271,4000:3500:3000:2500:2000,3000:2500:2000:1500:1000,0,0,300000
+//-- MO_CHAINCOMBO
+272,0,1000,0,0,0
+//-- MO_COMBOFINISH
+273,0,700,0,0,0
 //==========================================
 
-
 //===== Sage ===============================
 //-- SA_MAGICROD
 276,0,1500,0,400:600:800:1000:1200,0
@@ -595,7 +599,7 @@
 //-- CH_PALMSTRIKE
 370,0,300,0,0,0
 //-- CH_TIGERFIST
-371,0,0,0,0,2000:4000:6000:8000:10000
+371,0,700,0,0,2000:4000:6000:8000:10000
 //-- CH_CHAINCRUSH
 372,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0,0
 //==========================================

+ 5 - 1
db/skill_castnodex_db.txt

@@ -8,10 +8,14 @@
 // Delay: With 0, dex affects the skill's delay rate
 // Example - 46,1,1 = Double Strafe's casting time and delay is not affected by dex.
 // By default, dex NEVER affects after-cast delay, so no need of putting 'x,0,1' in this file
-
+263,0,2 //MO_TRIPLEATTACK
+272,0,2 //MO_CHAINCOMBO
+273,0,2 //MO_COMBOFINISH
 336,1	//WE_CALLPARTNER
 366,1	//HW_MAGICPOWER
 370,1	//CH_PALMSTRIKE
+371,0,2 //CH_TIGERFIST
+372,0,2 //CH_CHAINCRUSH
 403,3	//PF_MEMORIZE
 408,1	//WE_BABY
 409,1	//WE_CALLPARENT

+ 28 - 17
src/map/pc.c

@@ -3179,9 +3179,10 @@ int pc_show_steal(struct block_list *bl,va_list ap)
  *------------------------------------------
  */
 //** pc.c:
-int pc_steal_item(struct map_session_data *sd,struct block_list *bl)
+int pc_steal_item(struct map_session_data *sd,struct block_list *bl, int lv)
 {
-	int i,skill,itemid,flag;
+	static int i = 0;
+	int rate,itemid,flag;
 	struct status_data *sd_status, *md_status;
 	struct mob_data *md;
 	struct item tmp_item;
@@ -3193,33 +3194,43 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl)
 	md_status= status_get_status_data(bl);
 	md = (TBL_MOB *)bl;
 
-	if(md->state.steal_flag>=battle_config.skill_steal_max_tries || md_status->mode&MD_BOSS || md->master_id ||
+	if(md->state.steal_flag>=battle_config.skill_steal_max_tries ||
+		md_status->mode&MD_BOSS || md->master_id ||
 		(md->class_>=1324 && md->class_<1364) || // prevent stealing from treasure boxes [Valaris]
 		map[md->bl.m].flag.nomobloot ||        // check noloot map flag [Lorky]
-		md->sc.data[SC_STONE].timer != -1 || md->sc.data[SC_FREEZE].timer != -1 //status change check
+		md->sc.opt1 //status change check
   	)
 		return 0;
 	
-	skill = battle_config.skill_steal_type == 1
-		? (sd_status->dex - md_status->dex)/2 + pc_checkskill(sd,TF_STEAL)*6 + 10
-		: sd_status->dex - md_status->dex + pc_checkskill(sd,TF_STEAL)*3 + 10;
+	rate = battle_config.skill_steal_type
+		? (sd_status->dex - md_status->dex)/2 + lv*6 + 10
+		: sd_status->dex - md_status->dex + lv*3 + 10;
 
-	skill+= sd->add_steal_rate; //Better make the steal_Rate addition affect % rather than an absolute on top of the total drop rate. [Skotlex]
+	rate += sd->add_steal_rate; //Better make the steal_Rate addition affect % rather than an absolute on top of the total drop rate. [Skotlex]
 		
-	if (skill < 1)
+	if (rate < 1)
 		return 0;
 
 	md->state.steal_flag++; //increase steal tries number
 
-	for(i = 0; i<MAX_MOB_DROP; i++)//Pick one mobs drop slot.
-	{
-		itemid = md->db->dropitem[i].nameid;
-		if(itemid <= 0 || (itemid>4000 && itemid<5000 && pc_checkskill(sd,TF_STEAL) <= 5))
-			continue;
-		if(rand() % 10000 < md->db->dropitem[i].p*skill/100)
-			break;
+	//preliminar statistical data hints at this behaviour:
+	//each steal attempt: try to steal against ONE mob drop, and no more.
+	//We use a static index to prevent giving priority to any of the slots.
+	old_i = i;
+	do {
+		i++;
+		if (i == MAX_MOB_DROP-1 && lv <= 5)
+			continue; //Cannot steal "last slot" (card slot)
+		if (i == MAX_MOB_DROP)
+			i = 0;
+	} while (md->db->dropitem[i].p <= 0 && old_i != i);
+
+	if(old_i == i) {
+		md->state.steal_flag = UCHAR_MAX; //Tag for speed up in case you reinsist
+		return 0; //Mob has nothing stealable!
 	}
-	if (i == MAX_MOB_DROP)
+
+	if(rand() % 10000 >= md->db->dropitem[i].p*rate/100)
 		return 0;
 	
 	md->state.steal_flag = UCHAR_MAX; //you can't steal from this mob any more

+ 1 - 1
src/map/pc.h

@@ -171,7 +171,7 @@ int pc_skill(struct map_session_data*,int,int,int);
 
 int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip);
 
-int pc_steal_item(struct map_session_data *sd,struct block_list *bl);
+int pc_steal_item(struct map_session_data *sd,struct block_list *bl, int skilllv);
 int pc_steal_coin(struct map_session_data *sd,struct block_list *bl);
 
 int pc_modifybuyvalue(struct map_session_data*,int);

+ 43 - 60
src/map/skill.c

@@ -1031,7 +1031,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 			if(dstmd && dstmd->state.steal_flag<battle_config.skill_steal_max_tries && sd->status.weapon != W_BOW &&
 				(skill=pc_checkskill(sd,RG_SNATCHER)) > 0 &&
 				(skill*15 + 55) + pc_checkskill(sd,TF_STEAL)*10 > rand()%1000) {
-				if(pc_steal_item(sd,bl))
+				if(pc_steal_item(sd,bl,pc_checkskill(sd,TF_STEAL)))
 					clif_skill_nodamage(src,bl,TF_STEAL,skill,1);
 				else
 					clif_skill_fail(sd,RG_SNATCHER,0,0);
@@ -1896,7 +1896,9 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 	type=(skillid==0)?5:skill_get_hit(skillid);
 
 	if(damage < dmg.div_ 
-		&& skillid != CH_PALMSTRIKE) //Palm Strike is the only skill that will knockback even if it misses. [Skotlex]
+		//Only skills that knockback even when they miss. [Skotlex]
+		&& skillid != CH_PALMSTRIKE
+		&& skillid != HT_PHANTASMIC)
 		dmg.blewcount = 0;
 
 	if(skillid == CR_GRANDCROSS||skillid == NPC_GRANDDARKNESS) {
@@ -1906,8 +1908,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 	}
 
 	if(sd) {
-		//Sorry for removing the Japanese comments, but they were actually distracting 
-		//from the actual code and I couldn't understand a thing anyway >.< [Skotlex]
+		int flag = 0; //Used to signal if this skill can be combo'ed later on.
 		if (sd->sc.data[SC_COMBO].timer!=-1)
 		{	//End combo state after skill is invoked. [Skotlex]
 			switch (skillid) {
@@ -1933,65 +1934,29 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 		switch(skillid)
 		{
 			case MO_TRIPLEATTACK:
-			{
-				int delay = 1000 - 4*sstatus->agi - 2*sstatus->dex;
-				if (pc_checkskill(sd, MO_CHAINCOMBO) > 0)
-					delay += 300 * battle_config.combo_delay_rate / 100;
-				sc_start(src,SC_COMBO,100,MO_TRIPLEATTACK,delay);
-				clif_combo_delay(src, delay);
-				
 				if (sd->status.party_id>0) //bonus from SG_FRIEND [Komurka]
 					party_skill_check(sd, sd->status.party_id, MO_TRIPLEATTACK, skilllv);
+				if (pc_checkskill(sd, MO_CHAINCOMBO) > 0)
+					flag=1;
 				break;
-			}
 			case MO_CHAINCOMBO:
-			{
-				int delay = 1000 - 4*sstatus->agi - 2*sstatus->dex;
 				if(pc_checkskill(sd, MO_COMBOFINISH) > 0 && sd->spiritball > 0)
-					delay += 300 * battle_config.combo_delay_rate /100;
-				sc_start(src,SC_COMBO,100,MO_CHAINCOMBO,delay);
-				clif_combo_delay(src,delay);
+					flag=1;
 				break;
-			}
 			case MO_COMBOFINISH:
-			{
-				int delay = 700 - 4*sstatus->agi - 2*sstatus->dex;
-				if (
-					(pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball >= 4 && sd->sc.data[SC_EXPLOSIONSPIRITS].timer != -1) ||
-					(pc_checkskill(sd, CH_TIGERFIST) > 0 && sd->spiritball > 0) ||
-					(pc_checkskill(sd, CH_CHAINCRUSH) > 0 && sd->spiritball > 1)
-				)
-					delay += 300 * battle_config.combo_delay_rate /100;
-				sc_start(src,SC_COMBO,100,MO_COMBOFINISH,delay);
-				clif_combo_delay(src,delay);
-				break;
-			}
+				if (pc_checkskill(sd, CH_TIGERFIST) > 0 && sd->spiritball > 0)
+					flag=1;
 			case CH_TIGERFIST:
-			{	//Tigerfist is now a combo-only skill. [Skotlex]
-				int delay = 1000 - 4*sstatus->agi - 2*sstatus->dex;
-				if(
-					(pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball >= 3 && sd->sc.data[SC_EXPLOSIONSPIRITS].timer != -1) ||
-					(pc_checkskill(sd, CH_CHAINCRUSH) > 0)
-				)
-					delay += 300 * battle_config.combo_delay_rate /100;
-				sc_start(src,SC_COMBO,100,CH_TIGERFIST,delay);
-				clif_combo_delay(src,delay);
-				break;
-			}
+				if (!flag && pc_checkskill(sd, CH_CHAINCRUSH) > 0 && sd->spiritball > 1)
+					flag=1;
 			case CH_CHAINCRUSH:
-			{
-				int delay = 1000 - 4*sstatus->agi - 2*sstatus->dex;
-				if(pc_checkskill(sd, MO_EXTREMITYFIST) > 0 &&
-					sd->spiritball >= 1 &&
-					sd->sc.data[SC_EXPLOSIONSPIRITS].timer != -1)
-					delay += 300 * battle_config.combo_delay_rate /100;
-				sc_start(src,SC_COMBO,100,CH_CHAINCRUSH,delay);
-				clif_combo_delay(src,delay);
+				if (!flag && pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball > 0 && sd->sc.data[SC_EXPLOSIONSPIRITS].timer != -1)
+					flag=1;
 				break;
-			}
 			case AC_DOUBLE:
 				if((tstatus->race == RC_BRUTE || tstatus->race == RC_INSECT) &&
-					pc_checkskill(sd, HT_POWER)) {
+					pc_checkskill(sd, HT_POWER))
+				{
 					//TODO: This code was taken from Triple Blows, is this even how it should be? [Skotlex]
 					sc_start4(src,SC_COMBO,100,HT_POWER,bl->id,0,0,2000);
 					clif_combo_delay(src,2000);
@@ -2014,6 +1979,13 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 				sd->ud.attackabletime = sd->canuseitem_tick = sd->ud.canact_tick;
 				break;
 		}	//Switch End
+		if (flag) { //Possible to chain
+			flag = DIFF_TICK(sd->ud.canact_tick, tick);
+			if (flag < 0) flag = 0;
+			flag += 300 * battle_config.combo_delay_rate/100;
+			sc_start(src,SC_COMBO,100,skillid,flag);
+			clif_combo_delay(src, flag);
+		}
 	}
 
 	//Display damage.
@@ -4223,7 +4195,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 
 	case TF_STEAL:
 		if(sd) {
-			if(pc_steal_item(sd,bl))
+			if(pc_steal_item(sd,bl,skilllv))
 				clif_skill_nodamage(src,bl,skillid,skilllv,1);
 			else
 				clif_skill_fail(sd,skillid,0x0a,0);
@@ -8613,7 +8585,7 @@ int skill_delayfix (struct block_list *bl, int skill_id, int skill_lv)
 
 	if (bl->type&battle_config.no_skill_delay)
 		return battle_config.min_skill_delay_limit; 
-	
+
 	// instant cast attack skills depend on aspd as delay [celest]
 	if (time == 0) {
 		if (skill_get_type(skill_id)&(BF_WEAPON|BF_MISC) && !(skill_get_nk(skill_id)&NK_NO_DAMAGE))
@@ -8623,13 +8595,24 @@ int skill_delayfix (struct block_list *bl, int skill_id, int skill_lv)
 	} else if (time < 0)
 		time = -time + status_get_amotion(bl);	// if set to <0, the attack motion is added.
 	else //Agi reduction should apply only to non-zero delay skills.
-	if (battle_config.delay_dependon_agi && !(delaynochange&1))
-	{	// if skill casttime is allowed to be reduced by dex
-		int scale = battle_config.castrate_dex_scale - status_get_agi(bl);
-		if (scale > 0)
-			time = time * scale / battle_config.castrate_dex_scale;
-		else //To be capped later to minimum.
-			time = 0;
+	switch (skill_id)
+  	{	//Monk combo skills have their delay reduced by agi/dex.
+	case MO_TRIPLEATTACK:
+	case MO_CHAINCOMBO:
+	case MO_COMBOFINISH:
+	case CH_TIGERFIST:
+	case CH_CHAINCRUSH:
+		time -= 4*status_get_agi(bl) - 2*status_get_dex(bl);
+		break;
+	default:
+		if (battle_config.delay_dependon_agi && !(delaynochange&1))
+		{	// if skill casttime is allowed to be reduced by dex
+			int scale = battle_config.castrate_dex_scale - status_get_agi(bl);
+			if (scale > 0)
+				time = time * scale / battle_config.castrate_dex_scale;
+			else //To be capped later to minimum.
+				time = 0;
+		}
 	}
 
 	if (bl->type == BL_PC && ((TBL_PC*)bl)->delayrate != 100)