In Progress Night Stalkers by danno

The project is currently under development.
I now have to make new animations for every single character in the game, jeeeez this is gonna take forever.
I strongly suggest you to take a look at my approach for this http://www.chronocrash.com/forum/index.php?topic=4621.0
 
That's the plan buddy, the old throw system used several different methods and in each of those methods had multiple methods too,

for example


anim grabup2
offset 72 140
delay      10
bbox 0 0 0 0
attackone 1
quakeframe 9 3 -3
@cmd ani002 "ANI_GRABBED" 0  forces enemy into animation
    @cmd    anti    grab state
frame data/chars/jack/126
@cmd    position 0 20 30 -1 -1
frame data/chars/jack/125
delay 10
@cmd hurt 0 7 fall 1
@cmd    position 2 0 105 1 1
frame data/chars/jack/k1
@cmd    position 2 0 105 1 1
frame data/chars/jack/k1
@cmd    position 2 0 105 1 1
frame data/chars/jack/k1
@cmd    position 2 0 105 1 1
frame data/chars/jack/k1
@cmd    position 2 0 105 1 1
frame data/chars/jack/k1
delay 10
sound  data/sounds/n/jkuoo.wav
@cmd    hurt 0 7
@cmd    position 2 0 90 1 1
frame data/chars/jack/k2
@cmd    hurt 0 8  fall 2
@cmd shoot "slamfl" 0 25 2
@cmd    position 3 0 25 1 1
frame data/chars/jack/k3
@cmd    hurt 0 8
@cmd    position 3 0 26 1 1
frame data/chars/jack/k3
@cmd    hurt 0 8
@cmd    position 3 0 25 1 1
frame data/chars/jack/k3
@cmd    hurt 0 8
@cmd    position 3 0 26 1 1
frame data/chars/jack/k3
@cmd    depost 0
delay 5
@cmd    finish 30 3 0 2 0.3 0
frame data/chars/jack/k4
delay 40
frame data/chars/jack/k5


other throws/slams use different methods like player followcond followanim and instead of using 1 fall animation with 30 frames in enemy, multiple fall animations only have 4 frames each is used, so I have to change not only enemy animations but the player too  :o  I'm gonna need about 100 frames in fall7  :o  hahaha



 
danno said:
I'd love to use your duo attack please share :)
but please do a total unbind hahahaha

Alright, as you wish  ;). Here's script from test character's (Guy) ATTACK1:
Code:
anim	attack1
@script
  void self = getlocalvar("self");
  int iMax = openborvariant("count_entities");
  int i;

  for(i=0; i<iMax; i++){
    void ally = getentity(i);
    char AName = getentityproperty(ally, "name");
    void AAni = getentityproperty(ally, "animationID");

    if(AName=="Ramon" && AAni==openborconstant("ANI_JUMPATTACK")){
      int Disx = getRange(self, ally, "x", 0);
      int Disz = getRange(self, ally, "z", 0);
      int Ay = getentityproperty(ally, "y");

      if(Disx <= 80 && Disz <= 10 && Ay > 50 && Ay < 200){
        performattack(ally, openborconstant("ANI_FOLLOW2"));
        performattack(self, openborconstant("ANI_ATTACK3"));
        break;
      }
    }
  }
@end_script
	delay	4
	offset	68 101
	bbox	38 6 60 82
	frame	data/chars/guy/a1-01.gif
	attack	91 13 52 23 10 0
	delay	7
	frame	data/chars/guy/a1-02.gif
	attack  0 0 0 0 0 0
	delay	7
	frame	data/chars/guy/a1-01.gif

The script calls getRange function which is this:
Code:
void getRange(void Ent1, void Ent2, int T, int Flag)
{// Acquires distance between two entities
    float x1 = getentityproperty(Ent1, "x");
    float z1 = getentityproperty(Ent1, "z");
    float x2 = getentityproperty(Ent2, "x");
    float z2 = getentityproperty(Ent2, "z");
    float Disx = x2 - x1;
    float Disz = z2 - z1;

    if(Flag != 1){
      if(Disx < 0){
        Disx = -Disx;
      }
    }

    if(Disz < 0){
      Disz = -Disz;
    }

    if(T == "x"){
      return Disx;
    }
    if(T == "z"){
      return Disz;
    }
}

Copy that function in your animation script if you don't have it.

