Hooks
static bool BeforeCvWorldBuilderMapLoader_LoadModData(lua_State* L, int& result);static void AfterCvWorldBuilderMapLoader_LoadModData(lua_State* L, int& result);static int ReplaceCvWorldBuilderMapLoader_LoadModData(int (*original)(lua_State*), lua_State* L);CivRegisterBefore<CivHooks::CvWorldBuilderMapLoader_LoadModData>(host, &BeforeCvWorldBuilderMapLoader_LoadModData);CivRegisterAfter<CivHooks::CvWorldBuilderMapLoader_LoadModData>(host, &AfterCvWorldBuilderMapLoader_LoadModData);CivRegisterReplace<CivHooks::CvWorldBuilderMapLoader_LoadModData>(host, &ReplaceCvWorldBuilderMapLoader_LoadModData);
Code
1417int CvWorldBuilderMapLoader::LoadModData(lua_State* L)1418{1419 if(L == NULL)1420 {1421 FAssertMsg(L, "Seriously, you really need a lua state for this.");1422 return 0;1423 }14241425 const int iTop = lua_gettop(L);14261427 lua_getglobal(L, "MapModData");1428 bool bFoundTable = lua_istable(L, -1);14291430 FAssertMsg(bFoundTable, "Unable to find mod data table");1431 if(!bFoundTable)1432 {1433 lua_settop(L, iTop);1434 return 0;1435 }14361437 const int iModDataTable = iTop + 1;14381439 ModType& kGlobalsDataType = sg_kSave.m_kModData.m_kMapModData;1440 const uint uiGlobalsCount = kGlobalsDataType.GetFieldCount();1441 if(uiGlobalsCount > 0)1442 {1443 ModDataEntry kEntry = sg_kSave.m_kModData.GetMapDataEntry();14441445 lua_pushstring(L, "Globals");1446 lua_createtable(L, 0, uiGlobalsCount);1447 for(uint uiField = 0; uiField < uiGlobalsCount; ++uiField)1448 {1449 const char* szFieldName = kGlobalsDataType.GetFieldName(uiField);1450 lua_pushstring(L, szFieldName);14511452 switch(kGlobalsDataType.GetFieldType(uiField))1453 {1454 case ModType::TYPE_BOOL:1455 {1456 const bool bValue = kEntry.GetFieldAsBool(uiField);1457 lua_pushboolean(L, bValue);1458 }1459 break;14601461 case ModType::TYPE_FLOAT:1462 {1463 const float fValue = kEntry.GetFieldAsFloat(uiField);1464 lua_pushnumber(L, fValue);1465 }1466 break;14671468 case ModType::TYPE_STRING:1469 {1470 const char* szField = kEntry.GetFieldAsString(uiField);1471 lua_pushstring(L, szField);1472 }1473 break;14741475 case ModType::TYPE_ENUM:1476 {1477 const ModEnum* pkEnum = sg_kSave.m_kModData.m_kPlotModData.GetFieldEnumType(uiField);1478 if(pkEnum != NULL)1479 {1480 int iValue = kEntry.GetFieldAsInt(uiField);1481 const char* szMember = pkEnum->GetMember((uint)iValue);1482 if(szMember == NULL) szMember = "";1483 lua_pushstring(L, szMember);1484 }1485 else1486 {1487 lua_pushstring(L, "");1488 }1489 }1490 }14911492 lua_rawset(L, -3);1493 }14941495 lua_rawset(L, iModDataTable);1496 }1497 else1498 {1499 lua_pushstring(L, "Globals");1500 lua_pushnil(L);1501 lua_rawset(L, iModDataTable);1502 }15031504 ModType& kPlotDataType = sg_kSave.m_kModData.m_kPlotModData;1505 const uint uiFieldCount = kPlotDataType.GetFieldCount();1506 if(uiFieldCount > 0)1507 {1508 const int iFieldStart = lua_gettop(L) + 1;1509 for(uint uiField = 0; uiField < uiFieldCount; ++uiField)1510 {1511 const char* szFieldName = kPlotDataType.GetFieldName(uiField);1512 lua_pushstring(L, szFieldName);15131514 switch(kPlotDataType.GetFieldType(uiField))1515 {1516 case ModType::TYPE_BOOL:1517 {1518 const bool bValue = kPlotDataType.GetFieldDefaultAsBool(uiField);1519 lua_pushboolean(L, bValue);1520 }1521 break;15221523 case ModType::TYPE_FLOAT:1524 {1525 const float fValue = kPlotDataType.GetFieldDefaultAsFloat(uiField);1526 lua_pushnumber(L, fValue);1527 }1528 break;15291530 case ModType::TYPE_STRING:1531 {1532 const char* szField = kPlotDataType.GetFieldDefaultAsString(uiField);1533 lua_pushstring(L, szField);1534 }1535 break;15361537 case ModType::TYPE_ENUM:1538 {1539 int iValue = kPlotDataType.GetFieldDefaultAsInt(uiField);1540 const ModEnum* pkEnum = sg_kSave.m_kModData.m_kPlotModData.GetFieldEnumType(uiField);1541 if(pkEnum != NULL)1542 {1543 const char* szMember = pkEnum->GetMember((uint)iValue);1544 if(szMember == NULL) szMember = "";1545 lua_pushstring(L, szMember);1546 }1547 else1548 {1549 lua_pushstring(L, "");1550 }1551 }1552 }1553 }15541555 const uint uiMapWidth = sg_kSave.GetWidth();1556 const uint uiMapHeight = sg_kSave.GetHeight();15571558 lua_pushstring(L, "Plots");1559 lua_createtable(L, uiMapWidth, 1);1560 for(uint x = 0; x < uiMapWidth; ++x)1561 {1562 lua_createtable(L, uiMapHeight, 1);1563 for(uint y = 0; y < uiMapHeight; ++y)1564 {1565 lua_createtable(L, 0, uiFieldCount);1566 ModDataEntry kPlot = sg_kSave.m_kModData.GetPlotDataEntry(x + y * uiMapWidth);1567 for(uint uiField = 0; uiField < uiFieldCount; ++uiField)1568 {1569 if(kPlot.IsFieldDefaultValue(uiField))1570 {1571 lua_pushvalue(L, iFieldStart + 2 * uiField);1572 lua_pushvalue(L, iFieldStart + 2 * uiField + 1);1573 lua_rawset(L, -3);1574 }1575 else1576 {1577 switch(sg_kSave.m_kModData.m_kPlotModData.GetFieldType(uiField))1578 {1579 case ModType::TYPE_BOOL:1580 {1581 const bool bValue = kPlot.GetFieldAsBool(uiField);1582 lua_pushvalue(L, iFieldStart + 2 * uiField);1583 lua_pushboolean(L, bValue);1584 lua_rawset(L, -3);1585 }1586 break;15871588 case ModType::TYPE_FLOAT:1589 {1590 const float fValue = kPlot.GetFieldAsFloat(uiField);1591 lua_pushvalue(L, iFieldStart + 2 * uiField);1592 lua_pushnumber(L, fValue);1593 lua_rawset(L, -3);1594 }1595 break;15961597 case ModType::TYPE_STRING:1598 {1599 const char* szField = kPlot.GetFieldAsString(uiField);1600 lua_pushvalue(L, iFieldStart + 2 * uiField);1601 lua_pushstring(L, szField);1602 lua_rawset(L, -3);1603 }1604 break;16051606 case ModType::TYPE_ENUM:1607 {1608 int iValue = kPlot.GetFieldAsInt(uiField);1609 const ModEnum* pkEnum = kPlotDataType.GetFieldEnumType(uiField);1610 if(pkEnum != NULL)1611 {1612 const char* szMember = pkEnum->GetMember((uint)iValue);1613 if(szMember != NULL)1614 {1615 lua_pushvalue(L, iFieldStart + 2 * uiField);1616 lua_pushstring(L, szMember);1617 lua_rawset(L, -3);1618 }1619 }1620 }1621 }1622 }1623 }16241625 lua_rawseti(L, -2, y);1626 }16271628 lua_rawseti(L, -2, x);1629 }16301631 lua_rawset(L, iModDataTable);1632 }1633 else1634 {1635 lua_pushstring(L, "Plots");1636 lua_pushnil(L);1637 lua_rawset(L, iModDataTable);1638 }16391640 lua_settop(L, iTop);16411642 return 0;1643}