Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool WeaponDistance::useWeapon(Player* player, Item* item, Creature* target) const
- {
- int32_t modifier = playerWeaponCheck(player, target);
- if(!modifier)
- return false;
- int32_t chance = hitChance;
- if(chance == -1)
- {
- //hit chance is based on distance to target and distance skill
- const Position& playerPos = player->getPosition();
- const Position& targetPos = target->getPosition();
- uint32_t distance = std::max(std::abs(playerPos.x - targetPos.x), std::abs(
- playerPos.y - targetPos.y)), skill = player->getSkill(SKILL_DIST, SKILL_LEVEL);
- if(maxHitChance == 75)
- {
- //chance for one-handed weapons
- switch(distance)
- {
- case 1:
- chance = (uint32_t)((float)std::min(skill, (uint32_t)74)) + 1;
- break;
- case 2:
- chance = (uint32_t)((float)2.4 * std::min(skill, (uint32_t)28)) + 8;
- break;
- case 3:
- chance = (uint32_t)((float)1.55 * std::min(skill, (uint32_t)45)) + 6;
- break;
- case 4:
- chance = (uint32_t)((float)1.25 * std::min(skill, (uint32_t)58)) + 3;
- break;
- case 5:
- chance = (uint32_t)((float)std::min(skill, (uint32_t)74)) + 1;
- break;
- case 6:
- chance = (uint32_t)((float)0.8 * std::min(skill, (uint32_t)90)) + 3;
- break;
- case 7:
- chance = (uint32_t)((float)0.7 * std::min(skill, (uint32_t)104)) + 2;
- break;
- default:
- chance = hitChance;
- break;
- }
- }
- else if(maxHitChance == 90)
- {
- //formula for two-handed weapons
- switch(distance)
- {
- case 1:
- chance = (uint32_t)((float)1.2 * std::min(skill, (uint32_t)74)) + 1;
- break;
- case 2:
- chance = (uint32_t)((float)3.2 * std::min(skill, (uint32_t)28));
- break;
- case 3:
- chance = (uint32_t)((float)2.0 * std::min(skill, (uint32_t)45));
- break;
- case 4:
- chance = (uint32_t)((float)1.55 * std::min(skill, (uint32_t)58));
- break;
- case 5:
- chance = (uint32_t)((float)1.2 * std::min(skill, (uint32_t)74)) + 1;
- break;
- case 6:
- chance = (uint32_t)((float)1.0 * std::min(skill, (uint32_t)90));
- break;
- case 7:
- chance = (uint32_t)((float)1.0 * std::min(skill, (uint32_t)90));
- break;
- default:
- chance = hitChance;
- break;
- }
- }
- else if(maxHitChance == 100)
- {
- switch(distance)
- {
- case 1:
- chance = (uint32_t)((float)1.35 * std::min(skill, (uint32_t)73)) + 1;
- break;
- case 2:
- chance = (uint32_t)((float)3.2 * std::min(skill, (uint32_t)30)) + 4;
- break;
- case 3:
- chance = (uint32_t)((float)2.05 * std::min(skill, (uint32_t)48)) + 2;
- break;
- case 4:
- chance = (uint32_t)((float)1.5 * std::min(skill, (uint32_t)65)) + 2;
- break;
- case 5:
- chance = (uint32_t)((float)1.35 * std::min(skill, (uint32_t)73)) + 1;
- break;
- case 6:
- chance = (uint32_t)((float)1.2 * std::min(skill, (uint32_t)87)) - 4;
- break;
- case 7:
- chance = (uint32_t)((float)1.1 * std::min(skill, (uint32_t)90)) + 1;
- break;
- default:
- chance = hitChance;
- break;
- }
- }
- else
- chance = maxHitChance;
- }
- if(item->getWeaponType() == WEAPON_AMMO)
- {
- Item* bow = player->getWeapon(true);
- if(bow && bow->getHitChance() != -1)
- chance += bow->getHitChance();
- }
- if(random_range(1, 100) > chance)
- {
- //we failed attack, miss!
- Tile* destTile = target->getTile();
- if(!Position::areInRange<1,1,0>(player->getPosition(), target->getPosition()))
- {
- std::vector<std::pair<int32_t, int32_t> > destList;
- destList.push_back(std::make_pair(-1, -1));
- destList.push_back(std::make_pair(-1, 0));
- destList.push_back(std::make_pair(-1, 1));
- destList.push_back(std::make_pair(0, -1));
- destList.push_back(std::make_pair(0, 0));
- destList.push_back(std::make_pair(0, 1));
- destList.push_back(std::make_pair(1, -1));
- destList.push_back(std::make_pair(1, 0));
- destList.push_back(std::make_pair(1, 1));
- std::random_shuffle(destList.begin(), destList.end());
- Position destPos = target->getPosition();
- Tile* tmpTile = NULL;
- for(std::vector<std::pair<int32_t, int32_t> >::iterator it = destList.begin(); it != destList.end(); ++it)
- {
- if((tmpTile = g_game.getTile(destPos.x + it->first, destPos.y + it->second, destPos.z))
- && !tmpTile->hasProperty(IMMOVABLEBLOCKSOLID) && tmpTile->ground)
- {
- destTile = tmpTile;
- break;
- }
- }
- }
- Weapon::internalUseWeapon(player, item, destTile);
- }
- else
- Weapon::internalUseWeapon(player, item, target, modifier);
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement