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() > 0) setTimer(0.1);
else setTimer(0);
if (this.hp > 0) {
this.ani = "walk";
this.closestplayer = findnearestplayer(this.x, this.y);
this.plyr = this.closestplayer;
this.toright = this.plyr.x + 6;
this.todown = this.plyr.y + 6;
this.toup = this.plyr.y - 6;
this.toleft = this.plyr.x - 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.x - this.x;
this.plyrdisty = this.plyr.y - this.y;
this.len = (this.distx * this.distx + this.disty * this.disty) ^ 0.5;
this.movex = (this.distx / this.len);
this.fixed_x = this.x + 1.5;
this.fixed_y = this.y + 2;
this.movey = (this.disty / this.len);
if (!checkBlockedTile(this.movex + this.fixed_x, this.fixed_y + this.movey)) {
if (this.distx < 20 && this.disty < 20) {
this.x += this.movex * (this.movementSpeed);
this.y += this.movey * (this.movementSpeed);
}
} else this.ani = "idle";
}
if (abs(this.distx) > abs(this.disty)) {
if (this.distx > 0) this.dir = 3;
else this.dir = 1;
} else {
if (this.disty > 0) this.dir = 2;
else this.dir = 0;
}
if (this.swordfreezetime <= 0) {
if (abs(this.plyrdistx) < 4 && abs(this.plyrdisty) < 2) {
this.scheduleevent(random(0.1, 0.4), "hurtCharacter", 0);
}
if (abs(this.plyrdistx) < 2 && abs(this.plyrdisty) < 4) {
this.scheduleevent(random(0.1, 0.4), "hurtCharacter", 0);
}
}
}
function getMode() {
if (this.mode in this.outsidetargetmodes) return true;
else return false;
}
function checkBlockedTile(xValue, yValue) {
if (onwall(xValue, yValue) || onwater(xValue, yValue)) return true;
else return false;
}
function onRespawn(ticker) {
this.hp = this.maxhp;
this.ani = "idle";
move(int(random(-0.9999, 0.9999)), int(random(-0.9999, 0.9999)), 0, o);
this.chat = this.hp;
}
function onhurtCharacter() {
if (abs(this.plyrdistx) < 2 && abs(this.plyrdisty) < 4) {
if (abs(this.plyrdistx) < 4 && abs(this.plyrdisty) < 2) {
if (abs(this.plyrdistx) > abs(this.plyrdisty)) {
if (this.plyrdistx > 0) this.dir = 3;
else this.dir = 1;
} else {
if (this.plyrdisty > 0) this.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(0, 100)) < 30) {
this.mode = "charge";
} else {
temp.wheretoattack = int(random(0, 100));
if (temp.wheretoattack >= 50) {
if (this.dir = 0 || this.dir = 2) {
this.mode = "targetingright";
}
if (this.dir = 1 || this.dir = 3) {
this.mode = "targetingdown";
}
}
if (temp.wheretoattack <= 49) {
if (this.dir = 0 || this.dir = 2) {
this.mode = "targetingleft";
}
if (this.dir = 1 || this.dir = 3) {
this.mode = "targetingup";
}
}
}
}
function onWa****() {
this.mode = "waiting";
if (this.hp > 0) {
switch (player.dir) {
case "2":
if (!checkBlockedTile(this.x, this.y + 5)) {
this.y = this.y + 5;
}
break;
case "3":
if (!checkBlockedTile(this.x + 5, this.y)) {
this.x += 5;
}
break;
case "1":
if (!checkBlockedTile(this.x - 5, this.y)) {
this.x = this.x - 5;
}
break;
case "0":
if (!checkBlockedTile(this.x, this.y - 5)) {
this.y = this.y - 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);
}
}