AoS Hero Designs - TAF

SanKakU

Member
Reaction score
21
The map I'm working on is called The Ancient Frontier.

In it, the hero is basically the main thing, there will also be forest monsters with item drops, which sets it apart from a game like DotA.

I have heroes that I need help with...

I may need design ideas, i may need outright spells. i need whatever suggestions you can come up with...i might even ask you to code something for me or suggest how i ought to code something.

Odin -
JASS:
//black knight model done by unknown...

//==perhaps make him odin or something...
//==
//==
//==dark training(boost to atk spd,ms, decrease in magical resistance)A0A4
//==critical strike(ff8)A0A2
//==warp(teleport to ally(ff8) )A0A3


so i have warp which is like basically summoning odin...i have critical strike which is going to be kindof like zantetsuken...killing with one blow...think of dota's coup de grace. then dark training is just sortof a cool passive that i thought would fit in with his fighting style perhaps...

now what about a fourth skill? btw for now critical strike is his ultimate, although i suppose that's subject to change, lots of things in my map are subject to change.

anyone got some ideas for a final skill for him?

i'd kindof like it to be a triggered skill, but have no idea what it should be...the only thing that comes to mind is some kindof spear throw ability...like from ff7...
you throw it high into the sky and it comes down on the target or targeted area. i suppose some sort of jump ability for a dummy unit spear might work here. but i don't know if any of those jump abilities would work...plus using it with a spear instead of your actual hero has to add some trickiness...besides that you want the spear to go really high up, probably out of sight and then come crashing back down whereas a lot of jump abilities i've seen made the hero just jumps a little bit high and mostly just jumps far.

next hero:
Magic Crusher -


he has but one ability. and i didn't create this one.
feel free to give me some ideas on what do with with him.
i'm planning on using the akama hero model for him.
JASS:

//*******************************************************************
//              Information, Implementation and Credits                 
// @Requires:
//   -vJASS
//   -An ability (the spell)
//   -A unit (summoned by the ability)
//   -A buff (used by the ability)
//   -Custom lightning data: Splats\LightningData.slk and ReplaceableTextures\Weather\LineLightning.blp
//   -This trigger
// @Spell's special mechanics:  
//    -For each unit considered by the group filter (non spell immune, enemy, etc) and inside triangle,
//     its available mana (in raw units) and its mana ratio (available mana/total mana) is stored.
//    -An average is calculated for both quantites, and each unit is 'mana burnt' a fraction of these averages,
//     as stated in the Balance data section below.
// @Demonstration related info
//  -For this demonstration, only the quantity in units is used, making units with big mana pools
//   (such as the Archmage hero) disadvantageous for units with small mana pools. 
//    Each unit is this way burnt the same amount of mana, unless it has less available.
//  -If the quantity in ratio was used, the amount of mana burnt would vary among units, 
//   as well as making units with full mana disadvantageous for units around.
//
// @Credits:
//  -wc3c for this spell making session, and Rising Dusk for the submission
//  -Vexorian for vJASS
//  -PipeDream for grimoire as well xttocs and other contributors
//
// @Notes: 
//  -The summoned unit carries an unique struct id via the use of the SetUnitUserData/GetUnitUserData natives.
//  -If you want to rename the spell, just replace MANATRIANGLE by something different with a text editor,
//   be sure to create a new trigger with the same name too.
//
////*******************************************************************





//*******************************************************************
//             Object editor data, such as object's ids                 
//*******************************************************************

globals
    constant integer MANATRIANGLE_SPELLID='A0BO' // The spell used by the hero
    constant integer MANATRIANGLE_UNITID='n026'  // The summoned unit
endglobals

//*******************************************************************
//                     Balance data                 
//*******************************************************************

globals
    constant real MANATRIANGLE_EXPIREDURATION=1.0 //Time it takes after the completion of the triangle for the mana to be burnt.

    real array MANATRIANGLE_MANABURN_RATIOFACTOR  //Fraction of the average mana pool as a ratio (available mana/total mana pool) that is burnt.
                                                  // 
    real array MANATRIANGLE_MANABURN_UNITSFACTOR  //Fraction of the average mana pool in units (available mana) that is burnt.

    real array MANATRIANGLE_MAXDISTANCE           //Maximum distance a ward can traverse during each step
endglobals

function MANATRIANGLE_Setup takes nothing returns nothing

    set MANATRIANGLE_MANABURN_RATIOFACTOR[1]=0.   //This is set to 0 since this demonstration doesn't take advantage of this feature.
    set MANATRIANGLE_MANABURN_RATIOFACTOR[2]=0.   
    set MANATRIANGLE_MANABURN_RATIOFACTOR[3]=0.

    set MANATRIANGLE_MANABURN_UNITSFACTOR[1]=1.00//0.20//.2
    set MANATRIANGLE_MANABURN_UNITSFACTOR[2]=1.00//.25//.25
    set MANATRIANGLE_MANABURN_UNITSFACTOR[3]=1.00//.333//.333

    set MANATRIANGLE_MAXDISTANCE[1]=600.
    set MANATRIANGLE_MAXDISTANCE[2]=800.
    set MANATRIANGLE_MAXDISTANCE[3]=1000.


//*******************************************************************
//                    Sound effect initialization                 
//*******************************************************************

    set MANATRIANGLE_BLINKSOUND = CreateSound( "Abilities\\Spells\\NightElf\\Blink\\BlinkArrival1.wav", false, true, true, 10, 10, "SpellsEAX" )
    call SetSoundParamsFromLabel( MANATRIANGLE_BLINKSOUND, "BlinkTarget" )
    call SetSoundDuration(MANATRIANGLE_BLINKSOUND, 1466 )
endfunction

globals
    sound MANATRIANGLE_BLINKSOUND
endglobals

//*******************************************************************
//                     The spell's group filter                 
//*******************************************************************

function MANATRIANGLE_GroupFilter takes nothing returns boolean
    //This doesn't require much changing unless you want the spell to affect spell immune units.
    return IsUnitEnemy(GetFilterUnit(),MANATRIANGLE_player) and GetUnitState(GetFilterUnit(),UNIT_STATE_MAX_MANA)>0. and GetWidgetLife(GetFilterUnit())>0.405 and not(IsUnitType(GetFilterUnit(),UNIT_TYPE_MAGIC_IMMUNE))
