Advertisement
Guest User

Battle system - Type effectiveness

a guest
Apr 25th, 2016
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.54 KB | None | 0 0
  1. struct type_effectiveness{
  2.     u8 attacking_type;
  3.     u8 defending_type;
  4.     u8 effect;
  5. } type_effectiveness_table[] = {
  6.     {TYPE_NORMAL, TYPE_ROCK, 5},
  7.     {TYPE_NORMAL, TYPE_STEEL, 5},
  8.     {TYPE_NORMAL, TYPE_GHOST, 0},
  9.     {TYPE_FIRE, TYPE_FIRE, 5},
  10.     {TYPE_FIRE, TYPE_WATER, 5},
  11.     {TYPE_FIRE, TYPE_GRASS, 20},
  12.     {TYPE_FIRE, TYPE_ICE, 20},
  13.     {TYPE_FIRE, TYPE_BUG, 20},
  14.     {TYPE_FIRE, TYPE_ROCK, 5},
  15.     {TYPE_FIRE, TYPE_DRAGON, 5},
  16.     {TYPE_FIRE, TYPE_STEEL, 20},
  17.     {TYPE_WATER, TYPE_FIRE, 20},
  18.     {TYPE_WATER, TYPE_WATER, 5},
  19.     {TYPE_WATER, TYPE_GRASS, 5},
  20.     {TYPE_WATER, TYPE_GROUND, 20},
  21.     {TYPE_WATER, TYPE_ROCK, 20},
  22.     {TYPE_WATER, TYPE_DRAGON, 5},
  23.     {TYPE_ELECTRIC, TYPE_WATER, 20},
  24.     {TYPE_ELECTRIC, TYPE_ELECTRIC, 5},
  25.     {TYPE_ELECTRIC, TYPE_GRASS, 5},
  26.     {TYPE_ELECTRIC, TYPE_GROUND, 0},
  27.     {TYPE_ELECTRIC, TYPE_FLYING, 20},
  28.     {TYPE_ELECTRIC, TYPE_DRAGON, 5},
  29.     {TYPE_GRASS, TYPE_FIRE, 5},
  30.     {TYPE_GRASS, TYPE_WATER, 20},
  31.     {TYPE_GRASS, TYPE_GRASS, 5},
  32.     {TYPE_GRASS, TYPE_POISON, 5},
  33.     {TYPE_GRASS, TYPE_GROUND, 20},
  34.     {TYPE_GRASS, TYPE_FLYING, 5},
  35.     {TYPE_GRASS, TYPE_BUG, 5},
  36.     {TYPE_GRASS, TYPE_ROCK, 20},
  37.     {TYPE_GRASS, TYPE_DRAGON, 5},
  38.     {TYPE_GRASS, TYPE_STEEL, 5},
  39.     {TYPE_ICE, TYPE_WATER, 5},
  40.     {TYPE_ICE, TYPE_GRASS, 20},
  41.     {TYPE_ICE, TYPE_ICE, 5},
  42.     {TYPE_ICE, TYPE_GROUND, 20},
  43.     {TYPE_ICE, TYPE_FLYING, 20},
  44.     {TYPE_ICE, TYPE_DRAGON, 20},
  45.     {TYPE_ICE, TYPE_STEEL, 5},
  46.     {TYPE_ICE, TYPE_FIRE, 5},
  47.     {TYPE_FIGHTING, TYPE_NORMAL, 20},
  48.     {TYPE_FIGHTING, TYPE_ICE, 20},
  49.     {TYPE_FIGHTING, TYPE_POISON, 5},
  50.     {TYPE_FIGHTING, TYPE_FLYING, 5},
  51.     {TYPE_FIGHTING, TYPE_PSYCHIC, 5},
  52.     {TYPE_FIGHTING, TYPE_BUG, 5},
  53.     {TYPE_FIGHTING, TYPE_ROCK, 20},
  54.     {TYPE_FIGHTING, TYPE_DARK, 20},
  55.     {TYPE_FIGHTING, TYPE_STEEL, 20},
  56.     {TYPE_FIGHTING, TYPE_GHOST, 0},
  57.     {TYPE_POISON, TYPE_GRASS, 20},
  58.     {TYPE_POISON, TYPE_POISON, 5},
  59.     {TYPE_POISON, TYPE_GROUND, 5},
  60.     {TYPE_POISON, TYPE_ROCK, 5},
  61.     {TYPE_POISON, TYPE_GHOST, 5},
  62.     {TYPE_POISON, TYPE_STEEL, 0},
  63.     {TYPE_GROUND, TYPE_FIRE, 20},
  64.     {TYPE_GROUND, TYPE_ELECTRIC, 20},
  65.     {TYPE_GROUND, TYPE_GRASS, 5},
  66.     {TYPE_GROUND, TYPE_POISON, 20},
  67.     {TYPE_GROUND, TYPE_FLYING, 0},
  68.     {TYPE_GROUND, TYPE_BUG, 5},
  69.     {TYPE_GROUND, TYPE_ROCK, 20},
  70.     {TYPE_GROUND, TYPE_STEEL, 20},
  71.     {TYPE_FLYING, TYPE_ELECTRIC, 5},
  72.     {TYPE_FLYING, TYPE_GRASS, 20},
  73.     {TYPE_FLYING, TYPE_FIGHTING, 20},
  74.     {TYPE_FLYING, TYPE_BUG, 20},
  75.     {TYPE_FLYING, TYPE_ROCK, 5},
  76.     {TYPE_FLYING, TYPE_STEEL, 5},
  77.     {TYPE_PSYCHIC, TYPE_FIGHTING, 20},
  78.     {TYPE_PSYCHIC, TYPE_POISON, 20},
  79.     {TYPE_PSYCHIC, TYPE_PSYCHIC, 5},
  80.     {TYPE_PSYCHIC, TYPE_DARK, 0},
  81.     {TYPE_PSYCHIC, TYPE_STEEL, 5},
  82.     {TYPE_BUG, TYPE_FIRE, 5},
  83.     {TYPE_BUG, TYPE_GRASS, 20},
  84.     {TYPE_BUG, TYPE_FIGHTING, 5},
  85.     {TYPE_BUG, TYPE_POISON, 5},
  86.     {TYPE_BUG, TYPE_FLYING, 5},
  87.     {TYPE_BUG, TYPE_PSYCHIC, 20},
  88.     {TYPE_BUG, TYPE_GHOST, 5},
  89.     {TYPE_BUG, TYPE_DARK, 20},
  90.     {TYPE_BUG, TYPE_STEEL, 5},
  91.     {TYPE_ROCK, TYPE_FIRE, 20},
  92.     {TYPE_ROCK, TYPE_ICE, 20},
  93.     {TYPE_ROCK, TYPE_FIGHTING, 5},
  94.     {TYPE_ROCK, TYPE_GROUND, 5},
  95.     {TYPE_ROCK, TYPE_FLYING, 20},
  96.     {TYPE_ROCK, TYPE_BUG, 20},
  97.     {TYPE_ROCK, TYPE_STEEL, 5},
  98.     {TYPE_GHOST, TYPE_NORMAL, 0},
  99.     {TYPE_GHOST, TYPE_PSYCHIC, 20},
  100.     {TYPE_GHOST, TYPE_DARK, 0},
  101.     {TYPE_GHOST, TYPE_GHOST, 20},
  102.     {TYPE_DRAGON, TYPE_DRAGON, 20},
  103.     {TYPE_DRAGON, TYPE_STEEL, 5},
  104.     {TYPE_DARK, TYPE_FIGHTING, 5},
  105.     {TYPE_DARK, TYPE_PSYCHIC, 20},
  106.     {TYPE_DARK, TYPE_GHOST, 20},
  107.     {TYPE_DARK, TYPE_DARK, 5},
  108.     {TYPE_STEEL, TYPE_FIRE, 5},
  109.     {TYPE_STEEL, TYPE_WATER, 5},
  110.     {TYPE_STEEL, TYPE_ELECTRIC, 5},
  111.     {TYPE_STEEL, TYPE_ICE, 20},
  112.     {TYPE_STEEL, TYPE_ROCK, 20},
  113.     {TYPE_STEEL, TYPE_STEEL, 5}, //now fairy type
  114.     {TYPE_STEEL, TYPE_FAIRY, 20},
  115.     {TYPE_POISON, TYPE_FAIRY, 20},
  116.     {TYPE_BUG, TYPE_FAIRY, 5},
  117.     {TYPE_DARK, TYPE_FAIRY, 5},
  118.     {TYPE_FIGHTING, TYPE_FAIRY, 5},
  119.     {TYPE_DRAGON, TYPE_FAIRY, 0},
  120.     {TYPE_FAIRY, TYPE_DRAGON, 20},
  121.     {TYPE_FAIRY, TYPE_POISON, 5},
  122.     {TYPE_FAIRY, TYPE_STEEL, 5},
  123.     {TYPE_FAIRY, TYPE_FIRE, 5},
  124.     {TYPE_FAIRY, TYPE_DARK, 20},
  125.     {TYPE_FAIRY, TYPE_FIGHTING, 20},
  126.     {0xFF, 0xFF, 0xFF}
  127. };
  128.  
  129.  
  130. u32 apply_type_effectiveness(u32 damage, u8 move_type, u8 target_bank, u8 atk_bank)
  131. {
  132.     u8 defender_type1 = battle_participants[target_bank].type1;
  133.     u8 defender_type2 = battle_participants[target_bank].type2;
  134.     u8 defender_type3 = new_battlestruct.ptr->bank_affecting[target_bank].type3;
  135.  
  136.     //set different types
  137.  
  138.     if (defender_type2 == defender_type1)
  139.         defender_type2 = TYPE_EGG;
  140.     if (defender_type3 == defender_type1 || defender_type3 == defender_type2)
  141.         defender_type3 = TYPE_EGG;
  142.  
  143.     for (u8 i = 0; type_effectiveness_table[i].attacking_type != 0xFF; i++)
  144.     {
  145.         if (move_type == type_effectiveness_table[i].attacking_type && (defender_type1 == type_effectiveness_table[i].defending_type || defender_type2 == type_effectiveness_table[i].defending_type || defender_type3 == type_effectiveness_table[i].defending_type))
  146.         {
  147.             damage = damage_type_effectiveness_update(type_effectiveness_table[i].attacking_type, type_effectiveness_table[i].defending_type, type_effectiveness_table[i].effect, atk_bank, target_bank, damage);
  148.         }
  149.     }
  150.  
  151.     return damage;
  152. }
  153.  
  154. u32 damage_type_effectiveness_update (u8 attacking_type, u8 defending_type, u8 effect, u8 atk_bank, u8 def_bank, u32 damage)
  155. {
  156.     if (new_battlestruct.ptr->various.inverse_battle)
  157.     {
  158.         if (effect == 20)
  159.         {
  160.             effect = 5;
  161.         }
  162.         else if (effect == 5 || effect == 0)
  163.         {
  164.             effect = 20;
  165.         }
  166.     }
  167.  
  168.     if (((attacking_type == TYPE_NORMAL || attacking_type == TYPE_FIGHTING) && defending_type == TYPE_GHOST && ((battle_participants[atk_bank].status2 & 0x20000000))) || battle_participants[atk_bank].ability_id == ABILITY_SCRAPPY && effect == 0)
  169.     {
  170.         effect = 10;
  171.     }
  172.  
  173.     else if ((attacking_type == TYPE_PSYCHIC) && defending_type == TYPE_DARK && new_battlestruct.ptr->bank_affecting[atk_bank].miracle_eyed && effect == 0)
  174.     {
  175.         effect = 10;
  176.     }
  177.  
  178.     else if (effect == 0 && (get_item_effect(def_bank, true) == ITEM_EFFECT_RINGTARGET))
  179.     {
  180.         effect = 10;
  181.     }
  182.     else if (battle_weather.flags.air_current && defending_type == TYPE_FLYING && effect == 20)
  183.     {
  184.         effect = 10;
  185.     }
  186.     else if (attacking_type == TYPE_GROUND)
  187.     {
  188.         if ((new_battlestruct.ptr->field_affecting.gravity || get_item_effect(def_bank, true) == ITEM_EFFECT_IRONBALL) && effect == 0)
  189.         {
  190.             effect = 10;
  191.         }
  192.         else if ((defending_type == TYPE_FLYING && effect == 0) || battle_participants[def_bank].ability_id == ABILITY_LEVITATE || (get_item_effect(def_bank, true) == ITEM_EFFECT_AIRBALLOON && !new_battlestruct.ptr->bank_affecting[def_bank].popped_air_balloon) || new_battlestruct.ptr->bank_affecting[def_bank].magnet_rise || new_battlestruct.ptr->bank_affecting[def_bank].telekinesis)
  193.         {
  194.             if (new_battlestruct.ptr->bank_affecting[def_bank].smacked_down)
  195.             {
  196.                 effect = 10;
  197.             }
  198.             else
  199.             {
  200.                 effect = 10;
  201.             }
  202.         }
  203.     }
  204.     else if (current_move == MOVE_FREEZEDRY && defending_type == TYPE_WATER)
  205.     {
  206.         effect = 20;
  207.     }
  208.  
  209.     damage_loc = damage;
  210.     damage_modulate_by_type_effectivity(effect);
  211.     damage = damage_loc;
  212.  
  213.     return damage;
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement