This commit is contained in:
aozhiwei 2021-07-23 11:05:52 +00:00
parent ee1914129d
commit 49fa3bb28b
4 changed files with 88 additions and 6 deletions

View File

@ -2400,6 +2400,7 @@ bool Creature::CheckCollision()
{ {
Global::last_collider = nullptr; Global::last_collider = nullptr;
if (room->OverBorder(GetPos(), GetRadius())){ if (room->OverBorder(GetPos(), GetRadius())){
++collision_times_;
return true; return true;
} }
if (HasBuffEffect(kBET_ThroughWall) || if (HasBuffEffect(kBET_ThroughWall) ||
@ -2424,6 +2425,7 @@ bool Creature::CheckCollision()
(collider->type == CT_Circle && self_collider_->Intersect(collider)) (collider->type == CT_Circle && self_collider_->Intersect(collider))
) { ) {
if (obstacle->OnCollisionTrigger(this, collider) == 1) { if (obstacle->OnCollisionTrigger(this, collider) == 1) {
++collision_times_;
return true; return true;
} }
} }
@ -2437,6 +2439,7 @@ bool Creature::CheckCollision()
(collider->type == CT_Circle && self_collider_->Intersect(collider)) (collider->type == CT_Circle && self_collider_->Intersect(collider))
) { ) {
Global::last_collider = collider; Global::last_collider = collider;
++collision_times_;
return true; return true;
} }
} }
@ -2448,6 +2451,7 @@ bool Creature::CheckCollision()
(collider->type == CT_Circle && self_collider_->Intersect(collider)) (collider->type == CT_Circle && self_collider_->Intersect(collider))
) { ) {
Global::last_collider = collider; Global::last_collider = collider;
++collision_times_;
return true; return true;
} }
} }

View File

@ -210,6 +210,7 @@ class Creature : public MoveableEntity
std::shared_ptr<Ability>& GetAbility() { return ability_; }; std::shared_ptr<Ability>& GetAbility() { return ability_; };
void RefreshHP(); void RefreshHP();
void TraverseBuff(std::function<void (Buff*, bool&)> func); void TraverseBuff(std::function<void (Buff*, bool&)> func);
long long GetCollisionTimes() { return collision_times_; };
protected: protected:
@ -252,6 +253,7 @@ protected:
private: private:
CreatureWeakPtr weak_ptr_; CreatureWeakPtr weak_ptr_;
Trigger* trigger_ = nullptr; Trigger* trigger_ = nullptr;
long long collision_times_ = 0;
Team* team_ = nullptr; Team* team_ = nullptr;
Weapon* curr_weapon_ = nullptr; Weapon* curr_weapon_ = nullptr;
CreatureWeakPtrChunk weak_ptr_chunk_; CreatureWeakPtrChunk weak_ptr_chunk_;

View File

