6ce5a66da7847fac8d4184d7b7908784c5503c5a
1 (* Copyright (C) DooM 2D:Forever Developers
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *)
16 {$INCLUDE ../shared/a_modes.inc}
17 {$DEFINE D2F_NEW_SPARK_THINKER}
20 interface
22 uses
25 const
49 procedure g_GFX_Water(fX, fY: Integer; Count: Word; fVelX, fVelY: Single; DevX, DevY, Color: Byte);
50 procedure g_GFX_SimpleWater(fX, fY: Integer; Count: Word; fVelX, fVelY: Single; DefColor, CR, CG, CB: Byte);
63 var
68 implementation
70 uses
75 type
88 // for bubbles
90 // for water
93 //k8: sorry, i have to emulate virtual methods this way, 'cause i haet `Object`
111 const
120 var
127 // ////////////////////////////////////////////////////////////////////////// //
132 begin
142 // ////////////////////////////////////////////////////////////////////////// //
144 begin
149 // ???
151 begin
157 begin
163 begin
169 begin
175 begin
181 begin
187 begin
189 result := g_Map_HasAnyPanelAtPoint(x, y, (PANEL_WALL or PANEL_CLOSEDOOR or PANEL_OPENDOOR or PANEL_WATER or PANEL_ACID1 or PANEL_ACID2 or PANEL_STEP or PANEL_LIFTUP or PANEL_LIFTDOWN or PANEL_LIFTLEFT or PANEL_LIFTRIGHT));
194 {$IF not DEFINED(HAS_COLLIDE_BITMAP)}
195 begin
197 {$ELSE}
198 var
200 begin
202 begin
208 Exit;
211 begin
217 Exit;
220 Exit;
222 Exit;
237 end
238 else
246 {$ENDIF}
249 {$IF DEFINED(HAS_COLLIDE_BITMAP)}
251 var
253 begin
260 begin
268 begin
276 begin
284 begin
288 begin
303 begin
306 begin
308 begin
309 // Çàêðûòàÿ äâåðü:
317 end
324 {$ENDIF}
328 begin
329 //CreateCollideMap();
330 {$IFDEF HEADLESS}
332 {$ENDIF}
337 var
339 begin
346 begin
355 // ////////////////////////////////////////////////////////////////////////// //
357 var
360 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
363 {$ELSE}
366 {$ENDIF}
367 begin
372 begin
374 begin
375 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
376 {
377 if (not ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)) and
378 (not ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)) and
379 (not ByteBool(gCollideMap[Y, X-1] and MARK_BLOCKED)) and
380 (not ByteBool(gCollideMap[Y, X+1] and MARK_BLOCKED))
381 then
382 }
387 {$ELSE}
388 if not g_Map_CollidePanel(X-1, Y-1, 3, 3, (PANEL_STEP or PANEL_WALL or PANEL_OPENDOOR or PANEL_CLOSEDOOR))
389 {$ENDIF}
390 then
395 end
400 exit;
404 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
406 begin
425 {$ELSE}
428 begin
430 begin
437 begin
442 begin
447 {$ENDIF}
452 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
454 begin
465 {$ELSE}
467 begin
468 // Âèñèò â âîçäóõå - êàïàåò
469 if (nil = g_Map_traceToNearest(X, Y-1, X, Y+1, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey)) then
470 begin
476 {$ENDIF}
478 {$IF DEFINED(D2F_NEW_SPARK_THINKER)}
479 // horizontal
481 begin
482 pan := g_Map_traceToNearest(X, Y, X+dX, Y, (GridTagWall or GridTagDoor or GridTagStep), @ex, @ey);
484 // free to ride?
486 begin
487 // Ñòåíà/äâåðü
497 // vertical
499 begin
500 pan := g_Map_traceToNearest(X, Y, X, Y+dY, (GridTagWall or GridTagDoor or GridTagStep), @ex, @ey);
502 // free to ride?
504 begin
505 // Ñòåíà/äâåðü
511 begin
513 end
514 else
515 begin
517 if (g_Map_PanelAtPoint(X-1, Y, (GridTagWall or GridTagDoor or GridTagStep)) <> nil) then stickDX := -1
518 else if (g_Map_PanelAtPoint(X+1, Y, (GridTagWall or GridTagDoor or GridTagStep)) <> nil) then stickDX := 1
524 {$ELSE}
525 // horizontal
527 begin
531 begin
533 //c := gCollideMap[Y, X+s];
541 break;
546 // vertical
548 begin
552 begin
554 //c := gCollideMap[Y+s, X];
562 break;
567 {$ENDIF}
569 else
570 begin
573 if (X+dX >= w) or (Y+dY >= h) or (X+dX <= 0) or (Y+dY <= 0) or isBlockedAt(X+dX, Y+dY) {ByteBool(gCollideMap[Y+dY, X+dX] and MARK_BLOCKED)} then
576 exit;
577 //VelX := 0;
578 //VelY := 0;
579 end
580 else
581 begin
590 // Êðîâü ðàñòâîðÿåòñÿ â æèäêîñòè:
592 begin
600 // ////////////////////////////////////////////////////////////////////////// //
602 var
604 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
608 {$ELSE}
611 {$ENDIF}
612 begin
613 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
616 {$ENDIF}
618 //TODO: trace wall end when water becomes stick
623 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
627 {$ELSE}
629 begin
630 // no walls around, drop
632 end
633 else
634 begin
635 if (g_Map_PanelAtPoint(X+stickDX, Y, (GridTagWall or GridTagDoor or GridTagStep)) = nil) then State := STATE_NORMAL;
637 {$ENDIF}
638 exit;
641 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
643 begin
666 {$ELSE}
669 begin
670 if ((pan.tag and (GridTagAcid1 or GridTagAcid2 or GridTagWater)) <> 0) then begin die(); exit; end;
672 begin
679 begin
684 begin
689 {$ENDIF}
694 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
696 begin
707 {$ELSE}
709 begin
710 // Âèñèò â âîçäóõå - êàïàåò
711 if (nil = g_Map_traceToNearest(X, Y-1, X, Y+1, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey)) then
712 begin
718 {$ENDIF}
720 {$IF DEFINED(D2F_NEW_SPARK_THINKER)}
721 // horizontal
723 begin
724 pan := g_Map_traceToNearest(X, Y, X+dX, Y, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey);
726 // free to ride?
728 begin
729 // nope
730 if (dY > 0) and ((pan.tag and (GridTagAcid1 or GridTagAcid2 or GridTagWater)) <> 0) then begin die(); exit; end;
731 // Ñòåíà/äâåðü?
733 begin
744 // vertical
746 begin
747 pan := g_Map_traceToNearest(X, Y, X, Y+dY, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey);
749 // free to ride?
751 begin
752 // nope
753 if (dY > 0) and ((pan.tag and (GridTagAcid1 or GridTagAcid2 or GridTagWater)) <> 0) then begin die(); exit; end;
754 // Ñòåíà/äâåðü?
756 begin
762 begin
764 end
765 else
766 begin
768 if (g_Map_PanelAtPoint(X-1, Y, (GridTagWall or GridTagDoor or GridTagStep)) <> nil) then stickDX := -1
769 else if (g_Map_PanelAtPoint(X+1, Y, (GridTagWall or GridTagDoor or GridTagStep)) <> nil) then stickDX := 1
776 {$ELSE}
777 // horizontal
779 begin
782 begin
783 // Ñáîêó ãðàíèöà?
785 //c := gCollideMap[Y, X+s];
786 // Ñáîêó æèäêîñòü, à ÷àñòèöà óæå ïàäàåò?
795 Break;
800 // vertical
802 begin
805 begin
806 // Ñíèçó/ñâåðõó ãðàíèöà
808 //c := gCollideMap[Y+s, X];
809 // Ñíèçó æèäêîñòü, à ÷àñòèöà óæå ïàäàåò
818 break;
823 {$ENDIF}
832 // ////////////////////////////////////////////////////////////////////////// //
834 var
836 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
839 {$ELSE}
842 {$ENDIF}
843 begin
847 {$IF DEFINED(D2F_NEW_SPARK_THINKER)}
849 begin
850 pan := g_Map_traceToNearest(X, Y-1, X, Y+1, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey);
852 {$ELSE}
861 {$ENDIF}
864 begin
865 {$IF DEFINED(D2F_NEW_SPARK_THINKER)}
866 pan := g_Map_traceToNearest(X, Y, X+dX, Y, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey);
867 //e_WriteLog(Format('spark h-trace: (%d,%d)-(%d,%d); dx=%d; end=(%d,%d); hit=%d', [X, Y, X+dX, Y, dX, ex, ey, Integer(pan <> nil)]), MSG_NOTIFY);
869 // free to ride?
871 begin
872 // nope
873 if ((pan.tag and (GridTagAcid1 or GridTagAcid2 or GridTagWater)) <> 0) then begin die(); exit; end;
878 {$ELSE}
882 begin
884 //c := gCollideMap[Y, X+s];
889 Break;
890 end
895 begin
897 break;
900 {$ENDIF}
904 begin
905 {$IF DEFINED(D2F_NEW_SPARK_THINKER)}
906 pan := g_Map_traceToNearest(X, Y, X, Y+dY, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey);
907 //e_WriteLog(Format('spark y-trace: (%d,%d)-(%d,%d); dy=%d; end=(%d,%d); hit=%d', [X, Y, X, Y+dY, dY, ex, ey, Integer(pan <> nil)]), MSG_NOTIFY);
908 (*
909 if (pan <> nil) then
910 begin
911 e_WriteLog(Format('spark y-trace: %08x (%d,%d)-(%d,%d); dy=%d; end=(%d,%d); hittag=%04x', [LongWord(@self), X, Y, X, Y+dY, dY, ex, ey, pan.tag]), MSG_NOTIFY);
912 end
913 else
914 begin
915 e_WriteLog(Format('spark y-trace: %08x (%d,%d)-(%d,%d); dy=%d; end=(%d,%d); hit=%d', [LongWord(@self), X, Y, X, Y+dY, dY, ex, ey, Integer(pan <> nil)]), MSG_NOTIFY);
916 end;
917 *)
919 // free to ride?
921 begin
922 //die(); exit;
923 // nope
924 if ((pan.tag and (GridTagAcid1 or GridTagAcid2 or GridTagWater)) <> 0) then begin die(); exit; end;
926 begin
929 end
930 else
931 begin
939 {$ELSE}
943 begin
945 //c := gCollideMap[Y+s, X];
949 begin
952 end
954 begin
961 Break;
962 end
967 begin
969 break;
972 {$ENDIF}
978 begin
986 // ////////////////////////////////////////////////////////////////////////// //
988 var
993 begin
999 begin
1002 else
1006 begin
1009 (*
1010 if not isLiquidAt(X, Y+s) {ByteBool(gCollideMap[Y+s, X] and MARK_LIQUID)} then
1011 begin // Óæå íå æèäêîñòü
1012 State := STATE_FREE;
1013 Break;
1014 end;
1015 *)
1016 // we traced liquid before, so don't bother checking
1030 // ////////////////////////////////////////////////////////////////////////// //
1032 var
1037 begin
1049 begin
1051 begin
1061 else
1080 else
1088 var
1095 begin
1098 begin
1100 Exit;
1104 Exit;
1114 begin
1116 begin
1120 {
1121 if (X < 0) or (X > gMapInfo.Width-1) or
1122 (Y < 0) or (Y > gMapInfo.Height-1) or
1123 ByteBool(gCollideMap[Y, X] and MARK_WALL) then
1124 Continue;
1125 }
1134 else
1142 begin
1147 end else
1150 begin
1155 end else
1158 begin
1163 end else
1176 else
1183 var
1190 begin
1194 Exit;
1213 begin
1215 begin
1237 else
1242 procedure g_GFX_Water(fX, fY: Integer; Count: Word; fVelX, fVelY: Single; DevX, DevY, Color: Byte);
1243 var
1248 begin
1252 Exit;
1265 begin
1267 begin
1273 else
1283 begin
1289 begin
1295 begin
1301 begin
1318 else
1323 procedure g_GFX_SimpleWater(fX, fY: Integer; Count: Word; fVelX, fVelY: Single; DefColor, CR, CG, CB: Byte);
1324 var
1327 begin
1331 Exit;
1336 begin
1338 begin
1349 begin
1355 begin
1361 begin
1367 begin
1376 begin
1385 begin
1402 else
1409 var
1414 begin
1418 Exit;
1428 begin
1430 begin
1436 Continue;
1438 (*
1439 // don't spawn bubbles outside of the liquid
1440 if not isLiquidAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIQUID)} then
1441 Continue;
1442 *)
1444 // trace liquid, so we'll know where it ends; do it in 8px steps for speed
1445 // tracer will return `false` if we started outside of the liquid
1466 else
1472 var
1474 begin
1481 //if CurrentParticle >= Count then
1486 begin
1491 var
1493 begin
1497 begin
1499 Exit;
1503 begin
1506 end
1507 else
1508 begin
1515 var
1517 begin
1520 Exit;
1533 var
1537 begin
1540 begin
1547 begin
1549 begin
1551 begin
1554 //if not alive then Continue;
1555 //e_WriteLog(Format('particle #%d: %d', [State, ParticleType]), MSG_NOTIFY);
1563 begin
1566 begin
1568 ONCEANIM_SMOKE:
1569 begin
1578 begin
1581 end
1582 else
1589 var
1591 begin
1593 begin
1607 begin