Back to the script, it simply finds entity with defined name and is performing certain animation.
In this example, script is finding Ramon and expecting him to perform JUMPATTACK. If script find him performing correct animation, Guy's and Ramon's distance is checked and if it accepted, Guy will perform ATTACK3 while Ramon will perform FOLLOW2.

That's to replicate duo attack from Nightslashers, the boosted jump attack.
Of course, you can adjust the values, animation name and character name to suit your need :).
I have to specify entity's name or should I say other player's name cause IIRC in Nightslashers, duo attack is different with different character pair.
 
Thanks Bloodbane, works great, some tweaking is needed like facing each other but it's a nice bit of tech 8)

 
This project never stop to impress me.
Great progress. And good luck with upgrading/updating the elements for throw system.
 
You're welcome danno  8)

Glad you can show the duo attack in video like this :).

I forgot to tell that you can adjust values in this line:
Code:
if(Disx <= 80 && Disz <= 10 && Ay > 50 && Ay < 200){

80 is maximum x distance players could be, 10 is maximum z distance while 50 is minimum altitude difference and 200 is maximum altitude difference to perform duo attack.
 
This is looking pretty good!!!



danno said:
another reason why I want to rework the throw system, if dracula does escape hit during exact time of a throw, drives me crazy hahaha
I had similar problem and solved it by using @depost
 
Die_In_Fire said:
This is looking pretty good!!
I had similar problem and solved it by using @depost
Thanks Die_In_Fire I really appreciate that and your help, I did try depost but it's more for grabbed ''state'' since the old throw forced enemy into ''anim grabbed'' if depost is used the whole process of the throw is broken off and both player and enemy just stood there looking at each other like f****** lemons

Bloodbane I added a little more to the script so it'll switch depending where ally is coming from
Code:
  void self = getlocalvar("self");
  int iMax = openborvariant("count_entities");
  int Dir = getentityproperty(self, "direction");
  int i;

  for(i=0; i<iMax; i++){
    void ally = getentity(i);
    char AName = getentityproperty(ally, "name");
    void AAni = getentityproperty(ally, "animationID");
    int ADir = getentityproperty(ally, "direction");

    if(AName=="Chris" && ADir==0 && AAni==openborconstant("ANI_FORWARDJUMP")){
      int Disx = getRange(self, ally, "x", 0);
      int Disz = getRange(self, ally, "z", 0);
      int Ay = getentityproperty(ally, "y");
    
      if(Dir==1 && Disx <= 70 && Disz <= 10 && Ay > 20 && Ay < 70){
        performattack(ally, openborconstant("ANI_FREESPECIAL12"));
        changeentityproperty(self, "direction", 1);
        performattack(self, openborconstant("ANI_FOLLOW6"));
        } else {
        if(Dir==0 && Disx <= 70 && Disz <= 10 && Ay > 20 && Ay < 70){
        performattack(ally, openborconstant("ANI_FREESPECIAL12"));
        changeentityproperty(self, "direction", 1);      
        performattack(self, openborconstant("ANI_FOLLOW6"));
        break;
         }
              }
       }
      if(AName=="Chris" && ADir==1 && AAni==openborconstant("ANI_FORWARDJUMP")){
      int Disx = getRange(self, ally, "x", 0);
      int Disz = getRange(self, ally, "z", 0);
      int Ay = getentityproperty(ally, "y");
    
      if(Dir==0 && Disx <= 70 && Disz <= 10 && Ay > 20 && Ay < 70){
        changeentityproperty(self, "direction", 0);
        performattack(ally, openborconstant("ANI_freespecial12"));
        performattack(self, openborconstant("ANI_FOLLOW6"));
        } else {
        if(Dir==1 && Disx <= 70 && Disz <= 10 && Ay > 20 && Ay < 70){
        performattack(ally, openborconstant("ANI_freespecial12"));
        changeentityproperty(self, "direction", 0);      
        performattack(self, openborconstant("ANI_FOLLOW6"));
        break;
            }
           }
          }
         }


Is there a script for deducting ammo? I tried the throwframe custknife but in air it just doesn't seem to work.
 
danno if you want the code to still work even if the entities has alias, you can change this line:

char AName = getentityproperty(ally, "name");

to

char AName = getentityproperty(ally, "defaultname");
 
Thanks maxman and for the tip o'illu

danno said:
Things I'll be changing:
throw system, the moves will be the same I'm just going to code them differently so they look smoother

WRMyZxr.gif


sorry guys hahaha, I redid all of jacks old throws with new code but... I also added a few extra ones and changed some too


I promise though I won't change the rest of the characters throws, I wanted to give Jack a more wrestling vibe so added things like elbow drop and DDT
 
Life is difficult when you are the sparring partner of Jack, please call the ambulance lol. So much good throws and great job for coding these ones ;) .
 