endfunction

//*******************************************************************
//                      Visual effect data                 
//*******************************************************************

globals
    constant string MANATRIANGLE_DMGART="Abilities\\Spells\\NightElf\\ManaBurn\\ManaBurnTarget.mdl" // Mana burn visual effect
    constant string MANATRIANGLE_BLINKEFFECT="Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl" //Blink visual effect
    constant string MANATRIANGLE_VANISHEFFECT="Abilities\\Spells\\Demon\\DarkPortal\\DarkPortalTarget.mdl" //Ward death visual effect
    constant string MANATRIANGLE_LIGHTNINGTYPE="ASDF"//Lightning type, as defined in LightningData.slk 
    constant real MANATRIANGLE_LIGHTNINGHEIGHT=100.  //Height at which the lightning is drawn 
endglobals

//*******************************************************************
//           Spell's body, change at your own risk               
//*******************************************************************

globals
    real MANATRIANGLE_x
    real MANATRIANGLE_y
    real MANATRIANGLE_v0_x
    real MANATRIANGLE_v0_y
    real MANATRIANGLE_v1_x
    real MANATRIANGLE_v1_y
    real MANATRIANGLE_v2_x
    real MANATRIANGLE_v2_y
    real MANATRIANGLE_dot_v0v0
    real MANATRIANGLE_dot_v0v1
    real MANATRIANGLE_dot_v1v1
    real MANATRIANGLE_dot_v0v2
    real MANATRIANGLE_dot_v1v2

    player MANATRIANGLE_player
    group MANATRIANGLE_group
    real MANATRIANGLE_Denom
    real MANATRIANGLE_u
    real MANATRIANGLE_v
    unit MANATRIANGLE_unit
    real MANATRIANGLE_manaratio
    real MANATRIANGLE_manaunits
    integer MANATRIANGLE_unitN
endglobals

function MANATRIANGLE_Determinant takes real x1, real y1, real z1, real x2, real y2, real z2, real x3, real y3, real z3 returns real
    return x1*(y2*z3-z2*y3)-y1*(x2*z3-z2*x3)+z1*(x2*y3-y2*x3)
endfunction

function MANATRIANGLE_Aligned takes MANATRIANGLE t returns boolean
    return MANATRIANGLE_v0_x*MANATRIANGLE_v1_y-MANATRIANGLE_v1_x*MANATRIANGLE_v0_y==0
endfunction

function MANATRIANGLE_ManaBurnTag takes real x, real y, integer i returns nothing
    local texttag t=CreateTextTag()
    call SetTextTagText(t, "-"+I2S(i), 0.025)
    call SetTextTagPos(t, x, y, 0.00)
    call SetTextTagColor(t, 82, 82, 255, 255)
    call SetTextTagVelocity(t, 0, 0.04)
    call SetTextTagVisibility(t, true)
    call SetTextTagFadepoint(t, 2)
    call SetTextTagLifespan(t, 5)
    call SetTextTagPermanent(t, false)
endfunction

function MANATRIANGLE_GroupEnum takes nothing returns nothing
    local unit u=GetEnumUnit()
    local real mana=GetUnitState(u,UNIT_STATE_MANA)
    local real result=mana-MANATRIANGLE_manaunits-MANATRIANGLE_manaratio*GetUnitState(u,UNIT_STATE_MAX_MANA)
    if result<0. then
       set result=mana
    else
       set result=mana-result
    endif
    call DestroyEffect( AddSpecialEffectTarget( MANATRIANGLE_DMGART,u,"origin"))
    call SetUnitState(u,UNIT_STATE_MANA,mana-result)
    call MANATRIANGLE_ManaBurnTag(GetUnitX(u),GetUnitY(u),R2I(result))
    call UnitDamageTarget( MANATRIANGLE_unit,u, result,true,false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNKNOWN,WEAPON_TYPE_WHOKNOWS )
    set u=null
endfunction

function MANATRIANGLE_GroupFiltering takes nothing returns nothing
    local unit u=GetEnumUnit()
    set MANATRIANGLE_v2_x=GetUnitX(u)-MANATRIANGLE_x
    set MANATRIANGLE_v2_y=GetUnitY(u)-MANATRIANGLE_y
    set MANATRIANGLE_dot_v0v2=MANATRIANGLE_v0_x*MANATRIANGLE_v2_x+MANATRIANGLE_v0_y*MANATRIANGLE_v2_y 
    set MANATRIANGLE_dot_v1v2=MANATRIANGLE_v1_x*MANATRIANGLE_v2_x+MANATRIANGLE_v1_y*MANATRIANGLE_v2_y
    set MANATRIANGLE_u=(MANATRIANGLE_dot_v1v1*MANATRIANGLE_dot_v0v2- MANATRIANGLE_dot_v0v1*MANATRIANGLE_dot_v1v2)/MANATRIANGLE_Denom
    set MANATRIANGLE_v=(MANATRIANGLE_dot_v0v0*MANATRIANGLE_dot_v1v2- MANATRIANGLE_dot_v0v1*MANATRIANGLE_dot_v0v2)/MANATRIANGLE_Denom
    if MANATRIANGLE_u>=0. and MANATRIANGLE_v>=0. and MANATRIANGLE_u+MANATRIANGLE_v<=1. then
        set MANATRIANGLE_manaunits=MANATRIANGLE_manaunits+GetUnitState(u,UNIT_STATE_MANA)
        set MANATRIANGLE_manaratio=MANATRIANGLE_manaratio+GetUnitState(u,UNIT_STATE_MANA)/GetUnitState(u,UNIT_STATE_MAX_MANA)
        set MANATRIANGLE_unitN=MANATRIANGLE_unitN+1
    else
        call GroupRemoveUnit(MANATRIANGLE_group,u)
    endif
    set u=null
endfunction

