2021-09-09 05:36:05 +00:00

139 lines
3.2 KiB
C++

#include "precompile.h"
#include "team.h"
#include "human.h"
#include "room.h"
void Team::TraverseMembers(std::function<bool (Human*)> func)
{
for (Human* member : members_) {
if (!func(member)) {
break;
}
}
}
void Team::GetOveredHumans(std::set<Human*>& overed_humans)
{
for (Human* member : members_) {
if (member->real_dead) {
overed_humans.insert(member);
}
}
}
Human* Team::GetOneAliveMember(Human* exclude_hum)
{
for (Human* member : members_) {
if (member != exclude_hum && !member->dead) {
return member;
}
}
return nullptr;
}
bool Team::HasAliveMember()
{
for (Human* member : members_) {
if (!member->real_dead) {
return true;
}
}
return false;
}
void Team::AddMember(Human* member)
{
if (!first_member_) {
first_member_ = member;
init_team_member_num_ = member->init_team_member_num;
combined_team_member_num_ = member->init_team_member_num;
}
member->team_id = team_id_;
member->SetTeam(this);
members_.insert(member);
if (member->GetFollowTimes() <= 0 && member != first_member_ && !member->follow_target.Get()) {
member->DoFollow(first_member_->GetUniId());
}
}
bool Team::IsFull()
{
return GetMemberNum() >= MAX_TEAM_NUM;
}
void Team::CombineBornPoint()
{
Human* target = nullptr;
for (Human* member : members_) {
if (!target) {
target = member;
} else {
if (target->born_point) {
if (member->born_point) {
room->DecBornPointHumanNum(member->born_point, member);
}
member->born_point = target->born_point;
if (member->born_point) {
room->IncBornPointHumanNum(member->born_point, member);
}
}
} //end if
if (!member->born_point) {
member->SetPos(room->GetDefaultBornPoint());
} else {
member->SetPos(member->born_point->RandPoint());
}
if (!a8::HasBitFlag(member->status, CS_Disable)) {
member->FindLocation();
member->RefreshView();
room->grid_service->MoveCreature(member);
} else if (room->GetRoomType() == RT_MidBrid && !member->team_uuid.empty()){
room->EnableHuman(member);
}
}
}
int Team::GetAliveNum()
{
int num = 0;
for (Human* member : members_) {
if (!member->real_dead) {
++num;
}
}
return num;
}
void Team::CombineTeam(Team* b_team)
{
b_team->TraverseMembers
(
[this] (Human* member) -> bool
{
AddMember(member);
return true;
});
}
Human* Team::GetMemberByUniId(int member_id)
{
for (Human* member : members_) {
if (member->GetUniId() == member_id) {
return member;
}
}
return nullptr;
}
bool Team::CanCombine(Human* member)
{
return !IsFull() && (combined_team_member_num_ + member->init_team_member_num < MAX_TEAM_NUM);
}
void Team::AddCombineMemberNum(int member_num)
{
combined_team_member_num_ += member_num;
}