1. bool CExchange::CheckSpace()
  2. {
  3. static CGrid s_grid1(5, INVENTORY_MAX_NUM / 5 / 4);
  4. static CGrid s_grid2(5, INVENTORY_MAX_NUM / 5 / 4);
  5. #ifdef WJ_INVENTORY_EX_SYSTEM
  6. CGrid * s_grid3 = M2_NEW CGrid(5,0);
  7. CGrid * s_grid4 = M2_NEW CGrid(5,0);
  8. #else
  9. static CGrid s_grid3(5, INVENTORY_MAX_NUM / 5 / 4);
  10. static CGrid s_grid4(5, INVENTORY_MAX_NUM / 5 / 4);
  11. #endif
  12. s_grid1.Clear();
  13. s_grid2.Clear();
  14. #ifndef WJ_INVENTORY_EX_SYSTEM
  15. s_grid3.Clear();
  16. s_grid4.Clear();
  17. #endif
  18. LPCHARACTER victim = GetCompany()->GetOwner();
  19. #ifdef WJ_INVENTORY_EX_SYSTEM
  20. int gridsize = (victim->GetInventoryEx()-90)/5;
  21. if (gridsize >= 9)
  22. {
  23. gridsize -= 9;
  24. s_grid4 = M2_NEW CGrid(5, gridsize);
  25. s_grid4->Clear();
  26. }
  27. else
  28. {
  29. s_grid3 = M2_NEW CGrid(5, gridsize);
  30. s_grid3->Clear();
  31. }
  32. #endif
  33. LPITEM item;
  34. int i;
  35. const int perPageSlotCount = INVENTORY_MAX_NUM / 4;
  36. #ifdef WJ_INVENTORY_EX_SYSTEM
  37. for (i = 0; i < victim->GetInventoryEx(); ++i) {
  38. #else
  39. for (i = 0; i < INVENTORY_MAX_NUM; ++i) {
  40. #endif
  41. if (!(item = victim->GetInventoryItem(i)))
  42. continue;
  43. BYTE itemSize = item->GetSize();
  44. if (i < perPageSlotCount)
  45. s_grid1.Put(i, 1, itemSize);
  46. else if (i < perPageSlotCount * 2)
  47. s_grid2.Put(i - perPageSlotCount, 1, itemSize);
  48. #ifdef WJ_INVENTORY_EX_SYSTEM
  49. else if (i < perPageSlotCount * 3)
  50. s_grid3->Put(i - perPageSlotCount * 2, 1, itemSize);
  51. else
  52. s_grid4->Put(i - perPageSlotCount * 3, 1, itemSize);
  53. #else
  54. else if (i < perPageSlotCount * 3)
  55. s_grid3.Put(i - perPageSlotCount * 2, 1, itemSize);
  56. else
  57. s_grid4.Put(i - perPageSlotCount * 3, 1, itemSize);
  58. #endif
  59. }
  60. static std::vector <WORD> s_vDSGrid(DRAGON_SOUL_INVENTORY_MAX_NUM);
  61. bool bDSInitialized = false;
  62. for (i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  63. {
  64. if (!(item = m_apItems[i]))
  65. continue;
  66. BYTE itemSize = item->GetSize();
  67. if (item->IsDragonSoul())
  68. {
  69. if (!victim->DragonSoul_IsQualified())
  70. return false;
  71. if (!bDSInitialized) {
  72. bDSInitialized = true;
  73. victim->CopyDragonSoulItemGrid(s_vDSGrid);
  74. }
  75. bool bExistEmptySpace = false;
  76. WORD wBasePos = DSManager::instance().GetBasePosition(item);
  77. if (wBasePos >= DRAGON_SOUL_INVENTORY_MAX_NUM)
  78. return false;
  79. for (int i = 0; i < DRAGON_SOUL_BOX_SIZE; i++)
  80. {
  81. WORD wPos = wBasePos + i;
  82. if (0 == s_vDSGrid[wBasePos])
  83. {
  84. bool bEmpty = true;
  85. for (int j = 1; j < item->GetSize(); j++)
  86. {
  87. if (s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM])
  88. {
  89. bEmpty = false;
  90. break;
  91. }
  92. }
  93. if (bEmpty)
  94. {
  95. for (int j = 0; j < item->GetSize(); j++)
  96. {
  97. s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM] = wPos + 1;
  98. }
  99. bExistEmptySpace = true;
  100. break;
  101. }
  102. }
  103. if (bExistEmptySpace)
  104. break;
  105. }
  106. if (!bExistEmptySpace)
  107. return false;
  108. }
  109. else
  110. {
  111. int iPos = s_grid1.FindBlank(1, itemSize);
  112. if (iPos >= 0) {
  113. s_grid1.Put(iPos, 1, itemSize);
  114. continue;
  115. }
  116. iPos = s_grid2.FindBlank(1, itemSize);
  117. if (iPos >= 0) {
  118. s_grid2.Put(iPos, 1, itemSize);
  119. continue;
  120. }
  121. #ifdef WJ_INVENTORY_EX_SYSTEM
  122. if (s_grid3)
  123. {
  124. iPos = s_grid3->FindBlank(1, itemSize);
  125. if (iPos >= 0) {
  126. s_grid3->Put(iPos, 1, itemSize);
  127. continue;
  128. }
  129. }
  130. if (s_grid4)
  131. {
  132. iPos = s_grid4->FindBlank(1, itemSize);
  133. if (iPos >= 0) {
  134. s_grid4->Put(iPos, 1, itemSize);
  135. continue;
  136. }
  137. }
  138. #else
  139. iPos = s_grid3.FindBlank(1, itemSize);
  140. if (iPos >= 0) {
  141. s_grid3.Put(iPos, 1, itemSize);
  142. continue;
  143. }
  144. iPos = s_grid4.FindBlank(1, itemSize);
  145. if (iPos >= 0) {
  146. s_grid4.Put(iPos, 1, itemSize);
  147. continue;
  148. }
  149. #endif
  150. return false;
  151. }
  152. }
  153. return true;
  154. }