struct MANATRIANGLE
    unit u
    integer level
    integer phase=0
    boolean pause=false
    lightning l1=null
    lightning l2=null
    lightning l3=null
    real x1
    real x2
    real x3
    real y1
    real y2
    real y3
    method MANATRIANGLE_Damage takes nothing returns nothing
        local real square1
        local real square2
        local real square3
        local real x0
        local real y0
        local real alpha
        local real beta_x
        local real beta_y
        set alpha=MANATRIANGLE_Determinant(.x1,.x2,.x3,.y1,.y2,.y3,1.,1.,1.)
        if alpha==0. then
            return
        endif
        set square1=.x1*.x1+.y1*.y1
        set square2=.x2*.x2+.y2*.y2
        set square3=.x3*.x3+.y3*.y3
        set beta_x=-MANATRIANGLE_Determinant(square1,square2,square3,.y1,.y2,.y3,1.,1.,1.)
        set beta_y=MANATRIANGLE_Determinant(square1,square2,square3,.x1,.x2,.x3,1.,1.,1.)
        set MANATRIANGLE_group=CreateGroup()
        set x0=-beta_x/(2*alpha)
        set y0=-beta_y/(2*alpha)
        set MANATRIANGLE_player=GetOwningPlayer(.u)
        call GroupEnumUnitsInRange(MANATRIANGLE_group,x0,y0,SquareRoot((.x1-x0)*(.x1-x0)+(.y1-y0)*(.y1-y0)),Condition(function MANATRIANGLE_GroupFilter))
        set MANATRIANGLE_v0_x=.x2-.x1
        set MANATRIANGLE_v0_y=.y2-.y1
        set MANATRIANGLE_v1_x=.x3-.x1
        set MANATRIANGLE_v1_y=.y3-.y1
        set MANATRIANGLE_x=.x1
        set MANATRIANGLE_y=.y1
        set MANATRIANGLE_dot_v0v0=MANATRIANGLE_v0_x*MANATRIANGLE_v0_x+MANATRIANGLE_v0_y*MANATRIANGLE_v0_y  
        set MANATRIANGLE_dot_v0v1=MANATRIANGLE_v0_x*MANATRIANGLE_v1_x+MANATRIANGLE_v0_y*MANATRIANGLE_v1_y 
        set MANATRIANGLE_dot_v1v1=MANATRIANGLE_v1_x*MANATRIANGLE_v1_x+MANATRIANGLE_v1_y*MANATRIANGLE_v1_y     
        set MANATRIANGLE_Denom=MANATRIANGLE_dot_v0v0*MANATRIANGLE_dot_v1v1-MANATRIANGLE_dot_v0v1*MANATRIANGLE_dot_v0v1
        set MANATRIANGLE_unit=.u
       // set MANATRIANGLE_dmg=(MANATRIANGLE_CONSTANTDMG/(SquareRoot(RAbsBJ(alpha)/2)))*MANATRIANGLE_DMGFACTOR[.level]
        set MANATRIANGLE_unitN=0
        set MANATRIANGLE_manaunits=0.
        set MANATRIANGLE_manaratio=0.
        call ForGroup(MANATRIANGLE_group,function MANATRIANGLE_GroupFiltering)
        if MANATRIANGLE_unitN==0 then
            return
        endif
   //     call BJDebugMsg("N:"+I2S( MANATRIANGLE_unitN)+";"+"MANAUNITS:"+R2S(MANATRIANGLE_manaunits)+";"+"MANARATIO:"+R2S(MANATRIANGLE_manaratio))
        set MANATRIANGLE_manaunits=(MANATRIANGLE_manaunits/I2R(MANATRIANGLE_unitN))*MANATRIANGLE_MANABURN_UNITSFACTOR[.level]
        set MANATRIANGLE_manaratio=(MANATRIANGLE_manaratio/I2R(MANATRIANGLE_unitN))*MANATRIANGLE_MANABURN_RATIOFACTOR[.level]
        call ForGroup(MANATRIANGLE_group,function MANATRIANGLE_GroupEnum)
        call DestroyGroup(MANATRIANGLE_group)
    endmethod
    static method create takes unit u, unit c returns MANATRIANGLE
        local MANATRIANGLE t=MANATRIANGLE.allocate()
        set t.u=u
        call SetUnitUserData(u,t)
        set t.level=GetUnitAbilityLevel(c,MANATRIANGLE_SPELLID)
        set t.x1=GetUnitX(u)
        set t.y1=GetUnitY(u)
        call SetUnitFlyHeight(u,0.,0.)
        return t
    endmethod
    method onDestroy takes nothing returns nothing
        if .l1!=null then
            call DestroyLightning(.l1)
        endif
        if .l2!=null then
            call DestroyLightning(.l2)
        endif
        if .l3!=null then
            call DestroyLightning(.l3)
        endif
    endmethod
endstruct

function MANATRIANGLEOrder_Conditions takes nothing returns boolean
    return GetUnitTypeId(GetTriggerUnit())==MANATRIANGLE_UNITID and 851973!=GetIssuedOrderId()
endfunction

function MANATRIANGLE_Condition takes nothing returns boolean
    return GetUnitTypeId(GetSummonedUnit())==MANATRIANGLE_UNITID
endfunction

function MANATRIANGLEDeath_Condition takes nothing returns boolean
    return GetUnitTypeId(GetTriggerUnit())==MANATRIANGLE_UNITID
endfunction

function MANATRIANGLE_OnDeath takes nothing returns nothing
    local MANATRIANGLE t=GetUnitUserData(GetTriggerUnit())
    if t.phase==2 then
        call t.MANATRIANGLE_Damage()
    endif
    call DestroyEffect(AddSpecialEffect(MANATRIANGLE_VANISHEFFECT,GetUnitX(GetTriggerUnit()),GetUnitY(GetTriggerUnit())))
    call t.destroy()
endfunction

function MANATRIANGLE_GetLocationZ takes real x, real y returns real
    local location l=Location(x,y)    
    set x=GetLocationZ(l)+MANATRIANGLE_LIGHTNINGHEIGHT
    call RemoveLocation(l)
    return x
endfunction

