trigger.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. //===========================================================================//
  2. // Copyright (C) Microsoft Corporation. All rights reserved. //
  3. //===========================================================================//
  4. #ifndef TRIGGER_H
  5. #include "trigger.h"
  6. #endif
  7. #ifndef MOVER_H
  8. #include "mover.h"
  9. #endif
  10. //***************************************************************************
  11. void* TriggerAreaManager::operator new (size_t ourSize) {
  12. void* result = systemHeap->Malloc(ourSize);
  13. return(result);
  14. }
  15. //---------------------------------------------------------------------------
  16. void TriggerAreaManager::operator delete (void* us) {
  17. systemHeap->Free(us);
  18. }
  19. //---------------------------------------------------------------------------
  20. void TriggerAreaManager::destroy (void) {
  21. }
  22. //---------------------------------------------------------------------------
  23. long TriggerAreaManager::add (long ULrow, long ULcol, long LRrow, long LRcol, long type, long param) {
  24. for (long i = 1; i < MAX_TRIGGER_AREAS; i++)
  25. if (triggerAreas[i].type == TRIGGER_AREA_NONE)
  26. break;
  27. if (i < MAX_TRIGGER_AREAS) {
  28. triggerAreas[i].dim[0] = ULrow;
  29. triggerAreas[i].dim[1] = ULcol;
  30. triggerAreas[i].dim[2] = LRrow;
  31. triggerAreas[i].dim[3] = LRcol;
  32. triggerAreas[i].type = type;
  33. triggerAreas[i].param = param;
  34. triggerAreas[i].hit = false;
  35. long tileDims[4];
  36. tileDims[0] = ULrow / 3;
  37. tileDims[1] = ULcol / 3 + 1;
  38. tileDims[2] = LRrow / 3;
  39. tileDims[3] = LRcol / 3 + 1;
  40. for (long r = tileDims[0]; r < tileDims[2]; r++)
  41. for (long c = tileDims[1]; c < tileDims[3]; c++) {
  42. //sert((map[r][c] == 0) || (map[r][c] == i), i," Duplicate Trigger ");
  43. map[r][c] = i;
  44. }
  45. return(i);
  46. }
  47. return(0);
  48. }
  49. //---------------------------------------------------------------------------
  50. void TriggerAreaManager::remove (long areaHandle) {
  51. if (triggerAreas[areaHandle].param == TRIGGER_AREA_NONE)
  52. return;
  53. long tileDims[4];
  54. tileDims[0] = triggerAreas[areaHandle].dim[0] / 3;
  55. tileDims[1] = triggerAreas[areaHandle].dim[1] / 3 + 1;
  56. tileDims[2] = triggerAreas[areaHandle].dim[2] / 3;
  57. tileDims[3] = triggerAreas[areaHandle].dim[3] / 3 + 1;
  58. for (long r = tileDims[0]; r < tileDims[2]; r++)
  59. for (long c = tileDims[1]; c < tileDims[3]; c++)
  60. if (map[r][c] == areaHandle)
  61. map[r][c] = 0;
  62. triggerAreas[areaHandle].type = TRIGGER_AREA_NONE;
  63. triggerAreas[areaHandle].hit = false;
  64. }
  65. //---------------------------------------------------------------------------
  66. void TriggerAreaManager::reset (long areaHandle) {
  67. triggerAreas[areaHandle].hit = false;
  68. }
  69. //---------------------------------------------------------------------------
  70. bool TriggerAreaManager::isHit (long areaHandle) {
  71. if (triggerAreas[areaHandle].type == TRIGGER_AREA_NONE)
  72. return(false);
  73. return(triggerAreas[areaHandle].hit);
  74. }
  75. //---------------------------------------------------------------------------
  76. void DEBUGWINS_print (char* s, long window);
  77. void TriggerAreaManager::setHit (MoverPtr mover) {
  78. #if 1
  79. for (long i = 0; i < MAX_TRIGGER_AREAS; i++) {
  80. if (triggerAreas[i].type == TRIGGER_AREA_NONE)
  81. continue;
  82. if (mover->cellPositionRow >= triggerAreas[i].dim[0])
  83. if (mover->cellPositionRow < triggerAreas[i].dim[2])
  84. if (mover->cellPositionCol >= triggerAreas[i].dim[1])
  85. if (mover->cellPositionCol < triggerAreas[i].dim[3])
  86. switch (triggerAreas[i].type) {
  87. case TRIGGER_AREA_MOVER:
  88. if (triggerAreas[i].param > 0) {
  89. if (mover->getWatchID() == triggerAreas[i].param)
  90. triggerAreas[i].hit = true;
  91. }
  92. else
  93. triggerAreas[i].hit = true;
  94. break;
  95. case TRIGGER_AREA_TEAM:
  96. if (mover->getTeamId() == triggerAreas[i].param) {
  97. triggerAreas[i].hit = true;
  98. //sprintf(s, "AREA HIT: %d", i);
  99. //DEBUGWINS_print(s, 0);
  100. }
  101. break;
  102. case TRIGGER_AREA_GROUP:
  103. if (mover->getGroupId() == triggerAreas[i].param)
  104. triggerAreas[i].hit = true;
  105. break;
  106. case TRIGGER_AREA_COMMANDER:
  107. if (mover->getCommanderId() == triggerAreas[i].param)
  108. triggerAreas[i].hit = true;
  109. break;
  110. }
  111. }
  112. #else
  113. long areaHandle = map[mover->cellPositionRow / 3][mover->cellPositionCol / 3];
  114. if (areaHandle > 0) {
  115. switch (triggerAreas[areaHandle].type) {
  116. case TRIGGER_AREA_MOVER:
  117. if (triggerAreas[areaHandle].param > 0) {
  118. if (mover->getWatchID() == triggerAreas[areaHandle].param)
  119. triggerAreas[areaHandle].hit = true;
  120. }
  121. else
  122. triggerAreas[areaHandle].hit = true;
  123. break;
  124. case TRIGGER_AREA_TEAM:
  125. if (mover->getTeamId() == triggerAreas[areaHandle].param)
  126. triggerAreas[areaHandle].hit = true;
  127. break;
  128. case TRIGGER_AREA_GROUP:
  129. if (mover->getGroupId() == triggerAreas[areaHandle].param)
  130. triggerAreas[areaHandle].hit = true;
  131. break;
  132. case TRIGGER_AREA_COMMANDER:
  133. if (mover->getCommanderId() == triggerAreas[areaHandle].param)
  134. triggerAreas[areaHandle].hit = true;
  135. break;
  136. }
  137. }
  138. #endif
  139. }
  140. //***************************************************************************