Graal Forums  

Go Back   Graal Forums > Development Forums > NPC Scripting > Code Gallery
FAQ Members List Calendar Today's Posts

Reply
 
Thread Tools Search this Thread Display Modes
  #16  
Old 05-18-2011, 11:08 PM
skillmaster19 skillmaster19 is offline
Registered User
Join Date: Oct 2010
Posts: 392
skillmaster19 will become famous soon enough
Fixes, and it wont let me edit my original post.
PHP Code:
function onCreated() {
  
this.outsidetargetmodes = {
    
"targetingup""targetingdown""targetingleft""targetingright""charge"
  
};
  
showcharacter();
  
swordimg "sword1.png";
  
this.hp 10;
  
this.movementSpeed 1;
  
swordpower 1;
  
setTimer(0.9);
}

function 
onTimeOut() {
  
this.resettarget++;
  if (
this.resettarget 30) {
    
this.mode "waiting";
    
this.resettarget 0;
  }
  
this.swordfreezetime--;
  if (
players.size() > 0setTimer(0.1);
  else 
setTimer(0);
  if (
this.hp 0) {
    
this.ani "walk";
    
this.closestplayer findnearestplayer(this.xthis.y);
    
this.plyr this.closestplayer;
    if (!
getMode) {
      if (
int(random(0100)) < 30) {
        
this.mode "charge";
      } else {
        
temp.wheretoattack int(random(0100));
        if (
temp.wheretoattack >= 50) {
          if (
this.dir || this.dir 2) {
            
this.mode "targetingright";
          }
          if (
this.dir || this.dir 3) {
            
this.mode "targetingdown";
          }
        }
        if (
temp.wheretoattack <= 49) {
          if (
this.dir || this.dir 2) {
            
this.mode "targetingleft";
          }
          if (
this.dir || this.dir 3) {
            
this.mode "targetingup";
          }
        }
      }
    }
    
this.toright this.plyr.5;
    
this.todown this.plyr.5;
    
this.toup this.plyr.5;
    
this.toleft this.plyr.5;
    switch (
this.mode) {
    case 
"targetingleft":
      
this.targetx this.toleft;
      
this.targety this.plyr.y;
      break;
    case 
"targetingright":
      
this.targetx this.toright;
      
this.targety this.plyr.y;
      break;
    case 
"targetingdown":
      
this.targety this.todown;
      
this.targetx this.plyr.x;
      break;
    case 
"targetingup":
      
this.targety this.toup;
      
this.targetx this.plyr.x;
      break;
    case 
"charge":
      
this.targetx this.plyr.x;
      
this.targety this.plyr.y;
      break;
    }
    
this.distx = (this.targetx) - this.x;
    
this.disty this.targety this.y;
    
this.plyrdistx this.plyr.this.x;
    
this.plyrdisty this.plyr.this.y;
    
this.len = (this.distx this.distx this.disty this.disty) ^ 0.5;
    
this.movex = (this.distx this.len);
    
this.fixed_x this.1.5;
    
this.fixed_y this.2;
    
this.movey = (this.disty this.len);
    if (!
checkBlockedTile(this.movex this.fixed_xthis.fixed_y this.movey)) {
      if (
this.distx 20 && this.disty 20) {
        
this.+= this.movex * (this.movementSpeed);
        
this.+= this.movey * (this.movementSpeed);
      }
    } else 
this.ani "idle";
  }
  if (
abs(this.distx) > abs(this.disty)) {
    if (
this.distx 0this.dir 3;
    else 
this.dir 1;
  } else {
    if (
this.disty 0this.dir 2;
    else 
this.dir 0;
  }
  if (
this.swordfreezetime <= 0) {
    if (
abs(this.plyrdistx) < && abs(this.plyrdisty) < 2) {
      
this.scheduleevent(random(0.10.4), "hurtCharacter"0);
    }
    if (
abs(this.plyrdistx) < && abs(this.plyrdisty) < 4) {
      
this.scheduleevent(random(0.10.4), "hurtCharacter"0);
    }
  }
}

function 
getMode() {
  if (
this.mode in this.outsidetargetmodes) return true;
  else return 
false;
}

function 
checkBlockedTile(xValueyValue) {
  if (
onwall(xValueyValue) || onwater(xValueyValue)) return true;
  else return 
false;
}

function 
onRespawn(ticker) {
  
this.hp 10;
  
this.ani "idle";
  
move(int(random(-0.99990.9999)), int(random(-0.99990.9999)), 0o);
  
this.chat this.hp;
}

function 
onhurtCharacter() {
  if (
abs(this.plyrdistx) < && abs(this.plyrdisty) < 4) {
    if (
abs(this.plyrdistx) < && abs(this.plyrdisty) < 2) {
      if (
abs(this.plyrdistx) > abs(this.plyrdisty)) {
        if (
this.plyrdistx 0this.dir 3;
        else 
this.dir 1;
      } else {
        if (
this.plyrdisty 0this.dir 2;
        else 
this.dir 0;
      }
      
this.mode "waiting";
      
this.ani "sword";
      
this.scheduleevent(0.1"StopSwinging"0);
    }
  }
  if (
this.plyr.hearts 0) {
    
this.ani "idle";
  }
}

function 
onStopSwinging() {
  
this.ani "walk";
  
this.swordfreezetime 10//stops swinging for 10 timeouts
}

function 
onPlayerEnters() {
  
onTimeOut();
}

function 
onWa****() {
  
this.mode "waiting";
  if (
this.hp 0) {
    switch (
player.dir) {
    case 
"2":
      if (!
checkBlockedTile(this.xthis.5)) {
        
this.this.5;
      }
      break;
    case 
"3":
      if (!
checkBlockedTile(this.5this.y)) {
        
this.+= 5;
      }
      break;
    case 
"1":
      if (!
checkBlockedTile(this.5this.y)) {
        
this.this.5;
      }
      break;
    case 
"0":
      if (!
checkBlockedTile(this.xthis.5)) {
        
this.this.5;
      }
      break;
    }
  }
  
this.hp--;
  if (
this.hp >= 0) {
    
this.chat this.hp;
  }
  if (
this.hp == 0) {
    
this.ani "dead";
  }
  if (
this.hp == 0) {
    
clientr.baddykills++;
    
player.chat "I have"
    
SPC clientr.baddykills SPC "baddy kills";
    
this.scheduleevent(50"Respawn"0);
  }


Last edited by skillmaster19; 05-18-2011 at 11:27 PM..
Reply With Quote
  #17  
Old 05-18-2011, 11:10 PM
Soala Soala is offline
Ideas on Fire
Soala's Avatar
Join Date: Jun 2007
Location: In my head
Posts: 3,208
Soala is a jewel in the roughSoala is a jewel in the rough
srry can't read
Reply With Quote
  #18  
Old 05-18-2011, 11:11 PM
Emera Emera is offline
Delterian Hybrid
Emera's Avatar
Join Date: Mar 2011
Location: Newcastle Upon-Tyne
Posts: 1,704
Emera is a jewel in the roughEmera is a jewel in the rough
Im not a scripter myself, and i don't know a lot about it. So tell me if i am wrong, but does the style of the script and the layout actually effect the script in any way in terms of its functionality?
__________________
Reply With Quote
  #19  
Old 05-18-2011, 11:29 PM
skillmaster19 skillmaster19 is offline
Registered User
Join Date: Oct 2010
Posts: 392
skillmaster19 will become famous soon enough
Quote:
Originally Posted by Emera View Post
Im not a scripter myself, and i don't know a lot about it. So tell me if i am wrong, but does the style of the script and the layout actually effect the script in any way in terms of its functionality?
No, but by making the script look organized, others(and yourself!) can understand the script better and find errors easier. An example of this is when I originally had an unorganized script, which fowlplay then styled, who discovered several functions were "nested" in another function.(that is bad)
Reply With Quote
  #20  
Old 05-18-2011, 11:47 PM
Emera Emera is offline
Delterian Hybrid
Emera's Avatar
Join Date: Mar 2011
Location: Newcastle Upon-Tyne
Posts: 1,704
Emera is a jewel in the roughEmera is a jewel in the rough
Ok thanks for that. I learn something new everyday.
__________________
Reply With Quote
  #21  
Old 05-20-2011, 12:38 AM
skillmaster19 skillmaster19 is offline
Registered User
Join Date: Oct 2010
Posts: 392
skillmaster19 will become famous soon enough
The baddy is now more efficient, by moving some things out of the timeout.I fixed many bugs causing it to keep charging, and it changes targets at the correct time now(when hit, when it hits, etc) I also fixed the styling
btw, how good or bad is this CPU time? 0.073447624 % npcs[2] (in level skills_sample_level.nw at pos (30.9, 6.1)) (skill_insidebaddy)
PHP Code:
function onCreated() {
  
showcharacter();
  
// change these to the attributes that you want
  
headimg "head10.gif";
  
bodyimg "body.png";
  
shieldimg "shield1.png";
  
swordimg "sword1.png";
  
this.maxhp 10;
  
this.movementSpeed 1;
  
colors[0] = "black"//skin color
  
colors[1] = "black"// coat color
  
colors[2] = "black"// sleeves color
  
colors[3] = "black"// shoes color
  
colors[4] = "black"// belt color
  //dont change past this point if you don't know what you are doing
  
this.outsidetargetmodes = {
    
"targetingup""targetingdown""targetingleft""targetingright""charge"
  
};
  
swordpower 1;
  
setTimer(0.1);
  
this.hp this.maxhp;
}

function 
onTimeOut() {
    if (!
getMode) {
    
getTarget();
  }
  
this.swordfreezetime--;
  if (
players.size() > 0setTimer(0.1);
  else 
setTimer(0);
  if (
this.hp 0) {
    
this.ani "walk";
    
this.closestplayer findnearestplayer(this.xthis.y);
    
this.plyr this.closestplayer;
    
this.toright this.plyr.6;
    
this.todown this.plyr.6;
    
this.toup this.plyr.6;
    
this.toleft this.plyr.6;
    switch (
this.mode) {
    case 
"targetingleft":
      
this.targetx this.toleft;
      
this.targety this.plyr.y;
      break;
    case 
"targetingright":
      
this.targetx this.toright;
      
this.targety this.plyr.y;
      break;
    case 
"targetingdown":
      
this.targety this.todown;
      
this.targetx this.plyr.x;
      break;
    case 
"targetingup":
      
this.targety this.toup;
      
this.targetx this.plyr.x;
      break;
    case 
"charge":
      
this.targetx this.plyr.x;
      
this.targety this.plyr.y;
      break;
    }
    
this.distx = (this.targetx) - this.x;
    
this.disty this.targety this.y;
    
this.plyrdistx this.plyr.this.x;
    
this.plyrdisty this.plyr.this.y;
    
this.len = (this.distx this.distx this.disty this.disty) ^ 0.5;
    
this.movex = (this.distx this.len);
    
this.fixed_x this.1.5;
    
this.fixed_y this.2;
    
this.movey = (this.disty this.len);
    if (!
checkBlockedTile(this.movex this.fixed_xthis.fixed_y this.movey)) {
      if (
this.distx 20 && this.disty 20) {
        
this.+= this.movex * (this.movementSpeed);
        
this.+= this.movey * (this.movementSpeed);
      }
    } else 
this.ani "idle";
  }
  if (
abs(this.distx) > abs(this.disty)) {
    if (
this.distx 0this.dir 3;
    else 
this.dir 1;
  } else {
    if (
this.disty 0this.dir 2;
    else 
this.dir 0;
  }
  if (
this.swordfreezetime <= 0) {
    if (
abs(this.plyrdistx) < && abs(this.plyrdisty) < 2) {
      
this.scheduleevent(random(0.10.4), "hurtCharacter"0);
    }
    if (
abs(this.plyrdistx) < && abs(this.plyrdisty) < 4) {
      
this.scheduleevent(random(0.10.4), "hurtCharacter"0);
    }
  }
}

function 
getMode() {
  if (
this.mode in this.outsidetargetmodes) return true;
  else return 
false;
}

function 
checkBlockedTile(xValueyValue) {
  if (
onwall(xValueyValue) || onwater(xValueyValue)) return true;
  else return 
false;
}

function 
onRespawn(ticker) {
  
this.hp this.maxhp;
  
this.ani "idle";
  
move(int(random(-0.99990.9999)), int(random(-0.99990.9999)), 0o);
  
this.chat this.hp;
}

function 
onhurtCharacter() {
  if (
abs(this.plyrdistx) < && abs(this.plyrdisty) < 4) {
    if (
abs(this.plyrdistx) < && abs(this.plyrdisty) < 2) {
      if (
abs(this.plyrdistx) > abs(this.plyrdisty)) {
        if (
this.plyrdistx 0this.dir 3;
        else 
this.dir 1;
      } else {
        if (
this.plyrdisty 0this.dir 2;
        else 
this.dir 0;
      }
      
this.swordfreezetime 10//stops swinging for 10 timeouts
      
this.mode "waiting";
      
this.ani "sword";
      
this.scheduleevent(0.3"StopSwinging"0);
    }
  }
  if (
this.plyr.hearts == 0) {
    
this.ani "idle";
  }
}

function 
onStopSwinging() {
  
this.ani "idle";
}

function 
onPlayerEnters() {
  
onTimeOut();
}

function 
getTarget() {
  if (
int(random(0100)) < 30) {
    
this.mode "charge";
  } else {
    
temp.wheretoattack int(random(0100));
    if (
temp.wheretoattack >= 50) {
      if (
this.dir || this.dir 2) {
        
this.mode "targetingright";
      }
      if (
this.dir || this.dir 3) {
        
this.mode "targetingdown";
      }
    }
    if (
temp.wheretoattack <= 49) {
      if (
this.dir || this.dir 2) {
        
this.mode "targetingleft";
      }
      if (
this.dir || this.dir 3) {
        
this.mode "targetingup";
      }
    }
  }
}

function 
onWa****() {
  
this.mode "waiting";
  if (
this.hp 0) {
    switch (
player.dir) {
    case 
"2":
      if (!
checkBlockedTile(this.xthis.5)) {
        
this.this.5;
      }
      break;
    case 
"3":
      if (!
checkBlockedTile(this.5this.y)) {
        
this.+= 5;
      }
      break;
    case 
"1":
      if (!
checkBlockedTile(this.5this.y)) {
        
this.this.5;
      }
      break;
    case 
"0":
      if (!
checkBlockedTile(this.xthis.5)) {
        
this.this.5;
      }
      break;
    }
  }
  
this.hp--;
  if (
this.hp >= 0) {
    
this.chat this.hp;
  }
  if (
this.hp == 0) {
    
this.ani "dead";
  }
  if (
this.hp == 0) {
    
clientr.baddykills++;
    
player.chat "I have"
    
SPC clientr.baddykills SPC "baddy kills";
    
this.scheduleevent(50"Respawn"0);
  }


Last edited by skillmaster19; 05-20-2011 at 12:51 AM..
Reply With Quote
  #22  
Old 05-20-2011, 12:57 AM
fowlplay4 fowlplay4 is offline
team canada
fowlplay4's Avatar
Join Date: Jul 2004
Location: Canada
Posts: 5,200
fowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond repute
-: if (!getMode) {
+: if (!getMode()) {

You're still using a 0.1 second timeout for a baddy and that is very troubling for something you plan to have a lot. Aim for 0.5 second minimum timeout.
Reply With Quote
  #23  
Old 05-20-2011, 01:04 AM
skillmaster19 skillmaster19 is offline
Registered User
Join Date: Oct 2010
Posts: 392
skillmaster19 will become famous soon enough
Quote:
Originally Posted by fowlplay4 View Post
-: if (!getMode) {
+: if (!getMode()) {

You're still using a 0.1 second timeout for a baddy and that is very troubling for something you plan to have a lot. Aim for 0.5 second minimum timeout.
How else am I supposed to update the position frequently? the low timeouts are necessary to have the baddy fight well.
Reply With Quote
  #24  
Old 05-20-2011, 01:30 AM
fowlplay4 fowlplay4 is offline
team canada
fowlplay4's Avatar
Join Date: Jul 2004
Location: Canada
Posts: 5,200
fowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond reputefowlplay4 has a reputation beyond repute
Quote:
Originally Posted by skillmaster19 View Post
How else am I supposed to update the position frequently? the low timeouts are necessary to have the baddy fight well.
With move(). Sure you can do it your way and use interpolation on the client-side to smoothen out the movement but that's a bit more complicated.

I made a post about this similar situation a while back:
http://forums.graalonline.com/forums...25&postcount=5
Reply With Quote
  #25  
Old 05-20-2011, 01:53 AM
skillmaster19 skillmaster19 is offline
Registered User
Join Date: Oct 2010
Posts: 392
skillmaster19 will become famous soon enough
Quote:
Originally Posted by fowlplay4 View Post
With move(). Sure you can do it your way and use interpolation on the client-side to smoothen out the movement but that's a bit more complicated.

I made a post about this similar situation a while back:
http://forums.graalonline.com/forums...25&postcount=5
Thanks, but the point of this baddy was to be action based, and keep the baddies response times amazing. If I lowered the timeout to 1 second, the whole targeting system would be pointless, because the player is constantly moving. I logged onto zodiac to find out while the baddies move very smoothly, but if you run from them they take about a second to respond, same as when you enter their aggro area. of course this kind of adaptation has to be done to Zodiac because it has hundreds of monsters being fought at once,but I plan to just use this baddy for part of a quest that will occasionally be played by new players.(there won't be hundreds of them being actively fought, that would crash the server)
Reply With Quote
  #26  
Old 06-09-2011, 01:57 AM
Twinny Twinny is offline
My empire of dirt
Twinny's Avatar
Join Date: Mar 2006
Location: Australia
Posts: 2,422
Twinny is just really niceTwinny is just really nice
Send a message via AIM to Twinny
The timeout value is quite intensive. I could only think that maybe you could leverage some of it clientside i.e. place the intended target in an attr[] serverside and have it move at a slower rate whilst smoothing out the movement clientside.
Reply With Quote
  #27  
Old 09-07-2011, 06:06 PM
Admins Admins is offline
Graal Administration
Join Date: Jan 2000
Location: Admins
Posts: 11,693
Admins has much to be proud ofAdmins has much to be proud ofAdmins has much to be proud ofAdmins has much to be proud ofAdmins has much to be proud ofAdmins has much to be proud of
0.1 is fine as long as the baddy is only moving when there are players around.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +2. The time now is 03:55 AM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.
Copyright (C) 1998-2019 Toonslab All Rights Reserved.