kimono said:
Life is difficult when you are the sparring partner of Jack,

I was laughing while doing the choke slam, choking a zombie then slamming it made me almost feel bad for the zombie hahaha like wow you are really getting abused by Jack

Bloodbane Thank you, I am thinking to do just 1 command grab D + F + S because the main grabs I wanted to keep under 2 seconds long but the command grab will be an over the top wrestling move throwing and slamming the enemy all over the screen for at least 5 seconds

2tMk8xl.png


also I am thinking to redo all the palettes for each entity because the old palette was a global palette and it's terrible that some models share the same colours, the axe for example has green on it.
 
danno said:

I wouldn't use global palettes if you paid me, but man it really shows how creative programmers had to be back in the day. Limited as it was, the original BOR's global palette still gave you far more freedom than any 4th gen machine. 16 per sprite tops, and none of them let you assign your own RGB values - you had to pick from a predefined table.

We're all a bunch of spoiled kids now. :P
 
Damon Caskey said:
We're all a bunch of spoiled kids now. :P

Ain't that the truth, I have to be careful as being so spoiled means the small details will consume/overwhelm me, that's why I think I'll just re-palette the hero's, doing the enemies is unnecessary..........maybe
 
Working on all the new enemy animations is laborious

5nsCIAL.gif


MvoelJV.gif


since I'm going to all this trouble I thought I might has well add new player moves also, just some extra throws    ::)

I'm re-colouring all the heroes and giving them individual palettes I might as well do the enemies also to give a more unified overall look

MdwGo6r.png


When it comes time to start recoding new enemy A.I the new palettes will be useful, It's all a bit tedious and boring but after its all done I'll start work on the new character Rou

 
danno you NAILED the throws. I love how much impact they have - its my grip with many openbor games.

Working on all the new enemy animations is laborious
Yes, it is, but will worth the trouble on the end :)

If you won't use "mirror"on your game, you can try using drawmethod to rotate those sprites on the fly (because mirror doesn't take any drawmethod into account).
I can't remember if the gfxshadow will display the right shadow too.

To make it work, you need to place the axis on the right spot - for example, create one frame with the axis on the foot, one at the middle and one at the head.
Then you can use the drawmethod rotate (and fliprotate) to make any angle variation you want to.

Take a look at this animation - on my game, it's an entity called "cdust"
8qfwXgT.gif


The axis is placed at the center of the image on its IDLE animation. When I need it on some angle, like 90, 45, etc, instead of making a different entity for each angle variation, I simply spawn it on a certain animation, where I change its angle using drawmethod, take a look:

IDLE
anim idle
loop 0
delay 4
offset 50 50
frame data/chars/misc/cdust/1.gif
frame data/chars/misc/cdust/2.gif
delay 2
frame data/sprites/0empty.gif
frame data/chars/misc/cdust/3.gif
delay 2
frame data/sprites/0empty.gif
delay 4
frame data/chars/misc/cdust/4.gif
delay 2
frame data/sprites/0empty.gif
delay 3
frame data/chars/misc/cdust/5.gif
delay 2
@cmd killentity getlocalvar("self")
frame data/sprites/0empty.gif

FOLLOW4 (45º)
anim follow4
loop 0
delay 4
offset 50 50
drawmethod rotate 45
drawmethod fliprotate 1

frame data/chars/misc/cdust/1.gif
frame data/chars/misc/cdust/2.gif
delay 2
frame data/sprites/0empty.gif
frame data/chars/misc/cdust/3.gif
delay 2
frame data/sprites/0empty.gif
delay 4
frame data/chars/misc/cdust/4.gif
delay 2
frame data/sprites/0empty.gif
delay 3
frame data/chars/misc/cdust/5.gif
delay 2
@cmd killentity getlocalvar("self")
frame data/sprites/0empty.gif

Open the entity .txt and you will see many tricks I am using to reuse the same entity.
Different angle, different size, different color (without using a different palette), etc :)

 
Thanks O ilu, your tips and tricks will cut the sprite work down a lot, I will try with the new enemy throws because I already finished the hero throws, I think some enemies should get revenge on Jake and be able to choke slam him
 
Back
Top Bottom