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 // 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). // damage skills (previous behavior).
can_damage_skill: 1 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, }, { "can_damage_skill", &battle_config.can_damage_skill, 1, 0, BL_ALL, },
{ "atcommand_levelup_events", &battle_config.atcommand_levelup_events, 0, 0, 1, }, { "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, }, { "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" #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 can_damage_skill; //Which BL types can damage traps
int atcommand_levelup_events; int atcommand_levelup_events;
int block_account_in_same_party; int block_account_in_same_party;
int tarotcard_equal_chance; //Official or equal chance for each card
#include "../custom/battle_config_struct.inc" #include "../custom/battle_config_struct.inc"
} battle_config; } 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) 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); 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)); 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); 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); status_fix_damage(src, target, 1000, 0);
clif_damage(src, target, tick, 0, 0, 1000, 0, DMG_NORMAL, 0, false); 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 }; unsigned short where[] = { EQP_ARMOR, EQP_SHIELD, EQP_HELM };
skill_break_equip(src, target, where[rnd() % 3], 10000, BCT_ENEMY); 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)); 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); status_heal(target, 2000, 0, 0);
if (!map_flag_vs(target->m)) if (!map_flag_vs(target->m))
unit_warp(target, -1, -1, -1, CLR_TELEPORT); 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 // Recursive call
skill_tarotcard(src, target, skill_id, skill_lv, tick); skill_tarotcard(src, target, skill_id, skill_lv, tick);
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 }; enum sc_type sc[] = { SC_STOP, SC_FREEZE, SC_STONE };
uint8 rand_eff = rnd() % 3; 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)); 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); 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_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)); 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)); 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); status_fix_damage(src, target, 6666, 0);
clif_damage(src, target, tick, 0, 0, 6666, 0, DMG_NORMAL, 0, false); 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_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_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)); 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); status_fix_damage(src, target, 4444, 0);
clif_damage(src, target, tick, 0, 0, 4444, 0, DMG_NORMAL, 0, false); 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); 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)); 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; 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: case SC_MARIONETTE:
{ {
int stat; int stat;