483 end; |
483 end; |
484 |
484 |
485 procedure DrawGears(Surface: PSDL_Surface); |
485 procedure DrawGears(Surface: PSDL_Surface); |
486 var Gear: PGear; |
486 var Gear: PGear; |
487 i: Longword; |
487 i: Longword; |
488 roplen: hwFloat; |
488 roplen: integer; |
489 |
489 |
490 procedure DrawRopeLine(X1, Y1, X2, Y2: integer); |
490 procedure DrawRopeLine(X1, Y1, X2, Y2: integer); |
491 const nodlen = 5; |
491 var eX, eY, dX, dY: integer; |
492 var i, x, y: integer; |
492 i, sX, sY, x, y, d: integer; |
493 t, k, ladd: hwFloat; |
493 b: boolean; |
494 begin |
494 begin |
495 if (X1 = X2) and (Y1 = Y2) then |
495 if (X1 = X2) and (Y1 = Y2) then |
496 begin |
496 begin |
497 OutError('WARNING: zero length rope line!', false); |
497 OutError('WARNING: zero length rope line!', false); |
498 exit |
498 exit |
499 end; |
499 end; |
500 { if abs(X1 - X2) > abs(Y1 - Y2) then |
500 eX:= 0; |
|
501 eY:= 0; |
|
502 dX:= X2 - X1; |
|
503 dY:= Y2 - Y1; |
|
504 |
|
505 if (dX > 0) then sX:= 1 |
|
506 else |
|
507 if (dX < 0) then |
|
508 begin |
|
509 sX:= -1; |
|
510 dX:= -dX |
|
511 end else sX:= dX; |
|
512 |
|
513 if (dY > 0) then sY:= 1 |
|
514 else |
|
515 if (dY < 0) then |
501 begin |
516 begin |
502 if X1 > X2 then |
517 sY:= -1; |
503 begin |
518 dY:= -dY |
504 i:= X1; |
519 end else sY:= dY; |
505 X1:= X2; |
520 |
506 X2:= i; |
521 if (dX > dY) then d:= dX |
507 i:= Y1; |
522 else d:= dY; |
508 Y1:= Y2; |
523 |
509 Y2:= i |
524 x:= X1; |
510 end; |
525 y:= Y1; |
511 k:= (Y2 - Y1) / (X2 - X1); |
526 |
512 ladd:= sqrt(1 + sqr(k)); |
527 for i:= 0 to d do |
513 if X1 < 0 then |
528 begin |
514 begin |
529 inc(eX, dX); |
515 t:= Y1 - 2 - k * X1; |
530 inc(eY, dY); |
516 X1:= 0 |
531 b:= false; |
517 end else t:= Y1 - 2; |
532 if (eX > d) then |
518 if X2 > cScreenWidth then X2:= cScreenWidth; |
|
519 for x:= X1 to X2 do |
|
520 begin |
533 begin |
521 roplen:= roplen + ladd; |
534 dec(eX, d); |
522 if roplen > nodlen then |
535 inc(x, sX); |
523 begin |
536 b:= true |
524 DrawGear(sRopeNode, x - 2, round(t) - 2, Surface); |
|
525 roplen:= roplen - nodlen; |
|
526 end; |
|
527 t:= t + k; |
|
528 end; |
537 end; |
529 end else |
538 if (eY > d) then |
530 begin |
|
531 if Y1 > Y2 then |
|
532 begin |
|
533 i:= X1; |
|
534 X1:= X2; |
|
535 X2:= i; |
|
536 i:= Y1; |
|
537 Y1:= Y2; |
|
538 Y2:= i |
|
539 end; |
|
540 k:= (X2 - X1) / (Y2 - Y1); |
|
541 ladd:= sqrt(1 + sqr(k)); |
|
542 if Y1 < 0 then |
|
543 begin |
|
544 t:= X1 - 2 - k * Y1; |
|
545 Y1:= 0 |
|
546 end else t:= X1 - 2; |
|
547 if Y2 > cScreenHeight then Y2:= cScreenHeight; |
|
548 for y:= Y1 to Y2 do |
|
549 begin |
539 begin |
550 roplen:= roplen + ladd; |
540 dec(eY, d); |
551 if roplen > nodlen then |
541 inc(y, sY); |
552 begin |
542 b:= true |
553 DrawGear(sRopeNode, round(t) - 2, y - 2, Surface); |
|
554 roplen:= roplen - nodlen; |
|
555 end; |
|
556 t:= t + k; |
|
557 end; |
543 end; |
|
544 if b then |
|
545 begin |
|
546 inc(roplen); |
|
547 if (roplen mod 4) = 0 then DrawGear(sRopeNode, x - 2, y - 2, Surface) |
|
548 end |
558 end |
549 end |
559 } end; |
550 end; |
560 |
551 |
561 begin |
552 begin |
562 Gear:= GearsList; |
553 Gear:= GearsList; |
563 while Gear<>nil do |
554 while Gear<>nil do |
564 begin |
555 begin |