Project X Forums



It is currently Fri Nov 08, 2024 11:44 pm

All times are UTC




Post new topic Reply to topic  [ 7 posts ] 
Author Message
 Post subject: Magnetic Super Sheep
PostPosted: Sat Jan 23, 2010 2:44 pm 
Offline
Betatester

Joined: Sat Jan 23, 2010 11:12 am
Posts: 7
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;


Top
 Profile  
Reply with quote  
 Post subject: Re: Magnetic Super Sheep
PostPosted: Sat Jan 23, 2010 2:47 pm 
Offline
Site Admin
User avatar

Joined: Mon Aug 17, 2009 12:29 pm
Posts: 91
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 :)


Top
 Profile  
Reply with quote  
 Post subject: Re: Magnetic Super Sheep
PostPosted: Sat Jan 23, 2010 4:44 pm 
Offline
Betatester

Joined: Sat Jan 23, 2010 11:12 am
Posts: 7
Cheers Gran PC, the script was very fun to do, and indeed, i speak spanish.


Top
 Profile  
Reply with quote  
 Post subject: Re: Magnetic Super Sheep
PostPosted: Sun Feb 28, 2010 2:07 pm 
Offline

Joined: Fri Feb 26, 2010 4:44 pm
Posts: 92
very nice script....
:mrgreen: :mrgreen: :D


Top
 Profile  
Reply with quote  
 Post subject: Re: Magnetic Super Sheep
PostPosted: Sun Mar 07, 2010 10:44 am 
Offline
Betatester

Joined: Sat Jan 23, 2010 11:12 am
Posts: 7
Atr0x wrote:
very nice script....
:mrgreen: :mrgreen: :D


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


Top
 Profile  
Reply with quote  
 Post subject: Re: Magnetic Super Sheep
PostPosted: Wed Jan 08, 2014 11:24 am 
Offline

Joined: Sat Jul 21, 2012 7:22 pm
Posts: 49
Its not working! error. fuck you..


Top
 Profile  
Reply with quote  
 Post subject: Re: Magnetic Super Sheep
PostPosted: Fri Mar 27, 2015 6:45 am 
Offline

Joined: Mon Jul 16, 2012 3:59 pm
Posts: 29
Worms wrote:
Its not working! error. fuck you..


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


Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 7 posts ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Skin by Lucas Kane