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 -
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.
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
Repulse
Yojimbo -
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
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=039;A0BO039; // The spell used by the hero
constant integer MANATRIANGLE_UNITID=039;n026039; // 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,039;Aloc039;)
call UnitApplyTimedLife(t.u,039;BTLF039;,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 = 039;A080039; // Raw code of the Firewall ability.
private constant integer ABIL2_ID = 039;A07Z039; // Raw code of the permanent immolation ability.
private constant integer UNIT_ID = 039;n01V039; // Raw code of the dummy unit used for the fire wall.
private constant integer TREEDUMMY_ID = 039;u00Q039; // 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 > 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;BTLF039;,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;BTLF039;,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 <= 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;BTLF039;,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 & GTrigger \\
//------------------------------------------------------------------------------------\\
scope Repulse initializer onInit
globals
// Configurables:
private constant integer ABIL_ID = 039;A07V039; // Raw code of the Magnetic Field ability.
private constant integer DUMMY_ID = 039;u00Q039; // 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 = "Abilities\\Spells\\Undead\\Darksummoning\\DarkSummonTarget.mdl" // Special effect that is attached to the caster.
private constant string CASTED_POINT = "origin" // 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 <= 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) < .Max_range * .Max_range
endmethod
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 unitfilt takes nothing returns boolean
return GetWidgetLife(GetFilterUnit()) > 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 > .DT
set d = .D<i>
set castx = GetUnitX(d.cast)
set casty = GetUnitY(d.cast)
if d.time >= Duration(d.lvl) or GetWidgetLife(d.cast) < 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 <= 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;ciri039;,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