Xeno Research Facility v1
1984
|
ID: 158
Family ID:
Author: Palandu
Rarity: unique
Element: iron
Attack Type: Physical
Attack Range: 1200
Attack CD: 1.8
Damage: 1812-1812
Abil. Factor: 0.5
Status: Approved
|
Sample Collection
Has a 25% chance to collect a tissue sample from a damaged creep. Once researched, it will provide a 5% bonus vs the race of that creep, through the Xeno Vulnerability Research aura. Maximum bonus per race is 25%. Whenever a different race is attacked, half of the research bonuses against all other races are lost. Level Bonus: +1% chance to collect sample +1% maximum bonus per race
Xeno Vulnerability Research
Improves damage vs various creep races for all towers in 280 range. Improvement amount depends on the Sample Collection. Research results are published every 6 seconds and whenever a different race is attacked. Stops working in the Bonus Level. Note: For this tower, research overrides any and all other race modifications. So the race bonuses of this tower reflect the bonuses given by this aura. |
Download
Toggle Triggers Header globals
BuffType xeno_dummyAura
BuffType xeno_undead
BuffType xeno_magic
BuffType xeno_nature
BuffType xeno_orc
BuffType xeno_humanoid
hashtable xeno_raceBonusTable = InitHashtable()
endglobals
//halving and setting of all modifiers on base tower
function xeno_ManageBonuses takes Tower tower, boolean isTypeChange, integer uid, integer currentCategory, integer currentBonus returns nothing
local real currentRaceBonus
local real idealBonus
if isTypeChange then
call SaveInteger(xeno_raceBonusTable, uid, CATEGORY_UNDEAD, LoadInteger(xeno_raceBonusTable, uid, CATEGORY_UNDEAD)/2)
call SaveInteger(xeno_raceBonusTable, uid, CATEGORY_MAGIC, LoadInteger(xeno_raceBonusTable, uid, CATEGORY_MAGIC)/2)
call SaveInteger(xeno_raceBonusTable, uid, CATEGORY_NATURE, LoadInteger(xeno_raceBonusTable, uid, CATEGORY_NATURE)/2)
call SaveInteger(xeno_raceBonusTable, uid, CATEGORY_ORC, LoadInteger(xeno_raceBonusTable, uid, CATEGORY_ORC)/2)
call SaveInteger(xeno_raceBonusTable, uid, CATEGORY_HUMANOID, LoadInteger(xeno_raceBonusTable, uid, CATEGORY_HUMANOID)/2)
//now restore the correct one :P
call SaveInteger(xeno_raceBonusTable, uid, currentCategory, currentBonus)
endif
//now set the correct race bonuses for this tower
set idealBonus = 1.0 + (I2R(LoadInteger(xeno_raceBonusTable, uid, CATEGORY_UNDEAD))/1000)
set currentRaceBonus = tower.getDamageToCategory(CATEGORY_UNDEAD)
if idealBonus != currentRaceBonus then
call tower.modifyProperty(MOD_DMG_TO_UNDEAD, idealBonus - currentRaceBonus) //add the delta
endif
set idealBonus = 1.0 + (I2R(LoadInteger(xeno_raceBonusTable, uid, CATEGORY_MAGIC))/1000)
set currentRaceBonus = tower.getDamageToCategory(CATEGORY_MAGIC)
if idealBonus != currentRaceBonus then
call tower.modifyProperty(MOD_DMG_TO_MAGIC, idealBonus - currentRaceBonus) //add the delta
endif
set idealBonus = 1.0 + (I2R(LoadInteger(xeno_raceBonusTable, uid, CATEGORY_NATURE))/1000)
set currentRaceBonus = tower.getDamageToCategory(CATEGORY_NATURE)
if idealBonus != currentRaceBonus then
call tower.modifyProperty(MOD_DMG_TO_NATURE, idealBonus - currentRaceBonus) //add the delta
endif
set idealBonus = 1.0 + (I2R(LoadInteger(xeno_raceBonusTable, uid, CATEGORY_ORC))/1000)
set currentRaceBonus = tower.getDamageToCategory(CATEGORY_ORC)
if idealBonus != currentRaceBonus then
call tower.modifyProperty(MOD_DMG_TO_ORC, idealBonus - currentRaceBonus) //add the delta
endif
set idealBonus = 1.0 + (I2R(LoadInteger(xeno_raceBonusTable, uid, CATEGORY_HUMANOID))/1000)
set currentRaceBonus = tower.getDamageToCategory(CATEGORY_HUMANOID)
if idealBonus != currentRaceBonus then
call tower.modifyProperty(MOD_DMG_TO_HUMANOID, idealBonus - currentRaceBonus) //add the delta
endif
endfunction
//this is where all the magic or rather research happens :P
function xeno_BuffTowers takes Tower tower, boolean isTypeChange returns nothing
local BuffType selectedBuff
local integer powerLevel
local integer uid = tower.getUID()
local Iterate towersInAura
local Unit nextTower
set powerLevel = LoadInteger(xeno_raceBonusTable, uid, tower.userInt)
set tower.userInt2 = tower.userInt //save the race type of new buff
if tower.userInt == CATEGORY_UNDEAD then
set selectedBuff = xeno_undead
if (isTypeChange and powerLevel > 0) or tower.userReal3 > 0 then
call tower.getOwner().displaySmallFloatingText("Undead Research Published", tower, 50, 50, 50, 0)
endif
elseif tower.userInt == CATEGORY_MAGIC then
set selectedBuff = xeno_magic
if (isTypeChange and powerLevel > 0) or tower.userReal3 > 0 then
call tower.getOwner().displaySmallFloatingText("Magic Research Published", tower, 0, 155, 0, 0)
endif
elseif tower.userInt == CATEGORY_NATURE then
set selectedBuff = xeno_nature
if (isTypeChange and powerLevel > 0) or tower.userReal3 > 0 then
call tower.getOwner().displaySmallFloatingText("Nature Research Published", tower, 0, 155, 0, 0)
endif
elseif tower.userInt == CATEGORY_ORC then
set selectedBuff = xeno_orc
if (isTypeChange and powerLevel > 0) or tower.userReal3 > 0 then
call tower.getOwner().displaySmallFloatingText("Orc Research Published", tower, 155, 0, 155, 0)
endif
elseif tower.userInt == CATEGORY_HUMANOID then
set selectedBuff = xeno_humanoid
if (isTypeChange and powerLevel > 0) or tower.userReal3 > 0 then
call tower.getOwner().displaySmallFloatingText("Humanoid Research Published", tower, 0, 155, 155, 0)
endif
else
//Probs a champ wave. Exit early.
return
endif
set tower.userReal3 = -101 //reset the message display flag
call xeno_ManageBonuses(tower, isTypeChange, uid, tower.userInt, powerLevel)
//re-apply buffs / refresh aura
if powerLevel > 0 then
set towersInAura = Iterate.overUnitsInRangeOfCaster(tower, TARGET_TOWERS, 315.0) //larger AoE needed as aura centre seems to be diff + collision problems
loop
set nextTower = towersInAura.next()
exitwhen nextTower == 0
if nextTower.getBuffOfType(xeno_dummyAura) != 0 and nextTower.getUID() != uid then //do not buff self
call selectedBuff.applyAdvanced(tower, nextTower, powerLevel, powerLevel, (6.5 / tower.getProp_BuffDuration())) //always 8.5 secs
endif
endloop
endif
endfunction
//Do not remove or rename this function!
//Put your initialization tasks here, this function will be called on map init
private function init takes nothing returns nothing
local Modifier m
set xeno_undead = BuffType.create(1, 0, true)
set m = Modifier.create()
call m.addModification(MOD_DMG_TO_UNDEAD, 0.0, 0.001)
call xeno_undead.setBuffModifier(m)
set xeno_magic = BuffType.create(1, 0, true)
set m = Modifier.create()
call m.addModification(MOD_DMG_TO_MAGIC, 0.0, 0.001)
call xeno_magic.setBuffModifier(m)
set xeno_nature = BuffType.create(1, 0, true)
set m = Modifier.create()
call m.addModification(MOD_DMG_TO_NATURE, 0.0, 0.001)
call xeno_nature.setBuffModifier(m)
set xeno_orc = BuffType.create(1, 0, true)
set m = Modifier.create()
call m.addModification(MOD_DMG_TO_ORC, 0.0, 0.001)
call xeno_orc.setBuffModifier(m)
set xeno_humanoid = BuffType.create(1, 0, true)
set m = Modifier.create()
call m.addModification(MOD_DMG_TO_HUMANOID, 0.0, 0.001)
call xeno_humanoid.setBuffModifier(m)
set xeno_dummyAura = BuffType.createAuraEffectType(true)
call xeno_dummyAura.setBuffIcon('@@0@@')
endfunction
On Attack
ONATTACK_chance: 1.0
ONATTACK_chanceLevelAdd: 0.0
function onAttack takes Tower tower returns nothing
local Creep enemy
if tower.userReal < 0 then
return
endif
set enemy = Event.getTarget()
if enemy.getSpawnLevel() > Game.getMaxLevel() then
set tower.userReal = -101 //off switch
set tower.userInt3 = 0
endif
set tower.userInt = enemy.getCategory() //setting the last attacked type
if tower.userInt != tower.userInt2 then //last attacked is diff from the prev. last attacked, halve bonuses and change buffs
call xeno_BuffTowers(tower, true)
endif
endfunction
On Damage
ONDAMAGE_chance: 0.25
ONDAMAGE_chanceLevelAdd: 0.01
function onDamage takes Tower tower returns nothing
local Creep enemy
local integer i
local integer index
local integer uid
if tower.userReal < 0 then
return
endif
if not Event.isMainTarget() or Event.isSpellDamage() then
return
endif
set uid = tower.getUID()
set enemy = Event.getTarget()
set index = enemy.getCategory() //can technically use the onattack userInt....
set i = LoadInteger(xeno_raceBonusTable, uid, index)
if i < tower.userInt3 then
call tower.getOwner().displaySmallFloatingText("Sample Collected", enemy, 200, 200, 200, 40.0)
set i = IMinBJ(tower.userInt3, i + 50)
call SaveInteger(xeno_raceBonusTable, uid, index, i)
set tower.userReal3 = 101 //flag to show the research message
endif
endfunction
On Level Up function onLevelUp takes Tower tower returns nothing
set tower.userInt3 = 250 + tower.getLevel()*10 //bonus limit
endfunction
On Tower Creation function onCreate takes Tower tower returns nothing
local integer uid = tower.getUID()
set tower.userInt = CATEGORY_OTHERS //which creep type i attacked - that's the type i'll buff next
set tower.userInt2 = CATEGORY_OTHERS //memory of prev. attacked creep type
set tower.userInt3 = 250 //bonus limit
set tower.userReal = 101 //on-off switch. Tower should not work in bonus level. +ve = tower is on
set tower.userReal3 = -101 //flag to show the research message. +ve = message is on.
call SaveInteger(xeno_raceBonusTable, uid, CATEGORY_UNDEAD, 0) //undead
call SaveInteger(xeno_raceBonusTable, uid, CATEGORY_MAGIC, 0) //magic
call SaveInteger(xeno_raceBonusTable, uid, CATEGORY_NATURE, 0) //nature
call SaveInteger(xeno_raceBonusTable, uid, CATEGORY_ORC, 0) //orc
call SaveInteger(xeno_raceBonusTable, uid, CATEGORY_HUMANOID, 0) //humanoid
call SaveInteger(xeno_raceBonusTable, uid, CATEGORY_OTHERS, 0) //just to prevent a hashkey error
endfunction
On Tower Destruction function onDestruct takes Tower tower returns nothing
call FlushChildHashtable(xeno_raceBonusTable, tower.getUID())
endfunction
Periodic
PERIODIC_period: 6
function periodic takes Tower tower returns nothing
if tower.userReal > 0 then
call xeno_BuffTowers(tower, tower.userInt != tower.userInt2)
endif
endfunction
Tower Aura
AURA_auraEffect: xeno_dummyAura
AURA_power: 1
AURA_level: 1
AURA_auraRange: 280.0
AURA_targetType: TARGET_TYPE_TOWERS
AURA_levelAdd: 1
AURA_powerAdd: 1
AURA_targetSelf: true
|
Description:
Latest Upload Comment: