Home Gallery Resources The Team Rules chat Login Register
Pages:  [1] 2 3 4
Author Topic: PSA Tips: What's possible and what's not possible.  (Read 64645 times)
0 Members and 1 Guest are viewing this topic.
KingJigglypuff
Meme Machine
Moderator
****
Offline Offline

Posts: 7206


  • Awards RAGE!! >9000 Hyperactive Contributor Heart Container

  • View Profile Awards
    « on: March 04, 2014, 08:08:45 PM »


    Hey, Kittens, KJP here. I've decided to get cracking on what's possible to do in PSA and what's not (at the moment). But I need your help in gathering this information. If I'm wrong about something or I missed something, then post what I got wrong/missed, along with a link/post of a tutorial or an example.

    What's Currently Possible.
    -Counters. Various PSAs.
    -Pseudo Gliding. Crusade Ridley PSA.
    -Transformation. BrawlEx. Only between 2 characters at the moment.
    -Pseudo Transformation. Various PSAs.
    -Power Ups/Downs. Various PSAs.
    -Adding new GFX. Various PSAs.
    -Bone Index editing. Various PSAs.
    -Adding new Visibility Bones. Various PSAs
    -Adding a new character slot. BrawlEx
    -Custom Attacks. All PSAs.
    -Custom Special Attacks. Most PSAs.
    -Custom Final Smashes. Most PSAs.
    -Charge up Attacks. Various PSAs.
    -Variable based Attacks. Various PSAs.
    -"Stance Change". Various PSAs.
    -Adding Action Overrides. Various PSAs.
    -Custom Bones. Various PSAs.
    -On hit cancel. Various PSAs.
    -Healing/Self Damage. Various PSAs.
    -Floating. Various PSAs.
    -Attribute Editing. Various PSAs.
    -Slot specific Attacks. Various PSAs.
    -Adding a true Crawl. BrawlEx.
    -Adding a true Glide. BrawlEx.
    -Adding true Multijumps. BrawlEx.
    -Adding new Sub Actions.
    -Adding a new custom Sword Glow. Requires renaming the character's ef_char to something that has a Sword Glow.
    -Item Attribute replacement.


    What Might be Possible (requires further study).
    -Adding new Actions.
    -Creating Action Overrides on a character without them.
    -Increasing maximum File Size.


    What's Currently Impossible.
    -Adding Articles.
    -Transformation between 3 or 4 characters.
    -Adding a Tether.


    Let the PSA Discussion begin! \o0o/
    « Last Edit: June 05, 2014, 08:06:51 AM by KingOfChaos » Logged

    I don't take requests.

    My PSA Thread

    ABloodyCanadian
    Ellipsis Abuser…
    Heroic Kitten
    **
    Offline Offline

    Posts: 2949


    Background processes...

  • Awards KCMM Veteran Super Saiyan Topic Hey! Listen! Famous Hacker

  • View Profile Awards
    « Reply #1 on: March 04, 2014, 08:14:07 PM »


    This is a good read. Makes me want to try a few things.
    Logged


    pikazz
    Heroic Kitten
    **
    Offline Offline

    Posts: 2286


    Machinimator!

  • Awards Renowned Hacker Good Citizen Pin Collector Helping Hand

  • View Profile Awards
    « Reply #2 on: March 05, 2014, 07:48:47 AM »


    Change "Adding a True Glide" to "What'S Currently Possible."

    Add "Adding True Multijumps (like Kirby and Jigglypuff)" to "What Might be Possible (requires further study)."

    and Add "Adding True Crawl" to "What's Currently Possible."

    why?
    True Crawl


    playing with "Misc Crawl", "Misc MultiJump" and "Misc Glide" inside FitFighter.pac. successfully added Misc Crawl to jigglypuff! will try Multijump on someone who cant double jump or Misc Glide on someone with working action override

    best use with BrawlEx Engine, letting you set the flag to make them useable

    EDIT:
    True Glide

    Fully working true glide on Yoshi!
    « Last Edit: March 05, 2014, 03:44:24 PM by pikazz » Logged

    Stupid Tinypic :C

    TheShyGuy
    Holy Kitten
    *
    Offline Offline

    Posts: 1003


  • Awards Super Saiyan Topic KCMM Veteran Heart Container Dedicated Hacker

  • View Profile Awards
    « Reply #3 on: May 21, 2014, 03:43:45 AM »


    How far have you guys gotten on new Actions?  I stopped working on a brawl-like game recently but I based the moveset system off PSA actions/subactions from the PSA docs.

    Here's what I learned and implemented that might be useful to others:

    Actions
    - run every game step
    - nothing special, more like an animation  finite state machine
    - those "ChangeAction" events are the transitions between states/actions
    - in Unity, it's represented similarly.
    -->the animation system has a bag of variables that are used to decide when wand what to transition to if a requirement succeeds (--> ChangeActions)
    - Early on, I noticed that Actions never(?) contain any timer events (Asynchronous, Synchronous timers), but made plenty use of infinite loops + loop rests.
    -->this backs up the idea that Actions are ran once per game step,
    -->anyone who uses timers in there are probably misusing the event and are pausing the action for an entire animation frame instead of a single game step (loop rest)
    -Since actions are just FSMs, you can create an entire alternative moveset if you can add actions.  --within memory limits ofc.
    -gives control of an Action at the per game step

    Subaction
    - run once per animation step, sets an animation
    - really, just gives control of an Action/animation code on a per animation frame step. (very useful as everyone who PSA's should know by now)
    - I used to have an "AllowInterrupt" "event" in my game too.  Straight to the point, "AllowInterrupt" (do you guys still name it that?) is just a fancy word for "specific change actions".
    --All current ChangeActions on my side are cached and checked at the end of a game step.
    --when an Action changes, any currently existing ChangeActions events are thrown away
    -Again, Actions are nothing special but a FSM -but at the PSA-like level, they're very easy to use (for those who program, a FSM doesn't scale well in code. However, the way Brawl does it for Actions, they scale fine.)
    -Subactions also aren't anything special but a small script

    uhh if I think of anything else that might be useful, I'll be sure to add to this.  These are just things I learned about when I was using PSA docs for guidance on how to setup a PSA-like system.  AFAIK, both systems turned out similar.

    This is pretty much advertising a game I don't work on anymore... but I dunno it might be useful to see how my side turned out?

    *Note*, anywhere you see coroutine.yield(runStatus.Running) within an infinite loop, it's similar to a LoopRest in PSA
    *WARNING* raw and uneditted.  This is a debug/test moveset using Lua
    Actions
    Code:
    local mitActions = function(_events)
    local events = _events

    events.lightPunchKeyPress = function()
    return events:isKeyPress(keys.X)
    end
    events.jumpKeyPressed = function()
    return events:isKeyPressed(keys.Z)
    end
    events.crouchKeyPressed = function()
    return events:isKeyPressed(keys.Down)
    end
    events.upKeyPressed = function()
    return events:isKeyPressed(keys.Up)
    end

    events.heavy_UpKeyPressed = function()
    return events:isKeyPressed(keys.Up) and events:isKeyPressed(keys.C)
    end
    events.horizontalKeysPressed = function()
    return events:areKeysPressed(events.horizontalKeys)
    end
    events.keyPressedTowardsWall = function()
    local wallSide = events:getWallSide()

    return (events:isKeyPressed(keys.Left) and wallSide == -1) or
      (events:isKeyPressed(keys.Right) and wallSide == 1)
    end

    --add change actions for: attack11,jumpBegin,crouch,walk,heavyUpAttackBegin
    events.changeActions_Ground0 = function()

    events:changeAction(events.actions.walk,events.horizontalKeysPressed)
    events:addRequirement(events.onGround)
    events:addRequirement(events.shouldBeOnGround)

    events:changeAction(events.actions.jumpBegin,events.jumpkeyPressed)
    events:addRequirement(events.onGround)
    events:addRequirement(events.shouldBeOnGround)

    events:changeAction(events.actions.crouch,events.crouchKeyPressed)
    events:addRequirement(events.onGround)
    events:addRequirement(events.shouldBeOnGround)

    events:changeAction(events.actions.attack11,events.lightPunchKeyPress)
    events:addRequirement(events.onGround)
    events:addRequirement(events.shouldBeOnGround)

    end

    --add change actions for: airN,airF,wallSlide,hammerUp
    events.changeActions_Air0 = function()
    events:changeAction(events.actions.walk,events.horizontalKeysPressed)
    events:changeAction(events.actions.walk,events.horizontalKeysPressed)
    events:changeAction(events.actions.walk,events.horizontalKeysPressed)
    events:changeAction(events.actions.walk,events.horizontalKeysPressed)

    end
    --empty func for now,replace with specifics later.
    events.allowInterrupt = function()end
    events.actions =
    {
    idle = action(
    {
    id = 0,
    method = function()
    --yield once to stay in sync with how game handles coroutines internally
    coroutine.yield()

    events:changeAction(events.actions.walk,events.horizontalKeysPressed)
    events:addRequirement(events.onGround)
    events:addRequirement(events.shouldBeOnGround)

    events:changeAction(events.actions.jumpBegin,events.jumpKeyPressed)
    events:addRequirement(events.onGround)
    events:addRequirement(events.shouldBeOnGround)

    events:changeAction(events.actions.attack11,events.lightPunchKeyPress)
    events:addRequirement(events.onGround)
    events:addRequirement(events.shouldBeOnGround)

    events:changeAction(events.actions.heavyAttack_Up_Begin,events.heavy_UpKeyPressed)

    events:changeAction(events.actions.fall,events.isFalling)
    events:addRequirement(events.inAir)
    events:addRequirement(events.shouldBeInAir)


    events:setSubaction(events.subactions.idle)

    while true do
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    walk = action(
    {
    id = 1,
    method = function()
    coroutine.yield()
    events:changeAction(events.actions.idle,events.horizontalKeysPressed,true)

    events:changeAction(events.actions.fall,events.isFalling)
    events:addRequirement(events.inAir)
    events:addRequirement(events.shouldBeInAir)

    events:changeAction(events.actions.jumpBegin,events.jumpKeyPressed)
    events:addRequirement(events.onGround)

    events:changeAction(events.actions.attack11,events.lightPunchKeyPress)
    events:addRequirement(events.onGround)
    events:addRequirement(events.shouldBeOnGround)

    events:changeAction(events.actions.heavyAttack_Up_Begin,events.heavy_UpKeyPressed)

    events:setSubaction(events.subactions.walk)

    while true do
    events:moveRelative()
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    jumpBegin = action(
    {
    id = 5,
    method = function()
    coroutine.yield()

       events:offsetRelative(vector2(0,-3))
    events:applyJumpImpulse()
    events:setGroundAirTime(0)
    --events:ignoreGroundCollisions()
    --events:playSound(3,0.5)

    events:setSubaction(events.subactions.jumpBegin)

    coroutine.yield(runStatus.Running)
    events:setShouldBeInAir(true)
    events:setInAir(true)

    events:changeAction(events.actions.fall,events.isFalling)
    events:addRequirement(events.inAir)
    events:addRequirement(events.shouldBeInAir)

    events:changeAction(events.actions.rise,events.isRising)
    events:addRequirement(events.inAir)
    events:addRequirement(events.shouldBeInAir)

    while true do
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    rise = action(
    {
    id = 6,
    method = function()
    coroutine.yield()

    events:changeAction(events.actions.idle,events.onGround)
    events:addRequirement(events.shouldBeOnGround)

    events:changeAction(events.actions.fall,events.isFalling)
    events:addRequirement(events.inAir)
    events:addRequirement(events.shouldBeInAir)


    events:changeAction(events.actions.airN,events.lightPunchKeyPress)
    events:addRequirement(events.horizontalKeysPressed,true)
    events:addRequirement(events.inAir)
    events:addRequirement(events.shouldBeInAir)

    events:changeAction(events.actions.airF,events.lightPunchKeyPress)
    events:addRequirement(events.isKeyPressed_Forward)
    events:addRequirement(events.inAir)
    events:addRequirement(events.shouldBeInAir)

    events:changeAction(events.actions.heavyAttack_Up_Begin,events.heavy_UpKeyPressed)

    events:setSubaction(events.subactions.jumpLoop)

    while true do
    events:move()

    --try to rise
    if(events:isRiseTimeLessThanAllowed() and
    events:isKeyPressed(events.jumpKeys)) then
    events:setVelocityY(-150)
    end

    coroutine.yield(runStatus.Running)
    end
    end
    }),
    fall = action(
    {
    id = 7,
    method = function()
    coroutine.yield()

    events:changeAction(events.actions.idle,events.onGround)
    events:addRequirement(events.shouldBeOnGround)

    events:changeAction(events.actions.rise,events.isRising)
    events:addRequirement(events.inAir)

    events:changeAction(events.actions.wallSlide,events.isFalling)
    events:addRequirement(events.isTouchingWall)
    events:addRequirement(events.keyPressedTowardsWall)

    events:changeAction(events.actions.airN,events.lightPunchKeyPress)
    events:addRequirement(events.horizontalKeysPressed,true)
    events:addRequirement(events.inAir)
    events:addRequirement(events.shouldBeInAir)

    events:changeAction(events.actions.airF,events.lightPunchKeyPress)
    events:addRequirement(events.isKeyPressed_Forward)
    events:addRequirement(events.inAir)
    events:addRequirement(events.shouldBeInAir)

    events:changeAction(events.actions.heavyAttack_Up_Begin,events.heavy_UpKeyPressed)

    events:setSubaction(events.subactions.fall)

    while true do
    events:move()
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    attack11 = action(
    {
    id = 10,
    method = function()
    coroutine.yield()

    events:changeAction(events.actions.idle,events.isSubactionNull)
    events:setSubaction(events.subactions.attack11)

    while true do
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    attack12 = action(
    {
    id = 11,
    method = function()
    coroutine.yield()
    events:setSubaction(events.subactions.attack12)

    while true do
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    attack13 = action(
    {
    id = 12,
    method = function()
    coroutine.yield()
    events:setSubaction(events.subactions.attack13)

    while true do
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    heavyAttack_Idle = action(
    {
    id = 13,
    method = function()
    coroutine.yield()
    events:setSubaction(events.subactions.heavyAttack_Idle)

    while true do
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    heavyAttack_Up_Begin = action(
    {
    id = 14,
    method = function()
    coroutine.yield()

    events:setSubaction(events.subactions.heavyAttack_Up_Begin)
    events:changeAction(events.actions.heavyAttack_Up_Loop,events.isSubactionNull)

    while true do
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    heavyAttack_Up_Loop = action(
    {
    id = 15,
    method = function()
    coroutine.yield()

     events:setSubaction(events.subactions.heavyAttack_Up_Loop)
     events:changeAction(events.actions.heavyAttack_Up_End,events.upKeyPressed,true)

    while true do
    events:moveRelative()

    coroutine.yield(runStatus.Running)
    end
    end
    }),
    heavyAttack_Up_End = action(
    {
    id = 16,
    method = function()
    coroutine.yield()

    events:setSubaction(events.subactions.heavyAttack_Up_End)
    events:changeAction(events.actions.idle,events.isSubactionNull)


    while true do
    events:moveRelative()
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    heavyAttack_AirN = action(
    {
    id = 20,
    method = function()
    coroutine.yield()
    events:setSubaction(events.subactions.heavyAttack_AirN)

    while true do
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    airN = action(
    {
    id = 21,
    method = function()
    coroutine.yield()

    events:changeAction(events.actions.airNFall,events.isSubactionNull)

    events:setSubaction(events.subactions.airN)

    while true do
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    airNFall = action(
    {
    id = 22,
    method = function()
    coroutine.yield()

    events:changeAction(events.actions.idle,events.onGround)
    events:addRequirement(events.shouldBeOnGround)

    events:changeAction(events.actions.rise,events.isRising)
    events:addRequirement(events.inAir)

    events:changeAction(events.actions.wallSlide,events.isFalling)
    events:addRequirement(events.isTouchingWall)
    events:addRequirement(events.keyPressedTowardsWall)

    events:changeAction(events.actions.airN,events.lightPunchKeyPress)
    events:addRequirement(events.horizontalKeysPressed,true)
    events:addRequirement(events.inAir)
    events:addRequirement(events.shouldBeInAir)

    events:changeAction(events.actions.airF,events.lightPunchKeyPress)
    events:addRequirement(events.isKeyPressed_Forward)
    events:addRequirement(events.inAir)
    events:addRequirement(events.shouldBeInAir)

    events:setSubaction(events.subactions.airNFall)

    while true do
    events:move()
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    airF = action(
    {
    id = 23,
    method = function()
    coroutine.yield()
    events:changeAction(events.actions.fall,events.isSubactionNull)
    events:setSubaction(events.subactions.airF)

    while true do
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    wallSlide = action(
    {
    id = 30,
    method = function()
    coroutine.yield()

    events:changeAction(events.actions.idle,events.onGround)
    events:addRequirement(events.shouldBeOnGround)

    events:changeAction(events.actions.fall,events.isFalling)
    events:addRequirement(events.inAir)
    events:addRequirement(events.shouldBeInAir)
    events:addRequirement(events.keyPressedTowardsWall,true)

    events:changeAction(events.actions.wallJump,events.jumpKeyPressed)

    events:setSubaction(events.subactions.wallSlide)

    while true do
    events:setVelocity(vector2(0,15))
    coroutine.yield(runStatus.Running)
    end
    end
    }),
    wallJump = action(
    {
    id = 31,
    method = function()
    coroutine.yield()

    events:setSubaction(events.subactions.wallJump)

    coroutine.yield(runStatus.Running)

    events:changeAction(events.actions.fall,events.isFalling)
    events:addRequirement(events.inAir)
    events:addRequirement(events.shouldBeInAir)

    while true do
    --events:move()

    --try to rise
    --if(events:isRiseTimeLessThanAllowed() and
    -- events:isKeyPressed(events.jumpKeys)) then
    -- events:setVelocityY(-150)
    --end

    coroutine.yield(runStatus.Running)
    end
    end
    }),
    }

    end

    mitActions(...)

    Subactions
    Code:
    local create =  function(_events)
    local events = _events

    --to prevent creating strings everytime used
    local bones =
    {
    HandL = 'HandL',
    HandR = 'HandR',
    FootL = 'FootL',
    FootR = 'FootR',
    Hammer = 'Hammer'
    }
    events.subactions =
    {
    idle = subaction(
    {
    id = 0,
    animationID = 0,
    looped = true,
    functions =
    {
    main = function()
    -- first yield gets consumed by coroutine start
    coroutine.yield()
    end
    }
    }),
    walk = subaction(
    {
    id = 1,
    animationID = 1,
    looped = true,
    functions =
    {
    main = function()
    coroutine.yield()

    events:allowInterrupt()

    events:playSound(0,0.1)
    events:synchronous(12)
    events:playSound(0,0.1)
    events:synchronous(11)
    end
    }
    }),
    jumpBegin = subaction(
    {
    id = 5,
    animationID = 2,
    looped = false,
    functions =
    {
    main = function()
    coroutine.yield()

    events:addParticleRelative(particle(13,1,color.White,vector2(0,10),vector2(-20,0),false,true))
    events:addParticleRelative(particle(13,1,color.White,vector2(0,10),vector2(20,0),false, true))
        
    events:allowInterrupt()
    end
    }
    }),
    jumpLoop = subaction(
    {
    id = 6,
    animationID = 2,
    looped = true,
    functions =
    {
    main = function()
    coroutine.yield()
    events:allowInterrupt()
    end
    }
    }),
    fall = subaction(
    {
    id = 7,
    animationID = 3,
    looped = true,
    functions =
    {
    main = function()
    coroutine.yield()
    events:allowInterrupt()
    end
    }
    }),
    attack11 =subaction(
    {
    id = 10,
    animationID = 9,
    looped = false,
    functions =
    {
    main = function()
    coroutine.yield()

    events:synchronous(4)
    events:playSound(5,1)

    events:offensiveCollision(0, true, bones.HandL, 1, 2, 180,0, 3, 4, vector2(-1, 0), 3, 1,0,5)
    events:offensiveCollision(1, true, bones.HandL, 1, 2, 135,0, 4, 4, vector2(-1, 0), 8, .2,0,5)
    events:offensiveCollision(2, true, bones.HandL, 1, 2, 0,0, 1, 1, vector2(-1, 0), 10, 0,0,5)

    events:asynchronous(5)

    for i=0,10 do
    events:synchronous(1)
    if(events:isKeyPress(events.punchKeys)) then
    events:terminateAllCollisions()
    events:setSubaction(events.subactions.attack12)
    end
    end

    events:asynchronous(16)
    events:terminateAllCollisions()
    end
    }
    }),
    attack12 =subaction(
    {
    id = 11,
    animationID = 10,
    looped = false,
    functions =
    {
    main = function()

    coroutine.yield()

    events:asynchronous(4)
       events:playSound(6,1)
      
    events:synchronous(1)
    events:offensiveCollision( 0, true, bones.HandR, 1, 2, 270,0, 5, 5,vector2(-1, 0), 10, 1)
        
    for i = 0,10 do
    events:synchronous(1)
    if(events:isKeyPress(events.punchKeys)) then
    events:terminateAllCollisions()
    events:setSubaction(events.subactions.attack13)
    return coroutine.yield(runStatus.Success)
    end
    end

    events:asynchronous(16)
    events:terminateAllCollisions()
    end
    }
    }),
    attack13 =subaction(
    {
    id = 12,
    animationID = 11,
    looped = false,
    functions =
    {
    main =function()

    coroutine.yield()

    events:asynchronous(4)
       events:playSound(7)
    events:offensiveCollision(0, true, bones.FootR, 1, 2, 45,0, 4, 10,vector2(-1, 0), 10, 2)
        
    events:asynchronous(16)
    events:terminateAllCollisions()                
    end
    }
    }),
    heavyAttack_Idle =subaction(
    {
    id = 13,
    animationID = 4,
    looped = false,
    functions =
    {
    main = function()
    coroutine.yield()
    events:playSound(3,1)
    end
    }
    }),
    heavyAttack_Up_Begin =subaction(
    {
    id = 14,
    animationID = 13,
    looped = false,
    functions =
    {
    main = function()

    coroutine.yield()

    events:playSound(28,.1)
    events:asynchronous(15)


    if(events:inAir()) then
    events:playSound(15,.2)
    events:setVelocityY(-200)
    end
    end,
    gfx = function()
    coroutine.yield()

    --BIFF
    local _particle =particle(32,.5,color.White)
    _particle:SetInitialMatrix(-15,-25,0,.5,.5,0,0)
    _particle:SetPosition(0,10,0,-100)
    _particle:SetRotation(3.14/-2,3.14)
    _particle:SetScale(1.5,1,0,0)
    _particle.FadeOut=true

    events:addParticleRelative(_particle)
    events:asynchronous(15)

    --MARTY
    _particle.AnimationIndex = 34
    _particle:SetInitialMatrix(15,-25,0,.5,.5,0,0)
    _particle:SetRotation(3.14 / 2,-3.14)

    events:addParticleRelative(_particle)


    if(events:inAir()) then

    --smoke puff
    _particle.AnimationIndex = 11
    _particle:SetInitialMatrix(0,5,0,.5,.5,0,0)
    _particle:SetPosition(0,20,0,-60)
    _particle:SetRotation(0,0)
    _particle:SetScale(3,3,-10,-10)

    events:addParticleRelative(_particle);
    _particle.LifeTime = 1

    --leaves
    for i=1,4 do
    _particle.AnimationIndex = i
    _particle:SetInitialMatrix(0,5,0,1,1,0,0)
    _particle:SetPosition(random.NextDouble(-30,30),random.NextDouble(-10,30),0,50)
    _particle:SetRotation(6.14,-6.14)
    _particle:SetScale(0,0,0,0)

    events:addParticleRelative(_particle)
    end
    end
    end
    }
    }),
    heavyAttack_Up_Loop =subaction(
    {
    id = 15,
    animationID = 14,
    looped = true,
    functions =
    {
    main = function()

    coroutine.yield()

    local offset = vector2(0,-1)

    events:offensiveCollision(0, true, bones.Hammer, 0, 0, 135,0, 0, 10, offset, 9, 1)
    events:offensiveCollision(1, true, nil, 0, 0, 135,0, 0, 10,vector2.Zero,10,1)-- vector2(0,-5), 6, 1)
    events:synchronous(15)
    events:terminateAllCollisions()
    end,
    gfx = function()

    coroutine.yield()

    local _particle = particle(0,.5,color.White)
    _particle.LifeTime = .5
    for i=0,2 do
    if(events:onGround()) then
    --smoke trail
    _particle.AnimationIndex = 12
    _particle:SetInitialMatrix(0,5,0,.5,.5,0,0)
    _particle:SetScale(-.5,-.5,0,0)

    events:addParticleRelative(_particle)

    --V particles
    _particle.AnimationIndex = 4
    _particle:SetInitialMatrix(0,10,0,.5,.5,0,0)
    _particle:SetPosition(-60,-60,0,0)
    _particle:SetScale(5,5,0,0)

    events:addParticleRelative(_particle)

    _particle:SetPosition(60,-60,0,0)

    events:addParticleRelative(_particle)
    end
    events:synchronous(5)
    end
    end
    ,sfx = function()

    coroutine.yield()

    events:playSound(27,.1)

    if(events:onGround()) then
    events:playSound(20,.01)
    end
    end
    }
    }),
    heavyAttack_Up_End = subaction(
    {
    id = 16,
    animationID = 15,
    looped = false,
    functions =
    {
    main = function()

    coroutine.yield()

    end
    }
    }),
    heavyAttack_AirN =  subaction(
    {
    id = 20,
    animationID = 22,
    looped = false,
    functions =
    {
    main = function()
    coroutine.yield()

    events:playSound(10,1)
    for i = 0,18 do
    if(events:shouldBeOnGround()) then
    events:setSubactionPassTime(events.subactions.heavyAttack_Idle,events:getCurrentAnimationFrameTime())
    return coroutine.yield(runStatus.Success)
    end
    events:synchronous(1)
    end
    end
    }
    }),
    airN = subaction(
    {
    id = 21,
    animationID = 18,
    looped = false,
    functions =
    {
    main = function()

    coroutine.yield()

    local offset = vector2(0,0)

    events:synchronous(4)
    --events:playSound(4,1)
    events:enableConstantMomentum()
    events:setConstantMomentum(vector2.Zero)
      
    events:asynchronous(9)
    events:offensiveCollision(0, true, bones.HandL, 0, 0, 135,0, 0, 10, offset, 10, 1)
    events:offensiveCollision(1, true, bones.HandR, 0, 0, 45,0, 0, 10, offset, 10, 1)
    events:offensiveCollision(2, true, bones.FootL, 0, 0, 225,0, 0, 10, offset, 10, 1)
    events:offensiveCollision(3, true, bones.FootR, 0, 0, 315,0, 0, 10, offset, 10, 1)
    events:synchronous(3)
    events:terminateAllCollisions()
      
    events:offensiveCollision(0, true, bones.HandL, 0, 0, 135,0, 0, 8, offset, 8, 1)
    events:offensiveCollision(1, true, bones.HandR, 0, 0, 45 ,0, 0, 8, offset, 8, 1)
    events:offensiveCollision(2, true, bones.FootL, 0, 0, 225,0, 0, 8, offset, 8, 1)
    events:offensiveCollision(3, true, bones.FootR, 0, 0, 315,0, 0, 8, offset, 8, 1)
    events:synchronous(15)
    events:terminateAllCollisions()
      
    events:synchronous(5)
    events:disableConstantMomentum()
    events:allowInterrupt()
    end
    }
    }),
    airNFall = subaction(
    {
    id = 22,
    animationID = 19,
    looped = false,
    functions =
    {
    main = function()
    coroutine.yield()
    end
    }
    }),
    airF =subaction(
    {
    id = 23,
    animationID = 17,
    looped = false,
    functions =
    {
    main = function()

    coroutine.yield()

    events:asynchronous(4)
    events:applyImpulse(vector2(0,-50))
    events:offensiveCollision( 0,true, bones.HandL, 1, 1, 0,0, 50, 8,vector2(0, -4), 10, 3)
    --events:playSound(5)
    events:asynchronous(13)
    events:terminateAllCollisions()
    events:allowInterrupt()
    end
    }
    }),
    wallSlide =subaction(
    {
    id = 30,
    animationID = 16,
    looped = true,
    functions =
    {
    main = function()
    coroutine.yield()

      
    --I don't want this subaction being called every frame because it plays sound
    local rnd = random.NextDouble(0,10)

    local _particle = nil
    if(rnd >= 5) then
    local life = random.NextDouble(.3,2)
       _particle = particle(11,life,color.White)
    _particle:SetInitialMatrix(10,0,0,.7,.7,0,0)
    _particle:SetPosition(0,-5,0,0)
    _particle:SetRotation(random.NextDouble(0,6),0)
    _particle:SetScale(-1/life,-1/life,0,0)
    _particle.DeathOnAnimationEnd = true
    _particle.FadeOut = true
    events:addParticleRelative(_particle)
    end

    rnd = random.NextDouble(0,10)
    if(rnd >= 8) then
    local life = random.NextDouble(.3,2)
       _particle = particle(11,life,color.White)
    _particle:SetInitialMatrix(10,10,0,.7,.7,0,0)
    _particle:SetPosition(0,-10,0,0)
    _particle:SetRotation(random.NextDouble(0,6),0)
    _particle:SetScale(-1/life,-1/life,0,0)
    _particle.DeathOnAnimationEnd = true
    _particle.FadeOut = true

    events:addParticleRelative(_particle)
    end

    events:allowInterrupt()
                                
    end
    }
    }),
    wallJump =subaction(
    {
    id = 31,
    animationID = 2,
    looped = false,
    functions =
    {
    main = function()
    coroutine.yield()

    --events:playSound(13,1)
    events:addParticleRelative(particle(11,1,color.White,vector2(10, 0),vector2(0,-20),true, true))
    events:addParticleRelative(particle(11,1,color.White,vector2(10, 0),vector2(0, 20),true, true))

    local wallNormal = events.context.PlacementData.BodySensorNormalCollection.AverageNormal
    local jumpDirection = vector2.Transform(wallNormal,matrix.CreateRotationZ(-mathHelper.PiOver4))

    jumpDirection.X = jumpDirection.X * 300
    jumpDirection.Y = jumpDirection.Y * 300

    if(jumpDirection.Y > 0) then
    jumpDirection.Y = jumpDirection.Y * -1.0
    end

    local levelMask = events.context.BasicPhysicsData.LevelCollisionMask

    if(events:waitForPermission()) then
    events:offsetRelative( wallNormal)
    levelMask:ApplyLinearImpulse(jumpDirection)
    end

    events:setFacingDirection(events:getWallSide() * -1)
    end
    }
    }),
    }
    end

    return create(...)

    You can check my dead devlog for gifs what this code actually does .  If this is against the rules, I have no problem if this post is deleted or editted.

    ___

    Oh yea, I never got to fully implementing articles.  The way I would've done articles was to have articles also have it's own "Moveset" data (actions/subactions).  Then the owner (Mario->fireball) controls the visibility/active/enabled of an article as well as set Actions directly.  To me (who hasn't PSA-ed in years), it sounds like how brawl might also do it.
    « Last Edit: May 21, 2014, 07:55:28 AM by KingOfChaos » Logged

    SonicBrawler
    Magical Girl
    Overlord Kitten
    ******
    Offline Offline

    Posts: 6977


    Bae

  • Awards Star Hacker Active Contributor Renowned Hacker Heart Container

  • View Profile WWW Awards
    « Reply #4 on: May 21, 2014, 05:43:10 AM »


    I really want to look into adding articles
    Logged

    Quotes:
    Not all people have the luxury of being able to buy things whenever they want.

    Some people are barely scraping by in the economy.
    Modding has made you guys so spoiled.

    KingJigglypuff
    Meme Machine
    Moderator
    ****
    Offline Offline

    Posts: 7206


  • Awards RAGE!! >9000 Hyperactive Contributor Heart Container

  • View Profile Awards
    « Reply #5 on: May 21, 2014, 08:02:15 AM »


    Your post is fine, ShyGuy. It was just really big, so I put it into a Spoiler.

    As for Actions and Sub Actions, Pikazz managed to perfectly add new Sub Actions, and is progressing on adding new Actions (there's various bugs with adding new Actions).

    I really want to look into adding articles
    Adding and/or porting Articles would be a breakthrough on the same grounds as BrawlEx.

    I believe Pikazz, PhantomWings(?), and SammiHusky(?) are looking into it.

    So ask those three about what you can do to look into adding/porting articles.
    Logged

    I don't take requests.

    My PSA Thread

    Akeno/Archer
    Middle Class Devil, Counter Guardian, Son of Sparda and
    Special Access
    *****
    Offline Offline

    Posts: 3100


    "You will not forget this Devil's power!" -Vergil

  • Awards Diamond in the Rough Super Saiyan Topic Favorite'd Heart Container

  • View Profile WWW Awards
    « Reply #6 on: May 21, 2014, 08:41:49 AM »


    This is a list that would be useful to people who starts PSAing.
    Logged

    "Atone for my sins? I don't have any sins to atone for nor have I forced such a meaningless concept on anyone." -Archer
    Best color, most stars, and least amount of power. The good life.
    Learning sucks, yeah, but it's from learning that you can eventually create masterpieces.

    Allbait
    Supreme Kitten
    ********
    Offline Offline

    Posts: 666


    Fin Dovahkiin Fent Qahnaar Pah Paalle

  • Awards Ninja Hot Topic Starstormer Dedicated Hacker

  • View Profile WWW Awards
    « Reply #7 on: June 05, 2014, 07:29:28 AM »


    Adding articles isn't possible currently but it is possible to port some assist trophy articles onto characters' items: http://forums.kc-mm.com/index.php?topic=43789.msg892895#msg892895

    But this only truly works over characters that have item spawning capabilities like Link, Toon Link, Peach, Snake and anything whatever else I'm forgetting. Although you can make any PSA summon these items if you wanted. IMO the best way to add articles one day will be through adding new items since it's the closest I've seen.

    Not everything works but one of the things that does almost always work is Jeff's Pencil rocket which homes in on enemies and is the closest thing to a auto-homing article ported.
     
    So add on character item replacement onto that list xD Or whatever anyone would call them.
    « Last Edit: June 05, 2014, 10:01:34 AM by Alses » Logged

    Friend Safari: Bug (Masquerain, Butterfree, Pinsir)
    4613-8365-7114

    KingJigglypuff
    Meme Machine
    Moderator
    ****
    Offline Offline

    Posts: 7206


  • Awards RAGE!! >9000 Hyperactive Contributor Heart Container

  • View Profile Awards
    « Reply #8 on: June 05, 2014, 08:06:16 AM »


    Adding articles isn't possible but it is possible to port some assist trophy articles onto characters' items: http://forums.kc-mm.com/index.php?topic=43789.msg892895#msg892895

    But this only truly works over characters that have item spawning capabilities like Link, Toon Link, Peach, Snake and anything whatever else I'm forgetting. Although you can make any PSA summon these items if you wanted. IMO the best way to add articles one day will be through adding new items since it's the closest I've seen.

    Not everything works but one of the things that does almost always work is Jeff's Pencil rocket which homes in on enemies and is the closest thing to a auto-homing article ported.
     
    So add on character item replacement onto that list xD Or whatever anyone would call them.
    Alright. Will do.
    Logged

    I don't take requests.

    My PSA Thread

    pikazz
    Heroic Kitten
    **
    Offline Offline

    Posts: 2286


    Machinimator!

  • Awards Renowned Hacker Good Citizen Pin Collector Helping Hand

  • View Profile Awards
    « Reply #9 on: June 05, 2014, 09:51:26 AM »


    Alses: Adding articles WILL be possible in the future, we just need to find a way to rebuild the module files completely!

    but there is one thing I wonder if its possible, that would be "Merging Subactions" together! perfect example is from the game Kirbys Return to dreamland, there example there is a animation for a drill arm thats its animation is "loop" while it plays durning the other animations aswell! and the arm isnt a article, its on the body itself

    I have seen it to Damagefaces, they "Merges" into the damage subactions like "throwN" animations without any problem
    « Last Edit: June 05, 2014, 09:54:24 AM by pikazz » Logged

    Stupid Tinypic :C

    Large Leader
    I'm shocked I'm allowed to still have this.
    Moderator
    ****
    Offline Offline

    Posts: 3036


  • Awards Renowned Hacker Diamond in the Rough Active Contributor Super Saiyan Topic

  • View Profile Awards
    « Reply #10 on: June 05, 2014, 09:54:02 AM »


    Alses: Adding articles WILL be possible in the future, we just need to find a way to rebuild the module files completely!

    Now this is great to hear!
    Logged



    Quote from: Miacis
    In other words, LURK MORE.
    Quote from: LC-DDM
    In other news, birds fly, sun shines, fishes swim, and the sky is [censored]ing BLUE.
    Quote from: Miacis
    3. ... You seriously don't know who Clinton is?
    Quote from: Haseyo
    If only hacking Brawl paid bills.
    Quote from: Nanobuds
    O snap
    Quote from: DrPanda
    But you are in a Smash Bros. thread.
    You can't have an opinion here.

    pikazz
    Heroic Kitten
    **
    Offline Offline

    Posts: 2286


    Machinimator!

  • Awards Renowned Hacker Good Citizen Pin Collector Helping Hand

  • View Profile Awards
    « Reply #11 on: June 05, 2014, 09:59:27 AM »


    Now this is great to hear!
    but sadly, it will not be easy cause it will require huge programming and PowerPC/Asm knowledge. even if it just "copypaste" if you want someones elses article on that character
    Logged

    Stupid Tinypic :C

    Archer(AkenoS3)
    Lol Kitten
    *********
    Offline Offline

    Posts: 918


    Archer Class Servant Master Race

  • Awards Heart Container Warm Welcomer

  • View Profile Awards
    « Reply #12 on: June 05, 2014, 10:01:33 AM »


    Alses: Adding articles WILL be possible in the future, we just need to find a way to rebuild the module files completely!
    This would be... so great... Im srs here
    There would be alot of PSAs to update, though... lol

    Logged

    On PC On Phone
    My PSA thread below.
    A forgotten place of a forgotten hero.


    Learning sucks, yeah, but it's from learning that you can eventually create masterpieces.

    Allbait
    Supreme Kitten
    ********
    Offline Offline

    Posts: 666


    Fin Dovahkiin Fent Qahnaar Pah Paalle

  • Awards Ninja Hot Topic Starstormer Dedicated Hacker

  • View Profile WWW Awards
    « Reply #13 on: June 05, 2014, 10:05:58 AM »


    Alses: Adding articles WILL be possible in the future, we just need to find a way to rebuild the module files completely!

    but there is one thing I wonder if its possible, that would be "Merging Subactions" together! perfect example is from the game Kirbys Return to dreamland, there example there is a animation for a drill arm thats its animation is "loop" while it plays durning the other animations aswell! and the arm isnt a article, its on the body itself

    I have seen it to Damagefaces, they "Merges" into the damage subactions like "throwN" animations without any problem

    Ah, I meant as in right now xD Fixed the post =) And brand new modules sounds awesome but I don't even know how to see what's coded in the sora module. =P Good luck on learning what it all means and hope to see progress!


    but sadly, it will not be easy cause it will require huge programming and PowerPC/Asm knowledge. even if it just "copypaste" if you want someones elses article on that character

    Hopefully with enough look into it adding articles will be just as easy as adding special grabs!
    Logged

    Friend Safari: Bug (Masquerain, Butterfree, Pinsir)
    4613-8365-7114

    namq
    Extreme Kitten
    *******
    Offline Offline

    Posts: 379


  • Awards Active Contributor

  • View Profile Awards
    « Reply #14 on: June 13, 2014, 11:18:20 AM »


    I need to ask a question.

    Is it possible to inject a special from one character to another?

    Example:

    Porting the animations is cake, brawlbox does that for us.  Also porting the PSA stuff is cake aswell, just copy paste specials from one character to another, but here is the hard part...

    Character doesn't not have enough specials
    - How to add new specials with hex edit?

    and here is the other thing:
    - How to edit Floating points so that the injected specials work as the Owner of that special


    Example:

    Fox has Ike's Side B and all it's attributes (Floating Points, charge frames, etc

    Or even the Cypher stats and all, so he would not be able to have button input to get momentum like fore fox, and just go upwards like snake.

    Thanks in advance!
    Logged


    Pages:  [1] 2 3 4
    Print
    Jump to: