Project X Forums
http://px.worms2d.info/forum/

Magnetic Super Sheep
http://px.worms2d.info/forum/viewtopic.php?f=5&t=35
Page 1 of 1

Author:  diego [ Sat Jan 23, 2010 2:44 pm ]
Post subject:  Magnetic Super Sheep

Heres the code and a short video that shows it working, you can read a brief description on the Scripts Download section.

http://www.youtube.com/watch?v=1vQ3JPAhdTw

Code:
//Magnetic Super Sheep. An orignal idea of Drumstick
//Contains some Gravity Gun code
//Feel free to tweak, or reuse as you wish
//Diego

var
Key_Q_Pressed : array[1..2] of Boolean;           
Gravitied, Dragging: array [1..4] of Boolean;
CurrentObj: array[1..4] of TWPobj;
AlmPosX, AlmPosY, dx, dy : array [1..4] of Double;
Dist : Double;
TGTlol, z:integer;
LastTimer, BTurnTime : Integer;


procedure InitHooks;
begin
  RegisterHook('Init', ON_INIT);
  RegisterHook('Frame', ON_FRAME);
  RegisterHook('TurnEnd', ON_TURN_END); 
  RegisterHook('TurnStart', ON_TURN_BEGIN);
  RegisterHook('PrepareMess', ON_PREPARE_MESSAGES);
  RegisterHook('RecvMess', ON_RECV_PXMESS);
   
end;

{-------------------------}
{-------------------------}

function IsRegistered(a : twpobj): boolean;
var
  i: integer;
begin
  Result:=false;
  for i:=1 to GetPObjCount-1 do
  begin
    if GetPObj(i)=a then
    begin
      Result:=true;
      Exit;
    end;
  end;
end;

{-------------------------}



function Find(ChargeObj : TWPobj) : TWPobj;
var i:integer;
  FindObj : TWPobj;
//  dx, dy : double;
  WormObj : TWorm;
 
 
begin

  WormObj := GetTekWormObj;
  Result:=nil;
 
for i := 1 to (GetPObjCount - 1) do begin
 FindObj := GetPObj(i);
 if (FindObj <> nil) then begin
  if (ObjInCircle(FindObj, ChargeObj.PosX, ChargeObj.PosY, 200)) and (FindObj.objtype <> OBJ_CHARGE) and (FindObj <> CurrentObj[1]) and (FindObj <> CurrentObj[2]) and (FindObj <> CurrentObj[3]) and (FindObj <> CurrentObj[4]) then begin
    Result := FindObj;
  end;
 end;

 if (Result <> nil) then break;
end;

end;


{-------------------------}


function DragIn(Obj,ChargeObj : TWPObj) : boolean;
var
  WormObj : TWorm;
//  dx, dy, AlmostPosX, AlmostPosY : double;
//  i : integer;
begin
  Result:=false;     
  WormObj := GetTekWormObj;
  CurrentObj[z] := Obj;
//  ShowMessageOnTop(23, 'dx='+IntToStr(Round(dx))+', dy='+IntToStr(Round(dy)));
  if not ObjInCircle(CurrentObj[z],ChargeObj.PosX,ChargeObj.PosY, Round(Dist+15)) then
  begin
    Dragging[z] := true;
    Gravitied[z] := false;
  end
  else begin
    Gravitied[z] := true;
  end;
//  if Dragging=false then
//  begin
//    Obj.PosX := Round(AlmPosX);
//    Obj.PosY := Round(AlmPosY);
//    Obj.SpX := GetSyncRandom(20,1)-10;
//    Obj.SpY := GetSyncRandom(20,1)-10;
//  end;
//  if ((TGTlol mod 60) = 0) then ShowMessageOnTop(23,'ObjSpX='+FloatToStr(Obj.SpX)+', ObjSpY='+FloatToStr(Obj.SpY));
//  Gravitied[z]:=true;
  Result:=true;
end;


{-------------------------}


function Drag(ChargeObj:TWPObj) : boolean;
var
  cx,cy : double;
  WormObj:TWorm;
