merge dixing
This commit is contained in:
commit
d2d0d3a62c
@ -338,7 +338,12 @@ enum AIMode_e
|
|||||||
|
|
||||||
enum ColliderTag_e
|
enum ColliderTag_e
|
||||||
{
|
{
|
||||||
kHalfWallTag = 1
|
kHalfWallTag = 1,
|
||||||
|
kColliderSpecTag_Begin = 2,
|
||||||
|
kColliderTag_Grass = 2, //草丛
|
||||||
|
kColliderTag_Water = 3, //水
|
||||||
|
kColliderTag_Ice = 4, //冰
|
||||||
|
kColliderSpecTag_End = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum GameChannel_e
|
enum GameChannel_e
|
||||||
@ -406,8 +411,11 @@ const int TURN_OVER_SKILL_ID = 41001;
|
|||||||
|
|
||||||
const int HUNLUAN_BUFFID = 6001;
|
const int HUNLUAN_BUFFID = 6001;
|
||||||
|
|
||||||
|
const long long SPEC_MAP_OBJECT_FLAGS = A8_DEFINE_RANGE_BIT(long long, kColliderSpecTag_Begin, kColliderSpecTag_End);
|
||||||
|
|
||||||
const int kThroughWall_BUFFID = 6003;
|
const int kThroughWall_BUFFID = 6003;
|
||||||
const int FLY_BUFFID = 7001;
|
const int FLY_BUFFID = 7001;
|
||||||
const int JUMP_BUFFID = 7002;
|
const int JUMP_BUFFID = 7002;
|
||||||
const int DRIVER_BUFFID = 7003;
|
const int DRIVER_BUFFID = 7003;
|
||||||
const int PASSENGER_BUFFID = 7004;
|
const int PASSENGER_BUFFID = 7004;
|
||||||
|
|
||||||
|
@ -3307,6 +3307,104 @@ void Human::DoGetOnWithCar(Car* car)
|
|||||||
car->GetOn(this);
|
car->GetOn(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Human::CheckSpecObject()
|
||||||
|
{
|
||||||
|
std::set<ColliderComponent*> colliders;
|
||||||
|
room->map_service->GetSpecColliders(SPEC_MAP_OBJECT_FLAGS, room, GetPos().x, GetPos().y, colliders);
|
||||||
|
|
||||||
|
long long flags = 0;
|
||||||
|
for (const ColliderComponent* collider : colliders) {
|
||||||
|
switch (collider->owner->GetEntityType()) {
|
||||||
|
case ET_Obstacle:
|
||||||
|
case ET_Building:
|
||||||
|
{
|
||||||
|
if (TestCollision(room, (ColliderComponent*)collider)) {
|
||||||
|
flags |= collider->tag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = kColliderSpecTag_Begin; i <= kColliderSpecTag_End; ++i) {
|
||||||
|
SpecMapObject& map_obj = spec_map_objects_[i - kColliderSpecTag_Begin];
|
||||||
|
int buff_effect = 0;
|
||||||
|
if (a8::HasBitFlag(flags, i)) {
|
||||||
|
if (!HasBuffEffect(buff_effect)) {
|
||||||
|
OnEnterSpecMapArea(i, map_obj);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (HasBuffEffect(buff_effect)) {
|
||||||
|
OnLeaveSpecMapArea(i, map_obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Human::OnEnterSpecMapArea(int tag, SpecMapObject& map_obj)
|
||||||
|
{
|
||||||
|
ClearSpecMapAreaTimer(map_obj);
|
||||||
|
map_obj.enter_timer = room->xtimer.AddDeadLineTimerAndAttach
|
||||||
|
(MetaMgr::Instance()->GetSpecMapAreaEnterTime(tag) * SERVER_FRAME_RATE,
|
||||||
|
a8::XParams()
|
||||||
|
.SetSender(this)
|
||||||
|
.SetParam1(&map_obj)
|
||||||
|
.SetParam2(tag),
|
||||||
|
[] (const a8::XParams& param)
|
||||||
|
{
|
||||||
|
Human* hum = (Human*)param.sender.GetUserData();
|
||||||
|
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff
|
||||||
|
(MetaMgr::Instance()->GetSpecMapAreaBuffId(param.param2));
|
||||||
|
if (buff_meta) {
|
||||||
|
hum->AddBuff(hum, buff_meta, 1);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
&xtimer_attacher.timer_list_,
|
||||||
|
[] (const a8::XParams& param)
|
||||||
|
{
|
||||||
|
SpecMapObject* map_obj = (SpecMapObject*)param.param1.GetUserData();
|
||||||
|
map_obj->enter_timer = nullptr;
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Human::OnLeaveSpecMapArea(int tag, SpecMapObject& map_obj)
|
||||||
|
{
|
||||||
|
ClearSpecMapAreaTimer(map_obj);
|
||||||
|
map_obj.leave_timer = room->xtimer.AddDeadLineTimerAndAttach
|
||||||
|
(MetaMgr::Instance()->GetSpecMapAreaLeaveTime(tag) * SERVER_FRAME_RATE,
|
||||||
|
a8::XParams()
|
||||||
|
.SetSender(this)
|
||||||
|
.SetParam1(&map_obj)
|
||||||
|
.SetParam2(tag),
|
||||||
|
[] (const a8::XParams& param)
|
||||||
|
{
|
||||||
|
Human* hum = (Human*)param.sender.GetUserData();
|
||||||
|
hum->RemoveBuffById((MetaMgr::Instance()->GetSpecMapAreaBuffId(param.param2)));
|
||||||
|
},
|
||||||
|
&xtimer_attacher.timer_list_,
|
||||||
|
[] (const a8::XParams& param)
|
||||||
|
{
|
||||||
|
SpecMapObject* map_obj = (SpecMapObject*)param.param1.GetUserData();
|
||||||
|
map_obj->leave_timer = nullptr;
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Human::ClearSpecMapAreaTimer(SpecMapObject& map_obj)
|
||||||
|
{
|
||||||
|
if (map_obj.leave_timer) {
|
||||||
|
room->xtimer.DeleteTimer(map_obj.leave_timer);
|
||||||
|
map_obj.leave_timer = nullptr;
|
||||||
|
}
|
||||||
|
if (map_obj.enter_timer) {
|
||||||
|
room->xtimer.DeleteTimer(map_obj.enter_timer);
|
||||||
|
map_obj.enter_timer = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Human::DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos)
|
void Human::DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos)
|
||||||
{
|
{
|
||||||
if (action_type == AT_Reload ||
|
if (action_type == AT_Reload ||
|
||||||
|
@ -25,6 +25,12 @@ enum HumanStatus
|
|||||||
HS_End
|
HS_End
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SpecMapObject
|
||||||
|
{
|
||||||
|
struct xtimer_list* leave_timer = nullptr;
|
||||||
|
struct xtimer_list* enter_timer = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
struct xtimer_list;
|
struct xtimer_list;
|
||||||
class CircleCollider;
|
class CircleCollider;
|
||||||
class AabbCollider;
|
class AabbCollider;
|
||||||
@ -271,6 +277,10 @@ private:
|
|||||||
void NextReload(int prev_weapon_id, int prev_weapon_idx);
|
void NextReload(int prev_weapon_id, int prev_weapon_idx);
|
||||||
void DoGetOnWithLoot(Loot* loot_entity);
|
void DoGetOnWithLoot(Loot* loot_entity);
|
||||||
void DoGetOnWithCar(Car* car);
|
void DoGetOnWithCar(Car* car);
|
||||||
|
void CheckSpecObject();
|
||||||
|
void OnEnterSpecMapArea(int tag, SpecMapObject& map_obj);
|
||||||
|
void OnLeaveSpecMapArea(int tag, SpecMapObject& map_obj);
|
||||||
|
void ClearSpecMapAreaTimer(SpecMapObject& map_obj);
|
||||||
virtual void AddBuffPostProc(Creature* caster, Buff* buff) override;
|
virtual void AddBuffPostProc(Creature* caster, Buff* buff) override;
|
||||||
virtual void OnBuffRemove(const Buff& buff) override;
|
virtual void OnBuffRemove(const Buff& buff) override;
|
||||||
virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos) override;
|
virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos) override;
|
||||||
@ -327,6 +337,7 @@ private:
|
|||||||
size_t box_drop_times_ = 0;
|
size_t box_drop_times_ = 0;
|
||||||
|
|
||||||
std::array<ObjectSyncFlags, FIXED_OBJECT_MAXID> fixed_object_sync_flags_ = {};
|
std::array<ObjectSyncFlags, FIXED_OBJECT_MAXID> fixed_object_sync_flags_ = {};
|
||||||
|
std::array<SpecMapObject, kColliderSpecTag_End - kColliderSpecTag_Begin + 1> spec_map_objects_ = {};
|
||||||
|
|
||||||
bool already_report_battle_ = false;
|
bool already_report_battle_ = false;
|
||||||
bool sent_battlereport_ = false;
|
bool sent_battlereport_ = false;
|
||||||
|
@ -34,6 +34,7 @@ void MapInstance::Init()
|
|||||||
map_meta_->i->map_height() / MAP_GRID_WIDTH,
|
map_meta_->i->map_height() / MAP_GRID_WIDTH,
|
||||||
MAP_GRID_WIDTH);
|
MAP_GRID_WIDTH);
|
||||||
CreateThings();
|
CreateThings();
|
||||||
|
CreateTerrain();
|
||||||
a8::UdpLog::Instance()->Info
|
a8::UdpLog::Instance()->Info
|
||||||
("map_id:%d current_uniid:%d loots:%d mini_room_spawn_points:%d normal_room_spawn_points:%d "
|
("map_id:%d current_uniid:%d loots:%d mini_room_spawn_points:%d normal_room_spawn_points:%d "
|
||||||
"building_num:%d obstalce_num:%d obstacle0_num:%d "
|
"building_num:%d obstalce_num:%d obstacle0_num:%d "
|
||||||
@ -149,6 +150,95 @@ void MapInstance::CreateThings()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MapInstance::CreateTerrain()
|
||||||
|
{
|
||||||
|
metatable::TerrainJson* terrain = MetaMgr::Instance()->GetTerrainJson(map_id);
|
||||||
|
std::list<metatable::MapLayerJson>* layers = MetaMgr::Instance()->GetMapLayer(map_meta_->i->map_pic());
|
||||||
|
if (!terrain || !layers) {
|
||||||
|
return;
|
||||||
|
//abort();
|
||||||
|
}
|
||||||
|
if (layers->empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
metatable::MapLayerJson* first_layer = nullptr;
|
||||||
|
for (auto layer : *layers) {
|
||||||
|
if (!first_layer) {
|
||||||
|
first_layer = &layer;
|
||||||
|
}
|
||||||
|
if (layer.width() != first_layer->width()) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
if (layer.height() != first_layer->height()) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
if (layer.grids().size() != first_layer->grids().size()) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (first_layer->grids().size() != first_layer->width() * first_layer->height()) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
if (first_layer->grids().size() <= 0) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<int> grids;
|
||||||
|
grids.reserve(first_layer->grids().size());
|
||||||
|
for (int i = 0; i < first_layer->grids().size(); ++i) {
|
||||||
|
grids.push_back(0);
|
||||||
|
}
|
||||||
|
std::set<int> dusts;
|
||||||
|
for (auto idx : terrain->dust()) {
|
||||||
|
dusts.insert(idx);
|
||||||
|
}
|
||||||
|
std::set<int> waters;
|
||||||
|
for (auto idx : terrain->water()) {
|
||||||
|
waters.insert(idx);
|
||||||
|
}
|
||||||
|
std::set<int> grasses;
|
||||||
|
for (auto idx : terrain->grass()) {
|
||||||
|
grasses.insert(idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mask = A8_DEFINE_RANGE_BIT(int, 0, 22);
|
||||||
|
for (auto layer : *layers) {
|
||||||
|
for (int i = 0; i < first_layer->grids().size(); ++i) {
|
||||||
|
int grid_val = layer.grids(i) & mask;
|
||||||
|
if (grid_val != 0) {
|
||||||
|
grids[i] = grid_val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(0);
|
||||||
|
if (thing_meta) {
|
||||||
|
for (int w = 0; w < first_layer->width(); ++w) {
|
||||||
|
for (int h = 0; h < first_layer->height(); ++h) {
|
||||||
|
int grid_val = grids[w * first_layer->width() + h];
|
||||||
|
if (grid_val != 0) {
|
||||||
|
float x = w * thing_meta->i->width() + thing_meta->i->width() / 2.0f;
|
||||||
|
float y = h * thing_meta->i->height() + thing_meta->i->height() / 2.0f;
|
||||||
|
int collider_tag = 0;
|
||||||
|
if (dusts.find(grid_val) != dusts.end()) {
|
||||||
|
a8::SetBitFlag(collider_tag, kColliderTag_Ice);
|
||||||
|
} else if (waters.find(grid_val) != waters.end()) {
|
||||||
|
a8::SetBitFlag(collider_tag, kColliderTag_Water);
|
||||||
|
} else if (grasses.find(grid_val) != grasses.end()) {
|
||||||
|
a8::SetBitFlag(collider_tag, kColliderTag_Grass);
|
||||||
|
}
|
||||||
|
if (collider_tag != 0) {
|
||||||
|
InternalCreateObstacle(thing_meta->i->thing_id(), x, y, collider_tag,
|
||||||
|
[] (Obstacle* entity)
|
||||||
|
{
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MapInstance::CreateMapObject(MetaData::MapTplThing& thing_tpl)
|
void MapInstance::CreateMapObject(MetaData::MapTplThing& thing_tpl)
|
||||||
{
|
{
|
||||||
int thing_id = thing_tpl.RandThing();
|
int thing_id = thing_tpl.RandThing();
|
||||||
@ -157,7 +247,7 @@ void MapInstance::CreateMapObject(MetaData::MapTplThing& thing_tpl)
|
|||||||
if (thing_meta->i->is_house()) {
|
if (thing_meta->i->is_house()) {
|
||||||
CreateBuilding(thing_id, thing_tpl.i->x(), thing_tpl.i->y());
|
CreateBuilding(thing_id, thing_tpl.i->x(), thing_tpl.i->y());
|
||||||
} else {
|
} else {
|
||||||
InternalCreateObstacle(thing_id, thing_tpl.i->x(), thing_tpl.i->y(),
|
InternalCreateObstacle(thing_id, thing_tpl.i->x(), thing_tpl.i->y(), 0,
|
||||||
[] (Obstacle* entity)
|
[] (Obstacle* entity)
|
||||||
{
|
{
|
||||||
});
|
});
|
||||||
@ -192,7 +282,7 @@ void MapInstance::CreateBuilding(int thing_id, float building_x, float building_
|
|||||||
MetaData::Building::Door* door_meta = &building->meta->doors[door_idx];
|
MetaData::Building::Door* door_meta = &building->meta->doors[door_idx];
|
||||||
float x = building->GetX() + door_meta->state0->x() - building->meta->i->tilewidth() / 2.0;
|
float x = building->GetX() + door_meta->state0->x() - building->meta->i->tilewidth() / 2.0;
|
||||||
float y = building->GetY() + door_meta->state0->y() - building->meta->i->tileheight() / 2.0;
|
float y = building->GetY() + door_meta->state0->y() - building->meta->i->tileheight() / 2.0;
|
||||||
InternalCreateObstacle(DOOR_THING_ID, x, y,
|
InternalCreateObstacle(DOOR_THING_ID, x, y, 0,
|
||||||
[building, door_idx] (Obstacle* entity)
|
[building, door_idx] (Obstacle* entity)
|
||||||
{
|
{
|
||||||
entity->SetDoorInfo(building, door_idx);
|
entity->SetDoorInfo(building, door_idx);
|
||||||
@ -206,7 +296,7 @@ void MapInstance::CreateBuilding(int thing_id, float building_x, float building_
|
|||||||
int rnd = rand () % obj._rand_space();
|
int rnd = rand () % obj._rand_space();
|
||||||
for (auto& pair : obj._things()) {
|
for (auto& pair : obj._things()) {
|
||||||
if (rnd <= pair.value()) {
|
if (rnd <= pair.value()) {
|
||||||
InternalCreateObstacle(pair.key(), x, y,
|
InternalCreateObstacle(pair.key(), x, y, 0,
|
||||||
[building] (Obstacle* entity)
|
[building] (Obstacle* entity)
|
||||||
{
|
{
|
||||||
entity->SetBuilding(building);
|
entity->SetBuilding(building);
|
||||||
@ -219,12 +309,13 @@ void MapInstance::CreateBuilding(int thing_id, float building_x, float building_
|
|||||||
buildings_.push_back(building);
|
buildings_.push_back(building);
|
||||||
}
|
}
|
||||||
|
|
||||||
Obstacle* MapInstance::InternalCreateObstacle(int id, float x, float y,
|
Obstacle* MapInstance::InternalCreateObstacle(int id, float x, float y, int collider_tag,
|
||||||
std::function<void (Obstacle*)> on_precreate)
|
std::function<void (Obstacle*)> on_precreate)
|
||||||
{
|
{
|
||||||
MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(id);
|
MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(id);
|
||||||
if (thing) {
|
if (thing) {
|
||||||
Obstacle* entity = EntityFactory::Instance()->MakeObstacle(AllocUniid());
|
Obstacle* entity = EntityFactory::Instance()->MakeObstacle(AllocUniid());
|
||||||
|
entity->collider_tag = collider_tag;
|
||||||
entity->meta = thing;
|
entity->meta = thing;
|
||||||
entity->is_permanent = true;
|
entity->is_permanent = true;
|
||||||
entity->permanent_map_service = map_service_;
|
entity->permanent_map_service = map_service_;
|
||||||
|
@ -26,9 +26,10 @@ class MapInstance
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void CreateThings();
|
void CreateThings();
|
||||||
|
void CreateTerrain();
|
||||||
void CreateMapObject(MetaData::MapTplThing& thing_tpl);
|
void CreateMapObject(MetaData::MapTplThing& thing_tpl);
|
||||||
void CreateBuilding(int thing_id, float building_x, float building_y);
|
void CreateBuilding(int thing_id, float building_x, float building_y);
|
||||||
Obstacle* InternalCreateObstacle(int id, float x, float y,
|
Obstacle* InternalCreateObstacle(int id, float x, float y, int collider_tag,
|
||||||
std::function<void (Obstacle*)> on_precreate);
|
std::function<void (Obstacle*)> on_precreate);
|
||||||
Entity* GetEntityByUniId(int uniid);
|
Entity* GetEntityByUniId(int uniid);
|
||||||
int AllocUniid();
|
int AllocUniid();
|
||||||
|
@ -184,6 +184,9 @@ void MapService::GetColliders(Room* room,
|
|||||||
}
|
}
|
||||||
struct CellNode *node, *tmp;
|
struct CellNode *node, *tmp;
|
||||||
list_for_each_entry_safe(node, tmp, head, entry) {
|
list_for_each_entry_safe(node, tmp, head, entry) {
|
||||||
|
if (node->collider->tag != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
switch (node->collider->owner->GetEntityType()) {
|
switch (node->collider->owner->GetEntityType()) {
|
||||||
case ET_Obstacle:
|
case ET_Obstacle:
|
||||||
{
|
{
|
||||||
@ -225,6 +228,33 @@ void MapService::GetColliders(Room* room,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MapService::GetSpecColliders(long long flags,
|
||||||
|
Room* room,
|
||||||
|
float world_x,
|
||||||
|
float world_y,
|
||||||
|
std::set<ColliderComponent*>& colliders)
|
||||||
|
{
|
||||||
|
int center_grid_id = GetGridId(world_x, world_y);
|
||||||
|
if (center_grid_id < 0 || center_grid_id >= max_grid_id_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < a8::ArraySize(grid_offset_arr_); ++i) {
|
||||||
|
int grid_id = center_grid_id + grid_offset_arr_[i];
|
||||||
|
if (grid_id >= 0 && grid_id < max_grid_id_) {
|
||||||
|
list_head* head = &map_cells_[grid_id];
|
||||||
|
if (list_empty(head)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
struct CellNode *node, *tmp;
|
||||||
|
list_for_each_entry_safe(node, tmp, head, entry) {
|
||||||
|
if (a8::HasBitFlag(flags, node->collider->tag)) {
|
||||||
|
colliders.insert(node->collider);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int MapService::GetGridId(float world_x, float world_y)
|
int MapService::GetGridId(float world_x, float world_y)
|
||||||
{
|
{
|
||||||
int grid_id = (int)(world_x/cell_width_) + (int)(world_y/cell_width_) * map_width_;
|
int grid_id = (int)(world_x/cell_width_) + (int)(world_y/cell_width_) * map_width_;
|
||||||
|
@ -43,6 +43,11 @@ class MapService
|
|||||||
float world_x,
|
float world_x,
|
||||||
float world_y,
|
float world_y,
|
||||||
std::set<ColliderComponent*>& colliders);
|
std::set<ColliderComponent*>& colliders);
|
||||||
|
void GetSpecColliders(long long flags,
|
||||||
|
Room* room,
|
||||||
|
float world_x,
|
||||||
|
float world_y,
|
||||||
|
std::set<ColliderComponent*>& colliders);
|
||||||
int FindPathRequest(Human* hum,
|
int FindPathRequest(Human* hum,
|
||||||
const a8::Vec2& start_pos,
|
const a8::Vec2& start_pos,
|
||||||
const a8::Vec2& end_pos,
|
const a8::Vec2& end_pos,
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
#include "precompile.h"
|
#include "precompile.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include <a8/stringlist.h>
|
#include <a8/stringlist.h>
|
||||||
#include <a8/csvreader.h>
|
#include <a8/csvreader.h>
|
||||||
|
|
||||||
@ -63,6 +66,7 @@ public:
|
|||||||
std::list<metatable::AI> ai_meta_list;
|
std::list<metatable::AI> ai_meta_list;
|
||||||
std::list<MetaData::AI> ai_list;
|
std::list<MetaData::AI> ai_list;
|
||||||
std::list<metatable::Text> text_meta_list;
|
std::list<metatable::Text> text_meta_list;
|
||||||
|
std::list<metatable::TerrainJson> terrain_meta_list;
|
||||||
|
|
||||||
std::map<std::string, MetaData::Parameter*> parameter_hash;
|
std::map<std::string, MetaData::Parameter*> parameter_hash;
|
||||||
std::map<int, MetaData::Map*> gamemap_hash;
|
std::map<int, MetaData::Map*> gamemap_hash;
|
||||||
@ -76,6 +80,7 @@ public:
|
|||||||
std::map<int, MetaData::Building*> building_hash;
|
std::map<int, MetaData::Building*> building_hash;
|
||||||
std::map<int, MetaData::Drop*> drop_hash;
|
std::map<int, MetaData::Drop*> drop_hash;
|
||||||
std::map<std::string, std::list<metatable::MapTplThingJson>> maptpl_meta_hash;
|
std::map<std::string, std::list<metatable::MapTplThingJson>> maptpl_meta_hash;
|
||||||
|
std::map<std::string, std::list<metatable::MapLayerJson>> layer_meta_hash;
|
||||||
std::map<std::string, std::vector<MetaData::MapTplThing>> maptpl_hash;
|
std::map<std::string, std::vector<MetaData::MapTplThing>> maptpl_hash;
|
||||||
std::map<int, MetaData::Dress*> dress_hash;
|
std::map<int, MetaData::Dress*> dress_hash;
|
||||||
std::vector<MetaData::Dress*> dress_vec;
|
std::vector<MetaData::Dress*> dress_vec;
|
||||||
@ -141,6 +146,7 @@ public:
|
|||||||
f8::ReadCsvMetaFile(res_path + "robot@robot.csv", robot_meta_list);
|
f8::ReadCsvMetaFile(res_path + "robot@robot.csv", robot_meta_list);
|
||||||
f8::ReadCsvMetaFile(res_path + "ai@ai.csv", ai_meta_list);
|
f8::ReadCsvMetaFile(res_path + "ai@ai.csv", ai_meta_list);
|
||||||
f8::ReadCsvMetaFile(res_path + "text@text.csv", text_meta_list);
|
f8::ReadCsvMetaFile(res_path + "text@text.csv", text_meta_list);
|
||||||
|
f8::ReadJsonMetaFile(res_path + "terrain.json", terrain_meta_list);
|
||||||
BindToMetaData();
|
BindToMetaData();
|
||||||
#if 1
|
#if 1
|
||||||
{
|
{
|
||||||
@ -443,14 +449,29 @@ private:
|
|||||||
#if 1
|
#if 1
|
||||||
{
|
{
|
||||||
for (auto& tuple : item.template_list) {
|
for (auto& tuple : item.template_list) {
|
||||||
auto itr = maptpl_meta_hash.find(std::get<0>(tuple));
|
{
|
||||||
if (itr == maptpl_meta_hash.end()) {
|
auto itr = maptpl_meta_hash.find(std::get<0>(tuple));
|
||||||
maptpl_meta_hash[std::get<0>(tuple)] = std::list<metatable::MapTplThingJson>();
|
if (itr == maptpl_meta_hash.end()) {
|
||||||
itr = maptpl_meta_hash.find(std::get<0>(tuple));
|
maptpl_meta_hash[std::get<0>(tuple)] = std::list<metatable::MapTplThingJson>();
|
||||||
} else {
|
itr = maptpl_meta_hash.find(std::get<0>(tuple));
|
||||||
itr->second.clear();
|
} else {
|
||||||
|
itr->second.clear();
|
||||||
|
}
|
||||||
|
f8::ReadJsonMetaFile(res_path + std::get<0>(tuple) + ".json", itr->second);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto itr = layer_meta_hash.find(meta.map_pic());
|
||||||
|
if (itr == layer_meta_hash.end()) {
|
||||||
|
layer_meta_hash[meta.map_pic()] = std::list<metatable::MapLayerJson>();
|
||||||
|
itr = layer_meta_hash.find(meta.map_pic());
|
||||||
|
} else {
|
||||||
|
itr->second.clear();
|
||||||
|
}
|
||||||
|
std::string filename = res_path + "map" + meta.map_pic() + ".layers.json";
|
||||||
|
if (access(filename.c_str(), F_OK) != -1) {
|
||||||
|
f8::ReadJsonMetaFile(filename, itr->second);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
f8::ReadJsonMetaFile(res_path + std::get<0>(tuple) + ".json", itr->second);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -732,12 +753,28 @@ MetaData::SafeArea* MetaMgr::GetSafeArea(int area_id)
|
|||||||
return itr != loader_->safearea_hash.end() ? itr->second : nullptr;
|
return itr != loader_->safearea_hash.end() ? itr->second : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<MetaData::MapTplThing>* MetaMgr::GetMapTplThing(std::string& map_name)
|
std::vector<MetaData::MapTplThing>* MetaMgr::GetMapTplThing(const std::string& map_name)
|
||||||
{
|
{
|
||||||
auto itr = loader_->maptpl_hash.find(map_name);
|
auto itr = loader_->maptpl_hash.find(map_name);
|
||||||
return itr != loader_->maptpl_hash.end() ? &itr->second : nullptr;
|
return itr != loader_->maptpl_hash.end() ? &itr->second : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metatable::TerrainJson* MetaMgr::GetTerrainJson(int map_id)
|
||||||
|
{
|
||||||
|
for (auto& itr : loader_->terrain_meta_list) {
|
||||||
|
if (itr.map_id() == map_id) {
|
||||||
|
return &itr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::list<metatable::MapLayerJson>* MetaMgr::GetMapLayer(const std::string& map_name)
|
||||||
|
{
|
||||||
|
auto itr = loader_->layer_meta_hash.find(map_name);
|
||||||
|
return itr != loader_->layer_meta_hash.end() ? &itr->second : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
std::list<MetaData::AirDrop>& MetaMgr::GetAirDrops()
|
std::list<MetaData::AirDrop>& MetaMgr::GetAirDrops()
|
||||||
{
|
{
|
||||||
return loader_->airdrop_list;
|
return loader_->airdrop_list;
|
||||||
@ -871,3 +908,45 @@ std::string MetaMgr::GetText(const std::string& textid, const std::string& def_t
|
|||||||
auto itr = loader_->text_hash.find(textid);
|
auto itr = loader_->text_hash.find(textid);
|
||||||
return itr != loader_->text_hash.end() ? itr->second : def_text;
|
return itr != loader_->text_hash.end() ? itr->second : def_text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int MetaMgr::GetSpecMapAreaBuffId(int tag)
|
||||||
|
{
|
||||||
|
switch (tag) {
|
||||||
|
case kColliderTag_Grass:
|
||||||
|
return 6005;
|
||||||
|
case kColliderTag_Water:
|
||||||
|
return 6006;
|
||||||
|
case kColliderTag_Ice:
|
||||||
|
return 6007;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int MetaMgr::GetSpecMapAreaEnterTime(int tag)
|
||||||
|
{
|
||||||
|
switch (tag) {
|
||||||
|
case kColliderTag_Grass:
|
||||||
|
return grass_invisible_time;
|
||||||
|
case kColliderTag_Water:
|
||||||
|
return water_invisible_time;
|
||||||
|
case kColliderTag_Ice:
|
||||||
|
return ice_invisible_time;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int MetaMgr::GetSpecMapAreaLeaveTime(int tag)
|
||||||
|
{
|
||||||
|
switch (tag) {
|
||||||
|
case kColliderTag_Grass:
|
||||||
|
return grass_show_time;
|
||||||
|
case kColliderTag_Water:
|
||||||
|
return water_show_time;
|
||||||
|
case kColliderTag_Ice:
|
||||||
|
return ice_show_time;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -31,7 +31,9 @@ class MetaMgr : public a8::Singleton<MetaMgr>
|
|||||||
MetaData::Building* GetBuilding(int building_id);
|
MetaData::Building* GetBuilding(int building_id);
|
||||||
MetaData::Drop* GetDrop(int drop_id);
|
MetaData::Drop* GetDrop(int drop_id);
|
||||||
MetaData::SafeArea* GetSafeArea(int area_id);
|
MetaData::SafeArea* GetSafeArea(int area_id);
|
||||||
std::vector<MetaData::MapTplThing>* GetMapTplThing(std::string& map_name);
|
std::vector<MetaData::MapTplThing>* GetMapTplThing(const std::string& map_name);
|
||||||
|
metatable::TerrainJson* GetTerrainJson(int map_id);
|
||||||
|
std::list<metatable::MapLayerJson>* GetMapLayer(const std::string& map_name);
|
||||||
std::list<MetaData::AirDrop>& GetAirDrops();
|
std::list<MetaData::AirDrop>& GetAirDrops();
|
||||||
MetaData::AirDrop* GetAirDrop(int airdrop_id);
|
MetaData::AirDrop* GetAirDrop(int airdrop_id);
|
||||||
MetaData::AirLine* RandAirLine(int map_id);
|
MetaData::AirLine* RandAirLine(int map_id);
|
||||||
@ -52,6 +54,9 @@ class MetaMgr : public a8::Singleton<MetaMgr>
|
|||||||
MetaData::Robot* RandRobot(std::set<int>& refreshed_robot_set);
|
MetaData::Robot* RandRobot(std::set<int>& refreshed_robot_set);
|
||||||
MetaData::AI* GetAI(int ai_level, int ai_mode);
|
MetaData::AI* GetAI(int ai_level, int ai_mode);
|
||||||
std::string GetText(const std::string& textid, const std::string& def_text="");
|
std::string GetText(const std::string& textid, const std::string& def_text="");
|
||||||
|
int GetSpecMapAreaBuffId(int tag);
|
||||||
|
int GetSpecMapAreaEnterTime(int tag);
|
||||||
|
int GetSpecMapAreaLeaveTime(int tag);
|
||||||
|
|
||||||
int gas_inactive_time = 10;
|
int gas_inactive_time = 10;
|
||||||
int newbie_gas_inactive_time = 5;
|
int newbie_gas_inactive_time = 5;
|
||||||
@ -123,6 +128,16 @@ class MetaMgr : public a8::Singleton<MetaMgr>
|
|||||||
int level1room_robot_autodie_distance = 0;
|
int level1room_robot_autodie_distance = 0;
|
||||||
std::string level1room_born_point;
|
std::string level1room_born_point;
|
||||||
|
|
||||||
|
float grass_invisible_time = 0.5;
|
||||||
|
float grass_show_time = 0.5f;
|
||||||
|
float grass_invisible_time2 = 2.0f;
|
||||||
|
float water_invisible_time = 0.5;
|
||||||
|
float water_show_time = 0.5f;
|
||||||
|
float water_invisible_time2 = 2.0f;
|
||||||
|
float ice_invisible_time = 0.5;
|
||||||
|
float ice_show_time = 0.5f;
|
||||||
|
float ice_invisible_time2 = 2.0f;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
int refresh_robot_min_num = 0;
|
int refresh_robot_min_num = 0;
|
||||||
int refresh_robot_max_num = 0;
|
int refresh_robot_max_num = 0;
|
||||||
|
@ -97,6 +97,9 @@ void Obstacle::RecalcSelfCollider()
|
|||||||
self_collider_->pos = a8::Vec2();
|
self_collider_->pos = a8::Vec2();
|
||||||
self_collider_->rad = 0.0f;
|
self_collider_->rad = 0.0f;
|
||||||
}
|
}
|
||||||
|
for (auto collider : colliders_) {
|
||||||
|
collider->tag = collider_tag;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Obstacle::FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data)
|
void Obstacle::FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data)
|
||||||
@ -171,12 +174,14 @@ void Obstacle::GetAabbBox(AabbCollider& aabb_box)
|
|||||||
if (self_collider_) {
|
if (self_collider_) {
|
||||||
aabb_box.active = true;
|
aabb_box.active = true;
|
||||||
aabb_box.owner = this;
|
aabb_box.owner = this;
|
||||||
|
aabb_box.tag = collider_tag;
|
||||||
aabb_box._min.x = -self_collider_->rad;
|
aabb_box._min.x = -self_collider_->rad;
|
||||||
aabb_box._min.y = -self_collider_->rad;
|
aabb_box._min.y = -self_collider_->rad;
|
||||||
aabb_box._max.x = self_collider_->rad;
|
aabb_box._max.x = self_collider_->rad;
|
||||||
aabb_box._max.y = self_collider_->rad;
|
aabb_box._max.y = self_collider_->rad;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
aabb_box.tag = collider_tag;
|
||||||
aabb_box.active = true;
|
aabb_box.active = true;
|
||||||
aabb_box.owner = this;
|
aabb_box.owner = this;
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ class Obstacle : public Entity
|
|||||||
MetaData::MapThing* meta = nullptr;
|
MetaData::MapThing* meta = nullptr;
|
||||||
MapService* permanent_map_service = nullptr;
|
MapService* permanent_map_service = nullptr;
|
||||||
bool is_permanent = false;
|
bool is_permanent = false;
|
||||||
|
int collider_tag = 0;
|
||||||
|
|
||||||
virtual ~Obstacle() override;
|
virtual ~Obstacle() override;
|
||||||
virtual void Initialize() override;
|
virtual void Initialize() override;
|
||||||
|
@ -33,6 +33,7 @@ message Map
|
|||||||
optional int32 map_mode = 10;
|
optional int32 map_mode = 10;
|
||||||
optional int32 safearea = 11;
|
optional int32 safearea = 11;
|
||||||
optional string game_start_buff_list = 12;
|
optional string game_start_buff_list = 12;
|
||||||
|
optional string map_pic = 13;
|
||||||
}
|
}
|
||||||
|
|
||||||
message MapThing
|
message MapThing
|
||||||
@ -358,3 +359,19 @@ message MapTplThingJson
|
|||||||
optional string object_type = 12;
|
optional string object_type = 12;
|
||||||
optional int32 _object_type = 13;
|
optional int32 _object_type = 13;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message TerrainJson
|
||||||
|
{
|
||||||
|
optional int32 map_id = 1;
|
||||||
|
repeated int32 dust = 2;
|
||||||
|
repeated int32 water = 3;
|
||||||
|
repeated int32 grass = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message MapLayerJson
|
||||||
|
{
|
||||||
|
optional string name = 1;
|
||||||
|
optional int32 width = 2;
|
||||||
|
optional int32 height = 3;
|
||||||
|
repeated int32 grids = 4;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user