136 lines
3.0 KiB
C++
136 lines
3.0 KiB
C++
#include "precompile.h"
|
|
|
|
#include "android.h"
|
|
#include "metamgr.h"
|
|
#include "android.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()
|
|
{
|
|
ai = new AndroidAI;
|
|
ai->owner = this;
|
|
Human::Initialize();
|
|
RandSkin();
|
|
GiveEquip();
|
|
RecalcBaseAttr();
|
|
SetInfiniteBulletMode();
|
|
{
|
|
auto context = std::make_shared<BattleDataContext>();
|
|
SetBattleContext(context);
|
|
context->ForceInit
|
|
(
|
|
App::Instance()->AllocTempHeroUniId(),
|
|
meta,
|
|
App::Instance()->AllocTempWeaponUniId(),
|
|
GetCurrWeapon()->meta,
|
|
0,
|
|
nullptr
|
|
);
|
|
GetBattleContext()->Init(this);
|
|
}
|
|
}
|
|
|
|
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, CS_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(robot_meta->i->weapon_id());
|
|
if (weapon_meta) {
|
|
Weapon& weapon = weapons[GUN_SLOT1];
|
|
weapon.weapon_idx = GUN_SLOT1;
|
|
weapon.weapon_id = weapon_meta->i->id();
|
|
weapon.weapon_lv = robot_meta->i->weapon_lv();
|
|
weapon.ammo = 0;
|
|
weapon.meta = weapon_meta;
|
|
weapon.Recalc();
|
|
SetCurrWeapon(&weapon);
|
|
}
|
|
sex = robot_meta->i->sex();
|
|
if (sex == 0) {
|
|
sex = rand() % 3;
|
|
}
|
|
}
|
|
|
|
void Android::SetAiLevel(int ai_level)
|
|
{
|
|
if (ai) {
|
|
((AndroidAI*)ai)->SetAiLevel(ai_level);
|
|
}
|
|
}
|
|
|
|
void Android::RandSkin()
|
|
{
|
|
#if 1
|
|
if (!robot_meta->skin_id.empty()) {
|
|
Skin& skin = skins[0];
|
|
#if 1
|
|
skin.skin_id = 1 + (robot_meta->i->id() % 3);
|
|
#else
|
|
skin.skin_id = robot_meta->skin_id[rand() % robot_meta->skin_id.size()];
|
|
#endif
|
|
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
|
|
}
|