Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1812 | yogev_ezra | 1 | ; -------------------------------------------------------------------------- |
2 | ; FILE: TCommon.Asm |
||
3 | ; DATE: October 4, 2008 |
||
4 | ; -------------------------------------------------------------------------- |
||
5 | |||
6 | ; -------------------------------------------------------------------------- |
||
7 | align PROC_ALIGN |
||
8 | TCommon_AbsEAX: |
||
9 | add eax, 0 |
||
10 | js .flip_negative |
||
11 | ret |
||
12 | |||
13 | .flip_negative: |
||
14 | neg eax |
||
15 | ret |
||
16 | |||
17 | ; -------------------------------------------------------------------------- |
||
18 | ; Input: |
||
19 | ; ST(0) = DOUBLE value B |
||
20 | ; ST(1) = DOUBLE value A |
||
21 | ; Output: |
||
22 | ; ST(0) = A with a sign of B |
||
23 | ; -------------------------------------------------------------------------- |
||
24 | align PROC_ALIGN |
||
25 | TCommon_FPU_SignAB: |
||
26 | mcZeroBits eax |
||
27 | fldz |
||
28 | mc_CMP_ST0_ST1 |
||
29 | adc eax, eax ; EAX=1 if B is positive |
||
30 | |||
31 | fabs |
||
32 | mcOnRegZero eax, .negative |
||
33 | ret |
||
34 | |||
35 | .negative: |
||
36 | fchs |
||
37 | ret |
||
38 | |||
39 | ; -------------------------------------------------------------------------- |
||
40 | ; Input: |
||
41 | ; ST(0) = DOUBLE value #1 |
||
42 | ; ST(1) = DOUBLE value #2 |
||
43 | ; Output: |
||
44 | ; ST(0) = maximum of two values |
||
45 | ; -------------------------------------------------------------------------- |
||
46 | align PROC_ALIGN |
||
47 | TCommon_FPU_Max: |
||
48 | mcBeginLocals 16 |
||
49 | |||
50 | fld st |
||
51 | fstp tbyte [esp] |
||
52 | |||
53 | fcomip st, st1 |
||
54 | jc .done |
||
55 | |||
56 | fstp [glb_dbl_FpuPopper] |
||
57 | fld tbyte [esp] |
||
58 | |||
59 | .done: |
||
60 | mcEndLocals 16 |
||
61 | ret |
||
62 | |||
63 | ; -------------------------------------------------------------------------- |
||
64 | ; Input: |
||
65 | ; ST(0) = DOUBLE value #1 |
||
66 | ; ST(1) = DOUBLE value #2 |
||
67 | ; Output: |
||
68 | ; ST(0) = minimum of two values |
||
69 | ; -------------------------------------------------------------------------- |
||
70 | align PROC_ALIGN |
||
71 | TCommon_FPU_Min: |
||
72 | mcBeginLocals 16 |
||
73 | |||
74 | fld st |
||
75 | fstp tbyte [esp] |
||
76 | |||
77 | fcomip st, st1 |
||
78 | jnc .done |
||
79 | |||
80 | fstp [glb_dbl_FpuPopper] |
||
81 | fld tbyte [esp] |
||
82 | |||
83 | .done: |
||
84 | mcEndLocals 16 |
||
85 | ret |
||
86 | |||
87 | ; -------------------------------------------------------------------------- |
||
88 | align PROC_ALIGN |
||
89 | TCommon_Allocate: |
||
90 | mcAllocatePages TCommon.size |
||
91 | mov [glb_pCommon], eax |
||
92 | |||
93 | add eax, TCommon.GAMEDB |
||
94 | mov [glb_pGameData], eax |
||
95 | ret |
||
96 | |||
97 | ; -------------------------------------------------------------------------- |
||
98 | ; EXPRAN |
||
99 | ; -------------------------------------------------------------------------- |
||
100 | ; Input: |
||
101 | ; ST(0) = AVERAGE |
||
102 | ; Output: |
||
103 | ; ST(0) = -AVERAGE * LOG (RANF(0)) |
||
104 | ; -------------------------------------------------------------------------- |
||
105 | align PROC_ALIGN |
||
106 | TCommon_ExpRan: |
||
107 | fchs |
||
108 | fld1 |
||
109 | call TRandom_Ranf |
||
110 | fyl2x |
||
111 | fldln2 |
||
112 | fmulp |
||
113 | fmulp |
||
114 | ret |
||
115 | |||
116 | ; -------------------------------------------------------------------------- |
||
117 | ; Input: |
||
118 | ; AL = byte lo load |
||
119 | ; Output: |
||
120 | ; ST(0) = DOUBLE loaded for processing |
||
121 | ; -------------------------------------------------------------------------- |
||
122 | align PROC_ALIGN |
||
123 | TCommon_LoadByteIntoFPU: |
||
124 | movzx eax, al |
||
125 | mov [glb_FPU_Int32], eax |
||
126 | fild [glb_FPU_Int32] |
||
127 | ret |
||
128 | |||
129 | ; -------------------------------------------------------------------------- |
||
130 | ; Input: |
||
131 | ; EAX = value lo load |
||
132 | ; Output: |
||
133 | ; ST(0) = DOUBLE loaded for processing |
||
134 | ; -------------------------------------------------------------------------- |
||
135 | align PROC_ALIGN |
||
136 | TCommon_FPU_Load_EAX: |
||
137 | mov [glb_FPU_Int32], eax |
||
138 | fild [glb_FPU_Int32] |
||
139 | ret |
||
140 | |||
141 | ; -------------------------------------------------------------------------- |
||
142 | ; Input: |
||
143 | ; ST(0) = DOUBLE value |
||
144 | ; Output: |
||
145 | ; EAX = truncated Int32 value |
||
146 | ; -------------------------------------------------------------------------- |
||
147 | align PROC_ALIGN |
||
148 | TCommon_FP_Truncate: |
||
149 | fisttp [glb_FPU_Int32] |
||
150 | mov eax, [glb_FPU_Int32] |
||
151 | ret |
||
152 | |||
153 | ; -------------------------------------------------------------------------- |
||
154 | ; Input: |
||
155 | ; ESI = points to DOUBLE X value |
||
156 | ; EDI = points to DOUBLE Y value |
||
157 | ; Output: |
||
158 | ; ST(0) = result X**Y |
||
159 | ; -------------------------------------------------------------------------- |
||
160 | align PROC_ALIGN |
||
161 | TCommon_X_exp_Y: |
||
162 | fld tbyte [edi] |
||
163 | fld tbyte [esi] |
||
164 | |||
165 | fyl2x |
||
166 | |||
167 | fld st |
||
168 | frndint |
||
169 | |||
170 | fsub st1, st |
||
171 | fxch |
||
172 | f2xm1 |
||
173 | fld1 |
||
174 | faddp |
||
175 | |||
176 | fscale |
||
177 | fxch |
||
178 | mcFpuPop |
||
179 | ret |
||
180 | |||
181 | ; -------------------------------------------------------------------------- |
||
182 | virtual at 0 |
||
183 | loc12: |
||
184 | .nQuadrants COUNT ? |
||
185 | .nStars COUNT ? |
||
186 | .pQuadrant PINT32 ? |
||
187 | .size = $ |
||
188 | end virtual |
||
189 | ; -------------------------------------------------------------------------- |
||
190 | align PROC_ALIGN |
||
191 | TCommon_AllocateStars: |
||
192 | mcBeginLocals loc12.size |
||
193 | |||
194 | mcLoad8bitsToReg32 eax, 64 |
||
195 | mcStoreLocal loc12.nQuadrants, eax |
||
196 | |||
197 | mcLoadGameDataPtr edx |
||
198 | lea edi, [edx + TREKDATA.GALAXY] |
||
199 | mcStoreLocal loc12.pQuadrant, edi |
||
200 | |||
201 | mcZeroBits ecx |
||
202 | mcStoreLocal loc12.nStars, ecx |
||
203 | |||
204 | .stars_for_quadrant: |
||
205 | mcLoad8bitsToReg32 edx, 9 |
||
206 | call TRandom_IRan |
||
207 | inc eax |
||
208 | |||
209 | add [esp + loc12.nStars], eax |
||
210 | mcLoadLocal edi, loc12.pQuadrant |
||
211 | mov [edi], eax |
||
212 | add [esp + loc12.pQuadrant], 4 |
||
213 | |||
214 | dec [esp + loc12.nQuadrants] |
||
215 | jnz .stars_for_quadrant |
||
216 | |||
217 | mcLoadLocal eax, loc12.nStars |
||
218 | mcLoadGameDataPtr ebx |
||
219 | mcStoreMember TREKDATA.INSTAR, eax |
||
220 | |||
221 | mcEndLocals loc12.size |
||
222 | ret |
||
223 | |||
224 | ; -------------------------------------------------------------------------- |
||
225 | virtual at 0 |
||
226 | loc13: |
||
227 | .base_IX INT32 ? |
||
228 | .base_IY INT32 ? |
||
229 | .base_DISTQ_max INT32 ? |
||
230 | .loop_I INT32 ? |
||
231 | .loop_J INT32 ? |
||
232 | .loop_LIM INT32 ? |
||
233 | .loop_INBASE INT32 ? |
||
234 | .pBaseQX PINT32 ? |
||
235 | .pBaseQY PINT32 ? |
||
236 | .pGalaxyCell PINT32 ? |
||
237 | .size = $ |
||
238 | end virtual |
||
239 | ; -------------------------------------------------------------------------- |
||
240 | align PROC_ALIGN |
||
241 | TCommon_AllocateBases: |
||
242 | mcBeginLocals loc13.size |
||
243 | |||
244 | mcLoadGameDataPtr esi |
||
245 | movzx eax, [esi + TREKDATA.INBASE] |
||
246 | mcStoreLocal loc13.loop_INBASE, eax |
||
247 | |||
248 | sub eax, 6 |
||
249 | neg eax |
||
250 | imul eax, 6 |
||
251 | mcStoreLocal loc13.base_DISTQ_max, eax |
||
252 | |||
253 | lea edx, [esi + TREKDATA.BASEQX] |
||
254 | lea ecx, [esi + TREKDATA.BASEQY] |
||
255 | mcStoreLocal loc13.pBaseQX, edx |
||
256 | mcStoreLocal loc13.pBaseQY, ecx |
||
257 | |||
258 | mcLoad1 eax |
||
259 | mcStoreLocal loc13.loop_I, eax |
||
260 | |||
261 | .L6: |
||
262 | call TRandom_IRan8 |
||
263 | mcStoreLocal loc13.base_IX, eax |
||
264 | mcStoreLocal loc13.base_IY, edx |
||
265 | |||
266 | call TArray_GalaxyPtr |
||
267 | mcStoreLocal loc13.pGalaxyCell, ebx |
||
268 | |||
269 | cmp dword [ebx], 10 |
||
270 | jae .L6 |
||
271 | |||
272 | cmp [esp + loc13.loop_I], 1 |
||
273 | je .L8 |
||
274 | |||
275 | mcLoadLocal ecx, loc13.loop_I |
||
276 | dec ecx |
||
277 | mcStoreLocal loc13.loop_LIM, ecx |
||
278 | ; |
||
279 | ; Check distances to already set up bases |
||
280 | ; |
||
281 | mcLoad1 eax |
||
282 | mcStoreLocal loc13.loop_J, eax |
||
283 | |||
284 | .calculate_distance: |
||
285 | mcLoadLocal ecx, loc13.loop_J |
||
286 | dec ecx |
||
287 | |||
288 | mcLoadLocal esi, loc13.pBaseQX |
||
289 | mcLoadLocal edi, loc13.pBaseQY |
||
290 | |||
291 | mcLoadLocal edx, loc13.base_IX |
||
292 | mcLoadLocal eax, loc13.base_IY |
||
293 | |||
294 | sub dl, [esi + ecx] |
||
295 | sub al, [edi + ecx] |
||
296 | |||
297 | movsx ecx, dl |
||
298 | imul ecx, ecx |
||
299 | |||
300 | movsx edx, al |
||
301 | imul edx, edx |
||
302 | |||
303 | add edx, ecx |
||
304 | cmp edx, [esp + loc13.base_DISTQ_max] |
||
305 | jae .L8 |
||
306 | |||
307 | fld [glb_dbl_0dot75] |
||
308 | call TRandom_Ranf |
||
309 | mc_CMP_ST0_ST1 |
||
310 | jc .L6 |
||
311 | |||
312 | inc [esp + loc13.loop_J] |
||
313 | mcLoadLocal ecx, loc13.loop_J |
||
314 | cmp ecx, [esp + loc13.loop_LIM] |
||
315 | jbe .calculate_distance |
||
316 | |||
317 | .L8: |
||
318 | mcLoadLocal esi, loc13.pBaseQX |
||
319 | mcLoadLocal edi, loc13.pBaseQY |
||
320 | |||
321 | mcLoadLocal eax, loc13.base_IX |
||
322 | mcLoadLocal edx, loc13.base_IY |
||
323 | |||
324 | mcLoadLocal ecx, loc13.loop_I |
||
325 | dec ecx |
||
326 | |||
327 | mov [esi + ecx], al |
||
328 | mov [edi + ecx], dl |
||
329 | |||
330 | mcLoad8bitsToReg32 ecx, -1 |
||
331 | call TArray_SetStarChartValue |
||
332 | |||
333 | mcLoadLocal edi, loc13.pGalaxyCell |
||
334 | add dword [edi], 10 |
||
335 | ; |
||
336 | ; Next base... |
||
337 | ; |
||
338 | inc [esp + loc13.loop_I] |
||
339 | mcLoadLocal ecx, loc13.loop_I |
||
340 | cmp ecx, [esp + loc13.loop_INBASE] |
||
341 | jbe .L6 |
||
342 | |||
343 | mcEndLocals loc13.size |
||
344 | ret |
||
345 | |||
346 | ; -------------------------------------------------------------------------- |
||
347 | virtual at 0 |
||
348 | loc14: |
||
349 | .nKREM COUNT ? |
||
350 | .nKLUMP COUNT ? |
||
351 | .nKLUMPER COUNT ? |
||
352 | .nNUM COUNT ? |
||
353 | .size = $ |
||
354 | end virtual |
||
355 | ; -------------------------------------------------------------------------- |
||
356 | align PROC_ALIGN |
||
357 | TCommon_AllocateKlingons: |
||
358 | mcBeginLocals loc14.size |
||
359 | |||
360 | mcLoadGameDataPtr esi |
||
361 | mcZeroBits eax |
||
362 | mov al, [esi + TREKDATA.INKLING] |
||
363 | sub al, [esi + TREKDATA.INCOM] |
||
364 | sub al, [esi + TREKDATA.NSCREM] |
||
365 | mcStoreLocal loc14.nKREM, eax |
||
366 | |||
367 | movzx edx, [esi + TREKDATA.SKILL] |
||
368 | movzx ecx, [esi + TREKDATA.LENGTH] |
||
369 | sub ecx, 9 |
||
370 | neg ecx |
||
371 | imul ecx, edx |
||
372 | mov [glb_FPU_Int32], ecx |
||
373 | fild [glb_FPU_Int32] |
||
374 | fld [glb_dbl_DOCKFAC] |
||
375 | fmulp |
||
376 | fld1 |
||
377 | faddp |
||
378 | call TCommon_FP_Truncate |
||
379 | |||
380 | cmp eax, 9 |
||
381 | jbe .store_KLUMPER |
||
382 | |||
383 | mcLoad8bitsToReg32 eax, 9 |
||
384 | |||
385 | .store_KLUMPER: |
||
386 | mcStoreLocal loc14.nKLUMPER, eax |
||
387 | |||
388 | .L10: |
||
389 | call TRandom_Ranf |
||
390 | fld st |
||
391 | fmulp |
||
392 | fld1 |
||
393 | fsubrp |
||
394 | fild [esp + loc14.nKLUMPER] |
||
395 | fmulp |
||
396 | call TCommon_FP_Truncate |
||
397 | |||
398 | cmp eax, [esp + loc14.nKREM] |
||
399 | jbe .store_KLUMP |
||
400 | |||
401 | mcLoadLocal eax, loc14.nKREM |
||
402 | |||
403 | .store_KLUMP: |
||
404 | mcStoreLocal loc14.nKLUMP, eax |
||
405 | |||
406 | imul eax, 100 |
||
407 | mcStoreLocal loc14.nNUM, eax |
||
408 | |||
409 | .L15: |
||
410 | call TRandom_IRan8 |
||
411 | call TArray_GalaxyPtr |
||
412 | |||
413 | mov eax, [ebx] |
||
414 | add eax, [esp + loc14.nNUM] |
||
415 | cmp eax, 999 |
||
416 | ja .L15 |
||
417 | |||
418 | mcLoadLocal ecx, loc14.nNUM |
||
419 | add [ebx], ecx |
||
420 | |||
421 | mcLoadLocal edx, loc14.nKLUMP |
||
422 | sub [esp + loc14.nKREM], edx |
||
423 | |||
424 | cmp [esp + loc14.nKREM], 0 |
||
425 | jne .L10 |
||
426 | |||
427 | mcEndLocals loc14.size |
||
428 | ret |
||
429 | |||
430 | ; -------------------------------------------------------------------------- |
||
431 | virtual at 0 |
||
432 | loc15: |
||
433 | .loop_INCOM COUNT ? |
||
434 | .loop_IY INT32 ? |
||
435 | .loop_IX INT32 ? |
||
436 | .loop_I COUNT ? |
||
437 | .loop_JJ COUNT ? |
||
438 | .loop_IM1 COUNT ? |
||
439 | .pCX PBYTE ? |
||
440 | .pCY PBYTE ? |
||
441 | .pGalaxyCell PINT32 ? |
||
442 | .size = $ |
||
443 | end virtual |
||
444 | ; -------------------------------------------------------------------------- |
||
445 | align PROC_ALIGN |
||
446 | TCommon_AllocateCommanders: |
||
447 | mcBeginLocals loc15.size |
||
448 | |||
449 | mcLoadGameDataPtr ebx |
||
450 | |||
451 | lea esi, [ebx + TREKDATA.CX] |
||
452 | lea edi, [ebx + TREKDATA.CY] |
||
453 | mcStoreLocal loc15.pCX, esi |
||
454 | mcStoreLocal loc15.pCY, edi |
||
455 | |||
456 | movzx ecx, [ebx + TREKDATA.INCOM] |
||
457 | mcStoreLocal loc15.loop_INCOM, ecx |
||
458 | |||
459 | mcLoad1 eax |
||
460 | mcStoreLocal loc15.loop_I, eax |
||
461 | |||
462 | .L16: |
||
463 | call TRandom_IRan8 |
||
464 | mcStoreLocal loc15.loop_IY, edx |
||
465 | mcStoreLocal loc15.loop_IX, eax |
||
466 | |||
467 | call TArray_GalaxyPtr |
||
468 | mcStoreLocal loc15.pGalaxyCell, ebx |
||
469 | |||
470 | cmp dword [ebx], 99 |
||
471 | jae .check_if_quad_full |
||
472 | |||
473 | fld [glb_dbl_0dot75] |
||
474 | call TRandom_Ranf |
||
475 | mc_CMP_ST0_ST1 |
||
476 | jc .L16 |
||
477 | |||
478 | .check_if_quad_full: |
||
479 | mcLoadLocal esi, loc15.pGalaxyCell |
||
480 | cmp dword [esi], 899 |
||
481 | ja .L16 |
||
482 | |||
483 | cmp [esp + loc15.loop_I], 1 |
||
484 | je .L17 |
||
485 | ; |
||
486 | ; Verify that quadrant IX,IY does not contain commander already |
||
487 | ; |
||
488 | mcLoadLocal ecx, loc15.loop_I |
||
489 | dec ecx |
||
490 | |||
491 | mcLoadLocal esi, loc15.pCX |
||
492 | mcLoadLocal edi, loc15.pCY |
||
493 | mcZeroBits ebx |
||
494 | mcZeroBits eax |
||
495 | mcZeroBits edx |
||
496 | |||
497 | .check_cx_cy: |
||
498 | mov al, [esi + ebx] |
||
499 | mov dl, [edi + ebx] |
||
500 | |||
501 | cmp eax, [esp + loc15.loop_IX] |
||
502 | jne .next |
||
503 | |||
504 | cmp edx, [esp + loc15.loop_IY] |
||
505 | je .L16 |
||
506 | |||
507 | .next: |
||
508 | inc ebx |
||
509 | loop .check_cx_cy |
||
510 | |||
511 | .L17: |
||
512 | mcLoadLocal edi, loc15.pGalaxyCell |
||
513 | add dword [edi], 100 |
||
514 | |||
515 | mcLoadLocal ecx, loc15.loop_I |
||
516 | dec ecx |
||
517 | |||
518 | mcLoadLocal esi, loc15.pCX |
||
519 | mcLoadLocal edi, loc15.pCY |
||
520 | |||
521 | mcLoadLocal eax, loc15.loop_IX |
||
522 | mcLoadLocal edx, loc15.loop_IY |
||
523 | |||
524 | mov [esi + ecx], al |
||
525 | mov [edi + ecx], dl |
||
526 | |||
527 | inc [esp + loc15.loop_I] |
||
528 | mcLoadLocal ecx, loc15.loop_I |
||
529 | cmp ecx, [esp + loc15.loop_INCOM] |
||
530 | jbe .L16 |
||
531 | |||
532 | mcEndLocals loc15.size |
||
533 | ret |
||
534 | |||
535 | ; -------------------------------------------------------------------------- |
||
536 | virtual at 0 |
||
537 | loc16: |
||
538 | .loop_INPLAN COUNT ? |
||
539 | .pPlanet PTPlanet ? |
||
540 | .size = $ |
||
541 | end virtual |
||
542 | ; -------------------------------------------------------------------------- |
||
543 | align PROC_ALIGN |
||
544 | TCommon_AllocatePlanets: |
||
545 | mcBeginLocals loc16.size |
||
546 | |||
547 | mcLoadGameDataPtr esi |
||
548 | movzx ecx, [esi + TREKDATA.INPLAN] |
||
549 | add esi, TREKDATA.PLNETS |
||
550 | mcStoreLocal loc16.loop_INPLAN, ecx |
||
551 | mcStoreLocal loc16.pPlanet, esi |
||
552 | |||
553 | .L19: |
||
554 | call TRandom_IRan8 |
||
555 | call TArray_NewStufPtr |
||
556 | |||
557 | cmp byte [ebx], 0 |
||
558 | jne .L19 |
||
559 | |||
560 | inc byte [ebx] |
||
561 | mcLoadLocal ebx, loc16.pPlanet |
||
562 | |||
563 | mov [ebx + TPlanet.planet_X], al |
||
564 | mov [ebx + TPlanet.planet_Y], dl |
||
565 | |||
566 | mcLoad8bitsToReg32 edx, 3 |
||
567 | call TRandom_IRan |
||
568 | inc eax |
||
569 | mov [ebx + TPlanet.planet_CLASS], al |
||
570 | |||
571 | call TRandom_Ranf |
||
572 | fld [glb_dbl_1dot2] |
||
573 | fmulp |
||
574 | call TCommon_FP_Truncate |
||
575 | mov [ebx + TPlanet.planet_DILITHIUM], al |
||
576 | |||
577 | add [esp + loc16.pPlanet], TPlanet.size |
||
578 | dec [esp + loc16.loop_INPLAN] |
||
579 | jnz .L19 |
||
580 | |||
581 | mcEndLocals loc16.size |
||
582 | ret |
||
583 | |||
584 | ; -------------------------------------------------------------------------- |
||
585 | align PROC_ALIGN |
||
586 | TCommon_AllocateRomulans: |
||
587 | mcLoadGameDataPtr esi |
||
588 | movzx ecx, [esi + TREKDATA.NROMREM] |
||
589 | |||
590 | .L21: |
||
591 | push ecx |
||
592 | |||
593 | call TRandom_IRan8 |
||
594 | call TArray_NewStufPtr |
||
595 | add byte [ebx], 10 |
||
596 | |||
597 | pop ecx |
||
598 | loop .L21 |
||
599 | ret |
||
600 | |||
601 | ; -------------------------------------------------------------------------- |
||
602 | align PROC_ALIGN |
||
603 | TCommon_AllocateSuperCommander: |
||
604 | mcLoadGameDataPtr esi |
||
605 | cmp [esi + TREKDATA.NSCREM], 0 |
||
606 | je .done |
||
607 | |||
608 | .L22: |
||
609 | call TRandom_IRan8 |
||
610 | call TArray_GalaxyPtr |
||
611 | |||
612 | cmp dword [ebx], 899 |
||
613 | ja .L22 |
||
614 | |||
615 | mcLoadGameDataPtr edi |
||
616 | mov [edi + TREKDATA.ISX], al |
||
617 | mov [edi + TREKDATA.ISY], dl |
||
618 | add dword [ebx], 100 |
||
619 | |||
620 | .done: |
||
621 | ret |
||
622 | |||
623 | ; -------------------------------------------------------------------------- |
||
624 | align PROC_ALIGN |
||
625 | TCommon_AllocateThing: |
||
626 | call TRandom_Ranf |
||
627 | fld [glb_dbl_0dot04] |
||
628 | mc_CMP_ST0_ST1 |
||
629 | jc .no_thing |
||
630 | |||
631 | mcLoadGameDataPtr esi |
||
632 | cmp [esi + TREKDATA.THINGX], -1 |
||
633 | je .no_thing |
||
634 | |||
635 | call TRandom_IRan8 |
||
636 | mcLoadGameDataPtr ebx |
||
637 | mcStoreMember TREKDATA.THINGX, al |
||
638 | mcStoreMember TREKDATA.THINGY, dl |
||
639 | jmp .done |
||
640 | |||
641 | .no_thing: |
||
642 | mcZeroBits eax |
||
643 | mcLoadGameDataPtr ebx |
||
644 | mcStoreMember TREKDATA.THINGX, al |
||
645 | mcStoreMember TREKDATA.THINGY, al |
||
646 | |||
647 | .done: |
||
648 | ret |
||
649 | |||
650 | ; -------------------------------------------------------------------------- |
||
651 | ; Input: |
||
652 | ; AL = X sector coordinate |
||
653 | ; DL = Y sector coordinate |
||
654 | ; CH = value to check |
||
655 | ; CL = replacement value |
||
656 | ; NOTE: |
||
657 | ; All registers are saved |
||
658 | ; -------------------------------------------------------------------------- |
||
659 | align PROC_ALIGN |
||
660 | TCommon_ReserveSector: |
||
661 | push ebx |
||
662 | |||
663 | call TArray_QuadPtr |
||
664 | cmp [ebx], ch |
||
665 | jne .done |
||
666 | |||
667 | mov [ebx], cl |
||
668 | |||
669 | .done: |
||
670 | pop ebx |
||
671 | ret |
||
672 | |||
673 | ; -------------------------------------------------------------------------- |
||
674 | ; Input: |
||
675 | ; AL = object character |
||
676 | ; Output: |
||
677 | ; AL = X sector coordinate |
||
678 | ; DL = Y sector coordinate |
||
679 | ; -------------------------------------------------------------------------- |
||
680 | align PROC_ALIGN |
||
681 | TCommon_DropIn: |
||
682 | mcBeginLocals 4 |
||
683 | mov [esp], eax |
||
684 | |||
685 | .try_sector: |
||
686 | call TRandom_IRan10 |
||
687 | call TArray_QuadPtr |
||
688 | |||
689 | cmp byte [ebx], CHAR_COSMOS |
||
690 | jne .try_sector |
||
691 | |||
692 | mov ecx, [esp] |
||
693 | mov [ebx], cl |
||
694 | |||
695 | mcEndLocals 4 |
||
696 | ret |
||
697 | |||
698 | ; -------------------------------------------------------------------------- |
||
699 | ; RESETD |
||
700 | ; -------------------------------------------------------------------------- |
||
701 | align PROC_ALIGN |
||
702 | TCommon_ResetDist: |
||
703 | call TCommon_NewCondition |
||
704 | |||
705 | mcLoadGameDataPtr ebx |
||
706 | cmp [ebx + TREKDATA.NENHERE], 0 |
||
707 | je .done |
||
708 | |||
709 | mcZeroBits ecx |
||
710 | mcLoadMemberRef esi, TREKDATA.KX |
||
711 | mcLoadMemberRef edi, TREKDATA.KY |
||
712 | |||
713 | .calc_dist: |
||
714 | movzx eax, [ebx + TREKDATA.SECTX] |
||
715 | movzx edx, byte [esi + ecx] |
||
716 | sub eax, edx |
||
717 | imul eax, eax |
||
718 | push eax |
||
719 | |||
720 | movzx eax, [ebx + TREKDATA.SECTY] |
||
721 | movzx edx, byte [edi + ecx] |
||
722 | sub eax, edx |
||
723 | imul eax, eax |
||
724 | pop edx |
||
725 | add eax, edx |
||
726 | |||
727 | call TCommon_FPU_Load_EAX |
||
728 | fsqrt |
||
729 | inc ecx |
||
730 | call TArray_SetDblKDist |
||
731 | |||
732 | cmp cl, [ebx + TREKDATA.NENHERE] |
||
733 | jbe .calc_dist |
||
734 | |||
735 | .done: |
||
736 | ret |
||
737 | |||
738 | ; -------------------------------------------------------------------------- |
||
739 | ; SORTKL |
||
740 | ; -------------------------------------------------------------------------- |
||
741 | virtual at 0 |
||
742 | loc30: |
||
743 | .nEnemies COUNT ? |
||
744 | .pKPower PDOUBLE ? |
||
745 | .pKDist PDOUBLE ? |
||
746 | .bSwitch BOOL ? |
||
747 | .pKX PBYTE ? |
||
748 | .pKY PBYTE ? |
||
749 | .size = $ |
||
750 | end virtual |
||
751 | ; -------------------------------------------------------------------------- |
||
752 | align PROC_ALIGN |
||
753 | TCommon_SortKlingons: |
||
754 | mcBeginLocals loc30.size |
||
755 | |||
756 | mcLoadGameDataPtr esi |
||
757 | cmp [esi + TREKDATA.NENHERE], 1 |
||
758 | jbe .done |
||
759 | |||
760 | lea eax, [esi + TREKDATA.KDIST] |
||
761 | lea ecx, [esi + TREKDATA.KPOWER] |
||
762 | lea edx, [esi + TREKDATA.KX] |
||
763 | lea ebx, [esi + TREKDATA.KY] |
||
764 | |||
765 | mcStoreLocal loc30.pKDist, eax |
||
766 | mcStoreLocal loc30.pKPower, ecx |
||
767 | mcStoreLocal loc30.pKX, edx |
||
768 | mcStoreLocal loc30.pKY, ebx |
||
769 | |||
770 | movzx ecx, [esi + TREKDATA.NENHERE] |
||
771 | dec ecx |
||
772 | mcStoreLocal loc30.nEnemies, ecx |
||
773 | |||
774 | .L10: |
||
775 | mcZeroBits eax |
||
776 | mcStoreLocal loc30.bSwitch, eax |
||
777 | |||
778 | mcZeroBits ecx |
||
779 | mcZeroBits edx |
||
780 | |||
781 | .check_distance: |
||
782 | mcLoadLocal esi, loc30.pKDist |
||
783 | fld tbyte [esi + edx + 10] |
||
784 | fld tbyte [esi + edx] |
||
785 | mc_CMP_ST0_ST1 |
||
786 | jc .L20 |
||
787 | jz .L20 |
||
788 | ; |
||
789 | ; Swap items from all arrays |
||
790 | ; |
||
791 | fld tbyte [esi + edx + 10] |
||
792 | fld tbyte [esi + edx] |
||
793 | fstp tbyte [esi + edx + 10] |
||
794 | fstp tbyte [esi + edx] |
||
795 | |||
796 | mcLoadLocal esi, loc30.pKPower |
||
797 | fld tbyte [esi + edx + 10] |
||
798 | fld tbyte [esi + edx] |
||
799 | fstp tbyte [esi + edx + 10] |
||
800 | fstp tbyte [esi + edx] |
||
801 | |||
802 | mcLoadLocal esi, loc30.pKX |
||
803 | mov al, [esi + ecx] |
||
804 | xchg al, [esi + ecx + 1] |
||
805 | mov [esi + ecx], al |
||
806 | |||
807 | mcLoadLocal esi, loc30.pKY |
||
808 | mov al, [esi + ecx] |
||
809 | xchg al, [esi + ecx + 1] |
||
810 | mov [esi + ecx], al |
||
811 | |||
812 | inc [esp + loc30.bSwitch] |
||
813 | |||
814 | .L20: |
||
815 | inc ecx |
||
816 | add edx, 10 |
||
817 | cmp ecx, [esp + loc30.nEnemies] |
||
818 | jb .check_distance |
||
819 | |||
820 | cmp [esp + loc30.bSwitch], 0 |
||
821 | jne .L10 |
||
822 | |||
823 | .done: |
||
824 | mcEndLocals loc30.size |
||
825 | ret |
||
826 | |||
827 | ; -------------------------------------------------------------------------- |
||
828 | ; NEWCOND |
||
829 | ; -------------------------------------------------------------------------- |
||
830 | align PROC_ALIGN |
||
831 | TCommon_NewCondition: |
||
832 | mcLoadGameDataPtr ebx |
||
833 | cmp [ebx + TREKDATA.CONDIT], CONDITION_DOCKED |
||
834 | je .done |
||
835 | mov [ebx + TREKDATA.CONDIT], CONDITION_GREEN |
||
836 | |||
837 | fld [glb_dbl_1000] |
||
838 | fld [ebx + TREKDATA.ENERGY] |
||
839 | mc_CMP_ST0_ST1 |
||
840 | jnc .check_enemies |
||
841 | |||
842 | mov [ebx + TREKDATA.CONDIT], CONDITION_YELLOW |
||
843 | |||
844 | .check_enemies: |
||
845 | call TArray_MyGalaxyPtr |
||
846 | cmp dword [ebx], 99 |
||
847 | ja .condition_red |
||
848 | |||
849 | call TArray_MyNewStufPtr |
||
850 | cmp byte [ebx], 9 |
||
851 | ja .condition_red |
||
852 | |||
853 | .done: |
||
854 | ret |
||
855 | |||
856 | .condition_red: |
||
857 | mcLoadGameDataPtr ebx |
||
858 | mov [ebx + TREKDATA.CONDIT], CONDITION_RED |
||
859 | ret |
||
860 | |||
861 | ; -------------------------------------------------------------------------- |
||
862 | align PROC_ALIGN |
||
863 | TCommon_DropBlackHole: |
||
864 | call TRandom_Ranf |
||
865 | fld [glb_dbl_0dot89] |
||
866 | mc_CMP_ST0_ST1 |
||
867 | jc .drop |
||
868 | ret |
||
869 | |||
870 | .drop: |
||
871 | mov al, CHAR_BLACK_HOLE |
||
872 | call TCommon_DropIn |
||
873 | ret |
||
874 | |||
875 | ; -------------------------------------------------------------------------- |
||
876 | ; NEWQUAD |
||
877 | ; -------------------------------------------------------------------------- |
||
878 | virtual at 0 |
||
879 | loc23: |
||
880 | .pTrekData PVOID ? |
||
881 | .nQUADNUM INT32 ? |
||
882 | .nPLAN INT32 ? |
||
883 | .nI INT32 ? |
||
884 | .nIX INT32 ? |
||
885 | .nIY INT32 ? |
||
886 | .nSKILL INT32 ? |
||
887 | .pKX PBYTE ? |
||
888 | .pKY PBYTE ? |
||
889 | .nKLHERE COUNT ? |
||
890 | .nNENHERE COUNT ? |
||
891 | .pKPOWER PDOUBLE ? |
||
892 | .nQuadValue INT32 ? |
||
893 | .size = $ |
||
894 | end virtual |
||
895 | ; -------------------------------------------------------------------------- |
||
896 | align PROC_ALIGN |
||
897 | TCommon_NewQuad: |
||
898 | mcBeginLocals loc23.size |
||
899 | mcLoadGameDataPtr ebx |
||
900 | mcStoreLocal loc23.pTrekData, ebx |
||
901 | |||
902 | mcZeroBits eax |
||
903 | dec eax |
||
904 | mcStoreMember TREKDATA.LANDED, al |
||
905 | |||
906 | inc eax |
||
907 | mcStoreMember TREKDATA.BASEX, al |
||
908 | mcStoreMember TREKDATA.BASEY, al |
||
909 | mcStoreMember TREKDATA.KLHERE, al |
||
910 | mcStoreMember TREKDATA.COMHERE, al |
||
911 | mcStoreMember TREKDATA.PLNETX, al |
||
912 | mcStoreMember TREKDATA.PLNETY, al |
||
913 | mcStoreMember TREKDATA.ISHERE, al |
||
914 | mcStoreMember TREKDATA.IRHERE, al |
||
915 | mcStoreMember TREKDATA.IPLANET, al |
||
916 | mcStoreMember TREKDATA.NENHERE, al |
||
917 | mcStoreMember TREKDATA.NEUTZ, al |
||
918 | mcStoreMember TREKDATA.INORBIT, al |
||
919 | mcStoreMember TREKDATA.IENTESC, al |
||
920 | mcStoreMember TREKDATA.ITHERE, al |
||
921 | |||
922 | inc eax |
||
923 | mcStoreMember TREKDATA.JUSTIN, al |
||
924 | dec eax |
||
925 | |||
926 | cmp [ebx + TREKDATA.ISCATE], al |
||
927 | je .L5 |
||
928 | |||
929 | mcStoreMember TREKDATA.ISCATE, al |
||
930 | inc [ebx + TREKDATA.IENTESC] |
||
931 | |||
932 | .L5: |
||
933 | call TArray_MyGalaxyPtr |
||
934 | mov eax, [ebx] |
||
935 | mcStoreLocal loc23.nQUADNUM, eax |
||
936 | |||
937 | cmp eax, 999 |
||
938 | ja .L70 |
||
939 | |||
940 | mcLoad8bitsToReg32 ecx, 100 |
||
941 | mcZeroBits edx |
||
942 | div ecx |
||
943 | mcLoadLocal ebx, loc23.pTrekData |
||
944 | mcStoreMember TREKDATA.KLHERE, al |
||
945 | |||
946 | call TArray_MyNewStufPtr |
||
947 | movzx eax, byte [ebx] |
||
948 | mcLoad8bitsToReg32 ecx, 10 |
||
949 | mcZeroBits edx |
||
950 | div ecx |
||
951 | mcLoadLocal ebx, loc23.pTrekData |
||
952 | mcStoreMember TREKDATA.IRHERE, al |
||
953 | mcStoreLocal loc23.nPLAN, edx |
||
954 | |||
955 | mcLoadMember cl, TREKDATA.KLHERE |
||
956 | add cl, al |
||
957 | mcStoreMember TREKDATA.NENHERE, cl |
||
958 | |||
959 | lea edi, [ebx + TREKDATA.QUAD] |
||
960 | mcLoad8bitsToReg32 ecx, 100 |
||
961 | mov al, CHAR_COSMOS |
||
962 | rep stosb |
||
963 | |||
964 | mcLoadMember al, TREKDATA.SECTX |
||
965 | mcLoadMember dl, TREKDATA.SECTY |
||
966 | mcLoadMember cl, TREKDATA.SHIP |
||
967 | call TArray_QuadPtr |
||
968 | mov [ebx], cl |
||
969 | |||
970 | fld [glb_dbl_0dot08] |
||
971 | call TRandom_Ranf |
||
972 | mc_CMP_ST0_ST1 |
||
973 | jc .L17 |
||
974 | |||
975 | mcLoadLocal ebx, loc23.pTrekData |
||
976 | mcLoadMemberRef esi, TREKDATA.PASSWD |
||
977 | mov edi, str_THOLIANX |
||
978 | call TString_AnsiEqual |
||
979 | jnc .L23 |
||
980 | |||
981 | .L17: |
||
982 | call TRandom_TholianSect |
||
983 | mcLoadLocal ebx, loc23.pTrekData |
||
984 | mcStoreMember TREKDATA.ITHX, al |
||
985 | |||
986 | call TRandom_TholianSect |
||
987 | mcLoadLocal ebx, loc23.pTrekData |
||
988 | mcStoreMember TREKDATA.ITHY, al |
||
989 | |||
990 | mov dl, al |
||
991 | mcLoadMember al, TREKDATA.ITHX |
||
992 | call TArray_QuadPtr |
||
993 | cmp byte [ebx], CHAR_COSMOS |
||
994 | jne .L17 |
||
995 | |||
996 | mov byte [ebx], CHAR_THOLIAN |
||
997 | mcLoadLocal edi, loc23.pTrekData |
||
998 | inc [edi + TREKDATA.ITHERE] |
||
999 | |||
1000 | mov cl, CHAR_WEB |
||
1001 | mov ch, CHAR_COSMOS |
||
1002 | mov al, 1 |
||
1003 | mov dl, al |
||
1004 | call TCommon_ReserveSector |
||
1005 | |||
1006 | mov dl, 10 |
||
1007 | call TCommon_ReserveSector |
||
1008 | |||
1009 | mov al, 10 |
||
1010 | call TCommon_ReserveSector |
||
1011 | |||
1012 | mov dl, 1 |
||
1013 | call TCommon_ReserveSector |
||
1014 | |||
1015 | .L23: |
||
1016 | ; |
||
1017 | ; Klingons! |
||
1018 | ; |
||
1019 | mcLoadLocal ebx, loc23.pTrekData |
||
1020 | movzx ecx, [ebx + TREKDATA.KLHERE] |
||
1021 | mcStoreLocal loc23.nKLHERE, ecx |
||
1022 | |||
1023 | imul eax, ecx, 100 |
||
1024 | mcStoreLocal loc23.nQuadValue, eax |
||
1025 | |||
1026 | mcLoadMemberRef esi, TREKDATA.KX |
||
1027 | mcLoadMemberRef edi, TREKDATA.KY |
||
1028 | mcLoad1 eax |
||
1029 | mcStoreLocal loc23.pKX, esi |
||
1030 | mcStoreLocal loc23.pKY, edi |
||
1031 | mcStoreLocal loc23.nI, eax |
||
1032 | |||
1033 | mcLoadMemberRef esi, TREKDATA.KPOWER |
||
1034 | mcStoreLocal loc23.pKPOWER, esi |
||
1035 | |||
1036 | movzx eax, [ebx + TREKDATA.SKILL] |
||
1037 | mcStoreLocal loc23.nSKILL, eax |
||
1038 | |||
1039 | cmp [esp + loc23.nQUADNUM], 100 |
||
1040 | jb .L34 |
||
1041 | |||
1042 | mcLoadLocal eax, loc23.nQuadValue |
||
1043 | sub [esp + loc23.nQUADNUM], eax |
||
1044 | |||
1045 | .put_klingon: |
||
1046 | mov al, CHAR_KLINGON |
||
1047 | call TCommon_DropIn |
||
1048 | mcLoadLocal esi, loc23.pKX |
||
1049 | mcLoadLocal edi, loc23.pKY |
||
1050 | mcLoadLocal ecx, loc23.nI |
||
1051 | dec ecx |
||
1052 | mov [esi + ecx], al |
||
1053 | mov [edi + ecx], dl |
||
1054 | mcStoreLocal loc23.nIX, eax |
||
1055 | mcStoreLocal loc23.nIY, edx |
||
1056 | |||
1057 | call TRandom_Ranf |
||
1058 | fld [glb_dbl_150] |
||
1059 | fmulp |
||
1060 | mcLoadLocal eax, loc23.nSKILL |
||
1061 | imul eax, 25 |
||
1062 | add eax, 300 |
||
1063 | call TCommon_FPU_Load_EAX |
||
1064 | faddp |
||
1065 | |||
1066 | mcLoadLocal edi, loc23.pKPOWER |
||
1067 | mcLoadLocal ecx, loc23.nI |
||
1068 | dec ecx |
||
1069 | imul ecx, 10 |
||
1070 | fstp tbyte [edi + ecx] |
||
1071 | |||
1072 | inc [esp + loc23.nI] |
||
1073 | mcLoadLocal edx, loc23.nI |
||
1074 | cmp edx, [esp + loc23.nKLHERE] |
||
1075 | jbe .put_klingon |
||
1076 | ; |
||
1077 | ; Commander! |
||
1078 | ; |
||
1079 | mcLoadLocal ebx, loc23.pTrekData |
||
1080 | cmp [ebx + TREKDATA.REMCOM], 0 |
||
1081 | je .L32 |
||
1082 | |||
1083 | mcLoadMember al, TREKDATA.QUADX |
||
1084 | mcLoadMember dl, TREKDATA.QUADY |
||
1085 | call TArray_FindCommander |
||
1086 | jecxz .L32 |
||
1087 | |||
1088 | mcLoadLocal eax, loc23.nIX |
||
1089 | mcLoadLocal edx, loc23.nIY |
||
1090 | call TArray_QuadPtr |
||
1091 | mov byte [ebx], CHAR_COMMANDER |
||
1092 | |||
1093 | mcLoadLocal eax, loc23.nSKILL |
||
1094 | imul eax, 50 |
||
1095 | add eax, 950 |
||
1096 | call TCommon_FPU_Load_EAX |
||
1097 | call TRandom_Ranf |
||
1098 | fld [glb_dbl_400] |
||
1099 | fmulp |
||
1100 | faddp |
||
1101 | mcLoadLocal ecx, loc23.nKLHERE |
||
1102 | call TArray_SetDblKPower |
||
1103 | |||
1104 | mcLoadLocal ebx, loc23.pTrekData |
||
1105 | inc [ebx + TREKDATA.COMHERE] |
||
1106 | |||
1107 | .L32: |
||
1108 | ; |
||
1109 | ; Super-Commander!! |
||
1110 | ; |
||
1111 | mcLoadLocal ebx, loc23.pTrekData |
||
1112 | |||
1113 | mcLoadMember al, TREKDATA.QUADX |
||
1114 | cmp al, [ebx + TREKDATA.ISX] |
||
1115 | jne .L34 |
||
1116 | |||
1117 | mcLoadMember dl, TREKDATA.QUADY |
||
1118 | cmp dl, [ebx + TREKDATA.ISY] |
||
1119 | jne .L34 |
||
1120 | ; |
||
1121 | ; He's here!! |
||
1122 | ; |
||
1123 | mcLoadLocal eax, loc23.nKLHERE |
||
1124 | mcStoreLocal loc23.nI, eax |
||
1125 | |||
1126 | cmp [ebx + TREKDATA.COMHERE], 0 |
||
1127 | je .L33 |
||
1128 | |||
1129 | dec [esp + loc23.nI] |
||
1130 | mcLoadLocal esi, loc23.pKX |
||
1131 | mcLoadLocal edi, loc23.pKY |
||
1132 | mcLoadLocal ecx, loc23.nI |
||
1133 | dec ecx |
||
1134 | movzx eax, byte [esi + ecx] |
||
1135 | movzx edx, byte [edi + ecx] |
||
1136 | mcStoreLocal loc23.nIX, eax |
||
1137 | mcStoreLocal loc23.nIY, edx |
||
1138 | |||
1139 | .L33: |
||
1140 | mcLoadLocal eax, loc23.nIX |
||
1141 | mcLoadLocal edx, loc23.nIY |
||
1142 | call TArray_QuadPtr |
||
1143 | mov byte [ebx], CHAR_SCOM |
||
1144 | |||
1145 | mcLoadLocal eax, loc23.nSKILL |
||
1146 | imul eax, 125 |
||
1147 | add eax, 1175 |
||
1148 | call TCommon_FPU_Load_EAX |
||
1149 | call TRandom_Ranf |
||
1150 | fld [glb_dbl_400] |
||
1151 | fmulp |
||
1152 | faddp |
||
1153 | mcLoadLocal ecx, loc23.nI |
||
1154 | call TArray_SetDblKPower |
||
1155 | |||
1156 | mcLoadLocal ebx, loc23.pTrekData |
||
1157 | inc [ebx + TREKDATA.ISCATE] |
||
1158 | inc [ebx + TREKDATA.ISHERE] |
||
1159 | |||
1160 | .L34: |
||
1161 | ; |
||
1162 | ; Romulans! |
||
1163 | ; |
||
1164 | mcLoadLocal ebx, loc23.pTrekData |
||
1165 | cmp [ebx + TREKDATA.IRHERE], 0 |
||
1166 | je .L37 |
||
1167 | |||
1168 | movzx eax, [ebx + TREKDATA.KLHERE] |
||
1169 | inc eax |
||
1170 | mcStoreLocal loc23.nI, eax |
||
1171 | |||
1172 | movzx eax, [ebx + TREKDATA.NENHERE] |
||
1173 | mcStoreLocal loc23.nNENHERE, eax |
||
1174 | |||
1175 | .drop_a_romulan: |
||
1176 | mov al, CHAR_ROMULAN |
||
1177 | call TCommon_DropIn |
||
1178 | |||
1179 | mcLoadLocal ecx, loc23.nI |
||
1180 | dec ecx |
||
1181 | mcLoadLocal esi, loc23.pKX |
||
1182 | mcLoadLocal edi, loc23.pKY |
||
1183 | mov [esi + ecx], al |
||
1184 | mov [edi + ecx], dl |
||
1185 | |||
1186 | mcLoadLocal eax, loc23.nSKILL |
||
1187 | imul eax, 50 |
||
1188 | add eax, 450 |
||
1189 | call TCommon_FPU_Load_EAX |
||
1190 | call TRandom_Ranf |
||
1191 | fld [glb_dbl_400] |
||
1192 | fmulp |
||
1193 | faddp |
||
1194 | |||
1195 | mcLoadLocal ecx, loc23.nI |
||
1196 | call TArray_SetDblKPower |
||
1197 | |||
1198 | inc [esp + loc23.nI] |
||
1199 | mcLoadLocal edx, loc23.nI |
||
1200 | cmp edx, [esp + loc23.nNENHERE] |
||
1201 | jbe .drop_a_romulan |
||
1202 | |||
1203 | .L37: |
||
1204 | call TCommon_ResetDist |
||
1205 | call TCommon_SortKlingons |
||
1206 | ; |
||
1207 | ; Starbase |
||
1208 | ; |
||
1209 | cmp [esp + loc23.nQUADNUM], 10 |
||
1210 | jb .L50 |
||
1211 | |||
1212 | sub [esp + loc23.nQUADNUM], 10 |
||
1213 | mov al, CHAR_STARBASE |
||
1214 | call TCommon_DropIn |
||
1215 | mcLoadLocal ebx, loc23.pTrekData |
||
1216 | mcStoreMember TREKDATA.BASEX, al |
||
1217 | mcStoreMember TREKDATA.BASEY, dl |
||
1218 | |||
1219 | .L50: |
||
1220 | ; |
||
1221 | ; Planet |
||
1222 | ; |
||
1223 | cmp [esp + loc23.nPLAN], 0 |
||
1224 | je .L54 |
||
1225 | |||
1226 | mcLoadLocal ebx, loc23.pTrekData |
||
1227 | mcLoadMember al, TREKDATA.QUADX |
||
1228 | mcLoadMember dl, TREKDATA.QUADY |
||
1229 | call TArray_FindPlanet |
||
1230 | mcStoreMember TREKDATA.IPLANET, cl |
||
1231 | jecxz .L54 |
||
1232 | |||
1233 | mov al, CHAR_PLANET |
||
1234 | call TCommon_DropIn |
||
1235 | mcLoadLocal ebx, loc23.pTrekData |
||
1236 | mcStoreMember TREKDATA.PLNETX, al |
||
1237 | mcStoreMember TREKDATA.PLNETY, dl |
||
1238 | |||
1239 | .L54: |
||
1240 | ; |
||
1241 | ; Stars like dust!.. |
||
1242 | ; |
||
1243 | call TCommon_NewCondition |
||
1244 | cmp [esp + loc23.nQUADNUM], 0 |
||
1245 | je .L62 |
||
1246 | |||
1247 | mcLoadLocal ecx, loc23.nQUADNUM |
||
1248 | |||
1249 | .drop_star: |
||
1250 | push ecx |
||
1251 | mov al, CHAR_ASTERISK |
||
1252 | call TCommon_DropIn |
||
1253 | pop ecx |
||
1254 | loop .drop_star |
||
1255 | |||
1256 | .L62: |
||
1257 | ; |
||
1258 | ; Check for Neutral Zone |
||
1259 | ; |
||
1260 | mcLoadLocal ebx, loc23.pTrekData |
||
1261 | mcZeroBits eax |
||
1262 | cmp [ebx + TREKDATA.IRHERE], al |
||
1263 | je .L66 |
||
1264 | cmp [ebx + TREKDATA.KLHERE], al |
||
1265 | jne .L66 |
||
1266 | cmp [ebx + TREKDATA.BASEX], al |
||
1267 | jne .L66 |
||
1268 | |||
1269 | mov cl, DEV_SUBSPACE_RADIO |
||
1270 | call TArray_IsDamaged |
||
1271 | jc .L64 |
||
1272 | |||
1273 | call TConsole_ScrollUp |
||
1274 | call TConsole_SetCrewMsgAttr |
||
1275 | mcLoad8bitsToReg32 ecx, 85 |
||
1276 | call TConsole_Prout |
||
1277 | mcLoad8bitsToReg32 ecx, 86 |
||
1278 | call TConsole_Prout |
||
1279 | call TConsole_ScrollUp |
||
1280 | mcLoad8bitsToReg32 ecx, 87 |
||
1281 | call TConsole_Prout |
||
1282 | mcLoad8bitsToReg32 ecx, 88 |
||
1283 | call TConsole_Prout |
||
1284 | call TConsole_ScrollUp |
||
1285 | |||
1286 | .L64: |
||
1287 | mcLoadLocal ebx, loc23.pTrekData |
||
1288 | inc [ebx + TREKDATA.NEUTZ] |
||
1289 | |||
1290 | .L66: |
||
1291 | ; |
||
1292 | ; Check for THING!! |
||
1293 | ; |
||
1294 | mcLoadLocal ebx, loc23.pTrekData |
||
1295 | cmp [ebx + TREKDATA.SHUTUP], 0 |
||
1296 | jne .L67 |
||
1297 | |||
1298 | mcLoadMember al, TREKDATA.THINGX |
||
1299 | cmp al, [ebx + TREKDATA.QUADX] |
||
1300 | jne .L67 |
||
1301 | |||
1302 | mcLoadMember al, TREKDATA.THINGY |
||
1303 | cmp al, [ebx + TREKDATA.QUADY] |
||
1304 | jne .L67 |
||
1305 | |||
1306 | mov al, CHAR_THING |
||
1307 | call TCommon_DropIn |
||
1308 | |||
1309 | mcLoadLocal ebx, loc23.pTrekData |
||
1310 | mcZeroBits eax |
||
1311 | mcStoreMember TREKDATA.THINGX, al |
||
1312 | mcStoreMember TREKDATA.THINGY, al |
||
1313 | |||
1314 | mov cl, DEV_SR_SENSORS |
||
1315 | call TArray_IsDamaged |
||
1316 | jc .L67 |
||
1317 | |||
1318 | call TConsole_ScrollUp |
||
1319 | call TConsole_SetCrewMsgAttr |
||
1320 | mcLoad8bitsToReg32 ecx, 89 |
||
1321 | call TConsole_Prout |
||
1322 | mcLoad8bitsToReg32 ecx, 90 |
||
1323 | call TConsole_Prout |
||
1324 | |||
1325 | .L67: |
||
1326 | call TCommon_DropBlackHole |
||
1327 | call TCommon_DropBlackHole |
||
1328 | call TCommon_DropBlackHole |
||
1329 | |||
1330 | mcLoadLocal ebx, loc23.pTrekData |
||
1331 | cmp [ebx + TREKDATA.ITHERE], 0 |
||
1332 | je .done |
||
1333 | |||
1334 | mov ch, CHAR_WEB |
||
1335 | mov cl, CHAR_COSMOS |
||
1336 | mov al, 1 |
||
1337 | mov dl, al |
||
1338 | call TCommon_ReserveSector |
||
1339 | |||
1340 | mov dl, 10 |
||
1341 | call TCommon_ReserveSector |
||
1342 | |||
1343 | mov al, 10 |
||
1344 | call TCommon_ReserveSector |
||
1345 | |||
1346 | mov dl, 1 |
||
1347 | call TCommon_ReserveSector |
||
1348 | jmp .done |
||
1349 | |||
1350 | .L70: |
||
1351 | ; |
||
1352 | ; Quadrant contains supernova |
||
1353 | ; |
||
1354 | mcLoadLocal edi, loc23.pTrekData |
||
1355 | add edi, TREKDATA.QUAD |
||
1356 | mcLoad8bitsToReg32 ecx, 100 |
||
1357 | mov al, CHAR_COSMOS |
||
1358 | rep stosb |
||
1359 | |||
1360 | .done: |
||
1361 | mcEndLocals loc23.size |
||
1362 | ret |
||
1363 | |||
1364 | ; -------------------------------------------------------------------------- |
||
1365 | virtual at 0 |
||
1366 | loc22: |
||
1367 | .pBaseX PBYTE ? |
||
1368 | .pBaseY PBYTE ? |
||
1369 | .nBases COUNT ? |
||
1370 | .iBase INDEX ? |
||
1371 | .size = $ |
||
1372 | end virtual |
||
1373 | ; -------------------------------------------------------------------------- |
||
1374 | align PROC_ALIGN |
||
1375 | TCommon_PrintBaseQuads: |
||
1376 | mcBeginLocals loc22.size |
||
1377 | |||
1378 | mcLoadGameDataPtr ebx |
||
1379 | mcLoadMemberRef esi, TREKDATA.BASEQX |
||
1380 | mcLoadMemberRef edi, TREKDATA.BASEQY |
||
1381 | movzx ecx, [ebx + TREKDATA.INBASE] |
||
1382 | mcLoad1 eax |
||
1383 | |||
1384 | mcStoreLocal loc22.pBaseX, esi |
||
1385 | mcStoreLocal loc22.pBaseY, edi |
||
1386 | mcStoreLocal loc22.nBases, ecx |
||
1387 | mcStoreLocal loc22.iBase, eax |
||
1388 | |||
1389 | .print_location: |
||
1390 | mcLoadLocal esi, loc22.pBaseX |
||
1391 | mcLoadLocal edi, loc22.pBaseY |
||
1392 | mcLoadLocal ecx, loc22.iBase |
||
1393 | |||
1394 | dec ecx |
||
1395 | mov al, [esi + ecx] |
||
1396 | mov dl, [edi + ecx] |
||
1397 | mcZeroBits ecx |
||
1398 | call TConsole_CramLoc |
||
1399 | |||
1400 | mcLoadLocal ecx, loc22.iBase |
||
1401 | cmp ecx, [esp + loc22.nBases] |
||
1402 | je .done |
||
1403 | |||
1404 | mcLoad8bitsToReg32 ecx, 53 |
||
1405 | call TConsole_Cram |
||
1406 | |||
1407 | inc [esp + loc22.iBase] |
||
1408 | jmp .print_location |
||
1409 | |||
1410 | .done: |
||
1411 | mcEndLocals loc22.size |
||
1412 | ret |
||
1413 | |||
1414 | ; -------------------------------------------------------------------------- |
||
1415 | align PROC_ALIGN |
||
1416 | TCommon_InitialMsg: |
||
1417 | call TConsole_SetGameMsgAttr |
||
1418 | call TConsole_ScrollUp |
||
1419 | |||
1420 | mcLoad8bitsToReg32 ecx, 47 |
||
1421 | call TConsole_Cram |
||
1422 | mov cl, 1 |
||
1423 | mcLoadGameDataPtr esi |
||
1424 | fld [esi + TREKDATA.DATE] |
||
1425 | push esi |
||
1426 | call TConsole_CramFloat |
||
1427 | call TConsole_ScrollUp |
||
1428 | pop esi |
||
1429 | |||
1430 | movzx eax, [esi + TREKDATA.INKLING] |
||
1431 | movzx ecx, [esi + TREKDATA.NSCREM] |
||
1432 | sub eax, ecx |
||
1433 | mov cl, 5 |
||
1434 | push esi |
||
1435 | call TConsole_CramIntWidth |
||
1436 | mcLoad8bitsToReg32 ecx, 48 |
||
1437 | call TConsole_Prout |
||
1438 | inc ecx |
||
1439 | call TConsole_Prout |
||
1440 | pop esi |
||
1441 | |||
1442 | cmp [esi + TREKDATA.NSCREM], 0 |
||
1443 | je .L25 |
||
1444 | |||
1445 | mcLoad8bitsToReg32 ecx, 50 |
||
1446 | push esi |
||
1447 | call TConsole_Prout |
||
1448 | pop esi |
||
1449 | |||
1450 | .L25: |
||
1451 | fld [esi + TREKDATA.INTIME] |
||
1452 | call TCommon_FP_Truncate |
||
1453 | mov cl, 5 |
||
1454 | push esi |
||
1455 | call TConsole_CramIntWidth |
||
1456 | mcLoad8bitsToReg32 ecx, 51 |
||
1457 | call TConsole_Prout |
||
1458 | pop esi |
||
1459 | |||
1460 | movzx eax, [esi + TREKDATA.INBASE] |
||
1461 | mov cl, 5 |
||
1462 | push esi |
||
1463 | call TConsole_CramIntWidth |
||
1464 | mcLoad8bitsToReg32 ecx, 52 |
||
1465 | call TConsole_Cram |
||
1466 | call TCommon_PrintBaseQuads |
||
1467 | call TConsole_ScrollUp |
||
1468 | call TConsole_ScrollUp |
||
1469 | |||
1470 | mcLoad8bitsToReg32 ecx, 54 |
||
1471 | call TConsole_Cram |
||
1472 | pop esi |
||
1473 | |||
1474 | mov cl, 1 |
||
1475 | mov al, [esi + TREKDATA.QUADX] |
||
1476 | mov dl, [esi + TREKDATA.QUADY] |
||
1477 | push esi |
||
1478 | call TConsole_CramLoc |
||
1479 | |||
1480 | mov al, ',' |
||
1481 | call TConsole_PutChar |
||
1482 | pop esi |
||
1483 | |||
1484 | mov cl, 2 |
||
1485 | mov al, [esi + TREKDATA.SECTX] |
||
1486 | mov dl, [esi + TREKDATA.SECTY] |
||
1487 | push esi |
||
1488 | call TConsole_CramLoc |
||
1489 | call TConsole_ScrollUp |
||
1490 | |||
1491 | mcLoad8bitsToReg32 ecx, 55 |
||
1492 | call TConsole_Cram |
||
1493 | pop esi |
||
1494 | |||
1495 | cmp [esi + TREKDATA.NSCREM], 0 |
||
1496 | je .done |
||
1497 | |||
1498 | mcLoad8bitsToReg32 ecx, 56 |
||
1499 | call TConsole_Cram |
||
1500 | |||
1501 | .done: |
||
1502 | call TConsole_ScrollUp |
||
1503 | call TConsole_ScrollUp |
||
1504 | ret |
||
1505 | |||
1506 | ; -------------------------------------------------------------------------- |
||
1507 | ; Subroutine SETUP from original source |
||
1508 | ; -------------------------------------------------------------------------- |
||
1509 | virtual at 0 |
||
1510 | loc11: |
||
1511 | .dbl_IDATE DOUBLE ? |
||
1512 | .dbl_Reserved DOUBLE ? |
||
1513 | .size = $ |
||
1514 | end virtual |
||
1515 | ; -------------------------------------------------------------------------- |
||
1516 | align PROC_ALIGN |
||
1517 | TCommon_Setup: |
||
1518 | mcBeginLocals loc11.size |
||
1519 | mcLoadGameDataPtr ebx |
||
1520 | |||
1521 | mcStoreMember TREKDATA.SHIP, CHAR_ENTERPRISE |
||
1522 | |||
1523 | fld [glb_dbl_5000] |
||
1524 | fld st |
||
1525 | fstp [ebx + TREKDATA.INENRG] |
||
1526 | fstp [ebx + TREKDATA.ENERGY] |
||
1527 | |||
1528 | fld [glb_dbl_2500] |
||
1529 | fld st |
||
1530 | fstp [ebx + TREKDATA.INSHLD] |
||
1531 | fstp [ebx + TREKDATA.SHLD] |
||
1532 | |||
1533 | fld [glb_dbl_4] |
||
1534 | fld st |
||
1535 | fstp [ebx + TREKDATA.INLSR] |
||
1536 | fstp [ebx + TREKDATA.LSUPRES] |
||
1537 | |||
1538 | mcStoreMember TREKDATA.INTORPS, 10 |
||
1539 | mcStoreMember TREKDATA.TORPS, 10 |
||
1540 | mcStoreMember TREKDATA.NPTUBES, 3 |
||
1541 | |||
1542 | fld [glb_dbl_5] |
||
1543 | fld [glb_dbl_25] |
||
1544 | fstp [ebx + TREKDATA.WFACSQ] |
||
1545 | fstp [ebx + TREKDATA.WARPFAC] |
||
1546 | |||
1547 | call TRandom_Ranf |
||
1548 | fld [glb_dbl_31] |
||
1549 | fmulp |
||
1550 | fld [glb_dbl_20] |
||
1551 | faddp |
||
1552 | fld [glb_dbl_100] |
||
1553 | fmulp |
||
1554 | fld st |
||
1555 | fld st |
||
1556 | fstp [ebx + TREKDATA.DATE] |
||
1557 | fstp [ebx + TREKDATA.INDATE] |
||
1558 | fstp [ebx + TREKDATA.DOCKDATE] |
||
1559 | |||
1560 | call TRandom_IRan8 |
||
1561 | mcStoreMember TREKDATA.QUADX, al |
||
1562 | mcStoreMember TREKDATA.QUADY, dl |
||
1563 | |||
1564 | call TRandom_IRan10 |
||
1565 | mcStoreMember TREKDATA.SECTX, al |
||
1566 | mcStoreMember TREKDATA.SECTY, dl |
||
1567 | |||
1568 | mcStoreMember TREKDATA.ISCRAFT, 1 |
||
1569 | mcStoreMember TREKDATA.ALIVE, 1 |
||
1570 | mcStoreMember TREKDATA.LANDED, -1 |
||
1571 | |||
1572 | fld [glb_dbl_0dot05] |
||
1573 | fstp [ebx + TREKDATA.CRYPROB] |
||
1574 | ; |
||
1575 | ; Events |
||
1576 | ; |
||
1577 | fld [ebx + TREKDATA.INTIME] |
||
1578 | fld [glb_dbl_0dot5] |
||
1579 | fmulp |
||
1580 | call TCommon_ExpRan |
||
1581 | fld [ebx + TREKDATA.DATE] |
||
1582 | faddp |
||
1583 | fstp [ebx + TREKDATA.FUTURE1] |
||
1584 | |||
1585 | fld [ebx + TREKDATA.INTIME] |
||
1586 | fld [glb_dbl_1dot5] |
||
1587 | fmulp |
||
1588 | movzx ecx, [ebx + TREKDATA.REMCOM] |
||
1589 | mov [glb_FPU_Int32], ecx |
||
1590 | fild [glb_FPU_Int32] |
||
1591 | fdivp |
||
1592 | call TCommon_ExpRan |
||
1593 | fld [ebx + TREKDATA.DATE] |
||
1594 | faddp |
||
1595 | fstp [ebx + TREKDATA.FUTURE2] |
||
1596 | |||
1597 | fld [ebx + TREKDATA.INTIME] |
||
1598 | fld [glb_dbl_0dot5] |
||
1599 | fmulp |
||
1600 | call TCommon_ExpRan |
||
1601 | fld [ebx + TREKDATA.DATE] |
||
1602 | faddp |
||
1603 | fstp [ebx + TREKDATA.FUTURE3] |
||
1604 | |||
1605 | fld [ebx + TREKDATA.INTIME] |
||
1606 | fld [glb_dbl_0dot3] |
||
1607 | fmulp |
||
1608 | call TCommon_ExpRan |
||
1609 | fld [ebx + TREKDATA.DATE] |
||
1610 | faddp |
||
1611 | fstp [ebx + TREKDATA.FUTURE4] |
||
1612 | |||
1613 | fld [glb_dbl_1E38] |
||
1614 | fld st |
||
1615 | fld st |
||
1616 | fstp [ebx + TREKDATA.FUTURE5] |
||
1617 | fstp [ebx + TREKDATA.FUTURE6] |
||
1618 | fstp [ebx + TREKDATA.FUTURE7] |
||
1619 | |||
1620 | cmp [ebx + TREKDATA.NSCREM], 0 |
||
1621 | je .allocate_objects |
||
1622 | |||
1623 | fld [ebx + TREKDATA.DATE] |
||
1624 | fld [glb_dbl_0dot2777] |
||
1625 | faddp |
||
1626 | fstp [ebx + TREKDATA.FUTURE6] |
||
1627 | |||
1628 | .allocate_objects: |
||
1629 | call TCommon_AllocateStars |
||
1630 | call TCommon_AllocateBases |
||
1631 | call TCommon_AllocateKlingons |
||
1632 | call TCommon_AllocateCommanders |
||
1633 | call TCommon_AllocatePlanets |
||
1634 | call TCommon_AllocateRomulans |
||
1635 | call TCommon_AllocateSuperCommander |
||
1636 | call TCommon_AllocateThing |
||
1637 | |||
1638 | call TCommon_InitialMsg |
||
1639 | call TCommon_NewQuad |
||
1640 | |||
1641 | mcEndLocals loc11.size |
||
1642 | ret |
||
1643 | |||
1644 | ; --- EOF --- |