完成武器升级逻辑

This commit is contained in:
aozhiwei 2019-05-21 19:23:56 +08:00
parent ff825e13db
commit 6b64b8ede3
18 changed files with 162 additions and 25 deletions

View File

@ -65,7 +65,11 @@ void Bullet::Update(int delta_time)
}
}
}//end for
if (!objects.empty() || distance > gun_meta->i->range() ||
float bullet_range = gun_meta->i->range();
if (gun_upgrade_meta && gun_upgrade_meta->attr[EA_ShotRange] > 0) {
bullet_range += gun_upgrade_meta->attr[EA_ShotRange];
}
if (!objects.empty() || distance > bullet_range ||
(IsBomb() && meta->i->_inventory_slot() != 4 && distance >= fly_distance)
) {
if (IsBomb()) {

View File

@ -6,6 +6,7 @@ namespace MetaData
{
struct Player;
struct Equip;
struct EquipUpgrade;
}
class Human;
@ -14,6 +15,7 @@ class Bullet : public Entity
{
public:
MetaData::Equip* gun_meta = nullptr;
MetaData::EquipUpgrade* gun_upgrade_meta = nullptr;
MetaData::Equip* meta = nullptr;
Human* player = nullptr;
Vector2D dir;

View File

@ -122,13 +122,13 @@ enum VirtualPlayer_e
VP_Mine = 9000003,
};
enum EquipAttr
enum EquipAttr_e
{
EA_HP = 1,
EA_Dmg = 2,
EA_ShotRange = 3,
EA_ShotSpeed = 4,
EA_Def = 5,
EA_View = 1, //客户端用
EA_ShotRange = 2,
EA_Volume = 3,
EA_AutoAngle = 4, //客户端用
EA_BulletAngle = 5,
EA_End
};

View File

@ -68,6 +68,7 @@ void FrameEvent::AddBullet(Human* hum, Vector2D born_pos, Vector2D dir, float fl
dir.ToPB(p.mutable_dir());
p.set_bulletskin(10001);
p.set_gun_id(hum->curr_weapon->meta->i->id());
p.set_gun_lv(hum->curr_weapon->weapon_lv);
p.set_fly_distance(fly_distance);
}
{

View File

@ -25,6 +25,7 @@ Human::Human():Entity()
default_weapon.weapon_lv = 1;
default_weapon.ammo = 1;
default_weapon.meta = MetaMgr::Instance()->GetEquip(default_weapon.weapon_id);
default_weapon.Recalc();
weapons.reserve(MAX_WEAPON_NUM);
for (size_t i = 0; i < MAX_WEAPON_NUM; ++i) {
auto& weapon = a8::FastAppend(weapons);
@ -195,12 +196,18 @@ void Human::Shot(Vector2D& target_dir)
Vector2D bullet_born_pos = pos + bullet_born_offset;
Vector2D bullet_dir = attack_dir;
float bullet_angle = std::get<2>(tuple);
if (curr_weapon->meta->i->bullet_angle() >= 1.0f) {
bullet_angle += (rand() % (int)curr_weapon->meta->i->bullet_angle()) * (rand() % 2 == 0 ? 1 : -1);
if (curr_weapon->meta->i->bullet_angle() >= 0.10f) {
int angle = (int)curr_weapon->meta->i->bullet_angle() * 1000;
if (curr_weapon->upgrade_meta) {
angle -= curr_weapon->upgrade_meta->attr[EA_BulletAngle] * 1000;
}
if (angle > 0) {
bullet_angle += (rand() % angle) / 1000.0f * (rand() % 2 == 0 ? 1 : -1);
}
}
bullet_dir.Rotate(bullet_angle / 180.0f);
room->frame_event.AddBullet(this, bullet_born_pos, attack_dir, fly_distance);
room->CreateBullet(this, curr_weapon->meta, bullet_born_pos, attack_dir, fly_distance);
room->CreateBullet(this, curr_weapon, bullet_born_pos, attack_dir, fly_distance);
}
--curr_weapon->ammo;
int slot_id = curr_weapon->meta->i->_inventory_slot();
@ -397,7 +404,7 @@ void Human::AutoLoadingBullet(bool manual)
{
if (curr_weapon->weapon_idx != 0 &&
(curr_weapon->ammo <= 0 ||
(manual && curr_weapon->ammo < curr_weapon->meta->i->clip_volume()))
(manual && curr_weapon->ammo < curr_weapon->GetClipVolume()))
) {
MetaData::Equip* bullet_meta = MetaMgr::Instance()->GetEquip(curr_weapon->meta->i->use_bullet());
if (bullet_meta &&
@ -727,6 +734,7 @@ void Human::Land()
weapons[GUN_SLOT1].weapon_lv = 1;
weapons[GUN_SLOT1].ammo = 0;
weapons[GUN_SLOT1].meta = weapon_meta;
weapons[GUN_SLOT1].Recalc();
curr_weapon = &weapons[GUN_SLOT1];
}
}
@ -1516,17 +1524,17 @@ void Human::UpdateAction()
MetaData::Equip* bullet_meta = MetaMgr::Instance()->GetEquip(curr_weapon->meta->i->use_bullet());
if (bullet_meta) {
int ammo = curr_weapon->ammo;
if (ammo < curr_weapon->meta->i->clip_volume()) {
if (ammo < curr_weapon->GetClipVolume()) {
if (bullet_meta->i->_inventory_slot() >= 0 &&
bullet_meta->i->_inventory_slot() < IS_END) {
if (GetInventory(bullet_meta->i->_inventory_slot()) > 0) {
int add_num = 0;
if (GetInventory(bullet_meta->i->_inventory_slot()) <=
curr_weapon->meta->i->clip_volume() - ammo) {
curr_weapon->GetClipVolume() - ammo) {
add_num = GetInventory(bullet_meta->i->_inventory_slot());
DecInventory(bullet_meta->i->_inventory_slot(), add_num);
} else {
add_num = curr_weapon->meta->i->clip_volume() - ammo;
add_num = curr_weapon->GetClipVolume() - ammo;
DecInventory(bullet_meta->i->_inventory_slot(), add_num);
}
curr_weapon->ammo += add_num;
@ -1649,6 +1657,12 @@ void Human::SendWxVoip()
SendNotifyMsg(notifymsg);
}
int Human::GetWeaponConfigLv(int weapon_id)
{
auto itr = weapon_configs.find(weapon_id);
return itr != weapon_configs.end() ? itr->second : 0;
}
void Human::ClearFrameData()
{
if (!new_objects.empty()) {

View File

@ -101,6 +101,7 @@ class Human : public Entity
long long send_msg_times = 0;
float def = 0.0f;
std::map<int, int> weapon_configs;
Human();
virtual ~Human() override;
@ -174,6 +175,7 @@ class Human : public Entity
void UpdateAction();
void SendUIUpdate();
void SendWxVoip();
int GetWeaponConfigLv(int weapon_id);
private:
void ClearFrameData();

View File

@ -79,6 +79,32 @@ namespace MetaData
}
}
void EquipUpgrade::Init()
{
std::vector<int> attr_type;
std::vector<float> attr_value;
{
std::vector<std::string> strings;
a8::Split(i->attr_type(), strings, '|');
for (auto& str : strings) {
attr_type.push_back(a8::XValue(str).GetInt());
}
}
{
std::vector<std::string> strings;
a8::Split(i->attr_value(), strings, '|');
for (auto& str : strings) {
attr_value.push_back(a8::XValue(str).GetDouble());
}
}
assert(attr_type.size() == attr_value.size());
for (size_t i = 0; i < attr_type.size(); ++i) {
if (attr_type[i] < EA_End) {
attr[attr_type[i]] = attr_value[i];
}
}
}
void Player::Init()
{
{

View File

@ -52,6 +52,14 @@ namespace MetaData
void Init();
};
struct EquipUpgrade
{
const metatable::EquipUpgrade* i = nullptr;
std::array<float, EA_End> attr = {};
void Init();
};
struct Player
{
const metatable::Player* i = nullptr;

View File

@ -39,6 +39,8 @@ public:
std::list<MetaData::Skill> skill_list;
std::list<metatable::RankReward> rankreward_meta_list;
std::list<MetaData::RankReward> rankreward_list;
std::list<metatable::EquipUpgrade> equipupgrade_meta_list;
std::list<MetaData::EquipUpgrade> equipupgrade_list;
std::map<std::string, MetaData::Parameter*> parameter_hash;
std::map<int, MetaData::Map*> gamemap_hash;
@ -55,6 +57,7 @@ public:
std::map<int, MetaData::Dress*> dress_hash;
std::map<int, MetaData::Skill*> skill_hash;
std::map<int, MetaData::RankReward*> rankreward_hash;
std::map<long long, MetaData::EquipUpgrade*> equipupgrade_hash;
void Load()
{
@ -88,6 +91,7 @@ public:
f8::ReadCsvMetaFile(res_path + "dress@dress.csv", dress_meta_list);
f8::ReadCsvMetaFile(res_path + "skill@skill.csv", skill_meta_list);
f8::ReadCsvMetaFile(res_path + "rankReward@rankReward.csv", rankreward_meta_list);
f8::ReadCsvMetaFile(res_path + "equipUpgrade@equipUpgrade.csv", equipupgrade_meta_list);
BindToMetaData();
#if 1
{
@ -232,6 +236,12 @@ private:
rankreward_hash[item.i->rank()] = &item;
}
for (auto& meta : equipupgrade_meta_list) {
MetaData::EquipUpgrade& item = a8::FastAppend(equipupgrade_list);
item.i = &meta;
equipupgrade_hash[a8::MakeInt64(meta.id(), meta.level())] = &item;
}
}
private:
@ -307,6 +317,12 @@ MetaData::Equip* MetaMgr::GetEquipBySlotId(int slot_id)
return itr != loader_->equip_slot_hash.end() ? itr->second : nullptr;
}
MetaData::EquipUpgrade* MetaMgr::GetEquipUpgrade(int equip_id, int equip_lv)
{
auto itr = loader_->equipupgrade_hash.find(a8::MakeInt64(equip_id, equip_lv));
return itr != loader_->equipupgrade_hash.end() ? itr->second : nullptr;
}
MetaData::Building* MetaMgr::GetBuilding(int building_id)
{
auto itr = loader_->building_hash.find(building_id);

View File

@ -24,6 +24,7 @@ class MetaMgr : public a8::Singleton<MetaMgr>
MetaData::Player* GetPlayer(int id);
MetaData::Equip* GetEquip(int id);
MetaData::Equip* GetEquipBySlotId(int slot_id);
MetaData::EquipUpgrade* GetEquipUpgrade(int equip_id, int equip_lv);
MetaData::Building* GetBuilding(int building_id);
MetaData::Drop* GetDrop(int drop_id);
MetaData::SafeArea* GetSafeArea(int area_id);

View File

@ -343,13 +343,19 @@ void Player::Shot()
Vector2D bullet_born_pos = pos + bullet_born_offset;
Vector2D bullet_dir = attack_dir;
float bullet_angle = std::get<2>(tuple);
if (curr_weapon->meta->i->bullet_angle() >= 1.0f) {
bullet_angle += (rand() % (int)curr_weapon->meta->i->bullet_angle()) * (rand() % 2 == 0 ? 1 : -1);
if (curr_weapon->meta->i->bullet_angle() >= 0.01f) {
int angle = (int)curr_weapon->meta->i->bullet_angle() * 1000;
if (curr_weapon->upgrade_meta) {
angle -= curr_weapon->upgrade_meta->attr[EA_BulletAngle] * 1000;
}
if (angle > 0) {
bullet_angle += (rand() % angle) / 1000.0f * (rand() % 2 == 0 ? 1 : -1);
}
}
bullet_dir.Rotate(bullet_angle / 180.0f);
room->frame_event.AddBullet(this, bullet_born_pos, bullet_dir, fly_distance);
if (room->BattleStarted() || room->gas_data.gas_mode == GasJump && !a8::HasBitFlag(status, HS_Jump)) {
room->CreateBullet(this, curr_weapon->meta, bullet_born_pos, bullet_dir, fly_distance);
room->CreateBullet(this, curr_weapon, bullet_born_pos, bullet_dir, fly_distance);
}
}
} else {
@ -498,8 +504,10 @@ void Player::LootInteraction(Loot* entity)
} else {
weapons[0].weapon_idx = 0;
weapons[0].weapon_id = entity->item_id;
weapons[0].weapon_lv = entity->item_level;
weapons[0].weapon_lv = std::max(1, GetWeaponConfigLv(weapons[0].weapon_id));
weapons[0].ammo = 0;
weapons[0].meta = item_meta;
weapons[0].Recalc();
}
need_sync_active_player = true;
SyncAroundPlayers();
@ -527,9 +535,10 @@ void Player::LootInteraction(Loot* entity)
return;
}
weapon->weapon_id = entity->item_id;
weapon->weapon_lv = entity->item_level;
weapon->weapon_lv = std::max(1, GetWeaponConfigLv(weapon->weapon_id));
weapon->ammo = 0;
weapon->meta = item_meta;
weapon->Recalc();
AutoLoadingBullet();
need_sync_active_player = true;
SyncAroundPlayers();
@ -578,6 +587,7 @@ void Player::LootInteraction(Loot* entity)
weapon->weapon_lv = 1;
weapon->ammo += entity->count;
weapon->meta = item_meta;
weapon->Recalc();
DecInventory(item_meta->i->_inventory_slot(), add_num);
}
if (item_meta->i->_inventory_slot() > 12) {

View File

@ -36,6 +36,11 @@ Player* PlayerMgr::CreatePlayerByCMJoin(int socket, const cs::CMJoin& msg)
// hum->basemelee = msg.basemelee();
// hum->elo_score = msg.elo_score();
// hum->gmode = msg.gmode();
for (auto& weapon : msg.weapons()) {
if (weapon.weapon_id() != 0 && weapon.weapon_lv() > 0) {
hum->weapon_configs[weapon.weapon_id()] = weapon.weapon_lv();
}
}
socket_hash_[socket] = hum;
return hum;
}

View File

@ -495,6 +495,22 @@ void Room::CreateLoot(int equip_id, Vector2D pos, int count, int equip_lv)
entity->meta = equip_meta;
entity->entity_uniid = AllocUniid();
entity->pos = pos;
#if 1
{
if (entity->pos.x > MAP_WIDTH) {
entity->pos.x = MAP_WIDTH;
}
if (entity->pos.x <= 0.001f) {
entity->pos.x = 0.0f;
}
if (entity->pos.y > MAP_HEIGHT) {
entity->pos.y = MAP_HEIGHT;
}
if (entity->pos.y < 0.0001f) {
entity->pos.y = 0.0f;
}
}
#endif
entity->item_id = equip_id;
entity->count = count;
entity->item_level = equip_lv;
@ -505,14 +521,15 @@ void Room::CreateLoot(int equip_id, Vector2D pos, int count, int equip_lv)
}
}
void Room::CreateBullet(Human* hum, MetaData::Equip* gun_meta,
void Room::CreateBullet(Human* hum, Weapon* weapon,
Vector2D pos, Vector2D dir, float fly_distance)
{
Bullet* bullet = new Bullet();
bullet->player = hum;
bullet->room = this;
bullet->gun_meta = gun_meta;
bullet->meta = MetaMgr::Instance()->GetEquip(gun_meta->i->use_bullet());
bullet->gun_meta = weapon->meta;
bullet->gun_upgrade_meta = weapon->upgrade_meta;
bullet->meta = MetaMgr::Instance()->GetEquip(weapon->meta->i->use_bullet());
bullet->pos = pos;
bullet->dir = dir;
bullet->born_pos = pos;

View File

@ -78,7 +78,7 @@ public:
Hero* CreateHero(Human* hum);
void CreateLoot(int equip_id, Vector2D pos, int count, int equip_lv);
void CreateBullet(Human* hum, MetaData::Equip* gun_meta,
void CreateBullet(Human* hum, Weapon* weapon,
Vector2D pos, Vector2D dir, float fly_distance);
void OnHumanDie(Human* hum);

View File

@ -2,9 +2,27 @@
#include "cs_proto.pb.h"
#include "metamgr.h"
void Weapon::ToPB(cs::MFWeapon* pb_obj)
{
pb_obj->set_weapon_id(weapon_id);
pb_obj->set_weapon_lv(weapon_lv);
pb_obj->set_ammo(ammo);
}
void Weapon::Recalc()
{
upgrade_meta = MetaMgr::Instance()->GetEquipUpgrade(weapon_id,
weapon_lv);
}
int Weapon::GetClipVolume()
{
if (upgrade_meta) {
return meta->i->clip_volume() + upgrade_meta->attr[EA_Volume];
} else {
return meta->i->clip_volume();
}
}

View File

@ -13,6 +13,7 @@ namespace MetaData
{
struct SafeArea;
struct Equip;
struct EquipUpgrade;
}
struct GasData
@ -38,8 +39,11 @@ struct Weapon
int weapon_lv = 0;
int ammo = 0;
MetaData::Equip* meta = nullptr;
MetaData::EquipUpgrade* upgrade_meta = nullptr;
void ToPB(cs::MFWeapon* pb_obj);
void Recalc();
int GetClipVolume();
};
struct PlayerStats

View File

@ -462,12 +462,12 @@ message MFBullet
optional int32 bullet_id = 2; //id
optional MFVector2D pos = 3; //
optional MFVector2D dir = 4; //
optional float variance_t = 5;
optional int32 gun_lv = 5; //
optional int32 bulletskin = 6; //
optional bool crit = 7;
optional int32 reflect_count = 8;
optional int32 reflect_objid = 9;
optional int32 gun_id = 10; //id
optional int32 gun_id = 10; //id
optional float fly_distance = 11; //
}

View File

@ -81,6 +81,15 @@ message Equip
optional int32 _inventory_slot = 32; //
}
message EquipUpgrade
{
optional int32 id = 1;
optional int32 level = 2;
optional int32 next_level = 3;
optional string attr_type = 4;
optional string attr_value = 5;
}
message Player
{
optional int32 id = 1; //id