This commit is contained in:
aozhiwei 2021-07-29 11:21:27 +00:00
parent 7b5cefb0b5
commit a0e26e3dab
4 changed files with 19 additions and 10 deletions

View File

@ -96,7 +96,8 @@ void MapInstance::CreateThings()
case kMOT_Object: case kMOT_Object:
{ {
{ {
int thing_id = thing_tpl.RandThing(); int num = 0;
int thing_id = thing_tpl.RandThing(num);
if (MetaMgr::Instance()->level0room_spec_things_set.find(thing_id) != if (MetaMgr::Instance()->level0room_spec_things_set.find(thing_id) !=
MetaMgr::Instance()->level0room_spec_things_set.end()) { MetaMgr::Instance()->level0room_spec_things_set.end()) {
level0room_spec_things_.push_back(&thing_tpl); level0room_spec_things_.push_back(&thing_tpl);
@ -323,7 +324,8 @@ void MapInstance::CreateBlock()
void MapInstance::CreateMapObject(MetaData::MapTplThing& thing_tpl) void MapInstance::CreateMapObject(MetaData::MapTplThing& thing_tpl)
{ {
int thing_id = thing_tpl.RandThing(); int num = 0;
int thing_id = thing_tpl.RandThing(num);
MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(thing_id); MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(thing_id);
if (thing_meta) { if (thing_meta) {
if (thing_meta->i->is_house()) { if (thing_meta->i->is_house()) {

View File

@ -672,25 +672,30 @@ namespace MetaData
for (auto& str : strings) { for (auto& str : strings) {
std::vector<std::string> strings2; std::vector<std::string> strings2;
a8::Split(str, strings2, ':'); a8::Split(str, strings2, ':');
assert(strings2.size() == 2); assert(strings2.size() >= 2);
rand_space += a8::XValue(strings2[1]).GetInt(); rand_space += a8::XValue(strings2[1]).GetInt();
int num = strings2.size() > 2 ? a8::XValue(strings2[2]).GetInt() : 1;
num = std::max(num, 1);
things.push_back(std::make_tuple( things.push_back(std::make_tuple(
a8::XValue(strings2[0]), a8::XValue(strings2[0]),
rand_space rand_space,
num
) )
); );
} }
} }
} }
int MapTplThing::RandThing() int MapTplThing::RandThing(int& num)
{ {
num = 0;
if (rand_space <= 0) { if (rand_space <= 0) {
return 0; return 0;
} }
int rnd = rand() % rand_space; int rnd = rand() % rand_space;
for (auto& tuple : things) { for (auto& tuple : things) {
if (std::get<1>(tuple) > rnd) { if (std::get<1>(tuple) > rnd) {
num = std::get<2>(tuple);
return std::get<0>(tuple); return std::get<0>(tuple);
} }
} }

View File

@ -159,9 +159,9 @@ namespace MetaData
const metatable::MapTplThingJson* i = nullptr; const metatable::MapTplThingJson* i = nullptr;
void Init(); void Init();
int RandThing(); int RandThing(int& num);
std::vector<std::tuple<int, int>> things; std::vector<std::tuple<int, int, int>> things;
std::vector<int> heros; std::vector<int> heros;
int param1_int = 0; int param1_int = 0;
int rand_space = 0; int rand_space = 0;

View File

@ -2143,7 +2143,8 @@ void Room::CreateLoots()
{ {
std::vector<std::tuple<MetaData::Equip*, MetaData::MapTplThing*>> car_equips; std::vector<std::tuple<MetaData::Equip*, MetaData::MapTplThing*>> car_equips;
for (auto& thing_tpl : *loots_) { for (auto& thing_tpl : *loots_) {
int thing_id = thing_tpl->RandThing(); int num = 0;
int thing_id = thing_tpl->RandThing(num);
MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(thing_id); MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(thing_id);
if (equip_meta) { if (equip_meta) {
if (equip_meta->i->equip_type() == EQUIP_TYPE_CAR) { if (equip_meta->i->equip_type() == EQUIP_TYPE_CAR) {
@ -2156,7 +2157,7 @@ void Room::CreateLoots()
thing_tpl->i->x(), thing_tpl->i->x(),
thing_tpl->i->y() thing_tpl->i->y()
), ),
1, num,
1 1
); );
} }
@ -3416,7 +3417,8 @@ void Room::CreateLevel0RoomSpecThings()
{ {
if (level0room_spec_things_) { if (level0room_spec_things_) {
for (auto& thing_tpl : *level0room_spec_things_) { for (auto& thing_tpl : *level0room_spec_things_) {
int thing_id = thing_tpl->RandThing(); int num = 0;
int thing_id = thing_tpl->RandThing(num);
MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(thing_id); MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(thing_id);
if (thing_meta) { if (thing_meta) {
InternalCreateObstacle(thing_id, thing_tpl->i->x(), thing_tpl->i->y(), InternalCreateObstacle(thing_id, thing_tpl->i->x(), thing_tpl->i->y(),