Advertisement
Mahiro1

Tarot 255

Mar 29th, 2020
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.08 KB | None | 0 0
  1. /*========================================== [Playtester]
  2. * Process tarot card's effects
  3. * @param src: Source of the tarot card effect
  4. * @param target: Target of the tartor card effect
  5. * @param skill_id: ID of the skill used
  6. * @param skill_lv: Level of the skill used
  7. * @param tick: Processing tick time
  8. * @return Card number
  9. *------------------------------------------*/
  10. static int skill_tarotcard(struct block_list* src, struct block_list *target, uint16 skill_id, uint16 skill_lv, t_tick tick)
  11. {
  12.     int card = 0;
  13.  
  14.     if (battle_config.tarotcard_equal_chance) {
  15.         //eAthena equal chances
  16.         card = rnd() % 14 + 1;
  17.     }
  18.     else {
  19.         //Official chances
  20.         int rate = rnd() % 100;
  21.         if (rate < 10) card = 1; // THE FOOL
  22.         else if (rate < 20) card = 2; // THE MAGICIAN
  23.         else if (rate < 30) card = 3; // THE HIGH PRIESTESS
  24.         else if (rate < 37) card = 4; // THE CHARIOT
  25.         else if (rate < 47) card = 5; // STRENGTH
  26.         else if (rate < 62) card = 6; // THE LOVERS
  27.         else if (rate < 63) card = 7; // WHEEL OF FORTUNE
  28.         else if (rate < 69) card = 8; // THE HANGED MAN
  29.         else if (rate < 74) card = 9; // DEATH
  30.         else if (rate < 82) card = 10; // TEMPERANCE
  31.         else if (rate < 83) card = 11; // THE DEVIL
  32.         else if (rate < 85) card = 12; // THE TOWER
  33.         else if (rate < 90) card = 13; // THE STAR
  34.         else card = 14; // THE SUN
  35.     }
  36.  
  37.     switch (card) {
  38.     case 1: // THE FOOL - heals SP to 0
  39.     {
  40.         status_percent_damage(src, target, 0, 100, false);
  41.         break;
  42.     }
  43.     case 2: // THE MAGICIAN - matk halved
  44.     {
  45.         sc_start(src, target, SC_INCMATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv));
  46.         break;
  47.     }
  48.     case 3: // THE HIGH PRIESTESS - all buffs removed
  49.     {
  50.         status_change_clear_buffs(target, SCCB_BUFFS | SCCB_CHEM_PROTECT);
  51.         break;
  52.     }
  53.     case 4: // THE CHARIOT - 1000 damage, random armor destroyed
  54.     {
  55.         status_fix_damage(src, target, 30000, 0, skill_id);
  56.         clif_damage(src, target, tick, 0, 0, 30000, 0, DMG_NORMAL, 0, false);
  57.         if (!status_isdead(target))
  58.         {
  59.             unsigned short where[] = { EQP_ARMOR, EQP_SHIELD, EQP_HELM };
  60.             skill_break_equip(src, target, where[rnd() % 3], 10000, BCT_ENEMY);
  61.         }
  62.         break;
  63.     }
  64.     case 5: // STRENGTH - atk halved
  65.     {
  66.         sc_start(src, target, SC_INCATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv));
  67.         break;
  68.     }
  69.     case 6: // THE LOVERS - 2000HP heal, random teleported
  70.     {
  71.         status_heal(target, 20000, 0, 0);
  72.         if (!map_flag_vs(target->m))
  73.             unit_warp(target, -1, -1, -1, CLR_TELEPORT);
  74.         break;
  75.     }
  76.     case 7: // WHEEL OF FORTUNE - random 2 other effects
  77.     {
  78.         // Recursive call
  79.         skill_tarotcard(src, target, skill_id, skill_lv, tick);
  80.         skill_tarotcard(src, target, skill_id, skill_lv, tick);
  81.         break;
  82.     }
  83.     case 8: // THE HANGED MAN - stop, freeze or stoned
  84.     {
  85.         enum sc_type sc[] = { SC_STOP, SC_FREEZE, SC_STONE };
  86.         uint8 rand_eff = rnd() % 3;
  87.         int time = ((rand_eff == 0) ? skill_get_time2(skill_id, skill_lv) : skill_get_time2(status_sc2skill(sc[rand_eff]), 1));
  88.         sc_start(src, target, sc[rand_eff], 100, skill_lv, time);
  89.         break;
  90.     }
  91.     case 9: // DEATH - curse, coma and poison
  92.     {
  93.         status_change_start(src, target, SC_COMA, 10000, skill_lv, 0, src->id, 0, 0, SCSTART_NONE);
  94.         sc_start(src, target, SC_CURSE, 100, skill_lv, skill_get_time2(status_sc2skill(SC_CURSE), 1));
  95.         sc_start2(src, target, SC_POISON, 100, skill_lv, src->id, skill_get_time2(status_sc2skill(SC_POISON), 1));
  96.         break;
  97.     }
  98.     case 10: // TEMPERANCE - confusion
  99.     {
  100.         sc_start(src, target, SC_CONFUSION, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
  101.         break;
  102.     }
  103.     case 11: // THE DEVIL - 6666 damage, atk and matk halved, cursed
  104.     {
  105.         status_fix_damage(src, target, 66666, 0, skill_id);
  106.         clif_damage(src, target, tick, 0, 0, 66666, 0, DMG_NORMAL, 0, false);
  107.         sc_start(src, target, SC_INCATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv));
  108.         sc_start(src, target, SC_INCMATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv));
  109.         sc_start(src, target, SC_CURSE, skill_lv, 100, skill_get_time2(status_sc2skill(SC_CURSE), 1));
  110.         break;
  111.     }
  112.     case 12: // THE TOWER - 4444 damage
  113.     {
  114.         status_fix_damage(src, target, 44444, 0, skill_id);
  115.         clif_damage(src, target, tick, 0, 0, 44444, 0, DMG_NORMAL, 0, false);
  116.         break;
  117.     }
  118.     case 13: // THE STAR - stun
  119.     {
  120.         sc_start(src, target, SC_STUN, 100, skill_lv, skill_get_time2(status_sc2skill(SC_STUN), 1));
  121.         break;
  122.     }
  123.     default: // THE SUN - atk, matk, hit, flee and def reduced, immune to more tarot card effects
  124.     {
  125. #ifdef RENEWAL
  126.         //In renewal, this card gives the SC_TAROTCARD status change which makes you immune to other cards
  127.         sc_start(src, target, SC_TAROTCARD, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
  128. #endif
  129.         sc_start(src, target, SC_INCATKRATE, 100, -20, skill_get_time2(skill_id, skill_lv));
  130.         sc_start(src, target, SC_INCMATKRATE, 100, -20, skill_get_time2(skill_id, skill_lv));
  131.         sc_start(src, target, SC_INCHITRATE, 100, -20, skill_get_time2(skill_id, skill_lv));
  132.         sc_start(src, target, SC_INCFLEERATE, 100, -20, skill_get_time2(skill_id, skill_lv));
  133.         sc_start(src, target, SC_INCDEFRATE, 100, -20, skill_get_time2(skill_id, skill_lv));
  134.         return 14; //To make sure a valid number is returned
  135.     }
  136.     }
  137.  
  138.     return card;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement