X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_gfx.pas;h=b137db3ee26bc1936bcb9729329e48deb621d072;hb=674a902ed6e62076ad4bafc2b8f74d181f6bf287;hp=ab895762d3cae8f6b59ed2cc18fe77fc87ed3650;hpb=4caa7355c2a35f38ee6fbd541cfed72751a520a4;p=d2df-sdl.git diff --git a/src/game/g_gfx.pas b/src/game/g_gfx.pas index ab89576..b137db3 100644 --- a/src/game/g_gfx.pas +++ b/src/game/g_gfx.pas @@ -87,6 +87,8 @@ type offsetX, offsetY: ShortInt; // for bubbles liquidTopY: Integer; // don't float higher than this + // for water + stickDX: Integer; //k8: sorry, i have to emulate virtual methods this way, 'cause i haet `Object` @@ -325,6 +327,9 @@ end; procedure g_GFX_Init(); begin //CreateCollideMap(); +{$IFDEF HEADLESS} + gpart_dbg_enabled := False; +{$ENDIF} end; @@ -368,170 +373,475 @@ procedure TParticle.thinkerBlood (); var w, h: Integer; dX, dY: SmallInt; + {$IF not DEFINED(D2F_NEW_SPARK_THINKER)} b: Integer; s: ShortInt; + {$ELSE} + pan: TPanel; + ex, ey: Integer; + {$ENDIF} begin w := gMapInfo.Width; h := gMapInfo.Height; if gAdvBlood then + begin + if (State = STATE_STICK) then begin - if (State = STATE_STICK) then - { - if (not ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)) and - (not ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)) and - (not ByteBool(gCollideMap[Y, X-1] and MARK_BLOCKED)) and - (not ByteBool(gCollideMap[Y, X+1] and MARK_BLOCKED)) - then - } - if (not isBlockedAt(X, Y-1)) and - (not isBlockedAt(X, Y+1)) and - (not isBlockedAt(X-1, Y)) and - (not isBlockedAt(X+1, Y)) - then - begin // Îòëèïëà - êàïàåò - VelY := 0.5; - AccelY := 0.15; - State := STATE_NORMAL; - end - else - if Random(200) = 100 then - begin // Ïðèëåïëåíà - íî âîçìîæíî ñòåêàåò - VelY := 0.5; - AccelY := 0.15; - exit; - end; + {$IF not DEFINED(D2F_NEW_SPARK_THINKER)} + { + if (not ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)) and + (not ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)) and + (not ByteBool(gCollideMap[Y, X-1] and MARK_BLOCKED)) and + (not ByteBool(gCollideMap[Y, X+1] and MARK_BLOCKED)) + then + } + if (not isBlockedAt(X, Y-1)) and + (not isBlockedAt(X, Y+1)) and + (not isBlockedAt(X-1, Y)) and + (not isBlockedAt(X+1, Y)) + {$ELSE} + if not g_Map_CollidePanel(X-1, Y-1, 3, 3, (PANEL_STEP or PANEL_WALL or PANEL_OPENDOOR or PANEL_CLOSEDOOR)) + {$ENDIF} + then + begin // Îòëèïëà - êàïàåò + VelY := 0.5; + AccelY := 0.15; + State := STATE_NORMAL; + end + else if (Random(200) = 100) then + begin // Ïðèëåïëåíà - íî âîçìîæíî ñòåêàåò + VelY := 0.5; + AccelY := 0.15; + exit; + end; + end; - if not isBlockedAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)} then + {$IF not DEFINED(D2F_NEW_SPARK_THINKER)} + if not isBlockedAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)} then + begin + if isLiftUpAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTUP)} then + begin // Ëèôò ââåðõ + if (VelY > -4-Random(3)) then VelY -= 0.8; + if (abs(VelX) > 0.1) then VelX -= VelX/10.0; + VelX += (Random-Random)*0.2; + AccelY := 0.15; + end; + if isLiftLeftAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTLEFT)} then + begin // Ïîòîê âëåâî + if (VelX > -8-Random(3)) then VelX -= 0.8; + AccelY := 0.15; + end; + if isLiftRightAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTRIGHT)} then + begin // Ïîòîê âïðàâî + if (VelX < 8+Random(3)) then VelX += 0.8; + AccelY := 0.15; + end; + end; + {$ELSE} + pan := g_Map_PanelAtPoint(X, Y, GridTagLift); + if (pan <> nil) then + begin + if ((pan.PanelType and PANEL_LIFTUP) <> 0) then begin - if isLiftUpAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTUP)} then - begin // Ëèôò ââåðõ - if VelY > -4-Random(3) then - VelY := VelY - 0.8; - if Abs(VelX) > 0.1 then - VelX := VelX - VelX/10.0; - VelX := VelX + (Random-Random)*0.2; - AccelY := 0.15; - end; - if isLiftLeftAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTLEFT)} then - begin // Ïîòîê âëåâî - if VelX > -8-Random(3) then - VelX := VelX - 0.8; - AccelY := 0.15; - end; - if isLiftRightAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTRIGHT)} then - begin // Ïîòîê âïðàâî - if VelX < 8+Random(3) then - VelX := VelX + 0.8; - AccelY := 0.15; - end; + if (VelY > -4-Random(3)) then VelY -= 0.8; + if (abs(VelX) > 0.1) then VelX -= VelX/10.0; + VelX += (Random-Random)*0.2; + AccelY := 0.15; end; - - dX := Round(VelX); - dY := Round(VelY); - - if (Abs(VelX) < 0.1) and (Abs(VelY) < 0.1) then - if (State <> STATE_STICK) and - (not isBlockedAt(X, Y-1) {ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)}) and - (not isBlockedAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)}) and - (not isBlockedAt(X, Y+1) {ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)}) then - begin // Âèñèò â âîçäóõå - êàïàåò - VelY := 0.8; - AccelY := 0.5; - State := STATE_NORMAL; - end; - - if dX <> 0 then + if ((pan.PanelType and PANEL_LIFTLEFT) <> 0) then begin - if dX > 0 then - s := 1 - else - s := -1; - - dX := Abs(dX); + if (VelX > -8-Random(3)) then VelX -= 0.8; + AccelY := 0.15; + end; + if ((pan.PanelType and PANEL_LIFTRIGHT) <> 0) then + begin + if (VelX < 8+Random(3)) then VelX += 0.8; + AccelY := 0.15; + end; + end; + {$ENDIF} - for b := 1 to dX do - begin - if (X+s >= w) or (X+s <= 0) then begin die(); break; end; - - //c := gCollideMap[Y, X+s]; - - if isBlockedAt(X+s, Y) {ByteBool(c and MARK_BLOCKED)} then - begin // Ñòåíà/äâåðü - VelX := 0; - VelY := 0; - AccelX := 0; - AccelY := 0; - State := STATE_STICK; - Break; - end; + dX := Round(VelX); + dY := Round(VelY); - X := X+s; - end; + {$IF not DEFINED(D2F_NEW_SPARK_THINKER)} + if (Abs(VelX) < 0.1) and (Abs(VelY) < 0.1) then + begin + if (State <> STATE_STICK) and + (not isBlockedAt(X, Y-1) {ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)}) and + (not isBlockedAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)}) and + (not isBlockedAt(X, Y+1) {ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)}) then + begin // Âèñèò â âîçäóõå - êàïàåò + VelY := 0.8; + AccelY := 0.5; + State := STATE_NORMAL; + end; + end; + {$ELSE} + if (State <> STATE_STICK) and (Abs(VelX) < 0.1) and (Abs(VelY) < 0.1) then + begin + // Âèñèò â âîçäóõå - êàïàåò + 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 + begin + VelY := 0.8; + AccelY := 0.5; + State := STATE_NORMAL; end; + end; + {$ENDIF} - if dY <> 0 then + {$IF DEFINED(D2F_NEW_SPARK_THINKER)} + // horizontal + if (dX <> 0) then + begin + pan := g_Map_traceToNearest(X, Y, X+dX, Y, (GridTagWall or GridTagDoor or GridTagStep), @ex, @ey); + X := ex; + // free to ride? + if (pan <> nil) then + begin + // Ñòåíà/äâåðü + VelX := 0; + VelY := 0; + AccelX := 0; + AccelY := 0; + State := STATE_STICK; + if (dX > 0) then stickDX := 1 else stickDX := -1; + end; + if (X < 0) or (X >= w) then begin die(); exit; end; + end; + // vertical + if (dY <> 0) then + begin + pan := g_Map_traceToNearest(X, Y, X, Y+dY, (GridTagWall or GridTagDoor or GridTagStep), @ex, @ey); + Y := ey; + // free to ride? + if (pan <> nil) then begin - if dY > 0 then - s := 1 + // Ñòåíà/äâåðü + VelX := 0; + VelY := 0; + AccelX := 0; + AccelY := 0; + if (dY > 0) and (State <> STATE_STICK) then + begin + State := STATE_NORMAL; + end else - s := -1; - - dY := Abs(dY); - - for b := 1 to dY do begin - if (Y+s >= h) or (Y+s <= 0) then begin die(); break; end; - - //c := gCollideMap[Y+s, X]; - - if isBlockedAt(X, Y+s) {ByteBool(c and MARK_BLOCKED)} then - begin // Ñòåíà/äâåðü - VelX := 0; - VelY := 0; - AccelX := 0; - AccelY := 0; - if (s > 0) and (State <> STATE_STICK) then - State := STATE_NORMAL - else - State := STATE_STICK; - Break; - end; - - Y := Y+s; + State := STATE_STICK; + if (g_Map_PanelAtPoint(X-1, Y, (GridTagWall or GridTagDoor or GridTagStep)) <> nil) then stickDX := -1 + else if (g_Map_PanelAtPoint(X+1, Y, (GridTagWall or GridTagDoor or GridTagStep)) <> nil) then stickDX := 1 + else stickDX := 0; end; end; - end // if gAdvBlood - else + if (Y < 0) or (Y >= h) then begin die(); exit; end; + end; + {$ELSE} + // horizontal + if (dX <> 0) then begin - dX := Round(VelX); - dY := Round(VelY); - - 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 - begin // Ñòåíà/äâåðü/ãðàíèöà - die(); + if (dX > 0) then s := 1 else s := -1; + dX := Abs(dX); + for b := 1 to dX do + begin + if (X+s >= w) or (X+s <= 0) then begin die(); break; end; + //c := gCollideMap[Y, X+s]; + if isBlockedAt(X+s, Y) {ByteBool(c and MARK_BLOCKED)} then + begin // Ñòåíà/äâåðü VelX := 0; VelY := 0; - end - else - begin - Y := Y + dY; - X := X + dX; + AccelX := 0; + AccelY := 0; + State := STATE_STICK; + break; end; + X := X+s; + end; + end; + // vertical + if (dY <> 0) then + begin + if (dY > 0) then s := 1 else s := -1; + dY := Abs(dY); + for b := 1 to dY do + begin + if (Y+s >= h) or (Y+s <= 0) then begin die(); break; end; + //c := gCollideMap[Y+s, X]; + if isBlockedAt(X, Y+s) {ByteBool(c and MARK_BLOCKED)} then + begin // Ñòåíà/äâåðü + VelX := 0; + VelY := 0; + AccelX := 0; + AccelY := 0; + if (s > 0) and (State <> STATE_STICK) then State := STATE_NORMAL else State := STATE_STICK; + break; + end; + Y := Y+s; + end; + end; + {$ENDIF} + end // if gAdvBlood + else + begin + dX := Round(VelX); + dY := Round(VelY); + 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 + begin // Ñòåíà/äâåðü/ãðàíèöà + die(); + exit; + //VelX := 0; + //VelY := 0; + end + else + begin + Y += dY; + X += dX; end; + end; - VelX := VelX + AccelX; - VelY := VelY + AccelY; + VelX += AccelX; + VelY += AccelY; -// Êðîâü ðàñòâîðÿåòñÿ â æèäêîñòè: + // Êðîâü ðàñòâîðÿåòñÿ â æèäêîñòè: if isLiquidAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIQUID)} then begin - Inc(Time); + Time += 1; + Alpha := 255-trunc((255.0*Time)/LiveTime); + end; +end; + + + +// ////////////////////////////////////////////////////////////////////////// // +procedure TParticle.thinkerWater (); +var + dX, dY: SmallInt; + {$IF not DEFINED(D2F_NEW_SPARK_THINKER)} + w, h: Integer; + b: Integer; + s: ShortInt; + {$ELSE} + pan: TPanel; + ex, ey: Integer; + {$ENDIF} +begin + {$IF not DEFINED(D2F_NEW_SPARK_THINKER)} + w := gMapInfo.Width; + h := gMapInfo.Height; + {$ENDIF} + + //TODO: trace wall end when water becomes stick + if (State = STATE_STICK) and (Random(30) = 15) then + begin // Ñòåêàåò/îòëèïàåò + VelY := 0.5; + AccelY := 0.15; + {$IF not DEFINED(D2F_NEW_SPARK_THINKER)} + if (not isBlockedAt(X-1, Y) {ByteBool(gCollideMap[Y, X-1] and MARK_BLOCKED)}) and + (not isBlockedAt(X+1, Y) {ByteBool(gCollideMap[Y, X+1] and MARK_BLOCKED)}) then + State := STATE_NORMAL; + {$ELSE} + if (stickDX = 0) then + begin + // no walls around, drop + State := STATE_NORMAL; + end + else + begin + if (g_Map_PanelAtPoint(X+stickDX, Y, (GridTagWall or GridTagDoor or GridTagStep)) = nil) then State := STATE_NORMAL; + end; + {$ENDIF} + exit; + end; + + {$IF not DEFINED(D2F_NEW_SPARK_THINKER)} + if not isBlockedAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)} then + begin + if isLiftUpAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTUP)} then + begin // Ëèôò ââåðõ + if VelY > -4-Random(3) then + VelY := VelY - 0.8; + if Abs(VelX) > 0.1 then + VelX := VelX - VelX/10.0; + VelX := VelX + (Random-Random)*0.2; + AccelY := 0.15; + end; + if isLiftLeftAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTLEFT)} then + begin // Ïîòîê âëåâî + if VelX > -8-Random(3) then + VelX := VelX - 0.8; + AccelY := 0.15; + end; + if isLiftRightAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTRIGHT)} then + begin // Ïîòîê âïðàâî + if VelX < 8+Random(3) then + VelX := VelX + 0.8; + AccelY := 0.15; + end; + end; + {$ELSE} + pan := g_Map_PanelAtPoint(X, Y, (GridTagAcid1 or GridTagAcid2 or GridTagWater or GridTagLift)); + if (pan <> nil) then + begin + if ((pan.tag and (GridTagAcid1 or GridTagAcid2 or GridTagWater)) <> 0) then begin die(); exit; end; + if ((pan.PanelType and PANEL_LIFTUP) <> 0) then + begin + if (VelY > -4-Random(3)) then VelY -= 0.8; + if (Abs(VelX) > 0.1) then VelX -= VelX/10.0; + VelX += (Random-Random)*0.2; + AccelY := 0.15; + end; + if ((pan.PanelType and PANEL_LIFTLEFT) <> 0) then + begin + if (VelX > -8-Random(3)) then VelX -= 0.8; + AccelY := 0.15; + end; + if ((pan.PanelType and PANEL_LIFTRIGHT) <> 0) then + begin + if (VelX < 8+Random(3)) then VelX += 0.8; + AccelY := 0.15; + end; + end; + {$ENDIF} + + dX := Round(VelX); + dY := Round(VelY); + + {$IF not DEFINED(D2F_NEW_SPARK_THINKER)} + if (Abs(VelX) < 0.1) and (Abs(VelY) < 0.1) then + begin + if (State <> STATE_STICK) and + (not isBlockedAt(X, Y-1) {ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)}) and + (not isBlockedAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)}) and + (not isBlockedAt(X, Y+1) {ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)}) then + begin // Âèñèò â âîçäóõå - êàïàåò + VelY := 0.8; + AccelY := 0.5; + State := STATE_NORMAL; + end; + end; + {$ELSE} + if (State <> STATE_STICK) and (Abs(VelX) < 0.1) and (Abs(VelY) < 0.1) then + begin + // Âèñèò â âîçäóõå - êàïàåò + 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 + begin + VelY := 0.8; + AccelY := 0.5; + State := STATE_NORMAL; + end; + end; + {$ENDIF} - Alpha := 255 - Trunc((255.0 * Time) / LiveTime); + {$IF DEFINED(D2F_NEW_SPARK_THINKER)} + // horizontal + if (dX <> 0) then + begin + pan := g_Map_traceToNearest(X, Y, X+dX, Y, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey); + X := ex; + // free to ride? + if (pan <> nil) then + begin + // nope + if (dY > 0) and ((pan.tag and (GridTagAcid1 or GridTagAcid2 or GridTagWater)) <> 0) then begin die(); exit; end; + // Ñòåíà/äâåðü? + if ((pan.tag and (GridTagWall or GridTagDoor or GridTagStep)) <> 0) then + begin + VelX := 0; + VelY := 0; + AccelX := 0; + AccelY := 0; + State := STATE_STICK; + if (dX > 0) then stickDX := 1 else stickDX := -1; + end; + end; + if (X < 0) or (X >= gMapInfo.Width) then begin die(); exit; end; + end; + // vertical + if (dY <> 0) then + begin + pan := g_Map_traceToNearest(X, Y, X, Y+dY, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey); + Y := ey; + // free to ride? + if (pan <> nil) then + begin + // nope + if (dY > 0) and ((pan.tag and (GridTagAcid1 or GridTagAcid2 or GridTagWater)) <> 0) then begin die(); exit; end; + // Ñòåíà/äâåðü? + if ((pan.tag and (GridTagWall or GridTagDoor or GridTagStep)) <> 0) then + begin + VelX := 0; + VelY := 0; + AccelX := 0; + AccelY := 0; + if (dY > 0) and (State <> STATE_STICK) then + begin + State := STATE_NORMAL; + end + else + begin + State := STATE_STICK; + if (g_Map_PanelAtPoint(X-1, Y, (GridTagWall or GridTagDoor or GridTagStep)) <> nil) then stickDX := -1 + else if (g_Map_PanelAtPoint(X+1, Y, (GridTagWall or GridTagDoor or GridTagStep)) <> nil) then stickDX := 1 + else stickDX := 0; + end; + end; + end; + if (Y < 0) or (Y >= gMapInfo.Height) then begin die(); exit; end; + end; + {$ELSE} + // horizontal + if (dX <> 0) then + begin + if (dX > 0) then s := 1 else s := -1; + for b := 1 to Abs(dX) do + begin + // Ñáîêó ãðàíèöà? + if (X+s >= w) or (X+s <= 0) then begin die(); break;end; + //c := gCollideMap[Y, X+s]; + // Ñáîêó æèäêîñòü, à ÷àñòèöà óæå ïàäàåò? + if isLiquidAt(X+s, Y) {ByteBool(c and MARK_LIQUID)} and (dY > 0) then begin die(); break; end; + if isBlockedAt(X+s, Y) {ByteBool(c and MARK_BLOCKED)} then + begin // Ñòåíà/äâåðü + VelX := 0; + VelY := 0; + AccelX := 0; + AccelY := 0; + State := STATE_STICK; + Break; + end; + X := X+s; + end; + end; + // vertical + if (dY <> 0) then + begin + if (dY > 0) then s := 1 else s := -1; + for b := 1 to Abs(dY) do + begin + // Ñíèçó/ñâåðõó ãðàíèöà + if (Y+s >= h) or (Y+s <= 0) then begin die(); break; end; + //c := gCollideMap[Y+s, X]; + // Ñíèçó æèäêîñòü, à ÷àñòèöà óæå ïàäàåò + if isLiquidAt(X, Y+s) {ByteBool(c and MARK_LIQUID)} and (dY > 0) then begin die(); break; end; + if isBlockedAt(X, Y+s) {ByteBool(c and MARK_BLOCKED)} then + begin // Ñòåíà/äâåðü + VelX := 0; + VelY := 0; + AccelX := 0; + AccelY := 0; + if (s > 0) and (State <> STATE_STICK) then State := STATE_NORMAL else State := STATE_STICK; + break; + end; + Y := Y+s; + end; end; + {$ENDIF} + + VelX += AccelX; + VelY += AccelY; + + Time += 1; end; @@ -689,7 +999,6 @@ begin Time += 1; end; - // ////////////////////////////////////////////////////////////////////////// // procedure TParticle.thinkerBubble (); var @@ -734,138 +1043,6 @@ begin end; -// ////////////////////////////////////////////////////////////////////////// // -procedure TParticle.thinkerWater (); -var - w, h: Integer; - dX, dY: SmallInt; - b: Integer; - s: ShortInt; -begin - w := gMapInfo.Width; - h := gMapInfo.Height; - - if (State = STATE_STICK) and (Random(30) = 15) then - begin // Ñòåêàåò/îòëèïàåò - VelY := 0.5; - AccelY := 0.15; - if (not isBlockedAt(X-1, Y) {ByteBool(gCollideMap[Y, X-1] and MARK_BLOCKED)}) and - (not isBlockedAt(X+1, Y) {ByteBool(gCollideMap[Y, X+1] and MARK_BLOCKED)}) then - State := STATE_NORMAL; - exit; - end; - - if not isBlockedAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)} then - begin - if isLiftUpAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTUP)} then - begin // Ëèôò ââåðõ - if VelY > -4-Random(3) then - VelY := VelY - 0.8; - if Abs(VelX) > 0.1 then - VelX := VelX - VelX/10.0; - VelX := VelX + (Random-Random)*0.2; - AccelY := 0.15; - end; - if isLiftLeftAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTLEFT)} then - begin // Ïîòîê âëåâî - if VelX > -8-Random(3) then - VelX := VelX - 0.8; - AccelY := 0.15; - end; - if isLiftRightAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_LIFTRIGHT)} then - begin // Ïîòîê âïðàâî - if VelX < 8+Random(3) then - VelX := VelX + 0.8; - AccelY := 0.15; - end; - end; - - dX := Round(VelX); - dY := Round(VelY); - - if (Abs(VelX) < 0.1) and (Abs(VelY) < 0.1) then - if (State <> STATE_STICK) and - (not isBlockedAt(X, Y-1) {ByteBool(gCollideMap[Y-1, X] and MARK_BLOCKED)}) and - (not isBlockedAt(X, Y) {ByteBool(gCollideMap[Y, X] and MARK_BLOCKED)}) and - (not isBlockedAt(X, Y+1) {ByteBool(gCollideMap[Y+1, X] and MARK_BLOCKED)}) then - begin // Âèñèò â âîçäóõå - êàïàåò - VelY := 0.8; - AccelY := 0.5; - State := STATE_NORMAL; - end; - - if dX <> 0 then - begin - if dX > 0 then - s := 1 - else - s := -1; - - for b := 1 to Abs(dX) do - begin - // Ñáîêó ãðàíèöà? - if (X+s >= w) or (X+s <= 0) then begin die(); break;end; - - //c := gCollideMap[Y, X+s]; - - // Ñáîêó æèäêîñòü, à ÷àñòèöà óæå ïàäàåò? - if isLiquidAt(X+s, Y) {ByteBool(c and MARK_LIQUID)} and (dY > 0) then begin die(); break; end; - - if isBlockedAt(X+s, Y) {ByteBool(c and MARK_BLOCKED)} then - begin // Ñòåíà/äâåðü - VelX := 0; - VelY := 0; - AccelX := 0; - AccelY := 0; - State := STATE_STICK; - Break; - end; - - X := X+s; - end; - end; - - if dY <> 0 then - begin - if dY > 0 then - s := 1 - else - s := -1; - - for b := 1 to Abs(dY) do - begin - // Ñíèçó/ñâåðõó ãðàíèöà - if (Y+s >= h) or (Y+s <= 0) then begin die(); break; end; - - //c := gCollideMap[Y+s, X]; - - // Ñíèçó æèäêîñòü, à ÷àñòèöà óæå ïàäàåò - if isLiquidAt(X, Y+s) {ByteBool(c and MARK_LIQUID)} and (dY > 0) then begin die(); break; end; - - if isBlockedAt(X, Y+s) {ByteBool(c and MARK_BLOCKED)} then - begin // Ñòåíà/äâåðü - VelX := 0; - VelY := 0; - AccelX := 0; - AccelY := 0; - if (s > 0) and (State <> STATE_STICK) then - State := STATE_NORMAL - else - State := STATE_STICK; - Break; - end; - - Y := Y+s; - end; - end; - - VelX := VelX + AccelX; - VelY := VelY + AccelY; - - Time := Time + 1; -end; - - // ////////////////////////////////////////////////////////////////////////// // procedure g_GFX_SparkVel (fX, fY: Integer; Count: Word; VX, VY: Integer; DevX, DevY: Byte); var @@ -874,6 +1051,7 @@ var DevY1, DevY2: Byte; l: Integer; begin + if not gpart_dbg_enabled then Exit; l := Length(Particles); if l = 0 then exit; if Count > l then Count := l; @@ -933,6 +1111,7 @@ var CRnd: Byte; CC: SmallInt; begin + if not gpart_dbg_enabled then Exit; if Kind = BLOOD_SPARKS then begin g_GFX_SparkVel(fX, fY, 2 + Random(2), -VX div 2, -VY div 2, DevX, DevY); @@ -1029,6 +1208,7 @@ var BaseVelX, BaseVelY: Single; l: Integer; begin + if not gpart_dbg_enabled then Exit; l := Length(Particles); if l = 0 then Exit; @@ -1088,6 +1268,7 @@ var DevY1, DevY2: Byte; l: Integer; begin + if not gpart_dbg_enabled then Exit; l := Length(Particles); if l = 0 then Exit; @@ -1168,6 +1349,7 @@ var a: Integer; l: Integer; begin + if not gpart_dbg_enabled then Exit; l := Length(Particles); if l = 0 then Exit; @@ -1256,6 +1438,7 @@ var DevY1, DevY2: Byte; l, liquidx: Integer; begin + if not gpart_dbg_enabled then Exit; l := Length(Particles); if l = 0 then Exit; @@ -1286,7 +1469,7 @@ begin // trace liquid, so we'll know where it ends; do it in 8px steps for speed // tracer will return `false` if we started outside of the liquid - if not g_Map_TraceLiquid(X, Y, 0, -8, liquidx, liquidTopY) then continue; + if not g_Map_TraceLiquidNonPrecise(X, Y, 0, -8, liquidx, liquidTopY) then continue; VelX := 0; VelY := -1-Random; @@ -1360,6 +1543,7 @@ procedure g_GFX_OnceAnim(X, Y: Integer; Anim: TAnimation; AnimType: Byte = 0); var find_id: DWORD; begin + if not gpart_dbg_enabled then Exit; if Anim = nil then Exit;