function MANATRIANGLE_OnOrderChannel takes nothing returns nothing
    local MANATRIANGLE t=GetUnitUserData(GetTriggerUnit())
    local real a
    local real x
    local real y

    if t.pause then
       return
    endif
    if GetTriggerEventId()==EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER then
        set x=GetWidgetX(GetOrderTarget())
        set y=GetWidgetY(GetOrderTarget())
    else 
        set x=GetOrderPointX() 
        set y=GetOrderPointY()
    endif
    set t.phase=t.phase+1
    if t.phase==1 then
        call PlaySoundOnUnitBJ( MANATRIANGLE_BLINKSOUND, 100, t.u)
        call DestroyEffect( AddSpecialEffect( MANATRIANGLE_BLINKEFFECT,t.x1,t.y1))
        set t.x2=x
        set t.y2=y
        if SquareRoot((t.x2-t.x1)*(t.x2-t.x1)+(t.y2-t.y1)*(t.y2-t.y1))>MANATRIANGLE_MAXDISTANCE[t.level] then
            set a=Atan2(t.y2-t.y1,t.x2-t.x1)
            set t.x2=t.x1+Cos(a)*MANATRIANGLE_MAXDISTANCE[t.level]
            set t.y2=t.y1+Sin(a)*MANATRIANGLE_MAXDISTANCE[t.level]
        endif
        call SetUnitPosition(t.u,t.x2,t.y2)
        call PauseUnit(t.u,true)
        call IssueImmediateOrder(t.u,"stop")
        call PauseUnit(t.u,false)
        set t.l1=AddLightningEx(MANATRIANGLE_LIGHTNINGTYPE,true,t.x1,t.y1,MANATRIANGLE_GetLocationZ(t.x1,t.y1),t.x2,t.y2,MANATRIANGLE_GetLocationZ(t.x2,t.y2))
    else
        set t.pause=true
        call PlaySoundOnUnitBJ( MANATRIANGLE_BLINKSOUND, 100, t.u)
        call DestroyEffect( AddSpecialEffect( MANATRIANGLE_BLINKEFFECT,t.x2,t.y2))
        set t.x3=x
        set t.y3=y
        if SquareRoot((t.x3-t.x2)*(t.x3-t.x2)+(t.y3-t.y2)*(t.y3-t.y2))>MANATRIANGLE_MAXDISTANCE[t.level] then
            set a=Atan2(t.y3-t.y2,t.x3-t.x2)
            set t.x3=t.x2+Cos(a)*MANATRIANGLE_MAXDISTANCE[t.level]
            set t.y3=t.y2+Sin(a)*MANATRIANGLE_MAXDISTANCE[t.level]
        endif
        call SetUnitPosition(t.u,t.x3,t.y3)
        call PauseUnit(t.u,true)
        call IssueImmediateOrder(t.u,"stop")
        call PauseUnit(t.u,false)
        set t.l2=AddLightningEx(MANATRIANGLE_LIGHTNINGTYPE,true,t.x2,t.y2,MANATRIANGLE_GetLocationZ(t.x2,t.y2),t.x3,t.y3,MANATRIANGLE_GetLocationZ(t.x3,t.y3))
        set t.l3=AddLightningEx(MANATRIANGLE_LIGHTNINGTYPE,true,t.x3,t.y3,MANATRIANGLE_GetLocationZ(t.x3,t.y3),t.x1,t.y1,MANATRIANGLE_GetLocationZ(t.x1,t.y1))
        call UnitAddAbility(t.u,'Aloc')
        call UnitApplyTimedLife(t.u,'BTLF',MANATRIANGLE_EXPIREDURATION)
    endif
endfunction

function MANATRIANGLE_OnCast takes nothing returns nothing
   call MANATRIANGLE.create(GetSummonedUnit(),GetSummoningUnit())
endfunction

//*******************************************************************
//                     Trigger initialization                 
//*******************************************************************

function InitTrig_MANATRIANGLE takes nothing returns nothing
    call ExecuteFunc("MANATRIANGLE_Setup")
    set gg_trg_MANATRIANGLE = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_MANATRIANGLE, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_MANATRIANGLE, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )

    call TriggerAddCondition( gg_trg_MANATRIANGLE, Condition( function MANATRIANGLEOrder_Conditions ) )
    call TriggerAddAction( gg_trg_MANATRIANGLE, function MANATRIANGLE_OnOrderChannel )

    set gg_trg_MANATRIANGLE = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_MANATRIANGLE, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_MANATRIANGLE, Condition( function MANATRIANGLEDeath_Condition ) )
    call TriggerAddAction( gg_trg_MANATRIANGLE, function MANATRIANGLE_OnDeath )

    set gg_trg_MANATRIANGLE = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_MANATRIANGLE, EVENT_PLAYER_UNIT_SUMMON )
    call TriggerAddCondition( gg_trg_MANATRIANGLE, Condition( function MANATRIANGLE_Condition ) )
    call TriggerAddAction( gg_trg_MANATRIANGLE, function MANATRIANGLE_OnCast )
endfunction


next:
Sephiroth -
this guy has but two spells. they're really good ones though.
feel free to give me ideas on what the other two spells should be

Nightmare Flames
JASS:
//------------------------------------------------------------------------------------\\
//                                 Firewall [v3]                                      \\
//                                   by kenny!                                        \\
//                            Constructed using vJASS                                 \\
//                         Requires NewGen WE & GTrigger                              \\
//------------------------------------------------------------------------------------\\