begin
  WormObj:=GetTekWormObj;
  if (CurrentObj[z].PosX=Round(AlmPosX[z])) and (CurrentObj[z].PosY=Round(AlmPosY[z])) then Dragging[z]:=false;
  cx:=(CurrentObj[z].PosX-Round(ChargeObj.PosX))/Sqrt((Round(ChargeObj.PosX)-CurrentObj[z].PosX)*(Round(ChargeObj.PosX)-CurrentObj[z].PosX)+(Round(ChargeObj.PosY)-CurrentObj[z].PosY)*(Round(ChargeObj.PosY)-CurrentObj[z].PosY));
  cy:=(CurrentObj[z].PosY-Round(ChargeObj.PosY))/Sqrt((Round(ChargeObj.PosX)-CurrentObj[z].PosX)*(Round(ChargeObj.PosX)-CurrentObj[z].PosX)+(Round(ChargeObj.PosY)-CurrentObj[z].PosY)*(Round(ChargeObj.PosY)-CurrentObj[z].PosY));
//  ShowMessageOnTop(23,'cx='+FloatToStr(cx*1000)+', cy='+FloatToStr(cy*1000));
  if (TGTlol mod 5) = 0 then
  begin
    CurrentObj[z].SpX:=CurrentObj[z].SpX-125/Dist*cx;
    CurrentObj[z].SpY:=CurrentObj[z].SpY-125/Dist*cy-0.2399903;   
  end;
  Result := true;
end;


{-------------------------}


procedure Init;
begin
  Key_Q_Pressed[1] := false;
  Key_Q_Pressed[2] := false;
  TGTlol:=0;
  BTurnTime:=0;
  LastTimer:=0;
end; 


{-------------------------}


procedure TurnStart;
begin
  Gravitied[1] := false ; Gravitied[2] := false; Gravitied[3] := false ; Gravitied[4] := false;
  Dragging[1] := false; Dragging[2] := false; Dragging[3] := false; Dragging[4] := false;
end;


{-------------------------}


procedure Frame;
var
  i, k, m : Integer;
  b, ChargeObj, Obj : twpobj;
  WormObj : TWorm;
begin

  for i := 1 to GetPOBjCount - 1 do begin
    b := GetPObj(i);
      if b <> nil then begin
        if b.objtype = OBJ_CHARGE then begin
          ChargeObj := b;
        end;
      end;
  end;
 

  WormObj := GetTekWormObj;
 
  if (WormObj = nil) then begin
  for m := 1 to 4 do begin
  Gravitied[m]:=false;
  Dragging[m] :=false;
  CurrentObj[m] := nil;
  end;
  exit;
  end;
  if ChargeObj = nil then begin
  for m := 1 to 4 do begin 
  Gravitied[m]:=false;
  Dragging[m]:=false;
  CurrentObj[m] := nil
  end;
  exit;
  end;
 
  if (WormObj <> nil) then begin
   if (WormObj.Health <= 0) then exit;
  end;
 
   
  TGTlol:=TGTlol+1;

    if (WormObj.SelWeapon.WT = 1) and (WormObj.SelWeapon.WN = 24) and (ChargeObj <> nil) and Key_Q_Pressed[1] then begin 
    if ((TGTlol mod 4) = 0) then begin
    for z := 1 to 4 do begin
   


    if (WormObj.WormState = WSTATUS_ROPING) {or (WormObj.WormState = WSTATUS_AFTER_ROPING) or (WormObj.WormState = WSTATUS_FIRING_ROPE)} then exit;
//    Result:=false;
    if not Gravitied[z] and not Dragging[z] then begin
      CurrentObj[z] := nil;
      Obj := Find(ChargeObj);
      if Obj <> nil then DragIn(Obj,ChargeObj) {then ShowMessageOnTop(23,'Hurray! Hurray!')}  ;
    end;

   end; end;
   
   for z := 1 to 4 do begin

    if (not (Key_Q_Pressed[1])) then begin Gravitied[z] :=false; Dragging[z] := false; end;



 
  if TurnTimer = LastTimer then BTurnTime := BTurnTime + 1;
  if BTurnTime > 600 then begin
    BTurnTime := 0;
    for k := 1 to getpobjCOunt - 1 do begin
      b := GetPObj(i);
        if b <> nil then if b.ObjType = Obj_Mine then begin
          b.SpX := b.SpX + GetSyncRandom(6,k+TGTlol)-3;
          b.SpY := b.SpY + GetSyncRandom(6,k+TGTlol)-3;
        end;
    end;
  end;
  LastTimer := TurnTimer; 

 
 
  if Gravitied[z] then begin
  AlmPosX[z] := (ChargeObj.PosX - 50*dx[z]);
  AlmPosY[z] := (ChargeObj.PosY - 50*dy[z]);
//  CurrentObj.PosX := Round(AlmPosX);
//  CurrentObj.PosY := Round(AlmPosY);
  CurrentObj[z].SpX := ChargeObj.SpX;
  CurrentObj[z].SpY := ChargeObj.SpY;
  if not ObjInCircle(CurrentObj[z],ChargeObj.PosX,ChargeObj.PosY, Round(Dist+15)) then
  begin
    Dragging[z] := true;
    Gravitied[z] := false;
  end


