1
This commit is contained in:
parent
ee1914129d
commit
49fa3bb28b
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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_;
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user