Thread Rating:
  • 1 Vote(s) - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Steiner (STM1993 Version 3.00 beta)
#21
level 3 blasts seem to fly through each other :o
Reply
Thanks given by:
#22
(04-18-2015, 11:46 AM)YinYin Wrote:  level 3 blasts seem to fly through each other :o
Yeah, I wanted level 3 to be the strongest projectile in the game, so I gave it state 15 and a mix of regular itrs, ik9 itrs and secretly opointing state 3005 effects with itr kind 0 but no bdy. I didn't consider what happened if a pair of of level 3s collided nor know a way that would work without requiring a whole new ID, so yeah. Shame they don't collide and explode violently haha.

EDIT: I also noticed the level 1 hadoukens can destroy John's energy disc. I have no idea why, but oh well.

How's the AI though? Nave wants feedback on that too.
Reply
Thanks given by:
#23
maybe just add body in the air (y:-7990080), so only the ball itself can touch it?



[Image: NsiNMB9.png]

Help me and test my new game basis!




Reply
Thanks given by: Bamboori
#24
(04-18-2015, 04:19 PM)Gad Wrote:  maybe just add body in the air (y:-7990080), so only the ball itself can touch it?
Ball states such as 3000/3005/3006 will always go into hit/hitting as long as any of the itrs the ball have come into contact with a bdy. This is why I made the super hadouken a non-ball state like 15; it would be able to go on indefinitely, but the cost is that it also loses the ability to go into hitting frames or their equivalent entirely and thus I cannot use this method.

On hindsight, I suppose I could have considered having the ball be state 3006 but constantly opoint other 3005 balls to act as the itr at the cost of slightly erratic hitbox, which is what I already did to allow the ball to destroy 3005/3006 projectiles. I suppose I could have also simply added a bdy on the ball so that they'd at least acknowledge each others' existence instead of passing by without incidence. I may be able to use a different type instead of type 3 in the data.txt, perhaps type 5 and take advantage of the injury frames, but I'm wary of experimenting with that type. Most importantly, I want to keep the number of IDs low (IMO, 3 for one character is already a lot), but I cannot reuse the same ID as I cannot justify a large soul bomb projectile going into the same hitting frames as a tiny energy ball; it simply won't look right.

Do you still want me to add collision between level 3 hadoukens? I can do it, its just a matter of whether it is worth the effort. Ah, its already uploaded onto LFE's mainsite as a download. Gonna experiment with something.
Reply
Thanks given by:
#25
(04-18-2015, 05:07 PM)STM1993 Wrote:  constantly opoint other 3005 balls to act as the itr at the cost of slightly erratic hitbox, which is what I already did to allow the ball to destroy 3005/3006 projectiles.
what about wpoint instead of repeating opoints - not erratic
Reply
Thanks given by:
#26
(04-18-2015, 05:10 PM)YinYin Wrote:  
(04-18-2015, 05:07 PM)STM1993 Wrote:  constantly opoint other 3005 balls to act as the itr at the cost of slightly erratic hitbox, which is what I already did to allow the ball to destroy 3005/3006 projectiles.
what about wpoint instead of repeating opoints - not erratic
Wouldn't the 3005 ball being held as a weapon still destroy itself if its own itr came into contact with another 3005/3006? In that case I'd still need to make the "weapon" constantly opoint 3005s, which defeats the purpose.

EDIT:
Tested this. It works!!!
@Gad - Yeah that's one thing I considered. But now this wpoint method that YinYin suggested - previously untested - works! Anything carried via wpoint will NOT change to a different frame!
Reply
Thanks given by:
#27
what about ball with normal state with body outside the map, but every frame spawning another ball with non-ball state like 15, so the 'hitting' effect is still the same, but ball can be destroyed

edit:
lol sorry i didnt even realized that u descripted this in your post already hahah TLDR



[Image: NsiNMB9.png]

Help me and test my new game basis!




Reply
Thanks given by:
#28
Submitted!

@STM1993 When you update the char, please email me the updated archive, so I can replace the old one. Thanks!

» Gallery | » Sprites | » devArt

  [Image: style5,Blue-spc-Phoenix.png]
» Want your project on the Mainsite? Just follow the instructions in this thread!
Reply
Thanks given by: Bamboori , STM1993 , Deep
#29
Version 2.53: 19th April 2015, GMT +8 (11:30).
Hadoukens no longer destroy John's disc unless charged to at least level 2. Level 3 Hadouken will now convert John's disc instead of destroying it. They will also now explode VIOLENTLY on colliding with each other, and ONLY each other.



You do NOT want to be in between two level 3 hadoukens like poor Mr. Bandit over here.
105 from the ball directly (x2 in this case), 135x2 for the explosions(it does hit allies). Ouch.

Download updated in first post.

Data Changing things I learned today:
* A type 3 object will briefly take on the state of the hitting frames, allowing a normally state 3000 ball to destroy a 3005/6 ball by simply changing the state of the first hitting frame to 3005/6.
* When an object is opointed, it will briefly take on the state in frame 0 before going into the frame stated in action. When I initially made frame 0 state 18, charging the hadouken will cause burning_smoke to appear.
* Any object held in wpoint cannot go to another frame no matter how hard you try; it is purely influenced by the object holder's wpoint weaponact. That means a state 3005/6 object held as a weapon will still be able to influence a 3005/6 ball, but in this case the ball is sent into rebound state instead of hitting state. It also means if you hold a type 0 object in weaponact: 1200, you can hold him as invisible indefinitely as Marshall had posted (based on Windmill's system for Robotical LF2).
* When said object is released from wpoint, it goes into the same frames used by a weapon falling from the sky.
* Objects held in wpoint can have their ownership changed if they have a bdy that is hit by the enemy.

