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();
334 var
336 begin
343 begin
352 {
353 procedure CorrectOffsets(id: Integer); inline;
354 var
355 part: PParticle;
356 begin
357 part := @Particles[id];
358 part.offsetX := 0;
359 part.offsetY := 0;
360 // check for upper wall
361 if isBlockedAt(part.X, part.Y-1) then part.offsetY := 1;
362 // check for left wall
363 if isBlockedAt(part.X-1, part.Y) then part.offsetX := 1;
364 end;
365 }
368 // ////////////////////////////////////////////////////////////////////////// //
370 var
375 begin
380 begin
382 {
383 if (not ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)) and
384 (not ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)) and
385 (not ByteBool(gCollideMap[Y, X-1] and MARK_BLOCKED)) and
386 (not ByteBool(gCollideMap[Y, X+1] and MARK_BLOCKED))
387 then
388 }
393 then
398 end
399 else
404 exit;
408 begin
447 begin
450 else
456 begin
459 //c := gCollideMap[Y, X+s];
468 Break;
476 begin
479 else
485 begin
488 //c := gCollideMap[Y+s, X];
497 State := STATE_NORMAL
498 else
500 Break;
507 else
508 begin
519 end
520 else
521 begin
530 // Êðîâü ðàñòâîðÿåòñÿ â æèäêîñòè:
532 begin
540 // ////////////////////////////////////////////////////////////////////////// //
542 var
544 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
547 {$ELSE}
550 {$ENDIF}
551 begin
555 {$IF DEFINED(D2F_NEW_SPARK_THINKER)}
557 begin
558 pan := g_Map_traceToNearest(X, Y-1, X, Y+1, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey);
560 {$ELSE}
569 {$ENDIF}
572 begin
573 {$IF DEFINED(D2F_NEW_SPARK_THINKER)}
574 pan := g_Map_traceToNearest(X, Y, X+dX, Y, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey);
575 //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);
577 // free to ride?
579 begin
580 // nope
581 if ((pan.tag and (GridTagAcid1 or GridTagAcid2 or GridTagWater)) <> 0) then begin die(); exit; end;
586 {$ELSE}
590 begin
592 //c := gCollideMap[Y, X+s];
597 Break;
598 end
603 begin
605 break;
608 {$ENDIF}
612 begin
613 {$IF DEFINED(D2F_NEW_SPARK_THINKER)}
614 pan := g_Map_traceToNearest(X, Y, X, Y+dY, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey);
615 //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);
616 (*
617 if (pan <> nil) then
618 begin
619 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);
620 end
621 else
622 begin
623 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);
624 end;
625 *)
627 // free to ride?
629 begin
630 //die(); exit;
631 // nope
632 if ((pan.tag and (GridTagAcid1 or GridTagAcid2 or GridTagWater)) <> 0) then begin die(); exit; end;
634 begin
637 end
638 else
639 begin
647 {$ELSE}
651 begin
653 //c := gCollideMap[Y+s, X];
657 begin
660 end
662 begin
669 Break;
670 end
675 begin
677 break;
680 {$ENDIF}
686 begin
695 // ////////////////////////////////////////////////////////////////////////// //
697 var
699 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
703 {$ELSE}
706 {$ENDIF}
707 begin
708 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
711 {$ENDIF}
713 //TODO: trace wall end when water becomes stick
718 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
722 {$ELSE}
724 begin
725 // no walls around, drop
727 end
728 else
729 begin
730 if (g_Map_PanelAtPoint(X+stickDX, Y, (GridTagWall or GridTagDoor or GridTagStep)) = nil) then State := STATE_NORMAL;
732 {$ENDIF}
733 exit;
736 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
738 begin
761 {$ELSE}
762 pan := g_Map_PanelAtPoint(X, Y, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater or GridTagLift));
764 begin
765 if ((pan.tag and (GridTagAcid1 or GridTagAcid2 or GridTagWater)) <> 0) then begin die(); exit; end;
767 begin
774 begin
779 begin
784 {$ENDIF}
789 {$IF not DEFINED(D2F_NEW_SPARK_THINKER)}
791 begin
802 {$ELSE}
804 begin
805 // Âèñèò â âîçäóõå - êàïàåò
806 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
807 begin
813 {$ENDIF}
815 {$IF DEFINED(D2F_NEW_SPARK_THINKER)}
816 // horizontal
818 begin
819 pan := g_Map_traceToNearest(X, Y, X+dX, Y, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey);
821 // free to ride?
823 begin
824 // nope
825 if (dY > 0) and ((pan.tag and (GridTagAcid1 or GridTagAcid2 or GridTagWater)) <> 0) then begin die(); exit; end;
826 // Ñòåíà/äâåðü?
828 begin
839 // vertical
841 begin
842 pan := g_Map_traceToNearest(X, Y, X, Y+dY, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey);
844 // free to ride?
846 begin
847 // nope
848 if (dY > 0) and ((pan.tag and (GridTagAcid1 or GridTagAcid2 or GridTagWater)) <> 0) then begin die(); exit; end;
849 // Ñòåíà/äâåðü?
851 begin
857 begin
859 end
860 else
861 begin
863 if (g_Map_PanelAtPoint(X-1, Y, (GridTagWall or GridTagDoor or GridTagStep)) <> nil) then stickDX := -1
864 else if (g_Map_PanelAtPoint(X+1, Y, (GridTagWall or GridTagDoor or GridTagStep)) <> nil) then stickDX := 1
871 {$ELSE}
872 // horizontal
874 begin
877 begin
878 // Ñáîêó ãðàíèöà?
880 //c := gCollideMap[Y, X+s];
881 // Ñáîêó æèäêîñòü, à ÷àñòèöà óæå ïàäàåò?
890 Break;
895 // vertical
897 begin
900 begin
901 // Ñíèçó/ñâåðõó ãðàíèöà
903 //c := gCollideMap[Y+s, X];
904 // Ñíèçó æèäêîñòü, à ÷àñòèöà óæå ïàäàåò
913 break;
918 {$ENDIF}
927 // ////////////////////////////////////////////////////////////////////////// //
929 var
934 begin
940 begin
943 else
947 begin
950 (*
951 if not isLiquidAt(X, Y+s) {ByteBool(gCollideMap[Y+s, X] and MARK_LIQUID)} then
952 begin // Óæå íå æèäêîñòü
953 State := STATE_FREE;
954 Break;
955 end;
956 *)
957 // we traced liquid before, so don't bother checking
971 // ////////////////////////////////////////////////////////////////////////// //
973 var
978 begin
989 begin
991 begin
1001 else
1017 {CorrectOffsets(CurrentParticle);}
1022 else
1030 var
1037 begin
1039 begin
1041 Exit;
1045 Exit;
1055 begin
1057 begin
1061 {
1062 if (X < 0) or (X > gMapInfo.Width-1) or
1063 (Y < 0) or (Y > gMapInfo.Height-1) or
1064 ByteBool(gCollideMap[Y, X] and MARK_WALL) then
1065 Continue;
1066 }
1075 else
1083 begin
1088 end else
1091 begin
1096 end else
1099 begin
1104 end else
1114 {CorrectOffsets(CurrentParticle);}
1119 else
1126 var
1133 begin
1136 Exit;
1155 begin
1157 begin
1176 {CorrectOffsets(CurrentParticle);}
1181 else
1186 procedure g_GFX_Water(fX, fY: Integer; Count: Word; fVelX, fVelY: Single; DevX, DevY, Color: Byte);
1187 var
1192 begin
1195 Exit;
1208 begin
1210 begin
1216 else
1226 begin
1232 begin
1238 begin
1244 begin
1258 {CorrectOffsets(CurrentParticle);}
1263 else
1268 procedure g_GFX_SimpleWater(fX, fY: Integer; Count: Word; fVelX, fVelY: Single; DefColor, CR, CG, CB: Byte);
1269 var
1272 begin
1275 Exit;
1280 begin
1282 begin
1293 begin
1299 begin
1305 begin
1311 begin
1320 begin
1329 begin
1343 {CorrectOffsets(CurrentParticle);}
1348 else
1355 var
1360 begin
1363 Exit;
1373 begin
1375 begin
1381 Continue;
1383 (*
1384 // don't spawn bubbles outside of the liquid
1385 if not isLiquidAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIQUID)} then
1386 Continue;
1387 *)
1389 // trace liquid, so we'll know where it ends; do it in 8px steps for speed
1390 // tracer will return `false` if we started outside of the liquid
1408 {CorrectOffsets(CurrentParticle);}
1413 else
1419 var
1421 begin
1428 //if CurrentParticle >= Count then
1433 begin
1438 var
1440 begin
1444 begin
1446 Exit;
1450 begin
1453 end
1454 else
1455 begin
1462 var
1464 begin
1466 Exit;
1479 var
1483 begin
1486 begin
1493 begin
1495 begin
1497 begin
1500 //if not alive then Continue;
1501 //e_WriteLog(Format('particle #%d: %d', [State, ParticleType]), MSG_NOTIFY);
1503 {CorrectOffsets(a);}
1510 begin
1513 begin
1515 ONCEANIM_SMOKE:
1516 begin
1525 begin
1528 end
1529 else
1536 var
1538 begin
1540 begin
1554 begin