127 lines
2.9 KiB
C++
127 lines
2.9 KiB
C++
#include "precompile.h"
|
|
|
|
#include "android.h"
|
|
#include "metamgr.h"
|
|
#include "android.ai.h"
|
|
#include "zombiemode.ai.h"
|
|
#include "room.h"
|
|
#include "app.h"
|
|
|
|
Android::Android():Human()
|
|
{
|
|
#if 0
|
|
++PerfMonitor::Instance()->entity_num[ET_Android];
|
|
#endif
|
|
}
|
|
|
|
Android::~Android()
|
|
{
|
|
if (ai) {
|
|
A8_SAFE_DELETE(ai);
|
|
}
|
|
#if 0
|
|
--PerfMonitor::Instance()->entity_num[ET_Android];
|
|
#endif
|
|
}
|
|
|
|
void Android::Initialize()
|
|
{
|
|
if (room->GetRoomMode() == kZombieMode) {
|
|
ai = new ZombieModeAI;
|
|
ai->owner = this;
|
|
ai->SetAiLevel(8);
|
|
ai->SetAiMode(kHumanAiMode);
|
|
} else {
|
|
ai = new AndroidNewAI;
|
|
ai->owner = this;
|
|
}
|
|
Human::Initialize();
|
|
RandSkin();
|
|
GiveEquip();
|
|
RecalcBaseAttr();
|
|
}
|
|
|
|
void Android::Update(int delta_time)
|
|
{
|
|
if (UpdatedTimes() <= 0) {
|
|
if (room->GetFrameNo() % 2 != 0) {
|
|
return;
|
|
}
|
|
}
|
|
InternalUpdate(delta_time);
|
|
++updated_times_;
|
|
}
|
|
|
|
void Android::InternalUpdate(int delta_time)
|
|
{
|
|
if (a8::HasBitFlag(status, HS_Disable)) {
|
|
return;
|
|
}
|
|
if (action_type != AT_None) {
|
|
UpdateAction();
|
|
}
|
|
if (HasBuffEffect(kBET_Fly)) {
|
|
SetPos(room->plane.curr_pos);
|
|
room->grid_service->MoveCreature(this);
|
|
return;
|
|
}
|
|
ai->Update(delta_time);
|
|
}
|
|
|
|
void Android::GiveEquip()
|
|
{
|
|
MetaData::Equip* weapon_meta = MetaMgr::Instance()->GetEquip
|
|
(room->GetRoomMode() == kZombieMode ?
|
|
robot_meta->i->zbmode_weapon_id() : robot_meta->i->weapon_id());
|
|
if (weapon_meta) {
|
|
weapons[GUN_SLOT1].weapon_idx = GUN_SLOT1;
|
|
weapons[GUN_SLOT1].weapon_id = weapon_meta->i->id();
|
|
weapons[GUN_SLOT1].weapon_lv = room->GetRoomMode() == kZombieMode ?
|
|
robot_meta->i->zbmode_weapon_lv() : robot_meta->i->weapon_lv();
|
|
weapons[GUN_SLOT1].ammo = 0;
|
|
weapons[GUN_SLOT1].meta = weapon_meta;
|
|
weapons[GUN_SLOT1].Recalc();
|
|
SetCurrWeapon(&weapons[GUN_SLOT1]);
|
|
}
|
|
sex = robot_meta->i->sex();
|
|
if (sex == 0) {
|
|
sex = rand() % 3;
|
|
}
|
|
}
|
|
|
|
void Android::SetAiLevel(int ai_level)
|
|
{
|
|
if (ai) {
|
|
ai->SetAiLevel(ai_level);
|
|
}
|
|
}
|
|
|
|
void Android::RandSkin()
|
|
{
|
|
#if 1
|
|
if (!robot_meta->skin_id.empty()) {
|
|
Skin& skin = skins[0];
|
|
skin.skin_id = 13001 + robot_meta->skin_id[rand() % robot_meta->skin_id.size()];
|
|
skin.skin_lv = 1;
|
|
}
|
|
#else
|
|
std::vector<int> ids = {1, 2, 3, 4, 5, 6};
|
|
for (int i = 0; i < kSkinNum; ++i) {
|
|
int rand_idx = rand() % ids.size();
|
|
int skin_id = ids[rand_idx];
|
|
if (i == 1) {
|
|
skin_id = 13001 + (rand() % 6);
|
|
} else if (i == 2) {
|
|
skin_id = 15001 + (rand() % 6);
|
|
}
|
|
#if 1
|
|
skin_id = 1;
|
|
#endif
|
|
Skin& skin = skins[i];
|
|
skin.skin_id = skin_id;
|
|
skin.skin_lv = 1;
|
|
ids.erase(ids.begin() + rand_idx);
|
|
}
|
|
#endif
|
|
}
|