@ -7,6 +7,7 @@
#include "room.h" #include "room.h"
#include "metamgr.h" #include "metamgr.h"
#include "player.h" #include "player.h"
#include "roomobstacle.h"
HeroAI::HeroAI() HeroAI::HeroAI()
{ {
@ -74,6 +75,11 @@ void HeroAI::UpdateAI()
UpdateFollowMaster(); UpdateFollowMaster();
} }
break; break;
case HSE_SweepMine:
{
UpdateSweepMine();
}
break;
default: default:
{ {
abort(); abort();
@ -112,6 +118,14 @@ void HeroAI::UpdateThinking()
ChangeToStateAI(HSE_FollowMaster); ChangeToStateAI(HSE_FollowMaster);
return; return;
} }
if (ai_meta->i->ai_kind() == kAI_MineSweeper) {
RoomObstacle* target = FindObstacleTarget();
if (target) {
node_->target_obstacle.Attach(target);
ChangeToStateAI(HSE_SweepMine);
return;
}
}
Creature* target = GetTarget(); Creature* target = GetTarget();
if (target) { if (target) {
node_->target.Attach(target); node_->target.Attach(target);
@ -337,10 +351,24 @@ void HeroAI::ChangeToStateAI(HeroState_e to_state)
} }
} }
break; break;
case HSE_SweepMine:
{
moving_ = true;
a8::Vec2 move_dir = node_->target_obstacle.Get()->GetPos() - hero->GetPos();
move_dir.Normalize();
hero->SetMoveDir(move_dir);
hero->SetAttackDir(hero->GetMoveDir());
}
break;
default:
{
}
break;
} }
node_->main_state = to_state; node_->main_state = to_state;
node_->frameno = hero->room->GetFrameNo(); node_->frameno = hero->room->GetFrameNo();
node_->exec_frame_num = 0; node_->exec_frame_num = 0;
node_->last_collision_times = hero->GetCollisionTimes();
} }
Creature* HeroAI::GetTarget() Creature* HeroAI::GetTarget()
@ -438,3 +466,46 @@ int HeroAI::GetAttackTimes()
return ai_meta->i->attack_times(); return ai_meta->i->attack_times();
} }
} }
void HeroAI::UpdateSweepMine()
{
Hero* myself = (Hero*)owner;
if (!node_->target_obstacle.Get() || node_->target_obstacle.Get()->IsDead(myself->room)) {
ChangeToStateAI(HSE_Thinking);
return;
}
if (node_->exec_frame_num > SERVER_FRAME_RATE * 8) {
ChangeToStateAI(HSE_Thinking);
return;
}
if (myself->HasBuffEffect(kBET_Vertigo)) {
return;
}
if (node_->exec_frame_num % SERVER_FRAME_RATE == 0) {
a8::Vec2 move_dir = node_->target_obstacle.Get()->GetPos() - myself->GetPos();
move_dir.Normalize();
myself->SetMoveDir(move_dir);
myself->SetAttackDir(myself->GetMoveDir());
}
float distance = myself->GetPos().Distance(node_->target_obstacle.Get()->GetPos());
if (distance < myself->GetSpeed() + 2) {
myself->_UpdateMove(distance);
distance = myself->GetPos().Distance(node_->target_obstacle.Get()->GetPos());
}
if (!node_->target_obstacle.Get() || node_->target_obstacle.Get()->IsDead(myself->room)) {
ChangeToStateAI(HSE_Thinking);
} else {
if (myself->GetCollisionTimes() > node_->last_collision_times) {
ChangeToStateAI(HSE_Thinking);
} else {
if (distance < 3) {
ChangeToStateAI(HSE_Idle);
}
}
}
}
RoomObstacle* HeroAI::FindObstacleTarget()
{
return nullptr;
}

View File

@ -7,12 +7,13 @@
enum HeroState_e : int enum HeroState_e : int
{ {
HSE_Idle = 0, HSE_Idle,
HSE_Thinking = 1, HSE_Thinking,
HSE_Attack = 2, HSE_Attack,
HSE_RandomWalk = 3, HSE_RandomWalk,
HSE_Pursuit = 4, HSE_Pursuit,
HSE_FollowMaster = 5 HSE_FollowMaster,
HSE_SweepMine
}; };
class HeroAINode class HeroAINode
@ -33,6 +34,8 @@ public:
long long last_check_nearest_human_frameno = 0; long long last_check_nearest_human_frameno = 0;
a8::Vec2 shot_dir; a8::Vec2 shot_dir;
a8::Vec2 target_pos; a8::Vec2 target_pos;
RoomObstacleWeakPtr target_obstacle;
long long last_collision_times = 0;
}; };
class HeroAI : public AIComponent class HeroAI : public AIComponent
@ -52,11 +55,13 @@ protected:
void UpdateRandomWalk(); void UpdateRandomWalk();
void UpdatePursuit(); void UpdatePursuit();
void UpdateFollowMaster(); void UpdateFollowMaster();
void UpdateSweepMine();
void DoMoveAI(); void DoMoveAI();
void ChangeToStateAI(HeroState_e to_state); void ChangeToStateAI(HeroState_e to_state);
void DoShotAI(); void DoShotAI();
Creature* GetTarget(); Creature* GetTarget();
RoomObstacle* FindObstacleTarget();
float GetAttackRange(); float GetAttackRange();
int GetAttackTimes(); int GetAttackTimes();