Pārlūkot izejas kodu

Tarot Card of Fate Follow-Up (fixes #1789)
* The tarot card THE SUN no longer blocks other cards in pre-re (still does in renewal)
* Added a configuration for equal chance for all cards in case someone prefers eAthena behavior

Playtester 8 gadi atpakaļ
vecāks
revīzija
b4225e8436
5 mainītis faili ar 72 papildinājumiem un 37 dzēšanām
  1. 6 0
      conf/battle/skill.conf
  2. 1 0
      src/map/battle.c
  3. 1 0
      src/map/battle.h
  4. 64 29
      src/map/skill.c
  5. 0 8
      src/map/status.c

+ 6 - 0
conf/battle/skill.conf

@@ -352,3 +352,9 @@ skill_eightpath_algorithm: yes
 // The official setting makes it quite easy to trap MVPs, set this to 31 if you want all units to be able to
 // damage skills (previous behavior).
 can_damage_skill: 1
+
+// Should Tarot Card of Fate have the same chance for each card to occur? (Note 1)
+// Official chances: 15%: LOVERS | 10%: FOOL, MAGICIAN, HIGH PRIESTESS, STRENGTH, SUN | 8%: TEMPERANCE
+// 7%: CHARIOT | 6%: THE HANGED MAN | 5%: DEATH, STAR | 2%: TOWER | 1%: WHEEL OF FORTUNE, DEVIL
+// If you set this to "yes", the chance for each card becomes 1/14.
+tarotcard_equal_chance: no

+ 1 - 0
src/map/battle.c

@@ -8368,6 +8368,7 @@ static const struct _battle_data {
 	{ "can_damage_skill",                   &battle_config.can_damage_skill,                1,      0,      BL_ALL,         },
 	{ "atcommand_levelup_events",			&battle_config.atcommand_levelup_events,		0,		0,		1,				},
 	{ "block_account_in_same_party",		&battle_config.block_account_in_same_party,		1,		0,		1,				},
+	{ "tarotcard_equal_chance",             &battle_config.tarotcard_equal_chance,          0,      0,      1,              },
 
 #include "../custom/battle_config_init.inc"
 };

+ 1 - 0
src/map/battle.h

@@ -611,6 +611,7 @@ extern struct Battle_Config
 	int can_damage_skill; //Which BL types can damage traps
 	int atcommand_levelup_events;
 	int block_account_in_same_party;
+	int tarotcard_equal_chance; //Official or equal chance for each card
 
 #include "../custom/battle_config_struct.inc"
 } battle_config;

+ 64 - 29
src/map/skill.c