scope NightmareFlames initializer onInit

    globals
        private constant integer    ABIL_ID       = 'A080'  // Raw code of the Firewall ability.
        private constant integer    ABIL2_ID      = 'A07Z'  // Raw code of the permanent immolation ability.
        private constant integer    UNIT_ID       = 'n01V'  // Raw code of the dummy unit used for the fire wall.
        private constant integer    TREEDUMMY_ID  = 'u00Q'  // Raw code of the dummy unit used for destroying trees.
        private constant real       INTERVAL      = 0.25    // INTERVAL for periodic timer, creating the wall over time. Try to keep it down around 0.02 - 0.30.
        private constant real       SPREAD_DIST   = 125.00  // Distance between each part of the fire wall when they are created.
        private constant real       SCALE         = 1.50    // Original scale size of the middle wall section.
        private constant string     BEGIN_SFX     = "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl"            // Effect played for the beginning explosion.
        private constant string     DAMAGE_SFX    = "Abilities\\Weapons\\FireBallMissile\\FireBallMissile.mdl" // Effect played when a unit is hurt by that explosion.
        private constant string     DAMAGE_POINT  = "chest" // Attachment point for above effect.
        private constant attacktype A_TYPE        = A_T_N     // Attack type of damage dealt by explosion.
        private constant damagetype D_TYPE        = DAMAGE_TYPE_UNIVERSAL // Damage type of damage dealt by explosion.
        private constant weapontype W_TYPE        = WEAPON_TYPE_WHOKNOWS  // Weapon type of damage dealt by explosion.
        private constant boolean    DESTROY_TREES = true    // Whether or not to destroy trees.
        private constant boolean    ALLOW_PRELOAD = true    // Whether or not to allow preloading of effects.
    endglobals 
    
    private function Max_length takes integer lvl returns integer
        return 3 + (2 * lvl) // Legnth of the wall. This will be the number of wall sections created on each side of the middle section.
    endfunction              // For example: Level 3 = 4 sections either side, therefore 9 parts are created all together, at "SPREAD_DIST" distance apart from each other.   

    private function Duration takes integer lvl returns real
        return 6.00 + (2.00 + lvl) // How long the wall will last.
    endfunction

    private function Radius takes integer lvl returns real
        return 100.00 + (20.00 * lvl) // Radius of the explosion at the start.
    endfunction

    private function Damage takes integer lvl returns real
        return 40.00 + (40.00 * lvl) // Damage dealt by beginning explosion.
    endfunction

    private function Scale_reduction takes integer spread returns real
        return 0.10 * spread // SCALE reduction of the wall sections. Gives a nice effect (Large in middle - smaller on sides).
    endfunction
    
    //=======================================================================\\
    //   DO NOT TOUCH PAST THIS POINT UNLESS YOU KNOW WHAT YOUR ARE DOING!   \\
    //=======================================================================\\
    
    public struct Data
      
        unit    cast    = null
        real    castx   = 0.00
        real    casty   = 0.00
        real    locx    = 0.00
        real    locy    = 0.00
        real    sin1    = 0.00
        real    sin2    = 0.00
        real    cos1    = 0.00
        real    cos2    = 0.00
        integer level   = 0
        integer spread  = 0
        
        static Data     array D
        static integer  DT          = 0
        static rect     Rect1       = null
        static timer    Timer       = null
        static group    Group       = null
        static unit     Tree_dummy  = null
        static boolexpr Tree_filt   = null
        static boolexpr Enemy_filt  = null
        static real     Game_maxX   = 0.00
        static real     Game_minX   = 0.00
        static real     Game_maxY   = 0.00
        static real     Game_minY   = 0.00

        static method safex takes real x returns real
            if x < .Game_minX then
                return .Game_minX
            elseif x > .Game_maxX then
                return .Game_maxX
            endif
            return x
        endmethod

        static method safey takes real y returns real
            if y < .Game_minY then
                return .Game_minY
            elseif y > .Game_maxY then
                return .Game_maxY
            endif
            return y
        endmethod
        
        static method destroyenumtrees takes nothing returns nothing
            call KillDestructable(GetEnumDestructable())
        endmethod
        
        static method treefilt takes nothing returns boolean
            local destructable dest   = GetFilterDestructable()
            local boolean      result = false
            
            if GetDestructableLife(dest) > 0.405 then
                call ShowUnit(.Tree_dummy,true)
                call SetUnitX(.Tree_dummy,GetWidgetX(dest))
                call SetUnitY(.Tree_dummy,GetWidgetY(dest))
                
                set result = IssueTargetOrder(.Tree_dummy,"harvest",dest)
                call IssueImmediateOrder(.Tree_dummy,"stop")
                call ShowUnit(.Tree_dummy,false)
                
                set dest = null
                return result
            endif
            
            set dest = null
            return result
        endmethod
        
        static method enemyfilt takes nothing returns boolean
            return GetWidgetLife(GetFilterUnit()) > 0.405 and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) == false and IsUnitType(GetFilterUnit(),UNIT_TYPE_FLYING) == false
        endmethod
        
        private method onDestroy takes nothing returns nothing
            set .cast = null
        endmethod

        static method update takes nothing returns nothing
            local Data    d      = 0
            local integer i      = 1
            local real    radius = 0.00
            local real    newx1  = 0.00
            local real    newy1  = 0.00
            local real    newx2  = 0.00
            local real    newy2  = 0.00
            local unit    flame  = null
            local unit    first  = null
            
            loop
                exitwhen i > .DT
                
                set d = .D<i>
                
                set radius = Radius(d.level)
                set d.spread = d.spread + 1
                
                if d.spread &gt; Max_length(d.level) then
                    call d.destroy()
                    set .D<i> = .D[.DT]
                    set .DT = .DT - 1
                    set i = i - 1
                else
                    set newx1 = .safex(d.locx + (d.spread * SPREAD_DIST) * d.cos1)
                    set newy1 = .safey(d.locy + (d.spread * SPREAD_DIST) * d.sin1)
                    set newx2 = .safex(d.locx + (d.spread * SPREAD_DIST) * d.cos2)
                    set newy2 = .safey(d.locy + (d.spread * SPREAD_DIST) * d.sin2)
                    
                    set flame = CreateUnit(GetOwningPlayer(d.cast),UNIT_ID,newx1,newy1,0.00)
                    call SetUnitScale(flame,(SCALE - Scale_reduction(d.spread)),(SCALE - Scale_reduction(d.spread)),0.00)
                    call DestroyEffect(AddSpecialEffect(BEGIN_SFX,newx1,newy1))
                    call UnitApplyTimedLife(flame,&#039;BTLF&#039;,Duration(d.level))
                    call SetUnitAbilityLevel(flame,ABIL2_ID,d.level)
                    call PauseUnit(flame,true)
                    call PauseUnit(flame,false)
                    
                    call GroupEnumUnitsInRange(.Group,newx1,newy1,radius,.Enemy_filt)
                    loop
                        set first = FirstOfGroup(.Group)
                        exitwhen first == null
                        call GroupRemoveUnit(.Group,first)
                        if IsUnitEnemy(first,GetOwningPlayer(d.cast)) then
                            call UnitDamageTarget(d.cast,first,Damage(d.level),false,false,A_TYPE,D_TYPE,W_TYPE)
                            call DestroyEffect(AddSpecialEffectTarget(DAMAGE_SFX,first,DAMAGE_POINT))
                        endif
                    endloop
                    
                    if DESTROY_TREES then
                        call SetRect(.Rect1,newx1 - radius,newy1 - radius,newx1 + radius,newy1 + radius)
                        call EnumDestructablesInRect(.Rect1,.Tree_filt,function Data.destroyenumtrees)
                    endif
                    
                    set flame = CreateUnit(GetOwningPlayer(d.cast),UNIT_ID,newx2,newy2,0.00)
                    call SetUnitScale(flame,(SCALE - Scale_reduction(d.spread)),(SCALE - Scale_reduction(d.spread)),0.00)
                    call DestroyEffect(AddSpecialEffect(BEGIN_SFX,newx2,newy2))
                    call UnitApplyTimedLife(flame,&#039;BTLF&#039;,Duration(d.level))
                    call SetUnitAbilityLevel(flame,ABIL2_ID,d.level)
                    call PauseUnit(flame,true)
                    call PauseUnit(flame,false)
                    
                    call GroupEnumUnitsInRange(.Group,newx2,newy2,radius,.Enemy_filt)
                    loop
                        set first = FirstOfGroup(.Group)
                        exitwhen first == null
                        call GroupRemoveUnit(.Group,first)
                        if IsUnitEnemy(first,GetOwningPlayer(d.cast)) then
                            call UnitDamageTarget(d.cast,first,Damage(d.level),false,false,A_TYPE,D_TYPE,W_TYPE)
                            call DestroyEffect(AddSpecialEffectTarget(DAMAGE_SFX,first,DAMAGE_POINT))
                        endif
                    endloop
                    
                    if DESTROY_TREES then
                        call SetRect(.Rect1,newx2 - radius,newy2 - radius,newx2 + radius,newy2 + radius)
                        call EnumDestructablesInRect(.Rect1,.Tree_filt,function Data.destroyenumtrees)
                    endif
                endif
                
                set i = i + 1
            endloop
            
            if .DT &lt;= 0 then
                call PauseTimer(.Timer)
                set .DT = 0
            endif
            
            set flame = null
            set first = null
        endmethod        
        
        static method actions takes nothing returns boolean
            local Data     d     = Data.create()
            local location l     = GetSpellTargetLoc()
            local unit     flame = null
            local unit     first = null
            local real     angle = 0.00
            
            set d.cast   = GetTriggerUnit()
            set d.castx  = GetUnitX(d.cast)
            set d.casty  = GetUnitY(d.cast)
            set d.locx   = .safex(GetLocationX(l))
            set d.locy   = .safey(GetLocationY(l))
            set angle    = Atan2((d.locy - d.casty),(d.locx - d.castx))
            set d.sin1   = Sin(angle + (90.00 * bj_DEGTORAD))
            set d.sin2   = Sin(angle - (90.00 * bj_DEGTORAD))
            set d.cos1   = Cos(angle + (90.00 * bj_DEGTORAD))
            set d.cos2   = Cos(angle - (90.00 * bj_DEGTORAD))
            set d.level  = GetUnitAbilityLevel(d.cast,ABIL_ID)
            set d.spread = 0
            
            set flame = CreateUnit(GetOwningPlayer(d.cast),UNIT_ID,d.locx,d.locy,0.00)
            call SetUnitScale(flame,SCALE,SCALE,0.00)
            call DestroyEffect(AddSpecialEffect(BEGIN_SFX,d.locx,d.locy))
            call UnitApplyTimedLife(flame,&#039;BTLF&#039;,Duration(d.level))
            call SetUnitAbilityLevel(flame,ABIL2_ID,d.level)
            call PauseUnit(flame,true)
            call PauseUnit(flame,false)
            
            call GroupEnumUnitsInRange(.Group,d.locx,d.locy,Radius(d.level),.Enemy_filt)
            loop
                set first = FirstOfGroup(.Group)
                exitwhen first == null
                call GroupRemoveUnit(.Group,first)
                if IsUnitEnemy(first,GetOwningPlayer(d.cast)) then
                    call UnitDamageTarget(d.cast,first,Damage(d.level),false,false,A_TYPE,D_TYPE,W_TYPE)
                    call DestroyEffect(AddSpecialEffectTarget(DAMAGE_SFX,first,DAMAGE_POINT))
                endif
            endloop
            
            if DESTROY_TREES then
                call SetRect(.Rect1,d.locx - Radius(d.level),d.locy - Radius(d.level),d.locx + Radius(d.level),d.locy + Radius(d.level))
                call EnumDestructablesInRect(.Rect1,.Tree_filt,function Data.destroyenumtrees)
            endif
            
            set .DT = .DT + 1
            set .D[.DT] = d
            if .DT == 1 then
                call TimerStart(.Timer,INTERVAL,true,function Data.update)
            endif
        
            call RemoveLocation(l)
            set flame = null
            set first = null
            set l = null
            
            return false
        endmethod         

        static method onInit takes nothing returns nothing
            set .Timer      = CreateTimer()
            set .Group      = CreateGroup()
            set .Rect1      = Rect(0.00,0.00,1.00,1.00)
            set .Tree_filt  = Filter(function Data.treefilt)
            set .Enemy_filt = Filter(function Data.enemyfilt)
            
            set .Game_maxX = GetRectMaxX(bj_mapInitialPlayableArea) - 64.00
            set .Game_maxY = GetRectMaxY(bj_mapInitialPlayableArea) - 64.00
            set .Game_minX = GetRectMinX(bj_mapInitialPlayableArea) + 64.00
            set .Game_minY = GetRectMinY(bj_mapInitialPlayableArea) + 64.00

            // Register event.
            call GT_AddStartsEffectAction(function Data.actions,ABIL_ID)
            
            set .Tree_dummy = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),TREEDUMMY_ID,0.00,0.00,0.00)
            call SetUnitPathing(.Tree_dummy,false)
            call ShowUnit(.Tree_dummy,false)
            
            if ALLOW_PRELOAD then
                call DestroyEffect(AddSpecialEffect(BEGIN_SFX,400,-400))
                call DestroyEffect(AddSpecialEffect(DAMAGE_SFX,400,-400))
            endif
        endmethod
    
    endstruct

endscope</i></i>


Repulse
JASS:
//------------------------------------------------------------------------------------\\
//                               Magnetic Field [v3]                                  \\
//                                   by kenny!                                        \\
//                            Constructed using vJASS                                 \\
//                         Requires NewGen WE &amp; GTrigger                              \\
//------------------------------------------------------------------------------------\\

scope Repulse initializer onInit

    globals
        // Configurables:
        private constant integer ABIL_ID       = &#039;A07V&#039;    // Raw code of the Magnetic Field ability.
        private constant integer DUMMY_ID      = &#039;u00Q&#039;    // Raw code of the dummy unit used to destroy trees.
        private constant real    INTERVAL      = 0.03125   // Used in the periodic timer to move units.
        private constant real    COLLISION     = 150.00    // Area around the moving units in which trees will be destroyed.
        private constant real    DISTANCE      = 75.00     // DISTANCE for checking pathability. Should be at least 25.00 distance less than COLLISION!!!
        private constant string  CASTED_SFX    = &quot;Abilities\\Spells\\Undead\\Darksummoning\\DarkSummonTarget.mdl&quot;   // Special effect that is attached to the caster.
        private constant string  CASTED_POINT  = &quot;origin&quot;  // where the special effect is attached to the caster.
        private constant boolean DESTROY_TREES = true      // Whether or not to allow destroying trees.
        private constant boolean ALLOW_PRELOAD = true      // Whether or not to allow preloading of effects.
    endglobals

    private function Duration takes integer lvl returns real
        return 2.00 + (3.00 * lvl)
    endfunction

    private function Move_dist takes integer lvl returns real
        return 20.00 + (0.00 * lvl)
    endfunction

    private function Radius takes integer lvl returns real
        return 300.00 + (300.00 * lvl)
    endfunction

    //=======================================================================\\
    //   DO NOT TOUCH PAST THIS POINT UNLESS YOU KNOW WHAT YOU ARE DOING!    \\
    //=======================================================================\\
    
    public struct Data
    
        unit    cast    = null
        effect  sfx     = null
        real    time    = 0.00
        integer lvl     = 0
        
        static Data     array D
        static item     array Hidden
        static integer  Hidden_max   = 0
        static integer  DT           = 0
        static rect     Rect1        = null
        static timer    Timer        = null
        static group    Group        = null
        static unit     Tree_dummy   = null
        static item     Item         = null
        static boolexpr Tree_filt    = null
        static boolexpr Unit_filt    = null
        static real     Game_maxX    = 0.00
        static real     Game_minX    = 0.00
        static real     Game_maxY    = 0.00
        static real     Game_minY    = 0.00
        static real     Max_range    = 10.00

        static method hide takes nothing returns nothing
            if IsItemVisible(GetEnumItem()) then
                set .Hidden[.Hidden_max] = GetEnumItem()
                call SetItemVisible(.Hidden[.Hidden_max],false)
                set .Hidden_max = .Hidden_max + 1
            endif
        endmethod

        static method pathability takes real x1, real y1 returns boolean
            local real x2 = 0.00
            local real y2 = 0.00
            
            call SetRect(.Rect1,0.00,0.00,128.00,128.00)
            call MoveRectTo(.Rect1,x1,y1)
            call EnumItemsInRect(.Rect1,null,function Data.hide)

            call SetItemPosition(.Item,x1,y1)
            set x2 = GetItemX(.Item)
            set y2 = GetItemY(.Item)
            call SetItemVisible(.Item,false)

            loop
                exitwhen .Hidden_max &lt;= 0
                set .Hidden_max = .Hidden_max - 1
                call SetItemVisible(.Hidden[.Hidden_max],true)
                set .Hidden[.Hidden_max] = null
            endloop

            return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) &lt; .Max_range * .Max_range
        endmethod

        static method safex takes real x returns real
            if x &lt; .Game_minX then
                return .Game_minX
            elseif x &gt; .Game_maxX then
                return .Game_maxX
            endif
            return x
        endmethod

        static method safey takes real y returns real
            if y &lt; .Game_minY then
                return .Game_minY
            elseif y &gt; .Game_maxY then
                return .Game_maxY
            endif
            return y
        endmethod
        
        static method destroyenumtrees takes nothing returns nothing
            call KillDestructable(GetEnumDestructable())
        endmethod
        
        static method treefilt takes nothing returns boolean
            local destructable dest   = GetFilterDestructable()
            local boolean      result = false
            
            if GetDestructableLife(dest) &gt; 0.405 then
                call ShowUnit(.Tree_dummy,true)
                call SetUnitX(.Tree_dummy,GetWidgetX(dest))
                call SetUnitY(.Tree_dummy,GetWidgetY(dest))
                
                set result = IssueTargetOrder(.Tree_dummy,&quot;harvest&quot;,dest)
                call IssueImmediateOrder(.Tree_dummy,&quot;stop&quot;)
                call ShowUnit(.Tree_dummy,false)
                
                set dest = null
                return result
            endif
            
            set dest = null
            return result
        endmethod
        
        static method unitfilt takes nothing returns boolean
            return GetWidgetLife(GetFilterUnit()) &gt; 0.405 and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) == false
        endmethod
        
        private method onDestroy takes nothing returns nothing
            call DestroyEffect(.sfx)
            set .sfx = null
            set .cast = null
        endmethod
        
        static method update takes nothing returns nothing
            local Data    d      = 0
            local integer i      = 1
            local unit    u      = null
            local real    castx  = 0.00
            local real    casty  = 0.00
            local real    angle  = 0.00
            local real    sin    = 0.00
            local real    cos    = 0.00
            local real    ux     = 0.00
            local real    uy     = 0.00
            
            loop
                exitwhen i &gt; .DT
                
                set d = .D<i>
                
                set castx = GetUnitX(d.cast)
                set casty = GetUnitY(d.cast)
                
                if d.time &gt;= Duration(d.lvl) or GetWidgetLife(d.cast) &lt; 0.405 then
                    call d.destroy()
                    set .D<i> = .D[.DT]
                    set .DT = .DT - 1
                    set i = i - 1
                else
                    call GroupEnumUnitsInRange(.Group,castx,casty,Radius(d.lvl),.Unit_filt)
                    call GroupRemoveUnit(.Group,d.cast)
                    loop
                        set u = FirstOfGroup(.Group)
                        exitwhen u == null
                        call GroupRemoveUnit(.Group,u)
                        set ux = GetUnitX(u)
                        set uy = GetUnitY(u)
                        set angle = Atan2((uy - casty),(ux - castx))
                        set sin = Sin(angle)
                        set cos = Cos(angle)
                        if .pathability(ux + DISTANCE * cos,uy + DISTANCE * sin) then
                            set ux = .safex(ux + Move_dist(d.lvl) * cos)
                            set uy = .safey(uy + Move_dist(d.lvl) * sin)
                            call SetUnitPosition(u,ux,uy)
                            if DESTROY_TREES then
                                call SetRect(.Rect1,ux - COLLISION,uy - COLLISION,ux + COLLISION,uy + COLLISION)
                                call EnumDestructablesInRect(.Rect1,.Tree_filt,function Data.destroyenumtrees)
                            endif                            
                        endif
                    endloop
                    
                    set d.time = d.time + INTERVAL
                endif
                
                set i = i + 1
            endloop
            
            if .DT &lt;= 0 then
                call PauseTimer(.Timer)
                set .DT = 0
            endif               
                
            set u = null
        endmethod
        
        static method actions takes nothing returns boolean
            local Data d = Data.create()
            
            set d.cast = GetTriggerUnit()
            set d.lvl  = GetUnitAbilityLevel(d.cast,ABIL_ID)
            set d.sfx  = AddSpecialEffectTarget(CASTED_SFX,d.cast,CASTED_POINT)
            
            set .DT = .DT + 1
            set .D[.DT] = d
            if .DT == 1 then
                call TimerStart(.Timer,INTERVAL,true,function Data.update)
            endif
            
            return false
        endmethod

        static method onInit takes nothing returns nothing
            set .Timer     = CreateTimer()
            set .Group     = CreateGroup()
            set .Rect1     = Rect(0.00,0.00,1.00,1.00)
            set .Tree_filt = Filter(function Data.treefilt)
            set .Unit_filt = Filter(function Data.unitfilt)
            
            set .Game_maxX = GetRectMaxX(bj_mapInitialPlayableArea) - 64.00
            set .Game_maxY = GetRectMaxY(bj_mapInitialPlayableArea) - 64.00
            set .Game_minX = GetRectMinX(bj_mapInitialPlayableArea) + 64.00
            set .Game_minY = GetRectMinY(bj_mapInitialPlayableArea) + 64.00
            
            // Register event.
            call GT_AddStartsEffectAction(function Data.actions,ABIL_ID)
            
            set .Tree_dummy = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),DUMMY_ID,400,-400,0.00)
            call SetUnitPathing(.Tree_dummy,false)
            call ShowUnit(.Tree_dummy,false)
            
            set .Item  = CreateItem(&#039;ciri&#039;,400,-400)
            call SetItemVisible(.Item,false)
            
            if ALLOW_PRELOAD then
                call DestroyEffect(AddSpecialEffect(CASTED_SFX,400,-400))
            endif            
        endmethod
    
    endstruct

endscope</i></i>


Yojimbo -
JASS:
/*Troll Samurai By Lord_T
By Lord_T

Description:
A scratch-made and animated 
model, with the exception of 
the head. 

Made in about 8 hours 
over 2 days using milkshape 
3d Studio.

A versatile troll melee 
unit with a projectile 
throwing spell animation, 
a berserk spell animation, 
and 2 melee attacks.

This could be used as a unit, 
though it is originally 
intended to be used as a hero.
No hero glow because I hate them. 
Download a hero glow model 
and attach it via triggers or 
spells if you want him to have one.*/


Yojimbo is a famous legendary samurai i guess...
anyway this hero model is pretty tight but it's not really a blademaster hero...
it's something totally different. check it out and give me some spell ideas. for some reason, i can't think of anything for him.


and that's pretty much it for now. I will probably update with more but these are the main ones that are bugging me right now.

by the way...just wanted to mention that i know sephiroth's spells are pretty much edited about where i want them, but i doubt mana triangle is. modification of mana triangle is definitely subject to change. just in case you're testing it and wondering why it isn't super cool....heh heh. i know those sephiroth spells didn't need much modification to make them awesome, that's not my fault, blame kenny for making such good spells.

edit: corrected the name for the model for Magic Crusher
 

Xienoph

You can change this now in User CP.
Reaction score
43
So what kind of heroes do you want Yojimbo, Sephiroth, Magic Crusher, and Odin to be? It sounds like Magic Crusher is the anti mage, what about the others? Since your game sounds item oriented, maybe each hero should have an item related ability? E.g.: a skill to destroy an item owned by the hero ... or something like that.
 

SanKakU

Member
Reaction score
21
not a bad suggestion. anyway, i want all the heroes to basically be either mages or warriors.

yojimbo is definitely a warrior.
sephiroth i guess is a mage.
odin'll be a warrior, and same goes for magic crusher.

i was thinking of giving sephiroth a special phantom walk ability. like ghost scepter from dota...but i already have plans to make a phantom walk item. i already triggered it. it's just a matter of not having the trigger target potions, and actually creating the appropriate item, lol. at any rate, i should make it so his ability level is checked if he uses that item. i can use my itemstack system to make him have the special version of that item, basically. yeah, that'll work.

sephiroth will still need a final spell though. but that should be interesting enough for him as a third spell.

but, the question is...what special spell should be casted if he uses that item?

edit: oh, i just thought of a fantastic idea for yojimbo! hahaha!
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top