Beispiel #1
0
bool item_t::decode_addon()
{
  if ( encoded_addon_str == "none" ) return true;

  if ( encoded_addon_str == "synapse_springs" )
  {
    unique_addon = true;
    return true;
  }

  std::string use_str;
  if ( unique_gear_t::get_use_encoding( use_str, encoded_addon_str, heroic(), lfr(), player -> dbc.ptr ) )
  {
    unique_addon = true;
    use.name_str = encoded_addon_str;
    return decode_special( use, use_str );
  }

  std::string equip_str;
  if ( unique_gear_t::get_equip_encoding( equip_str, encoded_addon_str, heroic(), lfr(), player -> dbc.ptr ) )
  {
    unique_addon = true;
    addon.name_str = encoded_addon_str;
    return decode_special( addon, equip_str );
  }

  std::vector<token_t> tokens;
  int num_tokens = parse_tokens( tokens, encoded_addon_str );

  for ( int i=0; i < num_tokens; i++ )
  {
    token_t& t = tokens[ i ];
    int s;

    if ( ( s = util_t::parse_stat_type( t.name ) ) != STAT_NONE )
    {
      stats.add_stat( s, t.value );
    }
    else
    {
      sim -> errorf( "Player %s has unknown 'addon=' token '%s' at slot %s\n", player -> name(), t.full.c_str(), slot_name() );
      return false;
    }
  }

  return true;
}
Beispiel #2
0
bool item_t::init()
{
  parse_options();

  encoded_name_str = armory_name_str;

  if ( ! option_name_str.empty() ) encoded_name_str = option_name_str;

  if ( ! option_id_str.empty() )
  {
    if ( ! item_t::download_item( *this, option_id_str ) )
    {
      return false;
    }

    if ( encoded_name_str != armory_name_str )
    {
      sim -> errorf( "Player %s at slot %s has inconsistency between name '%s' and '%s' for id '%s'\n",
                     player -> name(), slot_name(), option_name_str.c_str(), armory_name_str.c_str(), option_id_str.c_str() );

      encoded_name_str = armory_name_str;
    }
  }

  if ( encoded_name_str != "empty" &&
      encoded_name_str != "none" )
  {
    id_str                    = armory_id_str;
    encoded_stats_str         = armory_stats_str;
    encoded_reforge_str       = armory_reforge_str;
    encoded_gems_str          = armory_gems_str;
    encoded_enchant_str       = armory_enchant_str;
    encoded_addon_str         = armory_addon_str;
    encoded_weapon_str        = armory_weapon_str;
    encoded_heroic_str        = armory_heroic_str;
    encoded_lfr_str           = armory_lfr_str;
    encoded_armor_type_str    = armory_armor_type_str;
    encoded_ilevel_str        = armory_ilevel_str;
    encoded_quality_str       = armory_quality_str;
    encoded_random_suffix_str = armory_random_suffix_str;
  }

  if ( ! option_heroic_str.empty()  ) encoded_heroic_str  = option_heroic_str;

  if ( ! decode_heroic()  ) return false;

  if ( ! option_lfr_str.empty() ) encoded_lfr_str = option_lfr_str;

  if ( ! decode_lfr() ) return false;

  if ( ! option_armor_type_str.empty() ) encoded_armor_type_str = option_armor_type_str;

  if ( ! decode_armor_type() ) return false;

  if ( ! option_ilevel_str.empty() ) encoded_ilevel_str = option_ilevel_str;

  if ( ! decode_ilevel() ) return false;

  if ( ! option_quality_str.empty() ) encoded_quality_str = option_quality_str;

  if ( ! decode_quality() ) return false;

  unique_gear_t::get_equip_encoding( encoded_equip_str, encoded_name_str, heroic(), lfr(), player -> dbc.ptr, id_str );
  unique_gear_t::get_use_encoding  ( encoded_use_str,   encoded_name_str, heroic(), lfr(), player -> dbc.ptr, id_str );

  if ( ! option_stats_str.empty()   ) encoded_stats_str   = option_stats_str;
  if ( ! option_reforge_str.empty() ) encoded_reforge_str = option_reforge_str;
  if ( ! option_gems_str.empty()    ) encoded_gems_str    = option_gems_str;
  if ( ! option_enchant_str.empty() )
  {
    if ( ( slot == SLOT_FINGER_1 || slot == SLOT_FINGER_2 ) && ! ( player -> profession[ PROF_ENCHANTING ] > 0 ) )
    {
      sim -> errorf( "Player %s's ring at slot %s has a ring enchant without the enchanting profession\n",
                     player -> name(), slot_name() );
    }
    else
    {
      encoded_enchant_str = option_enchant_str;
    }
  }
  if ( ! option_addon_str.empty()   ) encoded_addon_str   = option_addon_str;
  if ( ! option_weapon_str.empty()  ) encoded_weapon_str  = option_weapon_str;
  if ( ! option_random_suffix_str.empty() ) encoded_random_suffix_str = option_random_suffix_str;


  if ( ! decode_stats()         ) return false;
  if ( ! decode_gems()          ) return false;
  if ( ! decode_enchant()       ) return false;
  if ( ! decode_addon()         ) return false;
  if ( ! decode_weapon()        ) return false;
  if ( ! decode_random_suffix() ) return false;
  if ( ! decode_reforge()       ) return false;

  if ( ! option_equip_str.empty() ) encoded_equip_str = option_equip_str;
  if ( ! option_use_str.empty()   ) encoded_use_str   = option_use_str;

  if ( ! decode_special(   use, encoded_use_str   ) ) return false;
  if ( ! decode_special( equip, encoded_equip_str ) ) return false;

  encode_options();

  return true;
}
Beispiel #3
0
bool item_t::decode_enchant()
{
  if ( encoded_enchant_str == "none" ) return true;

  if ( encoded_enchant_str == "berserking"       ||
      encoded_enchant_str == "executioner"      ||
      encoded_enchant_str == "mongoose"         ||
      encoded_enchant_str == "avalanche"        ||
      encoded_enchant_str == "elemental_slayer" ||
      encoded_enchant_str == "hurricane"        ||
      encoded_enchant_str == "landslide"        ||
      encoded_enchant_str == "power_torrent"    ||
      encoded_enchant_str == "windwalk"         ||
      encoded_enchant_str == "spellsurge"       ||
      encoded_enchant_str == "synapse_springs"  ||
      encoded_enchant_str == "gnomish_xray"      )
  {
    unique_enchant = true;
    return true;
  }

  if ( encoded_enchant_str == "lightweave_embroidery" ||
       encoded_enchant_str == "lightweave_embroidery_old" ||
       encoded_enchant_str == "lightweave" ||
       encoded_enchant_str == "lightweave_old" ||
       encoded_enchant_str == "swordguard_embroidery" ||
       encoded_enchant_str == "swordguard_embroidery_old" ||
       encoded_enchant_str == "darkglow_embroidery" ||
       encoded_enchant_str == "darkglow_embroidery_old" )
  {
    stats.add_stat( STAT_SPIRIT, 1 );
  }

  std::string use_str;
  if ( unique_gear_t::get_use_encoding( use_str, encoded_enchant_str, heroic(), lfr(), player -> dbc.ptr ) )
  {
    unique_enchant = true;
    use.name_str = encoded_enchant_str;
    return decode_special( use, use_str );
  }

  std::string equip_str;
  if ( unique_gear_t::get_equip_encoding( equip_str, encoded_enchant_str, heroic(), lfr(), player -> dbc.ptr ) )
  {
    unique_enchant = true;
    enchant.name_str = encoded_enchant_str;
    return decode_special( enchant, equip_str );
  }

  std::vector<token_t> tokens;
  int num_tokens = parse_tokens( tokens, encoded_enchant_str );

  for ( int i=0; i < num_tokens; i++ )
  {
    token_t& t = tokens[ i ];
    int s;

    if ( ( s = util_t::parse_stat_type( t.name ) ) != STAT_NONE )
    {
      stats.add_stat( s, t.value );
    }
    else
    {
      sim -> errorf( "Player %s has unknown 'enchant=' token '%s' at slot %s\n", player -> name(), t.full.c_str(), slot_name() );
      continue;
    }
  }

  return true;
}
Beispiel #4
0
void EArm::decode()
{
  willExecute=false;
  cond=(opcode>>28)&0xf;
  op1.init();  op2.init();  op3.init();
  unsigned int rn,rd,rs,rm,imm;
  switch(mode) {
    case EARM_NONE:
      break;
    case EARM_SPECIAL:
      decode_special();
      break;
    case EARM_ILLEGAL:
      debugger("illegal mode in decode!");
      break;
    case EARM_REG_IMM:
      rn=(opcode>>16)&0xf;
      rd=(opcode>>12)&0xf;
      rs=(opcode>>8)&0xf;
      opcode2=(opcode>>4)&0xf;
      imm=opcode&0xf;
      op1.mode=EARM_REG;  op1.reg=rd;
      op2.mode=EARM_IMM;  op2.val=imm;
      break;
    case EARM_REG_IMM2:
      rn=(opcode>>16)&0xf;
      rd=(opcode>>12)&0xf;
      rs=(opcode>>8)&0xf;
      opcode2=(opcode>>4)&0xf;
      imm=opcode&0xf;
      op1.mode=EARM_REG;  op1.reg=rn;
      op2.mode=EARM_IMM;  op2.val=imm;
      break;
    case EARM_REG_REG:
      rn=(opcode>>16)&0xf;
      rd=(opcode>>12)&0xf;
      rs=(opcode>>8)&0xf;
      opcode2=(opcode>>4)&0xf;
      rm=opcode&0xf;
      op1.mode=EARM_REG;  op1.reg=rd;
      op2.mode=EARM_REG;  op2.reg=rm;
      break;
    case EARM_REG_REG2:
      rn=(opcode>>16)&0xf;
      rd=(opcode>>12)&0xf;
      rs=(opcode>>8)&0xf;
      opcode2=(opcode>>4)&0xf;
      rm=opcode&0xf;
      op1.mode=EARM_REG;  op1.reg=rn;
      op2.mode=EARM_REG;  op2.reg=rm;
      break;
    case EARM_REG_REG_REG:
      rn=(opcode>>16)&0xf;
      rd=(opcode>>12)&0xf;
      rs=(opcode>>8)&0xf;
      opcode2=(opcode>>4)&0xf;
      rm=opcode&0xf;
      op1.mode=EARM_REG;  op1.reg=rd;
      op2.mode=EARM_REG;  op2.reg=rn;
      op3.mode=EARM_REG;  op3.reg=rm;
      break;
    case EARM_REG_REG_IMM:
      rn=(opcode>>16)&0xf;
      rd=(opcode>>12)&0xf;
      rs=(opcode>>8)&0xf;
      opcode2=(opcode>>4)&0xf;
      imm=opcode&0xf;
      op1.mode=EARM_REG;  op1.reg=rd;
      op2.mode=EARM_REG;  op2.reg=rn;
      op3.mode=EARM_IMM;  op3.val=imm;
      break;
    case EARM_DISP:
      imm=sign_ext(opcode&0xffffff,24);
      op1.mode=EARM_DISP;  op1.val=imm*4;
      break;
    case EARM_REG_ADDR:
      rn=(opcode>>16)&0xf;
      rd=(opcode>>12)&0xf;
      imm=opcode&0xfff;
      op1.mode=EARM_REG;  op1.reg=rd;
      op2.mode=EARM_INDREG;  op2.reg=rn;  op2.val=-imm;
      break;
    case EARM_MULTREG:
      rn=(opcode>>16)&0xf;
      imm=opcode&0xffff;
      op1.mode=EARM_REG;  op1.reg=rn;
      op2.mode=EARM_MULTREG;  op2.val=imm;
      break;
    default:
      DEBUG_OUT<<"Mode was "<<mode<<"\n";
      debugger("unknown mode in decode!");
      break;
  }
  if(cond==EARM_CC_NEVER) {
    decode_special();
  }
  else {
    if(cond==EARM_CC_ALWAYS) willExecute=true;
    else {
      // TODO: Check cond code, set willExecute to true if necessary
    }
  }
}