//  DragIn(CurrentObj[z],ChargeObj); 
  end;
 
  if not IsRegistered(WormObj) then Gravitied[z]:=false;

// REEMPLAZADO  dx := sin(WormObj.WeapAngle*pi)*WormObj.Direction;
// REEMPLAZADO  dy := cos(WormObj.WeapAngle*pi);
//  dx[z] := 0.766;
//  dy := 0.642;

 


 
//  Dist := sqrt((Round(AlmPosX)-ChargeObj.PosX)*(Round(AlmPosX)-ChargeObj.PosX)+(Round(AlmPosY)-ChargeObj.PosY)*(Round(AlmPosY)-ChargeObj.PosY))
  Dist := 50;
 
  if Dragging[z]=true then
  begin
    if not ObjInCircle(CurrentObj[z],Round(ChargeObj.PosX),Round(ChargeObj.PosY), 400) then begin Gravitied[z]:=false; Dragging[z]:=false; CurrentObj[z] := nil ; exit; end;
    Drag(ChargeObj);
    if ObjInCircle(CurrentObj[z], Round(ChargeObj.PosX), Round(ChargeObj.PosY), Round(Dist)) then
    begin
      Gravitied[z] := true;
      Dragging[z] := false;
      AlmPosX[z] := Round(CurrentObj[z].PosX);
      AlmPosY[z] := Round(CurrentObj[z].PosY);
      dx[z] := (ChargeObj.PosX - CurrentObj[z].PosX)/50;
      dy[z] := (ChargeObj.PosY - CurrentObj[z].PosY)/50;
//      ShowMessageOnTop(23, 'gravitied = True');
     
//      DragIn(CurrentObj[z],ChargeObj);
    end;
  end;
 
 
end;
end;
end;

{-------------------------}


procedure TurnEnd;
var
g: integer;
begin
  for g := 1 to 4 do begin
  Gravitied[g]:=false;
  Dragging[g]:=false;
  CurrentObj[g] := nil;
end; 
end;


{-------------------------}



{ Start of Key syncronization, You may use this part in your code }


procedure PrepareMess;
begin
  Key_Q_Pressed[1] := false
  if gettekwormobj<>nil then
  begin
    if ispressed(81)=1 then Key_Q_Pressed[1]:=true;{Q}

    if Key_Q_Pressed[2] <> Key_Q_Pressed[1] then
      begin
        Key_Q_Pressed[2]:=Key_Q_Pressed[1];
        if Key_Q_Pressed[2] then sendpxmessage(5,1,1)
        else sendpxmessage(5,1,0);
      end;
  end;
end;

procedure RecvMess(Messtype, MessDataA,MessDataB: integer);
begin
  if messtype=5 then
    if messdatab=1 then Key_Q_Pressed[1]:=true
      else Key_Q_Pressed[1]:=false;
end;

Author:  Gran PC [ Sat Jan 23, 2010 2:47 pm ]
Post subject:  Re: Magnetic Super Sheep

Hey, diego! I can see you're also Spanish. Awesome.
Nice script, I like it a lot but you've been beaten by _Kilburn, one of our 0.8.0 testers. He has made a magnet. I might upload a trailer soon which will feature it. Good job though :)

Author:  diego [ Sat Jan 23, 2010 4:44 pm ]
Post subject:  Re: Magnetic Super Sheep

Cheers Gran PC, the script was very fun to do, and indeed, i speak spanish.

Author:  Atr0x [ Sun Feb 28, 2010 2:07 pm ]
Post subject:  Re: Magnetic Super Sheep

very nice script....
:mrgreen: :mrgreen: :D

Author:  diego [ Sun Mar 07, 2010 10:44 am ]
Post subject:  Re: Magnetic Super Sheep

Atr0x wrote:
very nice script....
:mrgreen: :mrgreen: :D


Thanks, new project X is gonna be so much better 8-)

Author:  Worms [ Wed Jan 08, 2014 11:24 am ]
Post subject:  Re: Magnetic Super Sheep

Its not working! error. fuck you..

Author:  tomaxx11 [ Fri Mar 27, 2015 6:45 am ]
Post subject:  Re: Magnetic Super Sheep

Worms wrote:
Its not working! error. fuck you..


Of course it will not work, because it's from the old Project X you dumbass...

Page 1 of 1 All times are UTC
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/