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
This commit is contained in:
Playtester 2016-12-12 19:10:28 +01:00
parent 0e78dfca26
commit b4225e8436
5 changed files with 72 additions and 37 deletions

View File

@ -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

View File

@ -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"
};

View File

@ -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;

View File

@ -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;
}
/*==========================================

View File

@ -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;