Posted to tcl by hypnotoad at Mon Dec 08 22:00:08 GMT 2014view raw

  1.  
  2. /*
  3. ** Advance a crew member by ms milliseconds or less. Return any time
  4. ** remaining.
  5. */
  6. int Crew_Member_Step(Crew *crewPtr, int ms){
  7. Waypoint *pW=NULL;
  8. Portal *pPortal=NULL;
  9. if (crewPtr->public_paused) {
  10. return 0;
  11. }
  12. if (crewPtr->public_team > 1 && crewPtr->public_team != crewPtr->id) {
  13. return 0;
  14. }
  15.  
  16. if(!crewPtr->aStep) {
  17. crewPtr->public_operation=CREW_OPERATION_DONE;
  18. }
  19.  
  20. switch( crewPtr->public_operation ){
  21. case CREW_OPERATION_ERROR:
  22. crewPtr->public_operation=CREW_OPERATION_ERROR;
  23. crewPtr->public_countdown=0;
  24. return 0;
  25. case CREW_OPERATION_BLOCKED:
  26. crewPtr->public_operation=CREW_OPERATION_BLOCKED;
  27. crewPtr->public_countdown=0;
  28. return 0;
  29. case CREW_OPERATION_TRAFFIC:
  30. case CREW_OPERATION_QUEUED:
  31. case CREW_OPERATION_MOVE:
  32. case CREW_OPERATION_OPEN:
  33. case CREW_OPERATION_VTRANS:
  34. case CREW_OPERATION_TRANS:
  35. case CREW_OPERATION_CLOSE:
  36. crewPtr->blockedReason=NULL;
  37. break;
  38.  
  39. case CREW_OPERATION_ARRIVED:
  40. case CREW_OPERATION_STOPPED:
  41. case CREW_OPERATION_DONE:
  42. default:
  43. crewPtr->blockedReason=NULL;
  44. crewPtr->public_operation=CREW_OPERATION_DONE;
  45. crewPtr->public_countdown=0;
  46. return 0;
  47. }
  48.  
  49. /*
  50. ** If we are in a countdown mode,
  51. ** finish the countdown
  52. */
  53. if( crewPtr->public_countdown>ms ){
  54. crewPtr->public_countdown -= ms;
  55. return 0;
  56. }
  57. ms-=crewPtr->public_countdown;
  58. crewPtr->public_countdown=0;
  59.  
  60. crewPtr->public_moved=1;
  61. pW = &crewPtr->aStep[crewPtr->iStep];
  62.  
  63.  
  64.  
  65. if(pW->pid) {
  66. pPortal=Portal_ById(pW->pid,0);
  67. if(!pPortal) {
  68. /* Treat any transition with a non-existent portal as a move */
  69. crewPtr->public_operation=CREW_OPERATION_MOVE;
  70. }
  71. }
  72. crewPtr->public_moved=1;
  73. if(crewPtr->public_operation==CREW_OPERATION_MOVE || crewPtr->public_operation==CREW_OPERATION_TRAFFIC) {
  74. int msUsed,offset=0;
  75. if(crewPtr->iStep<(crewPtr->nStep-1)) {
  76. offset=0;
  77. } else {
  78. offset=crewPtr->targetDistance;
  79. }
  80. if(pW->pid) {
  81. crewPtr->public_operation = CREW_OPERATION_OPEN;
  82. } else {
  83. int movecode=advanceCrewToWaypoint(crewPtr,ms,pW,offset,&msUsed);
  84. switch(movecode) {
  85. case 0: {
  86. ms-=msUsed;
  87. crewPtr->public_compartment_entering = 0;
  88. LinkRemove(&crewPtr->link2);
  89. return ms;
  90. }
  91. case 1: {
  92. if(pW->pid) {
  93. crewPtr->public_portal = pW->pid;
  94. } else {
  95. gotoNextStep(crewPtr);
  96. msUsed = 0;
  97. return ms;
  98. }
  99. }
  100. case 2: {
  101. Crew_Halt(crewPtr,CREW_OPERATION_ERROR);
  102. return 0;
  103. }
  104. }
  105. }
  106. }
  107.  
  108. if(crewPtr->public_operation==CREW_OPERATION_OPEN) {
  109. /* Trying to open a portal. If the portal is on an airlock and
  110. ** the airlock is open, then reset the timer and keep trying.
  111. */
  112. int code=0;
  113.  
  114. crewPtr->public_portal = pW->pid;
  115. code=Portal_Action(pPortal,crewPtr,PORTAL_ACTION_OPEN,pW->openTm*100);
  116. if(code<0) {
  117. /*
  118. ** Portal could not be opened
  119. */
  120. Portal_Release(pPortal,crewPtr);
  121. Crew_Halt(crewPtr,CREW_OPERATION_BLOCKED);
  122. return 0;
  123. }
  124. if(code>0) {
  125. /*
  126. ** Waiting for the door to become available
  127. ** or for the door to finish opening
  128. */
  129. return 0;
  130. }
  131. if(crewPtr->public_moving!=CREW_MOVING_FLEEING) {
  132. Compartment *pTo=Compartment_ById(pW->cid,0);
  133. if(pTo->public_accessible > crewPtr->public_protected) {
  134. Compartment *pFrom=Compartment_ById(crewPtr->public_compartment,0);
  135. if (pTo->public_accessible > pFrom->public_accessible) {
  136. /*
  137. ** RULE: crew-movement-0001
  138. ** A crewman will not transition from a compartment with
  139. ** a lower accessible score to a higher accessible score
  140. ** unless the higher accessible score is less than or
  141. ** equal to the crew's protection rating
  142. */
  143. /*
  144. ** Cannot transit, close the door and halt
  145. */
  146. if(!anybodyWantsPortalOpen(crewPtr, pW->pid, pW->x, pW->y, pW->deckid) ){
  147. code=Portal_Action(pPortal,crewPtr,PORTAL_ACTION_CLOSE,pW->closeTm*100);
  148. if(code==1) {
  149. /*
  150. ** Waiting for portal to close
  151. */
  152. return 0;
  153. }
  154. }
  155. Portal_Release(pPortal,crewPtr);
  156. crewPtr->blockedReason="crew-movement-0001";
  157. Crew_Halt(crewPtr,CREW_OPERATION_BLOCKED);
  158. return 0;
  159. }
  160. }
  161. }
  162. crewPtr->public_operation=CREW_OPERATION_QUEUED;
  163. if(pPortal->delta->public_door_state != pPortal->public_door_state) {
  164. /*
  165. ** If we did change the state of the door, count that
  166. ** as time served
  167. */
  168. return 0;
  169. }
  170. }
  171. if(crewPtr->public_operation==CREW_OPERATION_QUEUED) {
  172. int msUsed=0;
  173. /*
  174. ** Count the crew going through the portal. If it
  175. ** exceeds the number of crew rated, enter wait state
  176. */
  177. if(pPortal->public_transit_count) {
  178. Crew *p;
  179. int count=0;
  180. for(p=CurrentSim->pAllCrew; p; p=p->pNext){
  181. if(p->id==crewPtr->id) continue;
  182. if(p->public_portal==pW->pid) {
  183. if(p->public_operation==CREW_OPERATION_VTRANS || p->public_operation==CREW_OPERATION_TRANS) {
  184. count++;
  185. }
  186. }
  187. }
  188. /*
  189. ** Waiting for portal
  190. */
  191. if(count>=pPortal->public_transit_count) {
  192. return 0;
  193. }
  194. }
  195. int transitTime=pW->transTm*100;
  196. if(pPortal->public_transit_count && crewPtr->public_team) {
  197. transitTime=pW->transTm*100*(crewPtr->inParty+1)/pPortal->public_transit_count;
  198. }
  199. crewPtr->public_compartment_entering = pW->cid;
  200. crewPtr->public_countdown=transitTime;
  201. if(crewPtr->deckid != pW->deckid) {
  202. crewPtr->deckchange=1;
  203. crewPtr->public_operation=CREW_OPERATION_VTRANS;
  204. } else {
  205. crewPtr->deckchange=0;
  206. crewPtr->public_operation=CREW_OPERATION_TRANS;
  207. }
  208. pW->cost = transitTime/1000 + pW->closeTm*0.1;
  209.  
  210. return 0;
  211. }
  212. if(crewPtr->public_operation==CREW_OPERATION_VTRANS
  213. || crewPtr->public_operation==CREW_OPERATION_TRANS) {
  214. int code=2;
  215. code=Portal_Action(pPortal,crewPtr,PORTAL_ACTION_TRANSIT,1);
  216. /* Manage Airlock */
  217. if(code<0) {
  218. Portal_Release(pPortal,crewPtr);
  219. Crew_Halt(crewPtr,CREW_OPERATION_BLOCKED);
  220. return 0;
  221. }
  222. if(code>0) {
  223. /*
  224. ** Waiting for the transit time to elapse
  225. */
  226. return 0;
  227. }
  228. /* Move the crew to the waypoint */
  229. crewPtr->tx=pW->x;
  230. crewPtr->ty=pW->y;
  231. crewPtr->x=pW->x;
  232. crewPtr->y=pW->y;
  233. crewPtr->deckid=pW->deckid;
  234. crewPtr->public_countdown = 0;
  235. /* Start the close operation */
  236. crewPtr->public_operation = CREW_OPERATION_CLOSE;
  237. pW->cost = pW->closeTm*0.1;
  238. }
  239. if(crewPtr->public_operation==CREW_OPERATION_CLOSE) {
  240. /* Close a portal after moving through it.
  241. */
  242. crewPtr->public_compartment=pW->cid;
  243. crewPtr->public_compartment_entering=0;
  244. int close=0;
  245. crewPtr->nextPid = 0;
  246. if(!anybodyWantsPortalOpen(crewPtr, pW->pid, pW->x, pW->y, pW->deckid) ){
  247. close=Portal_Action(pPortal,crewPtr,PORTAL_ACTION_CLOSE,pW->closeTm/10.0);
  248. if(close==1) {
  249. /*
  250. ** Waiting for portal to close
  251. */
  252. return 0;
  253. }
  254. }
  255. crewPtr->public_portal=0;
  256. crewPtr->public_compartment_entering = 0;
  257. Portal_Release(pPortal,crewPtr);
  258. pW->cost = 0;
  259. gotoNextStep(crewPtr);
  260. return 0;
  261. }
  262. return ms;
  263. }
  264.