@@ -4305,24 +4305,48 @@ void skill_reveal_trap_inarea(struct block_list *src, int range, int x, int y) {
 *------------------------------------------*/
 static int skill_tarotcard(struct block_list* src, struct block_list *target, uint16 skill_id, uint16 skill_lv, int tick)
 {
-	int rate = rnd() % 100;
+	int card = 0;
 
-	if (rate < 10) // THE FOOL - heals SP to 0
+	if (battle_config.tarotcard_equal_chance) {
+		//eAthena equal chances
+		card = rand() % 14 + 1;
+	}
+	else {
+		//Official chances
+		int rate = rand() % 100;
+		if (rate < 10) card = 1; // THE FOOL
+		else if (rate < 20) card = 2; // THE MAGICIAN
+		else if (rate < 30) card = 3; // THE HIGH PRIESTESS
+		else if (rate < 37) card = 4; // THE CHARIOT
+		else if (rate < 47) card = 5; // STRENGTH
+		else if (rate < 62) card = 6; // THE LOVERS
+		else if (rate < 63) card = 7; // WHEEL OF FORTUNE
+		else if (rate < 69) card = 8; // THE HANGED MAN
+		else if (rate < 74) card = 9; // DEATH
+		else if (rate < 82) card = 10; // TEMPERANCE
+		else if (rate < 83) card = 11; // THE DEVIL
+		else if (rate < 85) card = 12; // THE TOWER
+		else if (rate < 90) card = 13; // THE STAR
+		else card = 14; // THE SUN
+	}
+
+	switch (card) {
+	case 1: // THE FOOL - heals SP to 0
 	{
 		status_percent_damage(src, target, 0, 100, false);
-		return 1;
+		break;
 	}
-	else if (rate < 20)  // THE MAGICIAN - matk halved
+	case 2: // THE MAGICIAN - matk halved
 	{
 		sc_start(src, target, SC_INCMATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv));
-		return 2;
+		break;
 	}
-	else if (rate < 30) // THE HIGH PRIESTESS - all buffs removed
+	case 3: // THE HIGH PRIESTESS - all buffs removed
 	{
 		status_change_clear_buffs(target, SCCB_BUFFS | SCCB_CHEM_PROTECT);
-		return 3;
+		break;
 	}
-	else if (rate < 37) // THE CHARIOT - 1000 damage, random armor destroyed
+	case 4: // THE CHARIOT - 1000 damage, random armor destroyed
 	{
 		status_fix_damage(src, target, 1000, 0);
 		clif_damage(src, target, tick, 0, 0, 1000, 0, DMG_NORMAL, 0, false);
@@ -4331,71 +4355,82 @@ static int skill_tarotcard(struct block_list* src, struct block_list *target, ui
 			unsigned short where[] = { EQP_ARMOR, EQP_SHIELD, EQP_HELM };
 			skill_break_equip(src, target, where[rnd() % 3], 10000, BCT_ENEMY);
 		}
-		return 4;
+		break;
 	}
-	else if (rate < 47) // STRENGTH - atk halved
+	case 5: // STRENGTH - atk halved
 	{
 		sc_start(src, target, SC_INCATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv));
-		return 5;
+		break;
 	}
-	else if (rate < 62) // THE LOVERS - 2000HP heal, random teleported
+	case 6: // THE LOVERS - 2000HP heal, random teleported
 	{
 		status_heal(target, 2000, 0, 0);
 		if (!map_flag_vs(target->m))
 			unit_warp(target, -1, -1, -1, CLR_TELEPORT);
-		return 6;
+		break;
 	}
-	else if (rate < 63) // WHEEL OF FORTUNE - random 2 other effects
+	case 7: // WHEEL OF FORTUNE - random 2 other effects
 	{
 		// Recursive call
 		skill_tarotcard(src, target, skill_id, skill_lv, tick);
 		skill_tarotcard(src, target, skill_id, skill_lv, tick);
-		return 7;
+		break;
 	}
-	else if (rate < 69) // THE HANGED MAN - stop, freeze or stoned
+	case 8: // THE HANGED MAN - stop, freeze or stoned
 	{
 		enum sc_type sc[] = { SC_STOP, SC_FREEZE, SC_STONE };
 		uint8 rand_eff = rnd() % 3;
 		sc_start2(src, target, sc[rand_eff], 100, skill_lv, (rand_eff == 2 ? src->id : 0), skill_get_time2(skill_id, skill_lv));
-		return 8;
+		break;
 	}
-	else if (rate < 74) // DEATH - curse, coma and poison
+	case 9: // DEATH - curse, coma and poison
 	{
 		status_change_start(src, target, SC_COMA, 10000, skill_lv, 0, src->id, 0, 0, SCSTART_NONE);
 		sc_start(src, target, SC_CURSE, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
 		sc_start2(src, target, SC_POISON, 100, skill_lv, src->id, skill_get_time2(skill_id, skill_lv));
-		return 9;
+		break;
 	}
-	else if (rate < 82) // TEMPERANCE - confusion
+	case 10: // TEMPERANCE - confusion
 	{
 		sc_start(src, target, SC_CONFUSION, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
-		return 10;
+		break;
 	}
-	else if (rate < 83) // THE DEVIL - 6666 damage, atk and matk halved, cursed
+	case 11: // THE DEVIL - 6666 damage, atk and matk halved, cursed
 	{
 		status_fix_damage(src, target, 6666, 0);
 		clif_damage(src, target, tick, 0, 0, 6666, 0, DMG_NORMAL, 0, false);
 		sc_start(src, target, SC_INCATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv));
 		sc_start(src, target, SC_INCMATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv));
 		sc_start(src, target, SC_CURSE, skill_lv, 100, skill_get_time2(skill_id, skill_lv));
-		return 11;
+		break;
 	}
-	else if (rate < 85) // THE TOWER - 4444 damage
+	case 12: // THE TOWER - 4444 damage
 	{
 		status_fix_damage(src, target, 4444, 0);
 		clif_damage(src, target, tick, 0, 0, 4444, 0, DMG_NORMAL, 0, false);
-		return 12;
+		break;
 	}
-	else if (rate < 90) // THE STAR - stun
+	case 13: // THE STAR - stun
 	{
 		sc_start(src, target, SC_STUN, 100, skill_lv, 5000);
-		return 13;
+		break;
 	}
-	else // THE SUN - atk, matk, hit, flee and def reduced, immune to more tarot card effects
+	default: // THE SUN - atk, matk, hit, flee and def reduced, immune to more tarot card effects
 	{
+#ifdef RENEWAL
+		//In renewal, this card gives the SC_TAROTCARD status change which makes you immune to other cards
 		sc_start(src, target, SC_TAROTCARD, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
-		return 14;
+#endif
+		sc_start(src, target, SC_INCATKRATE, 100, -20, skill_get_time2(skill_id, skill_lv));
+		sc_start(src, target, SC_INCMATKRATE, 100, -20, skill_get_time2(skill_id, skill_lv));
+		sc_start(src, target, SC_INCHITRATE, 100, -20, skill_get_time2(skill_id, skill_lv));
+		sc_start(src, target, SC_INCFLEERATE, 100, -20, skill_get_time2(skill_id, skill_lv));
+		sc_start(src, target, SC_INCDEFRATE, 100, -20, skill_get_time2(skill_id, skill_lv));
+		return 14; //To make sure a valid number is returned
 	}
+	}
+
+	return card;
 }
 
 /*==========================================

+ 0 - 8
src/map/status.c

@@ -9540,14 +9540,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			}
 			break;
 
-		case SC_TAROTCARD:
-			sc_start(src, bl, SC_INCATKRATE, 100, -20, tick);
-			sc_start(src, bl, SC_INCMATKRATE, 100, -20, tick);
-			sc_start(src, bl, SC_INCHITRATE, 100, -20, tick);
-			sc_start(src, bl, SC_INCFLEERATE, 100, -20, tick);
-			sc_start(src, bl, SC_INCDEFRATE, 100, -20, tick);
-			break;
-
 		case SC_MARIONETTE:
 		{
 			int stat;