(04-18-2015, 06:30 PM)Blue Phoenix Wrote:  @STM1993 When you update the char, please email me the updated archive, so I can replace the old one. Thanks!
Sent the latest update, thanks!
EDIT: Crap, just realized the readme is wrong(missing the AI information), correct text is in first post under the spoiler. This is what happens when you have multiple copies of the same files in multiple LF2s >_>
Reply
Thanks given by: Bamboori , bashscrazy , Deep
#30
AI Update from Nave after receiving feedback from SomeoneElse. Minor update, but important if you like to have more than 1 STM running around in the game.
Quote:<Nave_> the one thing was a memory issiue
<Nave_> where I accidently copied the instances of self and target every frame instead of using a pointer
<Nave_> and the other one was, that the Phase was globaly, so every stm in the same game would always be in the same phase
<Nave_> so now it works properly

Copy the following code below and replace the text in 930.as using a text editor such as Notepad++.
Code:
array<int> PHASE(400,0);

int ego(){

    int k = target.num;
    int dist = 400;
    for (int i = 0; i < 400; ++i){
        if (loadTarget(i) >= 0 && target.team != self.team && xyz_Distance() < dist && movesTorwards(target, self) && target.x_velocity != 0 && sameZ()){
            k = i;
        }
    }
    loadTarget(k);

    if(PHASE[self.num] == 0 && self.mp < 100 && !(self.frame >= 240 && self.frame <= 278)){
        PHASE[self.num] = 1;
    }

    if(PHASE[self.num] == 1 && (self.mp > 500-self.hp || self.mp > 200)){
        PHASE[self.num] = 0;
    }

    if(PHASE[self.num] == 0){
        if(target.y > self.y+10 && distance() < 60 && facesTorwards(self, target) && target.type == 0){
            A();
        }
        if(self.mp > 150 && distance() < 40 && target.type == 0){
            if(abs(target.z-self.z) > 50){
                DuJ();
                if(target.z < self.z){
                    up();
                }
                else{
                    down();
                }
                return 1;
            }
            else if(abs(target.z-self.z) < 20){
                DdA();
            }
        }
        if(movesTorwards(target, self) && abs(target.x_velocity) > 6 && distance() < 140 && sameZ()) {
            if(self.mp > self.hp/3){
                dashTo();
            }
            else if(self.y == 0){
                if(target.x < self.x){
                    right();
                }
                if(target.x > self.x){
                    left();
                }
                J();
            }
        }
    
        if(self.mp > 300 && distance() < 200 && sameZ() && self.frame == 312 && target.type == 0){
            if(distance() > 100){
                hadouken();
            }
            else{
                J();
            }
        }
    
        if(self.mp > 50 && distance() >= 150 && distance() < 1000 && sameZ() && (!facesTorwards(target, self) || (distance() > 500 && self.mp > 350)) && target.type == 0){
            if(self.frame >= 240 && self.frame <= 278){
                if(!self.facing){
                    left();
                    return 1;
                }
                else{
                    right();
                    return 1;
                }
            }    
            else if(self.mp > 250){
                hadouken();
            }
        }    
    
        return 0;
    }
    else if(PHASE[self.num] == 1){
        if(self.y == 0 && self.mp > 50 && movesTorwards(target, self) && abs(target.x_velocity) > 0 && distance() < 100 && sameZ()) {
            evade();
        }
        if(target.type == 0 && self.state == 2 && movesTorwards(target, self) && abs(target.x_velocity) > 0 && distance() < 200 && sameZ()) {
            J();
        }
        if(target.type == 0 && self.y > 0 && movesTorwards(self, target) && distance() < 200 && sameZ()) {
            A();
        }
        if(target.x < self.x){
            if(self.x + 200 > (mode==1?stage_bound:bg_width) || distance() > 500){
                left(1, 0);
            }
            else{
                right();
            }
        }
        if(target.x > self.x){
            if(self.x - 200 < 0 || distance() > 500){
                right(1, 0);
            }
            else{
                left();
            }
        }
        if(target.z > bg_zwidth1+(bg_zwidth2-bg_zwidth1)/4*3){
            up();
        }
        else if(target.z < bg_zwidth1+(bg_zwidth2-bg_zwidth1)/4){
            down();
        }
        else {
            if(target.z > self.z && abs(target.z-self.z) < 40){
                up();
            }
            if(target.z < self.z && abs(target.z-self.z) < 40){
                down();
            }
        }
        
        return 1;
    }

    return 0;
}

void evade(){
    if(self.x < bg_width/4){
        DrJ();
    }
    else if(self.x > bg_width/4*3){
        DlJ();
    }
    else {
        dashAway();
    }
}
    
bool sameZ(){
    return abs(target.z-self.z) <= 12;
}

int distance(){
    return abs(target.x-self.x);
}

int xyz_Distance(){
    return abs(target.x-self.x) + abs(target.y-self.y) + abs(target.z-self.z);
}

void hadouken(){
    if (target.x > self.x){
        DrA();
    }
    else {
        DlA();
    }
}

void dashTo(){
    if (target.x > self.x){
        DrJ();
    }
    else {
        DlJ();
    }
}

void dashAway(){
    if (target.x < self.x){
        DrJ();
    }
    else {
        DlJ();
    }
}


bool movesTorwards(const Info @o1, const Info @o2){
    return ((o1.x_velocity > 0 && o1.x-o2.x < 0) || (o1.x_velocity < 0 && o1.x - o2.x > 0));
}

bool facesTorwards(const Info @o1, const Info @o2){
    return (o2.x > o1.x && !o1.facing) || (o2.x < o1.x && o1.facing);
}
Reply
Thanks given by:




Users browsing this thread: 1 Guest(s)