139 lines
3.2 KiB
C++
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;
|
|
}
|